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

目录

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

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

语音识别中GMM是一个对角的GMM,它的协方差为对角阵,这是因为在GMM-HMM语音识别中,一般使用MFCC特征,而MFCC特征各维特征是独立的,只需要对角阵就可以描述它,此外,对角GMM模型的参数量相对较少,所需的计算量也更少。
语音识别中的HMM是一个三状态的左右模型(每个状态只能跳转到自身或者下一个状态)的HMM,如图所示(s1、s2、s3为状态):
语音识别入门第五节:基于GMM-HMM的语音识别系统_第1张图片

训练

从系统的角度考虑,输入数据为词w和w所对应的训练数据,输出为词w的GMM-HMM模型。​
其中的任务的关键是从训练数据 X w 1 , X w 2 , X w 3 , ⋯ X_{w1,X_{w2},X_{w3},\cdots} Xw1,Xw2,Xw3,中训练 P w ( X ) P_w(X) Pw(X),估计GMM-HMM模型参数,使用的准则为最大似然。
本节使用的方法为Viterbi学习(Viterbi训练)和Baum-Welch学习(前向后向训练)。
V i t e r b i 训练 \color{#FF0000}{Viterbi训练} Viterbi训练
类比问题:性别已知,求男生(或女生)的平均身高。
E步:使用Viterbi算法得到最优的状态序列(对齐 alignment),在时刻 t t t处于状态 i i i的概率(0或1),估计GMM模型中时刻 t t t处于状态 i i i k k k个GMM分量的概率。
M步:更新转移参数、GMM参数(详见语音识别入门第三节:GMM以及EM算法)。
重复E/M步。
具体流程如下:

  • 初始化GMM-HMM参数 λ = ( a i j , G M M 参数 ) \lambda=(a_{ij},GMM参数) λ=(aij,GMM参数),其中,每个状态 j j j对应的GMM参数为 ( α j m , μ j m , Σ j m ) (\alpha_{jm},\mu_{jm},\Sigma_{jm}) (αjm,μjm,Σjm)
  • 基于GMM-HMM参数 λ \lambda λ和Viterbi算法得到状态-观测对齐,得到每个观测对应的隐藏状态
  • 更新参数 λ \lambda λ
    a ^ i j = C ( i → j ) ∑ k C ( i → k ) \hat{a}_{ij}=\frac{C(i \to j)}{\sum_{k}C(i \to k)} a^ij=kC(ik)C(ij) C ( i → j ) C(i \to j) C(ij)表示从状态 i i i到状态 j j j的转移次数
    – 更新GMM参数
  • 重复2、3步,直到收敛

在语音识别问题中,最开始时并没有对应的模型,一般对一个语音包含的帧数根据状态数量进行等分,给每个状态分配各自所对应的特征,进而估计一个初始化的参数。
前向后向训练( B a u m − W e l c h 训练) \color{#FF0000}{前向后向训练(Baum-Welch训练)} 前向后向训练(BaumWelch训练)
类比问题:知道每个人属于男生(或女生)的概率,求男生(或女生)的平均身高。
E步:使用前向算法+后向算法,估计在时刻 t t t处于状态 i i i的概率 0 ≤ p ≤ 1 0\le p \le 1 0p1,并估计GMM模型中时刻 t t t处于状态 i i i k k k个GMM分量的概率。
M步:更新转移参数、GMM参数。
重复E/M步。
具体流程如下:

  • 初始化GMM-HMM参数 λ = ( a i j , ( c j m , μ j m , Σ j m ) ) \lambda = \left( a_{ij},\left( c_{jm},\mu_{jm},\Sigma_{jm} \right) \right) λ=(aij,(cjm,μjm,Σjm))
  • E步:对所有时间 t t t、状态 i i i
    – 递推计算前向概率 α t ( i ) \alpha_t(i) αt(i)和后向概率 β t ( i ) \beta_t(i) βt(i)
    – 计算 ζ t ( j , k ) = ∑ i α t − 1 ( i ) a i j c j k b j k ( o t ) β t ( j ) ∑ i = 1 N α 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αt1(i)aijcjkbjk(ot)βt(j) ξ t ( i , j ) = α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) ∑ i = 1 N α 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)aijbj(ot+1)βt+1(j) γ t ( i ) = ∑ k = 1 N ξ t ( i , j ) \gamma_t(i)=\sum_{k=1}^{N}\xi_t(i,j) γt(i)=k=1Nξt(i,j)
  • M步:更新参数
    μ ^ j k = ∑ t = 1 T ζ t ( j , k ) o t ∑ t = 1 T ζ 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
    Σ ^ j k = ∑ t = 1 T ζ t ( j , k ) ( o t − μ ^ j k ) ( o t − μ ^ j k ) T ∑ t = 1 T ζ 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 ^ j k = ∑ t = 1 T ζ t ( j , k ) ∑ t = 1 T ∑ 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=1Tkζt(j,k)t=1Tζt(j,k)
    a ^ i j = ∑ t = 1 T − 1 ξ t ( i , j ) ∑ t = 1 T − 1 ∑ k = 1 N ξ t ( i , k ) = ∑ t = 1 T − 1 ξ t ( i , j ) ∑ t = 1 T − 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=1T1k=1Nξt(i,k)t=1T1ξt(i,j)=t=1T1γt(i)t=1T1ξt(i,j)
  • 重复2、3步,直到收敛

