• GMM-HMM语音识别模型 原理篇


    本文简明讲述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:点击打开链接





    欢迎參与讨论并关注本博客和微博Rachel____Zhang, 兴许内容继续更新哦~






  • 相关阅读:
    37个绝对不容错过的HTML5教程和资源
    Google的自动驾驶汽车无事故成功完成30万英里的驾驶路程
    一个基于jQuery Mobile的移动设备实时幻灯javascript类库 taciónJS
    推荐免费黑色UI工具包下载
    分享一些前端开发人员必备的工具,脚本和资源
    使用HTML5画布实现的超棒javascript动画仪表板:gauge.js
    Google(谷歌)将打算在搜索结果中展示Gmail内容
    免费资源下载:30个用户界面工具栏图标设计
    一张超诡异的HTML图片“松鼠” 是图片同时也是web页面
    带给你设计灵感的30个超棒的暗色系网站设计
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3802911.html
Copyright © 2020-2023  润新知