-
Notifications
You must be signed in to change notification settings - Fork 31
Description
刚弄完与语音有关的毕业设计,对于语音识别系统算是入门了。
不同于图片识别,语音识别系统与其他时序系统一样,都是极度复杂的,为了让大家对这类系统有一定了解,特开此天坑。
//word图片不能直传,手动复制黏贴五十张图。。。辛酸
//word格式转换有点问题,因此部分公式不能较清楚地显示
//大部分图片取自网络,但所有文字均为手打
第三章基于GMM-HMM模型的传统语音识别系统
在本章中,将详细地讲述基于传统的GMM-HMM模型语音识别系统的建模、训练以及解码的过程。
3.1混合高斯模型(Gaussian Mixture Model)
3.1.1GMM简介
数学中所提及的高斯分布即正态分布N(x;μ,σ),是一种连续概率模型,其概率密度函数(PDF,probability density function)为:

在实际运用中,高斯分布函数通常用来拟合一些常见的统计量,例如人的身高、体重等,给定一类人的身高样本后,可以根据极大似然估计法,依次求出身高样本的方差和均值,即可得高斯分布函数,使得该高斯分布产生该组身高样本的概率最大,此时,该高斯分布便说明了这类人的身高的分布区间。
在得到几个类别高斯分布函数后,便有对样本进行分类的可能,例如得到男人和女人的身高的高斯分布后,可以发现,女人的身高样本,大概率会在女人的高斯分布中取较大的概率密度值,而在男人高斯分布中取较小的概率密度值,便可实现样本的分类。
在实际应用中,为了对样本进行准确的分类,往往需要多个维度的样本特征,此时采用的不是一维的高斯分布,而是多维的高斯分布
。多维向量x的PDF如下:

为了更好地拟合样本空间,例如人的身高中,成年男女的身高具有各自的分布特征,因此成年人的身高的概率分布应该具有两个峰,如果考虑小孩的话还需要再多加几个峰,此时一个高斯分布就无法准确拟合了,此时需要使用混合高斯模型。对于混合高斯模型,即将多个高斯分布加权求和,即:

其中为了保证概率分布的积分为1,有
举例而言,如图3-1即为一个简单的一维的混合高斯模型:
图3-1,三个一维高斯分布的加权混合
混合高斯模型可以较好地描述一类特征向量的分布情况
3.1.2GMM聚类算法
为了将一组样本用若干个高斯函数进行拟合,需要执行EM算法(Expectation Maximization Algorithm)(证明略),以二维数据为例,假如需要分为两类,首先需要随机初始化两个高斯函数的参数,如图9(a),接着循环执行(Loop)以下两步直到收敛:
I、E步:根据特征对于两个类的高斯函数的概率密度,将每个样本依次归类到概率密度较大的那个类中
II、M步:对于每个类别,重新计算均值和方差
每进行一步,称为一次迭代(Loop/Iter),效果如图3-2(b-f),用这种方法即可自动分类。
图3-2,EM算法分类过程
当维度较高时,采用随机初始化的分类效果不好,这时首先需要对这组样本进行预分类,如可采用K-means算法,将样本粗略的分成几个类,求出每个类的均值和方差,即可得每个类的高斯分布,接着再进行EM算法。
使用混合高斯模型时,执行E步首先需要确定样本属于哪一类/哪一个混合高斯模型,将样本归类后,再在该混合高斯模型内部,继续将样本归类到某个特定的高斯里去,然后执行M步估计该特定高斯的参数,再计算该高斯的混合权重:

