AI大语音(八)——GMM-HMM声学模型
基于GMM的0-9孤立词识别系统以词为训练单位,添加新词汇需要重新进行训练,若要涵盖所以词,差不多6万个词,训练量极大,预测时也要计算6万个模型的似然,哪个大预测出哪个,在实际应用中有局限性,只能应用于小词汇量场合。
孤立词识别系统识别了0-9的数字的英文单词,但是假如有人用英文报电话号码,是识别不了整个号码的,甚至识别不了其中的one。
孤立词识别这个模型无法从一连串英文号码(里面包含了one two等多个数字)中准确识别出one,关键点在于连续语音中不知道哪些语音信号是one,哪些是two,或者说不知道哪些帧是one哪些帧是two。
所以若要识别连续的0123456789的语音就需要Viterbi在HMM中进行对齐,这就是GMM-HMM模型了。
1 识别流程
在GMM独立词识别中以单词为单位建模,在GMM-HMM中以音素为单位进行建模。对连续语音提取MFCC特征,将特征对应到状态这个最小单位,通过状态获得音素,音素再组合成单词,单词串起来变成句子。
其中,若干帧对应一个状态,三个状态组成一个音素,若干音素组成一个单词,若干单词连成一个句子。难点并在于若干帧到底是多少帧对应一个状态了,这就使用到了viterbi对齐。 为了提高识别率,在三音子GMM-HMM模型基础上,又用DNN模型取代GMM模型,达到了识别率明显的提升。
将特征用混合高斯模型进行模拟,把均值和方差输入到HMM的模型里。GMM描述了状态的发射概率,拟合状态的输出分布。
单音素模型虽然可以完成基本的大词汇量连续语音识别的任务,但是存在一定缺点。
-
建模单元数目少,一般英文系统的音素数量在30~60个,中文系统音素数目在100个左右。这么少的建模单元难以做到精细化的建模,所以识别率不高。
-
音素发音受其所在上下文的影响,同样的音素,在不同的上下文环境中,数据特征也有明显的区分性。
所以就考虑音素所在的上下文(context)进行建模,一般的,考虑当前音素的前一个(左边)音素和后一个(右边)音素,称之为三音素,并表示为A-B+C的形式,其中B表示当前音素,A表示B的前一个音素,C表示B的后一个音素。
2 单音素模型
训练问题
一段2秒的音频信号,经过【分帧-预加重-加窗-fft-mel滤波器组-DCT】,得到MFCC特征作为输入信号,此处若以帧长为25ms,帧移为25ms为例,可以得到80帧的输入信号,这80帧特征序列就是观察序列:
给定观察序列O,估计GMM-HMM模型的参数,这就是训练问题。
A是转移概率,B是观察概率,也就是发射概率。我们使用GMM模型对观察概率建模,所以实际参数就是高斯分布中的均值和方差。模型参数就是转移概率、高斯分布的均值、方差(单高斯的情况)。单音素GMM-HMM模型的训练是无监督训练。
(灵魂的拷问:我们对语音进行了标注,也就是给了输入语音的label,为什么这个训练还是无监督的呢?
AI大语音:模型的训练并不是直接输入语音,给出这个语音是什么,然后和标注label求loss。模型的训练是输入特征到音素的状态的训练,即我们并不知道哪一帧输入特征对应哪个音素的哪一个状态。训练的目的就是找到帧对应状态的情况,并更新状态的gmm参数。把每一帧都归到某个状态上,本质上是进行聚类,是无监督训练。)
单音素GMM-HMM模型的训练通过Viterbi训练(嵌入式训练),把“S IH K S”对应的GMM模型嵌入到整段音频中去训练。
训练步骤:
步骤一:初始化对齐
为什么要初始化对齐?
为viterbi提供初始参数A、B。
一开始不知道一段语音的哪些帧对应哪些状态,我们就进行平均分配。比如两秒的“ six”语音一共80帧,分成四个因素“S IH K S”,每个音素分配到20帧,每个音素又有三个状态组成,每个状态分配6或者7帧。这样就初始化了每个状态对应的输入数据。
什么意思?
就是假设前0-20帧数据都是“S”这个音素的发音,20-40帧数据都是“IH”这个音素的发音,40-60帧是“K”这个音素的发音,60-80是“S”这个音素的发音。但这只是一个假设,事实到底如此我们还不知道。我们可以在这个初始对齐下进一步优化。
步骤二:初始化模型
HMM模型λ=(A,B,Π)。我们对初始对齐的模型进行count。count什么呢?
在初始化对齐后就可以count状态1->状态1的次数,状态1->状态2的次数,这就是转移次数,转移次数/总转移次数=转移概率。转移初始转移概率A(aij)就得出了。
Π就是[1,0,0,0...],一开始在状态一的概率是100%。在语音识别应用中由于HMM是从左到右的模型,第一个必然是状态一,即P(q0=1)=1。所以没有pi这个参数了。
还有B(bj(ot))参数怎么办?
一个状态对应一个gmm模型,一个状态对应若干帧数据,也就是若干帧数据对应一个gmm模型。一开始我们不知道哪些帧对应哪个状态,所以gmm模型的输入数据就无从得知。现在初始化后,状态1对应前6帧数据,我们就拿这六帧数据来计算状态1的gmm模型(单高斯,只有一个分量的gmm),得到初始均值 和方差 。
(完美的假想:假设我们初始化分配帧恰恰就是真实的样子,那么我们的gmm参数也是真实的样子,这个模型就已经训练好了。)
步骤三:重新对齐(viterbi硬对齐,Baum-welch软对齐)
假想想想就好了,现在得到的GMM-HMM模型就是个胚芽,还有待成长,懂事,这就需要重新对齐,向真实情况逼近的重新对齐。如何逼近真实情况?viterbi算法根据初始化模型λ=(A,B,Π)来计算。它记录每个时刻的每个可能状态的之前最优路径概率,同时记录最优路径的前一个状态,不断向后迭代,找出最后一个时间点的最大概率值对应的状态,如何向前回溯,得到最优路径。得到最优路径就得到最优的状态转移情况,哪些帧对应哪些状态就变了。转移概率A就变了。
哪些帧对应哪些状态变了导致状态对应的gmm参数自然就变了,也可以跟着更新均值 和方差,即发射概率B变了。
步骤四:迭代
新的A和新的B又可以进行下一次的Viterbi算法,寻找新的最优路径,得到新的对齐,新的对齐继续改变着参数A、B。如此循环迭代直到收敛,则GMM-HMM模型训练完成。
(灵魂的拷问:迭代何时是个头?
AI大语音:一般是设置固定轮数,也可以看一下对齐之后似然的变化,如果变化不大了,基本就是收敛了。)
3 三音子模型
决策树
考虑音素所在的上下文(context)进行建模,一般的,考虑当前音素的前一个(左边)音素和后一个(右边)音素,称之为三音素,并表示为A-B+C的形式,其中B表示当前音素,A表示B的前一个音素,C表示B的后一个音素。
使用三音素建模之后,引入了新的问题:
-
N个音素,则共有N^3 个三音素,若N=100,则建模单元又太多了,每个音素有三个状态,每个状态对应的GMM参数,参数就太多了。
-
数据稀疏问题,有的三音素数据量很少
-
unseen data问题。有的三音素在训练数据没有出现,如K-K+K,但识别时却有可能出现,这时如何描述未被训练的三音素及其概率。
所以通常我们会根据数据特征对triphone的状态进行绑定,常见的状态绑定方法有数据驱动聚类和决策树聚类,现在基本上是使用决策树聚类的方式。
三音素GMM-HMM模型是在单音素GMM-HMM模型的基础上训练的。
为什么要先进行单音素GMM-HMM训练?
通过在单音素GMM-HMM模型上viterbi算法得到与输入 对应的最佳状态链,就是得到对齐的结果。
对每个音素的每个state建立一颗属于他们自己的决策树,从而达到状态绑定的目的。
-
从根节点经过一些列的问题,相近(相似度高)的(绑定)三音素到达同一个叶子节点。
-
决策树建立的基本单元是状态,对每个三音子的每个state建立一颗属于他们自己的决策树。
-
每个三音素对于该问题都会有一个Yes或No的的答案,那么对所有的三音素来讲,该问题会把所有三音素分成Yes集合和No集合。
-
根节点是说这是以zh为中心音素的三音素的第三个状态的决策树,第一个状态和第二个状态也都有各自独立的决策树
-
即使zh-zh+zh从未在训练语料中出现过,通过决策树,我们最终将它绑定到一个与之相近的叶子节点上。
通过单音素系统,我们可以得到单音素各个状态所有对应的特征集合,做一下上下文的扩展,我们可以得到三音素的各个状态所有对应特征集合。通过这样的方法,我们可以把训练数据上所有的单音素的数据对齐转为三音素的对齐。
决策树的生成流程:
-
初始条件(单音素系统对齐,一个根节点)
-
选择当前所有待分裂的节点、计算所有问题的似然增益,选择使似然增益最大的节点和问题对该节点进行分裂。
-
直至算法满足一定条件终止。
4 总结
从单音素GMM-HMM到三音子GMM-HMM的过程就是发现问题,解决当前问题又引入了新问题,再解决新问题的过程。 单音素建模单元少,难以做到精细化建模,识别率不高,单音素发音受上下文影响。 为了优化或者说解决这些问题,引进三音子模型,导致建模单元又太多,所谓过犹不及。同时还出现数据稀疏问题,unseen data问题。 为了解决这些问题,引入带决策树的GMM-HMM模型,解决了上面问题。 为了提高识别率,在三音子GMM-HMM模型基础上,又用DNN模型取代GMM模型,达到了识别率明显的提升。
——————
浅谈则止,细致入微AI大道理
扫描下方“AI大道理”,选择“关注”公众号
a欢迎加入!
▼下期预告▼
AI大语音(九)——基于GMM-HMM的连续语音识别系统
▼往期精彩回顾▼
AI大语音(一)——语音识别基础
AI大语音(二)——语音预处理
AI大语音(三)——傅里叶变换家族
AI大语音(四)——MFCC特征提取
AI大语音(五)——隐马尔科夫模型(HMM)
AI大语音(六)——混合高斯模型(GMM)
AI大语音(七)——基于GMM的0-9语音识别系统
萍水相逢逢萍水,浮萍之水水浮萍!