精华内容
下载资源
问答
  • 用于隔离数字识别的简单GMM-HMM模型 简单的GMM和HMM模型的Python实现,用于隔离数字识别。 此实现包含3个模型: 单一高斯:使用具有对角协方差的单一高斯对每个数字进行建模。...cd gmm-hmm-asr && pip ins
  • 在这个项目中,我们要处理使用EM算法训练GMM-HMM的孤立单词数据。 测试阶段也考虑使用维特比算法。 结果表明,通过Matlab 编程获得的性能与HTK 的性能相似。 在运行这些程序之前,请先准备好训练和测试数据。 ...
  • 语音识别GMM-HMM

    2018-12-28 17:48:56
    语音识别GMM-HMM 模型 语音识别发展 人工智能 ASR 传统结合
  • 本文介绍基于GMM-HMM的语音识别系统,包括:孤立词、单音素、三音素识别系统。

    本文介绍GMM-HMM语音识别系统,虽然现在主流端到端系统,但是传统识别系统的学习是很有必要的。阅读本文前,需要了解语音特征提取、混合高斯模型GMM、隐马尔科夫模型HMM的基础知识(可以参考我的前几篇文章)。笔者能力有限,如有错误请指正!


    GMM-HMM语音识别系统的框架:

    1. 数据准备:数据源准备(wav/txt)、其他数据(词典、音素集等)、验证集、测试集
    2. 特征提取:MFCC
    3. 单音素GMM-HMM训练:单音素为三音素提供对齐
    4. 三音素GMM-HMM训练
    5. 解码

    语音识别的几个概念:

    • 对齐:音频和文本的对应关系
    • 训练:已知对齐,迭代计算模型参数
    • 解码:根据训练得到的模型参数,从音频推出文本

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

    问题简化,我们考虑(0-9)数字识别。整体思路:

    • 训练阶段,对于每个词用不同的音频作为训练样本,构建一个生成模型 P ( X ∣ W ) P(X|W) P(XW),W是词,X是音频特征(MFCC、Fbank参考这篇博客)
    • 解码阶段:给定一段音频特征,经过训练得到的模型,看哪个词生成这段音频的概率最大,取最大的那个词作为识别结果。

    X t e s t \mathbf{X}_{test} Xtest测试特征, P w ( X ) P_w(\mathbf{X}) Pw(X)是词 w w w的概率模型, v o c a b vocab vocab是词表:

    a n s w e r = arg ⁡ max ⁡ w ∈  vocab  P w ( X test  ) answer =\underset{w \in \text { vocab }}{\arg \max } P_{w}\left(\boldsymbol{X}_{\text {test }}\right) answer=w vocab argmaxPw(Xtest )

    假设我们给每个词建立了一个模型: P o n e ( X ) , P t w o ( X ) . . . P_{one}(X),P_{two}(X)... Pone(X),Ptwo(X)...,计算在每个词上的概率,选择所有词中概率最大的词作为识别结果。这样会有几个问题:用什么方法进行建模:DNN,GMM?这些够可以进行建模,但是语音任务的特点是序列性,不定长性,很难使用DNN、GMM直接进行建模。为了解决这些问题,我们可以利用HMM来进行序列建模。

    语音是一个序列, P w ( X ) P_w(X) Pw(X)可以用HMM的概率问题来描述,并且其中的观测是连续概率密度分布,我们可以为每个词建立一个GMM-HMM模型。

    建模

    语音识别中的GMM,采用对角GMM(协方差为对角阵),因为一般我们使用MFCC特征,MFCC特征各维之间已经做了去相关处理,各维之间相互独立,直接使用对角阵就可以描述,而且对角GMM参数量小。

    语音识别中的HMM,采用3状态,左右模型的HMM:

    • 为什么采用3状态?这是前人大量实验给出的经验值;
    • 左右模型的HMM:对于每个状态,它只能跳转到自身或者下一个状态。类似于人的发音过程,连续不可逆。

    HMM、GMM语音识别中如何结合?

    对于每个状态有一个GMM模型,对于每个词有一个HMM模型,当一段语音输入后,根据Viterbi算法得到一个序列在GMM-HMM上的概率,然后通过Viterbi回溯得到每帧属于HMM的哪个状态(对齐)。

    训练

    GMM-HMM模型参数:

    • 初始化参数(左右HMM):这参数没必要
    • 转移参数:自跳或者跳向下一个(两个参数)
    • 观测参数:混合系数、均值、方差

    Viterbi训练

    1. E步
      • Viterbi算法得到最优的状态序列(对齐),也就是在t时刻处于状态i上的概率(非0即1)
      • GMM模型中在t时刻处于状态i第k个GMM分量的概率
    2. M步
      • 更新转移参数、GMM参数(混合系数、均值、方差)
    3. 重复E、M步

    如何初始化GMM-HMM模型的参数?把语音进行均等切分,给每个状态分配对应的特征,然后去估计初始化的参数。

    前向后向训练(Baum-Welch训练)

    1. E步
      • 通过前向后向算法得到在时刻t处于状态i的概率
      • 在时刻t处于状态i且为GMM第k个分量的概率
    2. M步
      • 更新转移参数、GMM参数(混合系数、均值、方差)
    3. 重复E、M步

    Viterbi和Baum-Welch学习算法的详细内容参考我之前的文章。

    解码

    输入:各个词的GMM-HMM模型,未知的测试语音特征。

    输出:哪个词。

    主要关键点:对所有的词,如果计算 P w ( X t e s t ) P_w(X_{test}) Pw(Xtest)。可以通过:前向后算法,或者Viterbi算法(可以回溯到最优的状态序列),一般采用Viterbi算法。

    解码主要在图上做,我们现在看one two两个数字识别问题:

    构建HMM模型的拓扑图,下图是紧凑的解码图:

    通过Viterbi算法,找过最优的路径得到最终输出的词。那么如果我们需要对连续的多个词识别,需要如何建模?

    我们只需要再拓扑图上加一个循环连接,对于孤立词,如果达到了识别状态就结束了,对于连续词,如果达到了结束状态,就继续识别下一个词。每个HMM内部还是采用Viterbi算法,在每个时刻对于每个状态选择一条最大概率的路径。因为是并行的,在某个时刻,可能同时会有多个词达到结束状态,分别对应着一段路径,然后又要同时进行下一个词的识别,那么为了避免多余的计算,采用和Viterbi一样的思路,只选取最大概率的路径,扔掉其他。

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

    孤立词系统的缺点:

    • 建模单元数、计算量和词典大小成正比
    • OOV(out of Vocabulary)问题,训练中没有这个词,测试中存在这个词;
    • 词的状态数对每个词不用,长词使用的状态数更多

    为了克服上边的问题,采用音素建模。每个音素使用3状态结构:

    简化问题:假设一句话中包含一个单词,比如one(W AA N),我们可以很容易得到三个音素的HMM状态图,将状态图进行平滑连接得到one的一整个HMM,然后进行和上述孤立词相同的过程。

    问题:如果一句话中包含多个单词?

    这个采用和上述相同的方法,加入循环结构,当到达结束状态时进行下一个词的识别。

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

    单音素缺点:

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

    可以考虑音素的上下文,一般考虑前一个/后一个,称为三音素,表示为A-B+C。比如:KEEP K IY P => #-K+IY, K-IY+P, IY-P+#。

    问题1:假设有N个音素,一共有多少个三音素? N 3 N^3 N3

    问题2:有的三音素训练数据少或者不存在,怎么办?

    问题3:有的三音素在训练中不存在,但在测试中有怎么办?

    问题2和问题3通过参数共享解决,下文将介绍决策树。

    参数共享

    共享可以在不同层面:

    • 共享高斯模型:所有状态都用同样的高斯模型,只是混合权重不一样;
    • 共享状态:允许不同的HMM模型使用一些相同的状态;
    • 共享模型:相似的三音素使用同样的HMM模型。

    笔者主要介绍共享状态,可以采用自顶向下的拆分,建立决策树来聚类。

    三音素决策树

    决策树是一个二叉树,每个非叶子节点上会有一个问题,叶子节点是一个绑定三音素的集合。绑定的粒度为状态(A-B+C和A-B+D的第1个状态绑定在一起,并不表示其第二第三个状态也要绑定在一起),也就是B的每个状态都有一颗小的决策树。

    问题集

    常见的有:

    • 元音 AA AE AH AO AW AX AXR AY EH ER …
    • 爆破音 B D G P T K
    • 鼻音 M N NG
    • 摩擦音 CH DH F JH S SH TH V Z ZH
    • 流音 L R W Y

    问题集的构建:语言学家定义,Kaldi中通过自顶向下的聚类自动构建问题集。

    决策树构建

    初始条件类似图中的根节点,"*-zh+*",从问题集中选择合适的问题,分裂该节点,使相近的三音素分类到相同的节点上。假设根节点所有三音素对应的特征服从一个多元单高斯分布,可以计算出该单高斯分布的均值和方差,则可以计算出该节点任意一个特征在高斯上的似然。

    模型:假设其服从单高斯分布,并且各维独立,也就是对角GMM
    Pr ⁡ [ x ] = 1 ∏ k = 1 N ( 2 π σ k 2 ) 1 / 2 ∏ k = 1 N exp ⁡ ( − 1 2 ( x k − μ k ) 2 σ k 2 ) \operatorname{Pr}[x]=\frac{1}{\prod_{k=1}^{N}\left(2 \pi \sigma_{k}^{2}\right)^{1 / 2}} \prod_{k=1}^{N} \exp \left(-\frac{1}{2} \frac{\left(x_{k}-\mu_{k}\right)^{2}}{\sigma_{k}^{2}}\right) Pr[x]=k=1N(2πσk2)1/21k=1Nexp(21σk2(xkμk)2)
    似然
    L ( S ) = − 1 2 ∑ i = 1 m [ ∑ k = 1 N log ⁡ ( 2 π σ k 2 ) + ∑ k = 1 N ( x i k − μ k ) 2 σ k 2 ] = − 1 2 [ m ∑ k = 1 N log ⁡ ( 2 π σ k 2 ) + m ∑ k = 1 N σ k 2 σ k 2 ] = − 1 2 [ m N ( 1 + log ⁡ ( 2 π ) ) + m ∑ k = 1 N log ⁡ ( σ k 2 ) ] \begin{aligned} L(S) &=-\frac{1}{2} \sum_{i=1}^{m}\left[\sum_{k=1}^{N} \log \left(2 \pi \sigma_{k}^{2}\right)+\sum_{k=1}^{N} \frac{\left(x_{i k}-\mu_{k}\right)^{2}}{\sigma_{k}^{2}}\right] \\ &=-\frac{1}{2}\left[m \sum_{k=1}^{N} \log \left(2 \pi \sigma_{k}^{2}\right)+m \sum_{k=1}^{N} \frac{\sigma_{k}^{2}}{\sigma_{k}^{2}}\right] \\ &=-\frac{1}{2}\left[m N(1+\log (2 \pi))+m \sum_{k=1}^{N} \log \left(\sigma_{k}^{2}\right)\right] \end{aligned} L(S)=21i=1m[k=1Nlog(2πσk2)+k=1Nσk2(xikμk)2]=21[mk=1Nlog(2πσk2)+mk=1Nσk2σk2]=21[mN(1+log(2π))+mk=1Nlog(σk2)]

    假设通过某个问题将该节点的三音素对应的特征分成两部分(l 和 r),则这两部分的似然和为:
    L ( S l ) + L ( S r ) = − 1 2 m N ( 1 + log ⁡ ( 2 π ) ) − 1 2 [ m l ∑ k = 1 N log ⁡ ( σ l k 2 ) + m r ∑ k = 1 N log ⁡ ( σ r k 2 ) ] L\left(S_{l}\right)+L\left(S_{r}\right)=-\frac{1}{2} m N(1+\log (2 \pi))-\frac{1}{2}\left[m_{l} \sum_{k=1}^{N} \log \left(\sigma_{l k}^{2}\right)+m_{r} \sum_{k=1}^{N} \log \left(\sigma_{r k}^{2}\right)\right] L(Sl)+L(Sr)=21mN(1+log(2π))21[mlk=1Nlog(σlk2)+mrk=1Nlog(σrk2)]
    分裂前后的似然变化(增益)为:
    L ( S l ) + L ( S r ) − L ( S ) L\left(S_{l}\right)+L\left(S_{r}\right)-L(S) L(Sl)+L(Sr)L(S)
    似然增益越大,说明分裂后两部分数据之间的差异越大,则应该使用两个单独的GMM分别建模,则选择似然增益最大的问题进行划分(最优问题)。根节点一份为2后,递归执行该算法直至达到一定终止条件,通常是分裂达到一定数量的叶子节点或者似然增益已经低于一定阈值。

    总结

    1. 初始状态(单因素系统对齐,一个根节点)
    2. 选择一个节点,从问题集中选择似然增益最大的问题作为该节点问题,建立该节点左右子节点,并将该节点一分为二
    3. 重复2,直至满足一定的终止条件。

    基于GMM-HMM语音识别系统流程

    1. 数据准备:音素列表、词典、训练数据
    2. 特征提取:MFCC特征
    3. 单音素GMM-HMM:Viterbi训练
    4. 三音素GMM-HMM:三音素决策树、Viterbi训练
    5. 解码

    问题:为什么先做单音素训练?

    通过单音素模型上Viterbi算法得到与输入对应的最佳状态序列(对齐)。

    参考:

    https://blog.csdn.net/Magical_Bubble/article/details/90408095

    https://zhuanlan.zhihu.com/p/63753017

    展开全文
  • 基于GMM的0-9孤立词识别系统以词为训练单位,添加新词汇需要重新进行训练,若要涵盖所以词,差不多6万个词,训练量极大,预测时也要计算6万个模型的似然,哪个大预测出哪个,在实际应用中有局限性,只能应用于小词汇...

    本文来自公众号“每日一醒”

    基于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的后一个音素。

    使用三音素建模之后,引入了新的问题:

    1. N个音素,则共有N^3 个三音素,若N=100,则建模单元又太多了,每个音素有三个状态,每个状态对应的GMM参数,参数就太多了。

    2. 数据稀疏问题,有的三音素数据量很少

    3. 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从未在训练语料中出现过,通过决策树,我们最终将它绑定到一个与之相近的叶子节点上。

    通过单音素系统,我们可以得到单音素各个状态所有对应的特征集合,做一下上下文的扩展,我们可以得到三音素的各个状态所有对应特征集合。通过这样的方法,我们可以把训练数据上所有的单音素的数据对齐转为三音素的对齐。

    决策树的生成流程:

    1. 初始条件(单音素系统对齐,一个根节点)

    2. 选择当前所有待分裂的节点、计算所有问题的似然增益,选择使似然增益最大的节点和问题对该节点进行分裂。

    3. 直至算法满足一定条件终止。

    4 总结

    从单音素GMM-HMM到三音子GMM-HMM的过程就是发现问题,解决当前问题又引入了新问题,再解决新问题的过程。 单音素建模单元少,难以做到精细化建模,识别率不高,单音素发音受上下文影响。 为了优化或者说解决这些问题,引进三音子模型,导致建模单元又太多,所谓过犹不及。同时还出现数据稀疏问题,unseen data问题。 为了解决这些问题,引入带决策树的GMM-HMM模型,解决了上面问题。 为了提高识别率,在三音子GMM-HMM模型基础上,又用DNN模型取代GMM模型,达到了识别率明显的提升。

     ——————

    浅谈则止,细致入微AI大道理

    扫描下方“每日一醒”,选择“关注”公众号

    —————————————————————

      

      —————————————————————

    ▼下期预告▼

    AI大语音(九)——基于GMM-HMM的连续语音识别系统

    ▼往期精彩回顾▼

    AI大语音(一)——语音识别基础

    AI大语音(二)——语音预处理

    AI大语音(三)——傅里叶变换家族

    AI大语音(四)——MFCC特征提取

    AI大语音(五)——隐马尔科夫模型(HMM)

    AI大语音(六)——混合高斯模型(GMM)

    AI大语音(七)——基于GMM的0-9语音识别系统

    留你心,言你想

    展开全文
  • 动手搭建一个基于GMM-HMM的嵌入式命令词识别系统 。,。 写在前面 尽管如今基于深度学习的语音识别系统在性能上远远超过普通的语音识别系统,但是尝试去编写并理解一个传统语音识别系统也是一个非常有趣的过程。这个...

    动手搭建一个基于GMM-HMM的嵌入式命令词识别系统

    写在前面

    尽管如今基于深度学习的语音识别系统在性能上远远超过普通的语音识别系统,但是尝试去编写并理解一个传统语音识别系统也是一个非常有趣的过程。这个项目是我在写语音识别的大作业的时候写的,因为当时百度了半天发现网上竟然没有地方可以让我ctrl C+ctrl V,于是辛辛苦苦自己用numpy和scipy写了一个,由于找到的资料不足,这完全是一个我理解的嵌入式命令词识别系统,虽然有一定的效果,但其中还是有很多模糊的细节的,这不是一篇GMM-HMM的科普文章,所以读者需要先了解GMM-HMM的原理以及GMM-HMM的Viterbi训练方法。代码在此,整个项目除了音频特征提取部分,几乎完全基于numpy和scipy,这样代码也能很好帮助理解这个过程。

    准备

    首先明确这是一个基于GMM-HMM的嵌入式命令词识别系统,它和基于GMM-HMM的孤立词识别系统有很大不同,孤立词识别系统的很好的一个参考文章是这篇,下面将简要介绍两个模型的区别,图和说明都是为了表述而简化概念性版本,和我们实际操作的细节会有一些区别。

    简要地说,孤立词的GMM-HMM模型是每个需要识别的词对应一个GMM-HMM,如图所示
    在这里插入图片描述
    假设我们需要识别的词包括“前进”、“后退”、“左转”、“右转”,那么我们就会建立四个模型,每个模型对应其中的一个词,模型训练的时候,每个词的音频就用来训练其对应的GMM-HMM,最大化似然概率,训练完成之后,当我们遇到新的输入 x x x的时,我们把 x x x分别输入到这四个模型中,然后计算出四个似然概率,哪个大我们就认为 x x x是哪个词。

    在这个模型中,每个词的训练数据只用来训练它自己的GMM-HMM,而与其他词无关,因而称为一个孤立词识别系统,这样的模型搭建简单容易训练针对性强,但是你会发现它有个问题,明明左转和右转里都有一个“转”字,那“左转”和“右转”的音频里应该有相似的部分可以让模型从二者的共性中学的更好啊,而且,如果我要新加一个命令词“跳跃”,我就要重新收集数据然后训练这个GMM-HMM,在命令词较多或需要动态扩充命令词的时候就十分麻烦。

    因而,我们可以考虑建立一个嵌入式的GMM-HMM命令词识别系统,这个系统如图所示
    在这里插入图片描述
    我们不再把每个词对应一个GMM-HMM,而是把每个声韵母对应一个GMM-HMM,训练的时候,我们只需要将声韵母序列对应的GMM-HMM连接起来(具体怎么连实验步骤中有),然后训练,比如“前进”的声韵母序列是“q”,“ian”,“j”,“in”,因此我们只需要把“q”,“ian”,“j”,“in”分别对应的GMM-HMM连起来,然后来训练这个样本即可。当我们遇到新的输入 x x x的时,我们把 x x x分别输入到这四个连起来的GMM-HMM中,然后计算出四个似然概率,哪个大我们就认为 x x x是哪个词。

    由于我们的模型是音素级别的,当我们遇到需要识别的词时,我们只需要把对应的音素序列的GMM-HMM连接起来,这个过程就是一个嵌入的过程,因此称它为嵌入式的模型,注意到这个时候,我们甚至不需要准备“前进”、“后退”这样的训练数据,我们可以准备任意语音-句子对,只要保证我们的数据集中包括“q”,“ian”,“j”,“in”等音素即可,而且,当我们需要新增一个命令词“跳跃”时,我们只需要将“t”,“iao”,“y”,“ue”四个因素的GMM-HMM连接起来计算似然概率即可,无须重新训练模型,这样的模型可以用来识别几乎任意命令词(只要训练集中包含相应的音素),灵活性大大提高,只不过训练需要较多的数据、模型搭建较复杂。

    开始

    下面开始构建一个嵌入式命令词识别系统,其目的就是识别“前进”、“后退”、“左转”、“右转”

    数据准备

    首先来了解一下训练数据到底是什么样的,录音总共350句话,一句话对应一个音频,内容举例:

    • 毛巾上有一个洞。
    • 很抱歉,他们都在忙。很抱歉,他们都在忙。
    • 你能帮我将这个东西抬起来吗?
    • 请问,这个座位有人坐了吗?

    可以看到,这些数据并没有刻意为“前进”等命令词准备,而是随机的日常对话。

    为了建立嵌入式的音素级命令词识别系统,我们需要首先将这些句子都转化成音素序列,这里我用的是DaCiDian,里面有每个字对应的音素,其实就是一个简单的字到音素的映射过程,转化结果如下
    在这里插入图片描述
    其中sil代表silence,因为每段录音的前后总会有一段静音的时间,需要在HMM里加入sil音素来对应这段时间的音频,这里的音素我使用的是带声调的版本。实际转化中存在多音字的错误问题,然而无伤大雅,只要一致即可,因此没有人为去处理这些问题(主要是因为懒),最后一共有181种音素。

    我们日常说话中,说出来的各个音素的次数都是不同的,在这个数据集中,不同音素的出现次数如图所示
    在这里插入图片描述
    其中,出现次数前五的音素分别是:’sil’ 700次,’i_0’413次,’y’390次,’d’387次,’sh’264次,出现次数仅为1次的音素有10种,这种不平衡问题会导致出现次数较少的音素所对应的模型无法得到充分训练,由于我们使用的是GMM-HMM模型,GMM模型在数据少的时候协方差矩阵难以估计,因此,将所有出现次数小于5次的音素使用特殊音素’UNK’替代,采用这种方法,数据集中总共有27类共67出现频次的音素被“UNK”替代,最后得到的音素类别为155个。

    音频特征我们使用各个维度独立的13维MFCC特征,这也是我们GMM模型的重要假设。

    模型建立及初始化

    因为GMM-HMM是使用EM算法进行训练,所以需要参数初始化

    HMM初始化

    根据数据预处理结果,我们需要建立155个GMM-HMM模型,这里我们每个音素的GMM-HMM采用通常的参数设置方法,其HMM共有4个状态(省略了开始状态),除了结束状态,中间三个状态都为发射状态(一般我们认为它们分别对应音素的开始,中间和结束),每个发射状态对应一个由3个高斯分布组成的GMM,然后先初始化HMM的初始分布和状态转移矩阵,以uang_1为例:
    在这里插入图片描述

    GMM初始化

    那么如何来初始化每个状态对应的GMM呢?为了初始化GMM,我们需要把音素的GMM-HMM连起来,之前说了很多遍连起来,具体怎么连还是看下图,这是一个我对“彩虹”连接的示例
    在这里插入图片描述
    其实就是将GMM-HMM首尾相连嘛,连接之后,去掉中间的end状态,仅保留最后的end状态(包括之前去掉start状态,这些是我为了我编程时的方便的做法,具体操作因人而异),连接好之后,还需要将参数整合到一起,如果音素的小HMM转移矩阵如上图所示,那么连接后的大HMM的转移矩阵就是

    A = [ 0.1 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.8 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.8 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.8 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.7 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.7 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.7 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.6 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.6 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.6 0 0 0 0 0 0 0 0 0 0 0 0 1 ] A= \left[ \begin{matrix} 0.1 & 0.9 & 0 & 0 & 0&0&0&0&0&0&0&0&0 \\ 0& 0.1 & 0.9 & 0 & 0&0&0&0&0&0&0&0&0 \\ 0& 0 & 0.1 & 0.9 & 0&0&0&0&0&0&0&0&0 \\ 0& 0 & 0 & 0.2 & 0.8&0&0&0&0&0&0&0&0 \\ 0& 0 & 0 & 0 & 0.2&0.8&0&0&0&0&0&0&0 \\ 0& 0 & 0 & 0 & 0&0.2&0.8&0&0&0&0&0&0 \\ 0& 0 & 0 & 0 & 0&0&0.3&0.7&0&0&0&0&0 \\ 0& 0 & 0 & 0 & 0&0&0&0.3&0.7&0&0&0&0 \\ 0& 0 & 0 & 0 & 0&0&0&0&0.3&0.7&0&0&0 \\ 0& 0 & 0 & 0 & 0&0&0&0&0&0.4&0.6&0&0 \\ 0& 0 & 0 & 0 & 0&0&0&0&0&0&0.4&0.6&0 \\ 0& 0 & 0 & 0 & 0&0&0&0&0&0&0&0.4&0.6 \\ 0& 0 & 0 & 0 & 0&0&0&0&0&0&0&0&1 \\ \end{matrix} \right] A=0.10000000000000.90.10000000000000.90.10000000000000.90.20000000000000.80.20000000000000.80.20000000000000.80.30000000000000.70.30000000000000.70.30000000000000.70.40000000000000.60.40000000000000.60.40000000000000.61
    显然,初始的状态分布应该是
    π = [ 1 , 0 , 0 , . . . , 0 ] \pi=[1,0,0,...,0] π=[1,0,0,...,0]
    而对于GMM参数,因为每个状态与其自己的GMM状态参数一一对应,所以在连接的时候也不需要什么特别的操作。

    当然回到主题,这里连接GMM-HMM是为了初始化GMM参数,见下图:
    在这里插入图片描述
    与HMM不同,我们需要根据音频特征来初始化GMM的参数(因为GMM-HMM的训练对GMM初始参数很敏感,因此不能像HMM那样随便初始化),我们首先来数一数上图中的发射状态数,共有12个,假设T=24,那么每个状态就会分到两个特征,具体地,就是第一个s1分到o1 o2,第一个s2分到o3 o4,以此类推,就是通过均分特征序列将两个序列有序地对齐起来。

    注意到我们每个音素不仅仅是在一个句子中出现(甚至也会在一句话中出现多次),因此在我们对整个数据集进行此操作之后,每个音素的三个状态都会被分配到很多特征,从而我们可以对每个音素每个状态对应的GMM进行初始化(使用k-means算法),这样我们就初始化好了GMM的参数。

    训练

    初始化完成后,我们终于可以开始训练模型啦,这里使用的是Viterbi训练方法,整个过程是一个EM算法,分为E步和M步,概括地说,在E步,我们用当前参数重新根据Viterbi算法计算出一个特征和状态的对齐结果(刚刚初始化的时候我们用的是平均分割的对齐方法),然后在M步我们根据新的对齐结果重新估计参数。其实前面两个步骤理解完成之后,这个步骤就相对简单了。

    E step

    E步的时候就是重算对齐结果,这里直接使用Viterbi算法就可以了,如果不了解可以直接看网上的关于Viterbi算法的教程,简单说,我们使用了Viterbi算法,就可以计算出一个新的特征序列和状态序列的对齐结果,也就是知道哪些特征对应哪些状态,从而可以继续进行M step,下面就是一个Viterbi对齐结果
    在这里插入图片描述
    这里呢,在E step额外要做的就是使用前向算法计算每个训练数据的似然概率,然后计算整个数据集的平均似然概率,作为模型训练程度的一个参考数值,通过前后两轮的似然概率之差,我们可以决定在何时终止模型的训练。

    在整个数据集上完成上述操作即可开始M step

    M step

    在M step,我们需要重新估计模型的参数,这些参数包括HMM的状态转移矩阵,以及GMM的参数,首先,对于HMM的状态转移矩阵参数估计,其本质上就是个数数的过程,以上图的结果为例,s1对应o1 o2 o3,s2对应o4 o5,s3对应o7 o8,第二个s1对应o9 o10 o11 o12,那么第一个s1就有两次转移到自身(o1->o2, o2->o3),一次转移到s2(o3->o4),因此 A 11 = p ( s 1 → s 1 ) = 2 3 A_{11}=p(s_1\rightarrow s_1)=\frac{2}{3} A11=p(s1s1)=32 A 12 = p ( s 1 → s 2 ) = 1 3 A_{12}=p(s_1\rightarrow s_2)=\frac{1}{3} A12=p(s1s2)=31,之后的各个转移概率就这样一个个更新,需要注意的是,这里举的例子是一个语音——状态对的统计结果,实际训练时,我们是按照整个训练集上的统计结果进行状态转移矩阵更新的。

    对于GMM的参数,那就更简单了,每个状态直接根据被分配到的特征来更新(k-means初始化或者训练GMM)就可以了

    训练过程

    模型在整个数据集上的对数似然和训练轮次如图所示
    在这里插入图片描述
    在验证集(专门录制的“前进”、“后退”、“左转”、“右转”每个5句共20句的数据集)上的准确率如图所示
    在这里插入图片描述
    可以看到模型的验证集最好的结果是95%准确率,模型训练初始阶段平均对数似然不断上升,随后发生震荡。

    训练结果

    Viterbi算法最有趣的部分就是它可以对其两个序列,而无需我们进行这种精度的标注,最后95%准确率模型的Viterbi对齐结果示例如图所示:
    在这里插入图片描述
    可以看到对齐的结果还是很准的哈,这种模型的解释性也就挺好,嘻嘻。

    细节问题

    为了行文的顺畅,很多细节问题都没有加以讨论,在此简单讨论其中几个关键问题

    过拟合问题

    其实最开始写完模型,是有严重的过拟合问题的,模型几乎瞬间在验证集上达到顶峰,随后一直在25%不变,为了解决这个问题,我选择了13维的MFCC特征而不是通常差分过的39维MFCC特征,这样减少了GMM的参数,一定程度上降低了过拟合问题,另一个想到的解决方法是使用不带声调的声韵母系统,不过我还没尝试。

    数值问题

    用numpy和scipy从零开始搭这个系统,就需要自己解决其中存在的很多数值问题,比如有的音素的状态的GMM中某个高斯的协方差矩阵数值太小等问题,当然,导致这些问题的原因其实也是数据量不均匀,有的音素数据多,有的音素数据少,就使得你不可能单纯通过降低模型参数来解决这个问题(会导致数据多的音素欠拟合),为了解决这个问题,代码中我但凡碰到这种协方差矩阵,就将该高斯直接从GMM成分中舍弃,这样做其实是建立了一个动态K的GMM模型。

    标点符号

    日常用语中带停顿的标点符号我也按照通常的做法使用’sp’音素代替了

    GMM

    我在hmm_learn里面看到他们会使用协方差的对角矩阵来简化协方差矩阵,也算是减少参数的方法,因此我所有的GMM中使用的也是对角矩阵

    参数重估

    HMM的状态转移参数重估的时候我加入了平滑,也就是分母和分子都+1,来保护一些较小的转移概率

    GMM的参数重估方法我仅仅用K-means对其进行重新初始化了,这里我实在不清楚到底是要将GMM训练到收敛还是仅仅重新初始化它,因此我选了一个比较快的方法

    LogSumExp

    永远不要自己尝试去写什么logsumexp softmax之类的东西,就算你知道算的时候要减去一个最大值来保证exp的数值稳定,可你写的还是会爆炸…

    End

    好了,本文尝试描述了一个嵌入式的GMM-HMM系统,虽然文题是动手写,可是文章完全没有一点代码(标题党?),所有代码和数据集都在这里,并且配有一定程度的注释,其实理解了过程后自己写代码也就轻松多了,很多地方的写法因人而异,所以我觉得也没必要贴代码。虽然写的过程中遇到了很多问题,但是回过头来看,整个过程还是很有趣的~只是写代码的时候就忘了吃饭,这次写博客又忘了吃饭,好饿啊…能不能给个start当我的精神食粮(#^.^#)

    展开全文
  • GMM-HMM 详解

    千次阅读 2019-03-20 20:50:53
    本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程。这篇blog只回答三个问题: 1.什么是Hidden Markov Model? HMM要解决的三个问题: 1) Likelihood 2) Decoding 3) Training 2. GMM是神马?怎样用GMM求...

    本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程。这篇blog只回答三个问题:

    1. 什么是Hidden Markov Model

    HMM要解决的三个问题:

    1) Likelihood

    2) Decoding

    3) Training

    2. GMM是神马?怎样用GMM求某一音素(phoneme)的概率?

     

    3. GMM+HMM大法解决语音识别

    3.1 识别

    3.2 训练

    3.2.1 Training the params of GMM

    3.2.2 Training the params of HMM

     

     

     

    首先声明我是做视觉的不是做语音的,迫于**需要24小时速成语音。上网查GMM-HMM资料中文几乎为零,英文也大多是paper。苦苦追寻终于貌似搞懂了GMM-HMM,感谢语音组老夏(http://weibo.com/ibillxia)提供资料给予指导。本文结合最简明的概括还有自己一些理解应运而生,如有错误望批评指正。

     

    ====================================================================

     

     

    1. 什么是Hidden Markov Model

    ANS:一个有隐节点(unobservable)和可见节点(visible)的马尔科夫过程(见详解)。

    隐节点表示状态,可见节点表示我们听到的语音或者看到的时序信号。

    最开始时,我们指定这个HMM的结构,训练HMM模型时:给定n个时序信号y1...yT(训练样本), 用MLE(typically implemented in EM) 估计参数:

    1. N个状态的初始概率

    2. 状态转移概率a

    3. 输出概率b

    --------------

     

    • 在语音处理中,一个word由若干phoneme(音素)组成;
    • 每个HMM对应于一个word或者音素(phoneme)
    • 一个word表示成若干states,每个state表示为一个音素

     

    用HMM需要解决3个问题:

    1). Likelihood: 一个HMM生成一串observation序列x的概率< the Forward algorithm>

    其中,αt(sj)表示HMM在时刻t处于状态j,且observation = {x1,...,xt}的概率

    aij是状态i到状态j的转移概率,

    bj(xt)表示在状态j的时候生成xt的概率,

     

     

     

     

     

     

    2). Decoding: 给定一串observation序列x,找出最可能从属的HMM状态序列< the Viterbi algorithm>

     

    在实际计算中会做剪枝,不是计算每个可能state序列的probability,而是用Viterbi approximation:

    从时刻1:t,只记录转移概率最大的state和概率。

    记Vt(si)为从时刻t-1的所有状态转移到时刻t时状态为j的最大概率:

    为:从时刻t-1的哪个状态转移到时刻t时状态为j的概率最大;

    进行Viterbi approximation过程如下:

     

    然后根据记录的最可能转移状态序列进行回溯:

     

     

     

    3). Training: 给定一个observation序列x,训练出HMM参数λ = {aij, bij}  the EM (Forward-Backward) algorithm

    这部分我们放到“3. GMM+HMM大法解决语音识别”中和GMM的training一起讲

     

     

     

     

     

     

     

    ---------------------------------------------------------------------

     

    2. GMM是神马?怎样用GMM求某一音素(phoneme)的概率?

    2.1 简单理解混合高斯模型就是几个高斯的叠加。。。e.g. k=3

    fig2. GMM illustration and the probability of x

     

     

    2.2 GMM for state sequence 

    每个state有一个GMM,包含k个高斯模型参数。如”hi“(k=3):

    PS:sil表示silence(静音)

    fig3. use GMM to estimate the probability of a state sequence given observation {o1, o2, o3}

     

    其中,每个GMM有一些参数,就是我们要train的输出概率参数

    fig4. parameters of a GMM

    怎么求呢?和KMeans类似,如果已知每个点x^n属于某每类 j 的概率p(j|x^n),则可以估计其参数:

     , 其中 

     

    只要已知了这些参数,我们就可以在predict(识别)时在给定input sequence的情况下,计算出一串状态转移的概率。如上图要计算的state sequence 1->2->2概率:

    fig5. probability of S1->S2->S3 given o1->o2->o3

     

     

     

     

     

     


    ---------------------------------------------------------------------

    3. GMM+HMM大法解决语音识别

    <!--识别-->

    我们获得observation是语音waveform, 以下是一个词识别全过程:

    1). 将waveform切成等长frames,对每个frame提取特征(e.g. MFCC), 

    2).对每个frame的特征跑GMM,得到每个frame(o_i)属于每个状态的概率b_state(o_i)

     

    fig6. complete process from speech frames to a state sequence

     

    3). 根据每个单词的HMM状态转移概率a计算每个状态sequence生成该frame的概率; 哪个词的HMM 序列跑出来概率最大,就判断这段语音属于该词

     

    宏观图:

    fig7. Speech recognition, a big framework

    (from Encyclopedia of Information Systems, 2002)

     

     

     

    <!--训练-->

    好了,上面说了怎么做识别。那么我们怎样训练这个模型以得到每个GMM的参数和HMM的转移概率什么的呢?

     

     

     

    ①Training the params of GMM

    GMM参数:高斯分布参数:

    从上面fig4下面的公式我们已经可以看出来想求参数必须要知道P(j|x),即,x属于第j个高斯的概率。怎么求捏?

    fig8. bayesian formula of P( j | x )

    根据上图 P(j | x), 我们需要求P(x|j)和P(j)去估计P(j|x). 

    这里由于P(x|j)和P(j)都不知道,需要用EM算法迭代估计以最大化P(x) = P(x1)*p(x2)*...*P(xn):

    A. 初始化(可以用kmeans)得到P(j)

    B. 迭代

        E(estimate)-step: 根据当前参数 (means, variances, mixing parameters)估计P(j|x)

        M(maximization)-step: 根据当前P(j|x) 计算GMM参数(根据fig4 下面的公式:)

     , 其中 

     

     

     

     

    ②Training the params of HMM

    前面已经有了GMM的training过程。在这一步,我们的目标是:从observation序列中估计HMM参数λ;

    假设状态->observation服从单核高斯概率分布:,则λ由两部分组成:

     

     

    HMM训练过程:迭代

     

        E(estimate)-step: 给定observation序列,估计时刻t处于状态sj的概率 

        M(maximization)-step: 根据重新估计HMM参数aij. 

    其中,

     

    E-step: 给定observation序列,估计时刻t处于状态sj的概率 

    为了估计, 定义: t时刻处于状态sj的话,t时刻未来observation的概率。即

    这个可以递归计算:β_t(si)=从状态 si 转移到其他状态 sj 的概率aij * 状态 i 下观测到x_{t+1}的概率bi(x_{t+1}) * t时刻处于状态sj的话{t+1}后observation概率β_{t+1}(sj)

    即:

    定义刚才的为state occupation probability,表示给定observation序列,时刻t处于状态sj的概率P(S(t)=sj | X,λ) 。根据贝叶斯公式p(A|B,C) = P(A,B|C)/P(B|C),有:

     

     

    由于分子p(A,B|C)为

    其中,αt(sj)表示HMM在时刻t处于状态j,且observation = {x1,...,xt}的概率

    : t时刻处于状态sj的话,t时刻未来observation的概率;

    finally, 带入的定义式有:

     

     

    好,终于搞定!对应上面的E-step目标,只要给定了observation和当前HMM参数 λ,我们就可以估计了对吧 (*^__^*) 

     

     

     

     

     

    M-step:根据重新估计HMM参数λ:

    对于λ中高斯参数部分,和GMM的M-step是一样一样的(只不过这里写成向量形式):

    对于λ中的状态转移概率aij, 定义C(Si->Sj)为从状态Si转到Sj的次数,有

    实际计算时,定义每一时刻的转移概率为时刻t从si->sj的概率:

    那么就有:

    把HMM的EM迭代过程和要求的参数写专业点,就是这样的:

    PS:这个训练HMM的算法叫 Forward-Backward algorithm。

     

     

     

     

    一个很好的reference:点击打开链接

     

    from: http://blog.csdn.net/abcjennifer/article/details/27346787

    展开全文
  • 在理论上,LP技术得到进一步发展,动态时间归正技术(DTW)基本成熟,特别是提出了矢量量化(VQ)和隐马尔可夫模型(HMM)理论。在实践上,实现了基于线性预测倒谱和DTW技术的特定人孤立语音识别系统。80年代,语音...
  • 根据人体姿态的传感器数据特点将人体姿态划分为4个阶段, 使用高斯混合模型(Gaussian Mixture Model, GMM)拟合人体姿态的观测序列, 结合隐马尔可夫模型(Hidden Markov Model, HMM), 利用GMM-HMM算法进行姿态识别....
  • 本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程。1. 什么是Hidden Markov Model?HMM要解决的三个问题:1) Likelihood2) Decoding3) Training2. GMM是什么?怎样用GMM求某一音素(phoneme)的概率?3. ...
  • 上一专题GMM-HMM声学模型中讲述了其理论知识,这一章利用理论搭建一套GMM-HMM系统,来识别连续0123456789的英文语音。 本系统是单音素,未涉及后面三音子的训练以及决策树的内容。 在GMM专题和HMM专题中分别讲述...
  • hmm模型matlab代码HMM-GMM 这是我个人实现的隐马尔可夫模型和高斯混合模型,这是统计机器学习中的两个经典生成模型。 HMM是在无监督的情况下进行训练的,代码实现了前向后退算法,以在给出部分/全部观测值的任何时间...
  • kaldi:训练GMM-HMM 训练三音子模型 第一步: steps/train_deltas.sh Usage: steps/train_deltas.sh <num-leaves> <tot-gauss> <data-dir> <lang-dir> <alignment-dir> <exp-dir> e.g.: steps/train_deltas.sh 2000 ...
  • 关于GMM作用的理解: GMM是为了后续HMM所服务的 GMM是对所有的triphone进行聚类,输入是MFCC,输出是在不同triphone下的概率值 ...语音识别中的HMM-GMM模型:从一段语音说起 传统语音识别(GMM+HMM) ...
  • GMM-HMM孤立词识别

    2019-09-19 16:45:34
    之前做过的GMM-HMM孤立词识别,现在整理一下。 这里我们把输入的语音当做语音识别中的一个音素来建模,假定建模的HMM状态链是7状态的,因此,孤立词识别就是只用到了声学模型部分,没有涉及语言模型这些。 1、将...
  • GMM-HMM方法(滑动查看解码) DNN-HMM方法(滑动查看解码) (点击查看大图) 实践项目 本门课程采用理论与实践相结合的教学方式,通过8个实践项目,让大家将课上所学知识,即学即用,通过亲自动手实践达到灵活掌握...
  • gmm-hmm到dnn-hmm

    2019-11-11 16:37:46
    gmm-hmm就是把我们的特征用混合高斯模型区模拟,然后把均值和方差输入到hmm的模型里。 (2)dnn-hmm的模型图 (3)dbn-hmm的模型图 3、语言模型 对训练文本数据库进行语法、语义分析,经过基于统计模型训练...
  • Kaldi GMM-HMMGMM成分更新过程
  • GMM-HMM kaldi 详解

    千次阅读 2019-04-09 09:00:34
    而且掌握HMM-GMM结构,对于深入理解语音识别过程是由有一定好处的。 但对于外行(比如像我这种从机械行业转行到语音识别领域的人)或者刚接触语音识别的人来说,要弄懂HMM-GMM结构还是要花不少时间的,因为语音识别...
  • 都知道语音识别有GMM-HMM模型,也分别了解了什么是: GMM(混合高斯模型)https://blog.csdn.net/qq_37385726/article/details/89198387 MMC(马尔可夫链)...
  • GMM-HMM理解

    千次阅读 2017-12-03 12:13:47
    本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程。这篇blog只回答三个问题: 1. 什么是Hidden Markov Model? HMM要解决的三个问题: 1) Likelihood 2) Decoding 3) Training 2. GMM是...
  • 基于GMM-HMM语音识别系统的算法推导(全)

    千次阅读 热门讨论 2019-04-21 14:55:21
    最近研究完CTC,转而研究GMM-HMM; 参考文献:《语音识别实践》;《数学之美》;清华大学开源资料;爱丁堡大学语音识别课件;以及一些高校本硕博学位论文; 本文将会刷新你对GMM-HMM的认识,以及对EM算法加深...
  • https://www.bilibili.com/video/BV1KA411b7Q9/
  • GMM-HMM语音识别模型 原理篇
  • 在看kaldi文档中对chain model的介绍时,...而且前几天分别看了GMMHMM,各自原理大概明白了,但是还不太清楚它们是怎么和语音识别联系起来的,今天特地看了几篇博客去了解了一下GMMHMM具体是如何和语音识别联...
  • GMM-HMM学习笔记

    万次阅读 多人点赞 2015-07-17 16:31:23
    最近几天钻研了语音处理中的GMM-HMM模型,阅读了一些技术博客和学术论文,总算是对这个框架模型和其中的算法摸清了皮毛。在这里梳理一下思路,总结一下这几天学习的成果,也是为以后回顾时提高效率。 本文主要结合...
  • 都知道语音识别有GMM-HMM模型,也分别了解了什么是: GMM(混合高斯模型)https://blog.csdn.net/qq_37385726/article/details/89198387 MMC(马尔可夫链)...
  • 基于GMM-HMM和深层循环神经网络的复杂噪声环境下的语音识别.pdf
  •   本文讲阐述在语音识别中GMM-HMM的知识。其中包括了对GMM(Gauss Mixture Model)和HMM(Hidden Markov Model)的定义、原理及其算法的介绍。 GMM(高斯混合模型)   设有随机变量X,则混合高斯模型可以用...
  • 尽管基于GMM-HMM的语音识别模型已基本被神经网络所取代,但其背后的思想和处理方式仍需要我们仔细学习。 第四讲 自动语音识别(automaic speech recognition)就是建立一个将声学信号转化为文字的系统,而自动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,296
精华内容 1,318
关键字:

gmm-hmm