星空体育·(StarSky Sports)官方网站-星空官方认证

语音识别的流程docx-星空体育官方网站

新闻资讯
质量为本、客户为根、勇于拼搏、务实创新

语音识别的流程docx

日期:2024-10-04 浏览: 

  首先说一下作为输入的时域波形。我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须转成非压缩的纯波形文件,比如WindowsPCM文件,即wav文件来处理。wav文件里存储的除了一个文件头以外,就是声音波形的一个个点了。采样率越大,每毫秒语音中包含的点的个数就越多。另外声音有单通道,双通道之分,还有四通道的等等。对语音识别任务来说,单通道就足够了,多了浪费,因此一般要把声音转成单通道的来处理。下图是一个波

  时域的波形必须要星空体育官方入口 星空体育官网分帧,也就是把波形切开成一小段一小段,每小段称为一帧。分帧操作通常使用移动窗函数来实现,分帧之前还要做一些预加重等操作,这里不详述。帧与帧之间是有交叠的,就像下图这样:图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

  图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。

  分帧后,语音就变成了很多小段。但波形在时域上几乎没有描述能力,因此必须将波形作变换。常见的一种变换方法是提取MFCC特征,把每一帧波形变成一个12维向量。这12个点是根据人耳的生理特性提取的,可以理解为这12个点包含了这帧语音的内容信息。这个过程叫做声学特征提取。实际应用中,这一步有很多细节,比如差分、均值方差规整、高斯化、降维去冗余等,声学特征也不止有MFCC这一种,具体就不详述了。

  至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列如下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。

  音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见TheCMUPronouncingDictionaryo汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。

  图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若十个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态

  图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若十个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。

  那每帧音素对应哪个状态呢?有个容易想到的办法,看某帧对应哪个状态的概率最大,那这帧就属于哪个状态,这叫做最大似然”。比如下面的示意图,这帧对应S3状态的概率最大,因此就让这帧属于S3状态。

  那这些用到的概率从哪里读取呢?有个叫“声学模型”的东西,里面存了一大堆参数,通过这些参数,就可以知道帧和状态对应的概率。声学模型是使用巨大数量的语音数据训练出来的,训练的方法比较繁琐,这里不讲。

  但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号,相邻两帧间的状态号基本都不相同。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。如果真这么做,得到的状态号可能根本无法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,因为每帧很短。

  解决这个问题的常用方法就是使用隐马尔可夫模型(HiddenMarkovModel,HMM)。这东西听起来好像很高深的样子,实际上很简单,无非是:第一步,构建一个状态网络。

  这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,当然也带来一个局限,比如你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径,那么不管说些什么,识别出的结果必然是这两个句子中的一句。

  具体是这样的,首先构造单词级网络,然后展开成音素网络,然后展开成状态网络。然后在状态网络中搜索一条最佳路径,这条路径和语音之间的概率(称之为累积概率)最大。搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。感兴趣的同学可以到Wikipedia上搜一下。

  其中,前两种概率从声学模型中获取,最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的,存储的是任意单词、任意两个单词、任意三个单词(通常也就到三个单词)在大量文本中的出现机率。