循环以上步骤即可完成高维度向量的混合高斯模型聚类。
3.2语言模型的构建
现在而言,主流的语言模型是统计语言模型。为了构建统计语言模型,首先需要对语句进行分词,得到词序列W1,W2...Wn。假设某个词出现的概率只与这个词之前出现的词有关,那么:
P(W1,W2...Wn)=P(W1)*P(W2|W1)*P(W3|W1,W2)...*P(Wn|W1,W2...Wn-1)
其中,P(W1)即为W1在所有词中的出现概率,P(W2|W1)是前一个词是W1的条件下,这个词是W2的概率,依次类推。然而,当词序列过长时,语料严重不足,无法从足够多的语料中估计概率,更有甚者,某些词序列的语料只出现一次或者不出现。
此时可以引入马尔科夫假设,即假设当前词的出现概率只与前面一个词有关,这样,句子的出现概率就变成了P(W1)*P(W2|W1)*P(W3|W2)...*P(Wn|Wn-1),这便是二元语言模型。如果考虑前面的n-1个词,则是n元语言模型。对于极少出现的词,可以认为它的统计概率是不可靠的,这时可以给予其一个极小的,与其他低频词相仿的,但又不是零的概率,起到平滑效果。
3.3GMM-HMM的联合
在语音识别中,传统的办法是采用GMM-HMM模型及其变种形式,为了构建GMM-HMM语音识别系统,需要进行如下几个步骤:
I、采集语音录音和标注数据,即标注音素出现的时间段,以便MFCC特征使用。
II、对语音数据进行MFCC特征提取,结合标注得到有标注的MFCC序列
III、对有标注的X(MFCC)->Y(Label)数据进行GMM聚类,得到对应GMM模型
IV、统计音素序列,得到音素转移模型,即为HMM的转移概率矩阵A
V、此时Xt即为HMM模型中t时刻的观测状态,Y为对应的隐藏状态,其对应的观测概率P(Xt|Y)应由GMM模型求出,问题即转变为对X序列进行解码。
在实践中,鉴于解码所得序列的概率
P(O1|S1)P(O2|S2)...*P(Ot|St)*π(S1)P(S2|S1)...*P(St|St-1)
会越来越小以致于超过精度,故对整个序列取对数并求和,最终所得概率的形式为:
事实上,只用一个观测状态代表一个音素是远远不够的,因为通常一个音素会持续多个MFCC特征帧,而这多个特征帧虽然代表同一个音素,但是音素的开始部分和音素的结束部分还是存在一定的区别,如果用一个状态对应一个音素的方式建模,会导致在音素发音持续过程中,意外地将特征帧解码为其他音素的问题,这时需要对音素进行更细的建模。
当说话人发出一个音时,有三个时段:开始、保持、中止,这三个时段的顺序是不能颠倒的,此时利用一个单向的、三状态的HMM模型可以较好地模拟这一过程。具体而言,如图3-3所示,对单个音素进行GMM-HMM建模时,音素内部可以细分为数个隐藏状态S1,S2...SK,但是要求Sk的转移概率只能有两种非零的情况,一种是自转
,另一种是跳转
,这样就可以保证解码过程中,隐藏状态序列是单向变化的,如此就可以实现对发音较好的建模。
图3-3,一个音素的GMM-HMM模型
实际解码时,仍然采用维特比算法,但是此时的转移概率是较为特殊的,即在音素内部是单向跳转的,而在音素之间是自由跳转的,解码结束后,找回解码出的状态序列,每完整走完一个音素的所有状态,便将这组状态翻译为对应的音素,最终得到一个完整的音素序列串,完成解码。实际应用中,由于状态较多,直接采用维特比解码效率仍然不足,为了进一步加快解码速率,需要使用WFST(Weight Finite State Transducer)建立解码图(细节略)。
3.4语音帧的对齐与音素训练
对于数据标注,理想的办法是精细到波形,结合适合语音数据的MFCC特征帧,标注每个特征帧对应的波形是属于哪个音素的,这样直接可以根据统计数据建立最大似然的GMM-HMM模型。然而,一句简短的日常用语(数秒)往往有成百近千个语音帧,而timit作为一个非常小的数据集,也有几千句语音,同时,音素的内部状态细分也非常难以界定,因此,对语音帧进行标注是困难的。在实际运用中,实际数据最容易取得的样式是一句语音录音对应一串标注好的字符串,如timit数据集的音素串,因此需要发掘可以自动标注语音的方法。
为了针对数据集建立音素的GMM-HMM模型,需要进行如下步骤:
I、对语音特征帧序列进行对齐,即确定哪些帧片段是对应哪些音素的
接着将对应好的特征序列用相应的音素HMM模型进行训练,转移概率训练过程参考2.4节,GMM部分参考3.1.2节
II、初始化时,考虑到音素建模中转移概率是单向的,因此可以将特征序列均分成N段,N为音素模型的状态数目,然后认为第n部分的序列是对应第n个状态的,据此进行A矩阵和GMM模型的训练。
III、E步骤:根据音素GMM-HMM模型对特征序列进行解码
IV、M步骤:根据解码结果重估模型参数
V、循环E步和M步直到模型收敛
从步骤中可知,第I步是很重要的,对齐的效果决定了音素GMM-HMM模型的拟合效果,为了实现自动标注,需要继续对整个语音特征帧序列进行EM算法,步骤如下:
I、平均对齐,即将整句话的语音特征帧序列平均分为N段,N为这句话的标注中的音素数目,然后认为第n段对应第n个音素。虽然对于一句话而言,这种初始化的过程是极度不准确的,很有可能出现第n段的标注对应第n+1的音素甚至n+2的音素,但是如果语料库中语句的数目足够多(timit数据集只有数千句话,但是足够了),那么真正对齐音素的帧的数据会较为集中,而其他无法对齐的音素噪音由于可能来自任意其他音素,在GMM聚类时将会被互相抵消,从而得到音素的粗略GMM-HMM模型。
II、对对齐好的特征帧执行GMM-HMM模型训练
III、重对齐:利用训练好的GMM-HMM模型解码,可以得到对齐好的特征帧序列
IV、反复执行II和III的训练-重对齐操作直到模型收敛
此时即得到对齐好的特征序列以及训练好的音素GMM-HMM模型,其中对齐度和模型效果互相影响,为了提高模型的整体效果,可以改进音素GMM-HMM模型,从而提升对齐度、再让对齐效果反作用于模型。
3.5三音素模型
上文提及的音素GMM-HMM模型实际上是单音素GMM-HMM模型,即音素不考虑上下文,例如语音“打开”的拼音是“dakai”拆分成音素是d a k ai四个音素。在单音素模型中,认为音素“k”的对应的语音段与其上下文“a”和“ai”无关。然而,在对音素的详细分析中发现,事实上一个音素的发音受上下文影响很大,这也与日常说话时的连音相符,例如,“不要”一词的拼音是“buyao”,但是快速地读这个词,就会读成“biao”(其实这就是嫑的读音)。
为了更好地对音素进行建模,主流的做法是对音素进一步细分构成三音素模型,即考虑音素的上下文,如“打开”中的音素k结合上下文,可以表示为a-k-ai,这与“停靠”的k是不同的,后者是ing-k-ao。在一些实验基准中,采用的音素字典是48音素的,音素之间排列结合后会产生484848=110592种三音素,这个三音素字典过于巨大,而且是非常稀疏的,即大部分的三音素组合很少出现或者不可能出现,为了压缩字典,采用决策树进行合并(过程略),将极少出现的三音素分组合并,用一个音素进行表示,进行决策树合并后生成的三音素字典具有1947个三音素,对应1947个三音素GMM-HMM模型。
三音素模型应用过程如下:
I、模型初始化:利用单音素模型生成的对齐标注或其他模型生成的更好的对齐标注对三音素模型进行初始化
II、训练:与单音素模型一样,用EM算法迭代训练三音素模型
III、解码、对齐、打分
参考文献
[1]赵力. 语音信号处理-第2版[M]. 机械工业出版社, 2009.
[2]吴军. 数学之美.第2版[M]. 人民邮电出版社, 2014.
[3]俞栋, 邓力, 俞凯,等. 解析深度学习语音识别实践[M]. 电子工业出版社, 2016.
[4]郑泽宇, 顾思宇. TensorFlow实战Google深度学习框架[M]. 电子工业出版社. 2017.
[5]卡拉特.苏彦捷.生物心理学[M].第10版.北京.人民邮电出版社,2012
[6]Rabiner L, Juang B H. Fundamentals of speech recognition[M]. Tsinghua University Press, 1999.
[7]Bishop C M. Pattern Recognition and Machine Learning (Information Science and Statistics)[M]. Springer-Verlag New York, Inc. 2006.
[8]Andrew NG, Jiquan Ngiam, Chuan YU Foo, et al. UFLDL tutorial. http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial. 2013.
[9]Young S J. Token Passing: a Simple Conceptual Model for Connected Speech Recognition Systems[J]. Help, 1994.
[10]Hinton G, Deng L, Yu D, et al. Deep Neural Networks for Acoustic Modeling in Speech Recognition: The Shared Views of Four Research Groups[J]. IEEE Signal Processing Magazine, 2012, 29(6):82-97.
[11]Young S. A review of large-vocabulary continuous-speech[J]. IEEE Signal Processing Magazine, 1996, 13(5):45.
[12]Miao Y, Metze F. Improving low-resource CD-DNN-HMM using dropout and multilingual DNN training[J]. Proc Interspeech, 2013.
[13]Rath S, Povey D, Veselý K, et al. Improved feature processing for Deep Neural Networks[C]. conference of the international speech communication association, 2013.
[14]Mohamed A R, Dahl G, Hinton G. Deep Belief Networks for phone recognition[J]. 2009, 4.



