第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 语音识别入门第五节:基于GMM-HMM的语音识别系统

语音识别入门第五节:基于GMM-HMM的语音识别系统

时间:2019-07-06 16:36:05

相关推荐

语音识别入门第五节:基于GMM-HMM的语音识别系统

目录

基于孤立词的GMM-HMM语音识别系统训练解码基于单音素的GMM-HMM语音识别系统音素/词典训练解码基于三音素的GMM-HMM语音识别系统三音素决策树

基于孤立词的GMM-HMM语音识别系统

语音识别中GMM是一个对角的GMM,它的协方差为对角阵,这是因为在GMM-HMM语音识别中,一般使用MFCC特征,而MFCC特征各维特征是独立的,只需要对角阵就可以描述它,此外,对角GMM模型的参数量相对较少,所需的计算量也更少。

语音识别中的HMM是一个三状态的左右模型(每个状态只能跳转到自身或者下一个状态)的HMM,如图所示(s1、s2、s3为状态):

训练

从系统的角度考虑,输入数据为词w和w所对应的训练数据,输出为词w的GMM-HMM模型。​

其中的任务的关键是从训练数据Xw1,Xw2,Xw3,⋯X_{w1,X_{w2},X_{w3},\cdots}Xw1,Xw2​,Xw3​,⋯​中训练Pw(X)P_w(X)Pw​(X),估计GMM-HMM模型参数,使用的准则为最大似然。

本节使用的方法为Viterbi学习(Viterbi训练)和Baum-Welch学习(前向后向训练)。

