本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程。

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

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

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

好了,上面说了怎么做识别。那么我们怎样训练这个模型以得到每个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迭代过程和要求的参数写专业点,就是这样的:

GMM-HMM语音识别原理详解 - 全文相关推荐

  1. NLP --- 隐马尔可夫HMM(概念详解、三个基本问题详解)

    本节将进入隐马尔可夫环节,再次提醒不懂马尔科夫过程的同学建议先搞懂什么是马尔科夫过程,什么是马尔科夫链,同时需要懂一点语言模型的知识,下面会用到一点点,本人打算详细总结隐马尔可夫算法思想,因此讲解的会 ...

  2. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  3. Git 原理详解及实用指南

    Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...

  4. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  5. 【幻灯片分享】Siri:I,robot! Siri语音识别系统详解 | 新浪 张俊林 | iOS DevCamp

    iOS平台应用详解:<Siri:I,robot! Siri语音识别系统详解> | iOS DevCamp 话题简介:Siri是苹果公司发布的广受关注的iOS平台应用,它不仅仅是一套语音识别 ...

  6. 电路计算机仿真的优点,施密特触发器电路及工作原理详解_施密特触发器特点_施密特触发器的作用...

    描述 什么是施密特触发器 施密特触发器(Schmidt trigger)是包含正回授的比较器电路.它也有两个稳定状态,但与一般触发器不同的是,施密特触发器采用电位触发方式,其状态由输入信号电位维持:对 ...

  7. 卷积神经网络CNN原理详解(一)——基本原理

    卷积神经网络CNN原理详解(一)--基本原理 转载过来为了自己以后学习方便,大家请看原文章 为什么要用神经网络? 特征提取的高效性. 大家可能会疑惑,对于同一个分类任务,我们可以用机器学习的算法来做, ...

  8. 【语音识别技术详解】如何让机器更好地理解人类语音

    作者:禅与计算机程序设计艺术 <61. [语音识别技术详解]如何让机器更好地理解人类语音> 引言 1.1. 背景介绍 随着科技的发展,人工智能在语音识别领域取得了长足的发展,语音识别技术已 ...

  9. 负电压是怎么产生的?负压电路工作原理详解

    负电压是怎么产生的?负压电路工作原理详解 2019-07-29 21:39:29 燚智能物联网知识 简介 在电子电路中我们常常需要使用负的电压,比如说我们在使用运放的时候常常需要给他建立一个负的电压. ...

最新文章

  1. 代码 删除的stach 找回_阿里大佬教你,如何写好 Java 代码!
  2. python导入excel数据-如何把python中的数据导入excel
  3. power bi报表服务器_如何将Power BI Report Server报表嵌入ASP.Net Web应用程序
  4. 神经网络模型压缩优化方法
  5. redis php web管理,redis web界面管理工具 phpredisadmin
  6. 汇编语言程序设计 实验6 分支程序设计
  7. 安装搭配VUE使用的UI框架ElementUI
  8. recovery 恢复出厂设置失败Data wipe failed
  9. 【小镇的技术天梯】黑客技术(1) MITM-中间人攻击
  10. 前端生成二维码图片以及条形码图片
  11. rdp远程Windows10连接不上的解决方案
  12. 深度学习从入门到精通——生成对抗网络原理
  13. vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。
  14. 微信小程序中实现——【音乐播放器】
  15. 说说Wireshark(抓包)
  16. 隐私计算技术实现数据要素安全可信流通
  17. 存款准备金率灾后再度上调
  18. 19. linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解
  19. 如何让你的python程序,在未来某个时间去做一件事情
  20. 2014年广东省java程序员竞赛获奖名单,广东省中山大学2014年自主招生候选资格名单公示(学科竞赛特长生)...

热门文章

  1. python语言的jenkinapi
  2. Java中父类强制转换为子类的可能
  3. 免费素材大荟萃:免费图标和UI设计
  4. PHPCMS 模板标签
  5. ubuntu安装deb,rpm安装包方法
  6. UVA12554 A Special Happy Birthday Song!!!【水题】
  7. Go语言的素数对象编程实现及其使用
  8. CCF NOI1089 高精度运算
  9. CCF201412-2 Z字形扫描(解法二)(100分)【废除!!!】
  10. Bailian2928 POJ NOI0113-05 素数回文数的个数【数论】