对于语音识别过程个人的理解: 例如我对电脑说:“帮我打开“我的电脑”!”然后电脑得理解我说了什么,然后再执行打开“我的电脑”的操作,那怎么实现呢? 这个得预先有一个工作,就是电脑得先学会“帮我打开“我的电脑”!”这句语音(实际上是一个波形)所代表的文字就是“帮我打开“我的电脑”!”这句词串。那么如何让它学会呢? 如果以音节(对汉语来说就是一个字的发音)为语音基元的话,那么电脑就是一个字一个字地学*,例如“帮”字、“我”字等等,那么“帮”字怎么学*呢?也就是说电脑接收到一个“帮”字的语音波形,怎么分析理解才知道它代表的是“帮”字呢?首先我们需要建立一个数学模型来表示这个语音。因为语音是连续的不平稳的信号,但是在短的时间内可以认为是平稳的,所以我们需要分割语音信号为一帧一帧,假如大概25ms一帧,然后为了让每一帧平稳过渡,我们就让每帧见存在重叠,假如重叠10ms。这样每帧的语言信号就是平稳的了,再从每帧语音信号中提取反映语音本质特征的信息(去除语音信号中对于语音识别无用的冗余信息,同时达到降维)。那么采用什么特征最能表达每一帧的语音呢?MFCC是用的比较多的一种,这里不介绍了。然后我们就提取每一帧语音的MFCC特征,得到了是一系列的系数,大概四五十个这样,sphinx中是39个数字,组成了特征向量。好,那么我们就通过39个数字来描述每一帧的语音了,那不同的语音帧就会有不同的39个数字的组合,那我们用什么数学模型去描述这39个数字的分布情况呢?这里我们可以用一个混合高斯模型来表示着39个数字的分布,而混合高斯模型就存在着两个参数:均值和方差;那么实际上每一帧的语音就对应着这么一组均值和方差的参数了。呵呵,挺啰嗦的啊。 好了,这样“帮”字的语音波形中的一帧就对应了一组均值和方差(HMM模型中的观察序列),那么我们只需要确定“帮”字(HMM模型中的隐含序列)也对应于这一组均值和方差就可以了。那么后者是怎么对应的呢?这就是训练的作用了!我们知道描述一个HMM模型需要三个参数:初始状态概率分布π、隐含状态序列的转移矩阵A(就是某个状态转移到另一个状态的概率观察序列中的这个均值或者方差的概率)和某个隐含状态下输出观察值的概率分布B(也就是某个隐含状态下对应于);而声学模型可以用HMM模型来建模,也就是对于每一个建模的语音单元,我们需要找到一组HMM模型参数(π,A,B)就可以代表这个语音单元了。那么这三个参数怎么确定呢?训练!我们给出一个语音的数据库,指明说这个语音代表这个词,然后让电脑去学*,也就是对数据库进行统计,得到(π,A,B)这三个参数。 好了,一个字(建模单元)的声学模型建立了。那汉语是不是有很多个字啊,那我们就得对每一个建立声学模型了。假设就有几千个模型,然后每个模型就有了三个或者5个HMM状态,那么如果你说的句子有10个字,那我们就得搜索这所有可能的模型去匹配你的语音,那是多么大的搜索空间了,这非常耗时。那我们就需要采用一个比较优的搜索算法了(这里是Viterbi-Beam算法),它每搜索到一个状态点,就保留概率最大的,然后舍弃之前的状态点,这样就裁剪了很多的搜索路径,但因为忽略了之前的路径,所以它就只能得到一个局部的最优解。 那假如出现以下情况呢?例如,It’s a nice day,从语音上可能会被识别为:It sun niced A,或者是It son ice day。从声学模型来看它是无法区别这些结果,因为其不同之处只是在于每个单词的边界划分位置不同造成的。这时候语言模型就该闪亮登场了,从语义上判断那个结果出现的概率最大,即为搜索结果。语言模型N-Gram基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。这样就可以约束搜索,增加识别的准确率了。
|