目录

  • 基于孤立词的GMM-HMM语音识别系统
    • 训练
    • 解码
  • 基于单音素的GMM-HMM语音识别系统
    • 音素/词典
    • 训练
    • 解码
  • 基于三音素的GMM-HMM语音识别系统
    • 三音素
    • 决策树

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

语音识别中GMM是一个对角的GMM,它的协方差为对角阵,这是因为在GMM-HMM语音识别中,一般使用MFCC特征,而MFCC特征各维特征是独立的,只需要对角阵就可以描述它,此外,对角GMM模型的参数量相对较少,所需的计算量也更少。
语音识别中的HMM是一个三状态的左右模型(每个状态只能跳转到自身或者下一个状态)的HMM,如图所示(s1、s2、s3为状态):

训练

从系统的角度考虑,输入数据为词w和w所对应的训练数据,输出为词w的GMM-HMM模型。​
其中的任务的关键是从训练数据Xw1,Xw2,Xw3,⋯X_{w1,X_{w2},X_{w3},\cdots}Xw1,Xw2​,Xw3​,⋯​中训练Pw(X)P_w(X)Pw​(X),估计GMM-HMM模型参数,使用的准则为最大似然。
本节使用的方法为Viterbi学习(Viterbi训练)和Baum-Welch学习(前向后向训练)。
Viterbi训练\color{#FF0000}{Viterbi训练}Viterbi训练
类比问题:性别已知,求男生(或女生)的平均身高。
E步:使用Viterbi算法得到最优的状态序列(对齐 alignment),在时刻ttt处于状态iii的概率(0或1),估计GMM模型中时刻ttt处于状态iii第kkk个GMM分量的概率。
M步:更新转移参数、GMM参数(详见语音识别入门第三节:GMM以及EM算法)。
重复E/M步。
具体流程如下:

  • 初始化GMM-HMM参数λ=(aij,GMM参数)\lambda=(a_{ij},GMM参数)λ=(aij​,GMM参数),其中,每个状态jjj对应的GMM参数为(αjm,μjm,Σjm)(\alpha_{jm},\mu_{jm},\Sigma_{jm})(αjm​,μjm​,Σjm​)
  • 基于GMM-HMM参数λ\lambdaλ和Viterbi算法得到状态-观测对齐,得到每个观测对应的隐藏状态
  • 更新参数λ\lambdaλ
    – a^ij=C(i→j)∑kC(i→k)\hat{a}_{ij}=\frac{C(i \to j)}{\sum_{k}C(i \to k)}a^ij​=∑k​C(i→k)C(i→j)​,C(i→j)C(i \to j)C(i→j)表示从状态iii到状态jjj的转移次数
    – 更新GMM参数
  • 重复2、3步,直到收敛

在语音识别问题中,最开始时并没有对应的模型,一般对一个语音包含的帧数根据状态数量进行等分,给每个状态分配各自所对应的特征,进而估计一个初始化的参数。
前向后向训练(Baum−Welch训练)\color{#FF0000}{前向后向训练(Baum-Welch训练)}前向后向训练(Baum−Welch训练)
类比问题:知道每个人属于男生(或女生)的概率,求男生(或女生)的平均身高。
E步:使用前向算法+后向算法,估计在时刻ttt处于状态iii的概率0≤p≤10\le p \le 10≤p≤1,并估计GMM模型中时刻ttt处于状态iii第kkk个GMM分量的概率。
M步:更新转移参数、GMM参数。
重复E/M步。
具体流程如下:

  • 初始化GMM-HMM参数λ=(aij,(cjm,μjm,Σjm))\lambda = \left( a_{ij},\left( c_{jm},\mu_{jm},\Sigma_{jm} \right) \right)λ=(aij​,(cjm​,μjm​,Σjm​))
  • E步:对所有时间ttt、状态iii
    – 递推计算前向概率αt(i)\alpha_t(i)αt​(i)和后向概率βt(i)\beta_t(i)βt​(i)
    – 计算ζt(j,k)=∑iαt−1(i)aijcjkbjk(ot)βt(j)∑i=1NαT(i)\zeta_t(j,k)=\frac{\sum_{i} \alpha_{t-1}(i)a_{ij}c_{jk}b_{jk}(o_t)\beta_t(j)}{\sum_{i=1}^{N}\alpha_T(i)}ζt​(j,k)=∑i=1N​αT​(i)∑i​αt−1​(i)aij​cjk​bjk​(ot​)βt​(j)​,ξt(i,j)=αt(i)aijbj(ot+1)βt+1(j)∑i=1NαT(i)\xi_t(i,j)=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{i=1}^{N}\alpha_T(i)}ξt​(i,j)=∑i=1N​αT​(i)αt​(i)aij​bj​(ot+1​)βt+1​(j)​,γt(i)=∑k=1Nξt(i,j)\gamma_t(i)=\sum_{k=1}^{N}\xi_t(i,j)γt​(i)=∑k=1N​ξt​(i,j)。
  • M步:更新参数
    – μ^jk=∑t=1Tζt(j,k)ot∑t=1Tζt(j,k)\hat{\mu }_{jk} = \frac{\sum _{t=1}^{T}\zeta _t(j,k)o_t}{\sum _{t=1}^{T}\zeta_t (j,k)}μ^​jk​=∑t=1T​ζt​(j,k)∑t=1T​ζt​(j,k)ot​​
    – Σ^jk=∑t=1Tζt(j,k)(ot−μ^jk)(ot−μ^jk)T∑t=1Tζt(j,k)\hat{\Sigma}_{jk}= \frac{\sum _{t=1}^{T}\zeta _t(j,k)(o_t-\hat{\mu }_{jk})(o_t-\hat{\mu }_{jk})^T}{\sum _{t=1}^{T}\zeta_t (j,k)}Σ^jk​=∑t=1T​ζt​(j,k)∑t=1T​ζt​(j,k)(ot​−μ^​jk​)(ot​−μ^​jk​)T​
    – c^jk=∑t=1Tζt(j,k)∑t=1T∑kζt(j,k)\hat{c }_{jk} = \frac{\sum _{t=1}^{T}\zeta_t (j,k)}{\sum _{t=1}^{T}\sum _{k}\zeta_t (j,k)}c^jk​=∑t=1T​∑k​ζt​(j,k)∑t=1T​ζt​(j,k)​
    – a^ij=∑t=1T−1ξt(i,j)∑t=1T−1∑k=1Nξt(i,k)=∑t=1T−1ξt(i,j)∑t=1T−1γt(i)\hat{a }_{ij}=\frac{\sum _{t=1}^{T-1}\xi_t (i,j)}{\sum _{t=1}^{T-1}\sum_{k=1}^{N}\xi_t (i,k)}=\frac{\sum _{t=1}^{T-1}\xi_t (i,j)}{\sum _{t=1}^{T-1}\gamma_t (i)}a^ij​=∑t=1T−1​∑k=1N​ξt​(i,k)∑t=1T−1​ξt​(i,j)​=∑t=1T−1​γt​(i)∑t=1T−1​ξt​(i,j)​
  • 重复2、3步,直到收敛

解码

从系统角度考虑,输入为各个词汇的GMM-HMM模型和未知的测试语音XtestX_{test}Xtest​,输出为XtestX_{test}Xtest​对应的词。
其中的关键点为在概率的框架中对所有的www就散Pw(Xtest)P_w(X_{test})Pw​(Xtest​)。
本节使用的方法为前向算法和Viterbi算法(可以回溯到最优的状态序列)。
对于one、two两个数字的识别问题,分别使用one和two的HMM模型计算它们的概率,此时可以使用前向算法和Viterbi算法。首先,可以对one和two分散的建立拓扑结构,如下图所示。


也可将one和two表示为一个紧凑的图,如下图所示(此时只能使用Viterbi算法)。


此系统目前仅可识别独立的one或two,无法识别连续的多个词,如连续的one one one或one two one等,此时可将上图中节点E增加一个连接到节点S的跳转,这样就拥有可以表达连续数字串的能力。
基于孤立词的语音识别系统存在许多缺点:

  • 建模单元数、计算量和词典大小成正比。
  • 词的状态数(a/accomplishment)对每个词应该不同,长词应该使用更多的状态。
  • 存在OOV(Out of Vocabulary)的问题。
  • 实际上,词并不是一个语言的基本发音单元,以词为建模单元无法共享这些发音的基本单元。

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

音素/词典

音素是发音的基本单元。
英文一般会使用CMU Phone音素列表,共39个音素(其中,红色的为元音音素):AA\color{#FF0000}AAAA AE\color{#FF0000}AEAE AH\color{#FF0000}AHAH AW\color{#FF0000}AWAW AX\color{#FF0000}AXAX AXR\color{#FF0000}AXRAXR AY\color{#FF0000}AYAY B BD CH D DD DH DX EH\color{#FF0000}EHEH ER\color{#FF0000}ERER EY\color{#FF0000}EYEY F G GD HH IH\color{#FF0000}IHIH IX\color{#FF0000}IXIX IY\color{#FF0000}IYIY JH K KD L M N NG OW\color{#FF0000}OWOW OY\color{#FF0000}OYOY P PD R S SH T TD TH TS UH\color{#FF0000}UHUH UW\color{#FF0000}UWUW V W X Y Z ZH
中文音素(可以认为声韵母就是音素):a\color{#FF0000}aa o\color{#FF0000}oo e\color{#FF0000}ee i\color{#FF0000}ii u\color{#FF0000}uu v\color{#FF0000}vv b p m f d t n l g k h j q x zh ch sh z c s y w ai\color{blue}aiai ei\color{blue}eiei ui\color{blue}uiui ao\color{blue}aoao ou\color{blue}ouou iu\color{blue}iuiu ie\color{blue}ieie ue\color{blue}ueue er\color{blue}erer an\color{blue}anan en\color{blue}enen in\color{blue}inin un\color{blue}unun vn\color{blue}vnvn ang\color{blue}angang eng\color{blue}engeng ing\color{blue}inging ong\color{blue}ongong 
除此之外,一般还会引入一个静音音素Slience(SIL)

词典是词到音素序列的映射(文件),其中,0~910个数字的词典如下所示,其中,R音素是共享的,S音素也是共享的:

音素
one W AA N
two T UW
three TH R\color{red}RR IY
four F AO R\color{red}RR
five F AY V
six S\color{green}SS IH K S\color{green}SS
seven S\color{green}SS EH V AX N
eight EY T
nine N AY N
zero Z IY R\color{red}RR OW

训练

每个音素均使用经典的三状态结构。在训练时需将音素序列的三状态结构相连。如图是单词one的单音素结构图:

解码

类似孤立词解码,基于单音素的解码图如下图所示:

单音素的语音识别系统也有很多缺点:

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

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

三音素

考虑音素的上下文,一般会考虑前一个和后一个音素,称之为三音素,表示为A-B+C。
例如,单词KEEP是由音素K IY P组成,其三音素为#\color{#FF0000}{\#}#-K+YI,K-IY+P,YI-P+#\color{#FF0000}{\#}#。符号#代表空或边界点。
思考问题:\color{red}思考问题:思考问题:

  • 假设训练系统中有N个音素,一共有多少个三音素?\color{red}假设训练系统中有N个音素,一共有多少个三音素?假设训练系统中有N个音素,一共有多少个三音素?
  • 如果训练系统中有的三音素训练数据特别少或不存在,应该怎么办?\color{red}如果训练系统中有的三音素训练数据特别少或不存在,应该怎么办?如果训练系统中有的三音素训练数据特别少或不存在,应该怎么办?
  • 有的三音素在训练数据中不存在,但在测试数据中存在怎么办?\color{red}有的三音素在训练数据中不存在,但在测试数据中存在怎么办?有的三音素在训练数据中不存在,但在测试数据中存在怎么办?

三音素虽然解决了单音素中存在的问题时,又带来了新的问题。

决策树

为了解决上述问题,可将上下文发音相近的三音素共享参数,此时会大幅降低模型的参数量,对于训练数据少的问题,共享也可以增加它的数据。为了实现发音相近的三音素共享参数,可通过聚类(自底向上)或决策树(自顶向下)实现。
而决策树则是三音素共享参数的一个实际解决方案。
决策树是一个二叉树,每个非叶子节点上都会有一个问题,每个叶子节点都是一个绑定的三音素的集合,而绑定的粒度为状态,如A-B+C和A-B+D的第一个状态绑定在一起,并不代表其第2/3个状态也需要绑定在一起,也就是B的每个状态都有一个小的决策树。如下图所示:

决策树非叶子节点常见的问题由:是否是元音、是否是爆破音、是否是鼻音、是否是摩擦音、是否是流音、位置信息等。
将一条一条的问题进行整合即为问题集,而问题集一般可通过语言学家定义或自动构建问题集,Kaldi中通过自顶向下的聚类自动构建问题集。

语音识别入门第五节:基于GMM-HMM的语音识别系统相关推荐

  1. 语音识别入门第七节:语言模型

    统计语言模型 N-gram语言模型与评价方法 平滑算法 拉普拉斯平滑 古德图灵平滑 插值与回退 卡茨平滑 克奈瑟-内平滑 语言模型的存储格式--APRA Format及工具包 RNN语言模型 其他语言 ...

  2. 语音识别入门第七节:语言模型(实战篇)

    Ngrams计数: witten_bell平滑:

  3. Android零基础入门第83节:Activity间数据传递方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间 ...

  4. Android零基础入门第1节:Android的前世今生

    原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来 ...

  5. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  6. Android零基础入门第44节:ListView数据动态更新

    2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...

  7. Android零基础入门第38节:初识Adapter

    2019独角兽企业重金招聘Python工程师标准>>> 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MV ...

  8. Android零基础入门第77节:Activity任务栈和启动模式

    2019独角兽企业重金招聘Python工程师标准>>> 通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的 ...

  9. Android零基础入门第65节:RecyclerView分割线开发技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...

最新文章

  1. 「UI 测试自动化selenium」汇总
  2. libevent mysql_在 libevent 中使用 MariaDB(MySQL)
  3. zblog文件大小超出,上传成功但插入不了
  4. java心电图心率计算_java如何画心电图?
  5. BugkuCTF-Misc:Linux2
  6. 大概看了一下《Flash MX 2004 -- 数据库应用开发 - 基于.NET架构》,感觉有点迷惘了!...
  7. ▲为什么要用css Sprite技术?
  8. 如何轻松将上亿的数据玩弄于股掌之中?
  9. Saving Beans HDU - 3037(卢卡斯定理)
  10. 聊聊内卷之下,直博和读完硕士再读博该怎么选择?
  11. EfficientPS:目前排名第一的高效高精度全景分割算法
  12. cron java_cron表达式
  13. 拿到人工智能offer,一个腾讯,一个阿里,选哪个?
  14. java推送到 钉钉用户_javaweb利用钉钉机器人向钉钉群推送消息(解决中文乱码)...
  15. 『TensorFlow Internals』笔记_系统架构
  16. 基于Jackson2的JsonSchema实现java实体类生成json(一)
  17. spring揭秘_理解透彻!Spring中BeanFactory与FactoryBean分析
  18. 各省互联网普及率数据集(1997-2018年)
  19. matlab gui 进度条,MATLAB GUI 之自制进度条
  20. tp5欢迎页 (获取系统信息)

热门文章

  1. electron学习
  2. SuperOneClick一键Root工具使用方法
  3. 从龙之谷双开领悟出的——HOOK API
  4. android studio+genymotion windows系统下搭建
  5. 3dsmax动画四、形体模式。
  6. 【NEST】脉冲神经网络仿真平台入门手册整理翻译记录
  7. Python安装报错:0x80070641-无法访问Windows Installer服务
  8. 30个你应该在2023年里使用的JavaScript 动画库
  9. Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)
  10. 旅游自助系统项目之管理系统的开发