欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HMM+GMM语音识别

程序员文章站 2022-07-13 14:41:23
...

本文简明讲述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

HMM+GMM语音识别

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>

HMM+GMM语音识别

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

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的最大概率HMM+GMM语音识别

HMM+GMM语音识别为:从时刻t-1的哪个状态转移到时刻t时状态为j的概率最大;

进行Viterbi approximation过程如下:

HMM+GMM语音识别


然后根据记录的最可能转移状态序列HMM+GMM语音识别进行回溯:

HMM+GMM语音识别




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

HMM+GMM语音识别

HMM+GMM语音识别

fig2. GMM illustration and the probability of x



2.2 GMM for state sequence 

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

PS:sil表示silence(静音)

HMM+GMM语音识别

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


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

HMM+GMM语音识别

fig4. parameters of a GMM

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

HMM+GMM语音识别 , 其中 HMM+GMM语音识别


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

HMM+GMM语音识别

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)


HMM+GMM语音识别

fig6. complete process from speech frames to a state sequence


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


宏观图:

HMM+GMM语音识别

fig7. Speech recognition, a big framework

(from Encyclopedia of Information Systems, 2002)




<!--训练-->

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




①Training the params of GMM

GMM参数:高斯分布参数:HMM+GMM语音识别

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

HMM+GMM语音识别

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 下面的公式:)

HMM+GMM语音识别 , 其中 HMM+GMM语音识别





②Training the params of HMM

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

假设状态->observation服从单核高斯概率分布:HMM+GMM语音识别,则λ由两部分组成:


HMM+GMM语音识别


HMM训练过程:迭代

    E(estimate)-step: 给定observation序列,估计时刻t处于状态sj的概率 HMM+GMM语音识别

    M(maximization)-step: 根据HMM+GMM语音识别重新估计HMM参数aij. 

其中,


E-step: 给定observation序列,估计时刻t处于状态sj的概率 HMM+GMM语音识别

为了估计HMM+GMM语音识别, 定义HMM+GMM语音识别: t时刻处于状态sj的话,t时刻未来observation的概率。即HMM+GMM语音识别

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

即:

HMM+GMM语音识别

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


HMM+GMM语音识别

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

HMM+GMM语音识别

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

HMM+GMM语音识别: t时刻处于状态sj的话,t时刻未来observation的概率;

HMM+GMM语音识别

finally, 带入HMM+GMM语音识别的定义式有:

HMM+GMM语音识别

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






M-step:根据HMM+GMM语音识别重新估计HMM参数λ:

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

HMM+GMM语音识别

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

HMM+GMM语音识别

实际计算时,定义每一时刻的转移概率HMM+GMM语音识别为时刻t从si->sj的概率:

HMM+GMM语音识别

那么就有:

HMM+GMM语音识别

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

HMM+GMM语音识别

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





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





欢迎参与讨论并关注本博客和微博Rachel____Zhang, 后续内容继续更新哦

                        <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">1</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                                <div class="right-toolbox"><a href="https://blog.csdn.net/abcjennifer/article/details/27346787" target="_blank" class="jump-net-article">
                <svg t="1575545252354" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5597" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M243.9 1022.2c-62.3 0-124-23.8-171.5-70.8C26.4 905.5 1.5 845 1.5 779.9s24.9-125.6 70.8-171.5l184-184.1c45.9-45.9 106.4-70.8 171.5-70.8s125.6 24.9 171.5 70.8c18.1 18.1 18.1 47 0 65.1s-47 18.1-65.1 0c-28.3-28.3-65.7-43.5-105.9-43.5s-78.1 15.3-105.9 43.7l-184 184c-58.3 58.3-58.3 153.4 0 212.3 28.3 28.3 65.7 43.5 105.9 43.5s78.1-15.3 105.9-43.5l184-184c18.1-18.1 47-18.1 65.1 0 18.1 18.1 18.1 47 0 65.1l-184 184c-46.9 48-109.1 71.2-171.4 71.2z m523.7-423l184-184c94.5-94.5 94.5-248 0-342.5s-248-94.5-342.5 0l-184 184c-18.1 18.1-18.1 47 0 65.1s47 18.1 65.1 0l184-184c28.3-28.3 65.7-43.5 105.9-43.5s78.1 15.3 105.9 43.5c58.3 58.3 58.3 153.4 0 212.3l-184 184c-58.3 58.3-153.4 58.3-212.3 0-18.1-18.1-47-18.1-65.1 0-18.1 18.1-18.1 47 0 65.1 47 47 109.3 70.8 171.5 70.8s123.9-23.2 171.5-70.8z" p-id="5598"></path></svg>
                    站内首发文章</a></div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/brandon2015">
                    <img src="https://profile.csdnimg.cn/C/F/7/3_brandon2015" class="avatar_pic" username="brandon2015">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/1x/4.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/brandon2015" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">brandonyue</a></span>
                                            </div>
                    <div class="text"><span>发布了18 篇原创文章</span> · <span>获赞 34</span> · <span>访问量 28万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=brandon2015" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    </article>
    
    相关标签: 语音识别

    上一篇: 构图逻辑

    下一篇: wav格式