解码

从系统角度考虑,输入为各个词汇的GMM-HMM模型和未知的测试语音 X t e s t X_{test} Xtest,输出为 X t e s t X_{test} Xtest对应的词。
其中的关键点为在概率的框架中对所有的 w w w就散 P w ( X t e s t ) P_w(X_{test}) Pw(Xtest)
本节使用的方法为前向算法和Viterbi算法(可以回溯到最优的状态序列)。
对于one、two两个数字的识别问题,分别使用one和two的HMM模型计算它们的概率,此时可以使用前向算法和Viterbi算法。首先,可以对one和two分散的建立拓扑结构,如下图所示。
语音识别入门第五节:基于GMM-HMM的语音识别系统_第2张图片
语音识别入门第五节:基于GMM-HMM的语音识别系统_第3张图片
也可将one和two表示为一个紧凑的图,如下图所示(此时只能使用Viterbi算法)。
语音识别入门第五节:基于GMM-HMM的语音识别系统_第4张图片
语音识别入门第五节:基于GMM-HMM的语音识别系统_第5张图片
此系统目前仅可识别独立的one或two,无法识别连续的多个词,如连续的one one one或one two one等,此时可将上图中节点E增加一个连接到节点S的跳转,这样就拥有可以表达连续数字串的能力。
基于孤立词的语音识别系统存在许多缺点:

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

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

音素/词典

音素是发音的基本单元。
英文一般会使用CMU Phone音素列表,共39个音素(其中,红色的为元音音素): A A \color{#FF0000}AA AA A E \color{#FF0000}AE AE A H \color{#FF0000}AH AH A W \color{#FF0000}AW AW A X \color{#FF0000}AX AX A X R \color{#FF0000}AXR AXR A Y \color{#FF0000}AY AY B BD CH D DD DH DX  E H \color{#FF0000}EH EH E R \color{#FF0000}ER ER E Y \color{#FF0000}EY EY F G GD HH  I H \color{#FF0000}IH IH I X \color{#FF0000}IX IX I Y \color{#FF0000}IY IY JH K KD L M N NG  O W \color{#FF0000}OW OW O Y \color{#FF0000}OY OY P PD R S SH T TD TH TS  U H \color{#FF0000}UH UH U W \color{#FF0000}UW UW V W X Y Z ZH
中文音素(可以认为声韵母就是音素): a \color{#FF0000}a a o \color{#FF0000}o o e \color{#FF0000}e e i \color{#FF0000}i i u \color{#FF0000}u u v \color{#FF0000}v v b p m f d t n l g k h j q x zh ch sh z c s y w  a i \color{blue}ai ai e i \color{blue}ei ei u i \color{blue}ui ui a o \color{blue}ao ao o u \color{blue}ou ou i u \color{blue}iu iu i e \color{blue}ie ie u e \color{blue}ue ue e r \color{blue}er er a n \color{blue}an an e n \color{blue}en en i n \color{blue}in in u n \color{blue}un un v n \color{blue}vn vn a n g \color{blue}ang ang e n g \color{blue}eng eng i n g \color{blue}ing ing o n g \color{blue}ong ong
除此之外,一般还会引入一个静音音素Slience(SIL)

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

音素
one W AA N
two T UW
three TH  R \color{red}R R IY
four F AO  R \color{red}R R
five F AY V
six S \color{green}S S IH K  S \color{green}S S
seven S \color{green}S S EH V AX N
eight EY T
nine N AY N
zero Z IY  R \color{red}R R OW

训练

每个音素均使用经典的三状态结构。在训练时需将音素序列的三状态结构相连。如图是单词one的单音素结构图:
语音识别入门第五节:基于GMM-HMM的语音识别系统_第6张图片

解码

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

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

  • 建模单元少,一般英文系统的音素数量在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的每个状态都有一个小的决策树。如下图所示:
语音识别入门第五节:基于GMM-HMM的语音识别系统_第7张图片
决策树非叶子节点常见的问题由:是否是元音、是否是爆破音、是否是鼻音、是否是摩擦音、是否是流音、位置信息等。
将一条一条的问题进行整合即为问题集,而问题集一般可通过语言学家定义或自动构建问题集,Kaldi中通过自顶向下的聚类自动构建问题集。

你可能感兴趣的:(语音识别入门,语音识别,人工智能,机器学习)