Viterbi训练\color{#FF0000}{Viterbi训练}Viterbi训练

类比问题:性别已知,求男生(或女生)的平均身高。

E步:使用Viterbi算法得到最优的状态序列(对齐 alignment),在时刻ttt处于状态iii的概率(0或1),估计GMM模型中时刻ttt处于状态iii第kkk个GMM分量的概率。

M步:更新转移参数、GMM参数(详见语音识别入门第三节:GMM以及EM算法)。

重复E/M步。

具体流程如下:

初始化GMM-HMM参数λ=(aij,GMM参数)\lambda=(a_{ij},GMM参数)λ=(aij​,GMM参数),其中,每个状态jjj对应的GMM参数为(αjm,μjm,Σjm)(\alpha_{jm},\mu_{jm},\Sigma_{jm})(αjm​,μjm​,Σjm​)基于GMM-HMM参数λ\lambdaλ和Viterbi算法得到状态-观测对齐,得到每个观测对应的隐藏状态更新参数λ\lambdaλ

– a^ij=C(i→j)∑kC(i→k)\hat{a}_{ij}=\frac{C(i \to j)}{\sum_{k}C(i \to k)}a^ij​=∑k​C(i→k)C(i→j)​,C(i→j)C(i \to j)C(i→j)表示从状态iii到状态jjj的转移次数

– 更新GMM参数重复2、3步,直到收敛

在语音识别问题中,最开始时并没有对应的模型,一般对一个语音包含的帧数根据状态数量进行等分,给每个状态分配各自所对应的特征,进而估计一个初始化的参数。

前向后向训练(Baum−Welch训练)\color{#FF0000}{前向后向训练(Baum-Welch训练)}前向后向训练(Baum−Welch训练)

类比问题:知道每个人属于男生(或女生)的概率,求男生(或女生)的平均身高。

E步:使用前向算法+后向算法,估计在时刻ttt处于状态iii的概率0≤p≤10\le p \le 10≤p≤1,并估计GMM模型中时刻ttt处于状态iii第kkk个GMM分量的概率。

M步:更新转移参数、GMM参数。

重复E/M步。

具体流程如下:

初始化GMM-HMM参数λ=(aij,(cjm,μjm,Σjm))\lambda = \left( a_{ij},\left( c_{jm},\mu_{jm},\Sigma_{jm} \right) \right)λ=(aij​,(cjm​,μjm​,Σjm​))E步:对所有时间ttt、状态iii

– 递推计算前向概率αt(i)\alpha_t(i)αt​(i)和后向概率βt(i)\beta_t(i)βt​(i)

– 计算ζt(j,k)=∑iαt−1(i)aijcjkbjk(ot)βt(j)∑i=1NαT(i)\zeta_t(j,k)=\frac{\sum_{i} \alpha_{t-1}(i)a_{ij}c_{jk}b_{jk}(o_t)\beta_t(j)}{\sum_{i=1}^{N}\alpha_T(i)}ζt​(j,k)=∑i=1N​αT​(i)∑i​αt−1​(i)aij​cjk​bjk​(ot​)βt​(j)​,ξt(i,j)=αt(i)aijbj(ot+1)βt+1(j)∑i=1NαT(i)\xi_t(i,j)=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{i=1}^{N}\alpha_T(i)}ξt​(i,j)=∑i=1N​αT​(i)αt​(i)aij​bj​(ot+1​)βt+1​(j)​,γt(i)=∑k=1Nξt(i,j)\gamma_t(i)=\sum_{k=1}^{N}\xi_t(i,j)γt​(i)=∑k=1N​ξt​(i,j)。M步:更新参数

– μ^jk=∑t=1Tζt(j,k)ot∑t=1Tζt(j,k)\hat{\mu }_{jk} = \frac{\sum _{t=1}^{T}\zeta _t(j,k)o_t}{\sum _{t=1}^{T}\zeta_t (j,k)}μ^​jk​=∑t=1T​ζt​(j,k)∑t=1T​ζt​(j,k)ot​​

– Σ^jk=∑t=1Tζt(j,k)(ot−μ^jk)(ot−μ^jk)T∑t=1Tζt(j,k)\hat{\Sigma}_{jk}= \frac{\sum _{t=1}^{T}\zeta _t(j,k)(o_t-\hat{\mu }_{jk})(o_t-\hat{\mu }_{jk})^T}{\sum _{t=1}^{T}\zeta_t (j,k)}Σ^jk​=∑t=1T​ζt​(j,k)∑t=1T​ζt​(j,k)(ot​−μ^​jk​)(ot​−μ^​jk​)T​

– c^jk=∑t=1Tζt(j,k)∑t=1T∑kζt(j,k)\hat{c }_{jk} = \frac{\sum _{t=1}^{T}\zeta_t (j,k)}{\sum _{t=1}^{T}\sum _{k}\zeta_t (j,k)}c^jk​=∑t=1T​∑k​ζt​(j,k)∑t=1T​ζt​(j,k)​

– a^ij=∑t=1T−1ξt(i,j)∑t=1T−1∑k=1Nξt(i,k)=∑t=1T−1ξt(i,j)∑t=1T−1γt(i)\hat{a }_{ij}=\frac{\sum _{t=1}^{T-1}\xi_t (i,j)}{\sum _{t=1}^{T-1}\sum_{k=1}^{N}\xi_t (i,k)}=\frac{\sum _{t=1}^{T-1}\xi_t (i,j)}{\sum _{t=1}^{T-1}\gamma_t (i)}a^ij​=∑t=1T−1​∑k=1N​ξt​(i,k)∑t=1T−1​ξt​(i,j)​=∑t=1T−1​γt​(i)∑t=1T−1​ξt​(i,j)​重复2、3步,直到收敛

解码

从系统角度考虑,输入为各个词汇的GMM-HMM模型和未知的测试语音XtestX_{test}Xtest​,输出为XtestX_{test}Xtest​对应的词。

其中的关键点为在概率的框架中对所有的www就散Pw(Xtest)P_w(X_{test})Pw​(Xtest​)。

本节使用的方法为前向算法和Viterbi算法(可以回溯到最优的状态序列)。

对于one、two两个数字的识别问题,分别使用one和two的HMM模型计算它们的概率,此时可以使用前向算法和Viterbi算法。首先,可以对one和two分散的建立拓扑结构,如下图所示。

也可将one和two表示为一个紧凑的图,如下图所示(此时只能使用Viterbi算法)。

此系统目前仅可识别独立的one或two,无法识别连续的多个词,如连续的one one one或one two one等,此时可将上图中节点E增加一个连接到节点S的跳转,这样就拥有可以表达连续数字串的能力。

基于孤立词的语音识别系统存在许多缺点:

建模单元数、计算量和词典大小成正比。词的状态数(a/accomplishment)对每个词应该不同,长词应该使用更多的状态。存在OOV(Out of Vocabulary)的问题。实际上,词并不是一个语言的基本发音单元,以词为建模单元无法共享这些发音的基本单元。

基于单音素的GMM-HMM语音识别系统

音素/词典

音素是发音的基本单元。

英文一般会使用CMU Phone音素列表,共39个音素(其中,红色的为元音音素):AA\color{#FF0000}AAAA AE\color{#FF0000}AEAE AH\color{#FF0000}AHAH AW\color{#FF0000}AWAW AX\color{#FF0000}AXAX AXR\color{#FF0000}AXRAXR AY\color{#FF0000}AYAY B BD CH D DD DH DX EH\color{#FF0000}EHEH ER\color{#FF0000}ERER EY\color{#FF0000}EYEY F G GD HH IH\color{#FF0000}IHIH IX\color{#FF0000}IXIX IY\color{#FF0000}IYIY JH K KD L M N NG OW\color{#FF0000}OWOW OY\color{#FF0000}OYOY P PD R S SH T TD TH TS UH\color{#FF0000}UHUH UW\color{#FF0000}UWUW V W X Y Z ZH

中文音素(可以认为声韵母就是音素):a\color{#FF0000}aa o\color{#FF0000}oo e\color{#FF0000}ee i\color{#FF0000}ii u\color{#FF0000}uu v\color{#FF0000}vv b p m f d t n l g k h j q x zh ch sh z c s y w ai\color{blue}aiai ei\color{blue}eiei ui\color{blue}uiui ao\color{blue}aoao ou\color{blue}ouou iu\color{blue}iuiu ie\color{blue}ieie ue\color{blue}ueue er\color{blue}erer an\color{blue}anan en\color{blue}enen in\color{blue}inin un\color{blue}unun vn\color{blue}vnvn ang\color{blue}angang eng\color{blue}engeng ing\color{blue}inging ong\color{blue}ongong 

除此之外,一般还会引入一个静音音素Slience(SIL)

词典是词到音素序列的映射(文件),其中,0~910个数字的词典如下所示,其中,R音素是共享的,S音素也是共享的:

训练

每个音素均使用经典的三状态结构。在训练时需将音素序列的三状态结构相连。如图是单词one的单音素结构图:

解码

类似孤立词解码,基于单音素的解码图如下图所示:

单音素的语音识别系统也有很多缺点:

建模单元少,一般英文系统的音素数量在30-60个,中文系统的音素数量在100个左右。音素的发音受其所在上下文的影响,如连读、吞音等。

基于三音素的GMM-HMM语音识别系统

三音素

考虑音素的上下文,一般会考虑前一个和后一个音素,称之为三音素,表示为A-B+C。

例如,单词KEEP是由音素K IY P组成,其三音素为#\color{#FF0000}{\#}#-K+YI,K-IY+P,YI-P+#\color{#FF0000}{\#}#。符号#代表空或边界点。

思考问题:\color{red}思考问题:思考问题:

假设训练系统中有N个音素,一共有多少个三音素?\color{red}假设训练系统中有N个音素,一共有多少个三音素?假设训练系统中有N个音素,一共有多少个三音素?如果训练系统中有的三音素训练数据特别少或不存在,应该怎么办?\color{red}如果训练系统中有的三音素训练数据特别少或不存在,应该怎么办?如果训练系统中有的三音素训练数据特别少或不存在,应该怎么办?有的三音素在训练数据中不存在,但在测试数据中存在怎么办?\color{red}有的三音素在训练数据中不存在,但在测试数据中存在怎么办?有的三音素在训练数据中不存在,但在测试数据中存在怎么办?

三音素虽然解决了单音素中存在的问题时,又带来了新的问题。

决策树

为了解决上述问题,可将上下文发音相近的三音素共享参数,此时会大幅降低模型的参数量,对于训练数据少的问题,共享也可以增加它的数据。为了实现发音相近的三音素共享参数,可通过聚类(自底向上)或决策树(自顶向下)实现。

而决策树则是三音素共享参数的一个实际解决方案。

决策树是一个二叉树,每个非叶子节点上都会有一个问题,每个叶子节点都是一个绑定的三音素的集合,而绑定的粒度为状态,如A-B+C和A-B+D的第一个状态绑定在一起,并不代表其第2/3个状态也需要绑定在一起,也就是B的每个状态都有一个小的决策树。如下图所示:

决策树非叶子节点常见的问题由:是否是元音、是否是爆破音、是否是鼻音、是否是摩擦音、是否是流音、位置信息等。

将一条一条的问题进行整合即为问题集,而问题集一般可通过语言学家定义或自动构建问题集,Kaldi中通过自顶向下的聚类自动构建问题集。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。