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, 兴许内容继续更新哦~
GMM-HMM语音识别模型 原理篇的更多相关文章
- (转载)微软数据挖掘算法:Microsoft 神经网络分析算法原理篇(9)
前言 本篇文章继续我们的微软挖掘系列算法总结,前几篇文章已经将相关的主要算法做了详细的介绍,我为了展示方便,特地的整理了一个目录提纲篇:大数据时代:深入浅出微软数据挖掘算法总结连载,有兴趣的童鞋可以点 ...
- Cesium原理篇:3最长的一帧之地形(2:高度图)
这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面. 此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...
- 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)
1.点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量).消息多端同步.消息顺序保证等,是典型的IM技术难点. 就像即时通讯网整理的以下IM开发干货系列一样: <I ...
- (zhuan) 深度学习全网最全学习资料汇总之模型介绍篇
This blog from : http://weibo.com/ttarticle/p/show?id=2309351000224077630868614681&u=5070353058& ...
- xgboost入门与实战(原理篇)
sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...
- [NLP] TextCNN模型原理和实现
1. 模型原理 1.1 论文 Yoon Kim在论文(2014 EMNLP) Convolutional Neural Networks for Sentence Classification提出Te ...
- OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传
视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...
- 隐马尔可夫(HMM)模型
隐马尔可夫(HMM)模型 隐马尔可夫模型,是一种概率图模型,一种著名的有向图模型,一种判别式模型.主要用于时许数据建模,在语音识别.自然语言处理等领域广泛应用. 概率图模型分为两类,一类:使用有向无环 ...
- Holt-Winters模型原理分析
Holt-Winters模型原理分析及代码实现(python) from:https://blog.csdn.net/u010665216/article/details/78051192 引言 最近 ...
随机推荐
- 【进阶——种类并查集】hdu 1829 A Bug's Life (基础种类并查集)TUD Programming Contest 2005, Darmstadt, Germany
先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组 ...
- [视频监控]用状态机图展示Layout切换关系
监控系统通常会提供多种Layout给用户,用于满足不同需求,如:高清显示单路视频或者同时观察多路监控情况. 文中系统只提供了单路.2x2(2行2列共4路).8路(4行4列布局,从左上角算起,有个核心显 ...
- HDU5787 K-wolf Number 数位dp
分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...
- Linux基本命令(2)有关磁盘空间的命令
有关磁盘空间的命令 命令 功能 mount 挂载文件系统 umount 卸载已挂载上的文件系统 df 检查各个硬盘分区和已挂上来的文件系统的磁盘空间 du 显示文件目录和大小 fsck 主要是检查和修 ...
- pycharm 源文件 编码格式
pycharm 4.5.3 版本 修改项目的编码 按如下操作:菜单 File-Settings-Editor-File Encodings 将IDE Encoding 和 Project Encodi ...
- DOM笔记(三):Element接口和HTMLElement接口
一.Element接口 Element接口表示一个元素,该接口扩展自Node接口,自然继承了Node接口的属性和方法,也有一套针对元素的属性和方法. Element接口常见的属性比较少,常用的就是一个 ...
- 纯CSS制作冒泡提示框
来源:http://www.ido321.com/1214.html 前两天翻译了一篇文章,关于利用css的border属性制作基本图形:http://www.ido321.com/1200.html ...
- [LeetCode] Ugly Number (A New Question Added Today)
Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...
- <Chapter 2>2-1-1.安装Python SDK
App Engine包含两个Python运行时环境:一个基于Python2.5的传统环境,以及一个运行Python2.7的新环境.这个新环境不仅仅是有一个轻微的新版本的Python解释器.主要是,这个 ...
- Spark SQL概念学习系列之Spark SQL 优化策略(五)
查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟.除了查询优化, Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略. (1)内存列式存 ...