本文来自公众号“AI大道理”。

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。

基于GMM的0-9孤立词识别系统以词为训练单位,添加新词汇需要重新进行训练,若要涵盖所以

词,差不多6万个词,训练量极大,预测时也要计算6万个模型的似然,哪个大预测出哪个,在实际应用中有局限性,只能应用于小词汇量场合。

孤立词识别系统识别了0-9的数字的英文单词,但是假如有人用英文报电话号码,是识别不了整个号码的,甚至识别不了其中的one。

孤立词识别这个模型无法从一连串英文号码(里面包含了one two等多个数字)中准确识别出one,关键点在于连续语音中不知道哪些语音信号是one,哪些是two,或者说不知道哪些帧是one哪些帧是two。

所以若要识别连续的0123456789的语音就需要Viterbi在HMM中进行对齐,这就是GMM-HMM模型了。

1 识别流程

在GMM独立词识别中以单词为单位建模,在GMM-HMM中以音素为单位进行建模。对连续语音提取MFCC特征,将特征对应到状态这个最小单位,通过状态获得音素,音素再组合成单词,单词串起来变成句子。

其中,若干帧对应一个状态,三个状态组成一个音素,若干音素组成一个单词,若干单词连成一个句子。难点并在于若干帧到底是多少帧对应一个状态了,这就使用到了viterbi对齐。 为了提高识别率,在三音子GMM-HMM模型基础上,又用DNN模型取代GMM模型,达到了识别率明显的提升。

将特征用混合高斯模型进行模拟,把均值和方差输入到HMM的模型里。GMM描述了状态的发射概率,拟合状态的输出分布。

单音素模型虽然可以完成基本的大词汇量连续语音识别的任务,但是存在一定缺点。

  • 建模单元数目少,一般英文系统的音素数量在30~60个,中文系统音素数目在100个左右。这么少的建模单元难以做到精细化的建模,所以识别率不高。

  • 音素发音受其所在上下文的影响,同样的音素,在不同的上下文环境中,数据特征也有明显的区分性。

所以就考虑音素所在的上下文(context)进行建模,一般的,考虑当前音素的前一个(左边)音素和后一个(右边)音素,称之为三音素,并表示为A-B+C的形式,其中B表示当前音素,A表示B的前一个音素,C表示B的后一个音素。

2 单音素模型

训练问题

一段2秒的音频信号,经过【分帧-预加重-加窗-fft-mel滤波器组-DCT】,得到MFCC特征作为输入信号,此处若以帧长为25ms,帧移为25ms为例,可以得到80帧的输入信号,这80帧特征序列就是观察序列:

给定观察序列O,估计GMM-HMM模型的参数,这就是训练问题。

A是转移概率,B是观察概率,也就是发射概率。我们使用GMM模型对观察概率建模,所以实际参数就是高斯分布中的均值和方差。模型参数就是转移概率、高斯分布的均值、方差(单高斯的情况)。单音素GMM-HMM模型的训练是无监督训练。

(灵魂的拷问:我们对语音进行了标注,也就是给了输入语音的label,为什么这个训练还是无监督的呢?

AI大语音:模型的训练并不是直接输入语音,给出这个语音是什么,然后和标注label求loss。模型的训练是输入特征到音素的状态的训练,即我们并不知道哪一帧输入特征对应哪个音素的哪一个状态。训练的目的就是找到帧对应状态的情况,并更新状态的gmm参数。把每一帧都归到某个状态上,本质上是进行聚类,是无监督训练。)

单音素GMM-HMM模型的训练通过Viterbi训练(嵌入式训练),把“S IH K S”对应的GMM模型嵌入到整段音频中去训练。

训练步骤:

步骤一:初始化对齐

为什么要初始化对齐?

为viterbi提供初始参数A、B。

一开始不知道一段语音的哪些帧对应哪些状态,我们就进行平均分配。比如两秒的“ six”语音一共80帧,分成四个因素“S IH K S”,每个音素分配到20帧,每个音素又有三个状态组成,每个状态分配6或者7帧。这样就初始化了每个状态对应的输入数据。

什么意思?

就是假设前0-20帧数据都是“S”这个音素的发音,20-40帧数据都是“IH”这个音素的发音,40-60帧是“K”这个音素的发音,60-80是“S”这个音素的发音。但这只是一个假设,事实到底如此我们还不知道。我们可以在这个初始对齐下进一步优化。

步骤二:初始化模型

HMM模型λ=(A,B,Π)。我们对初始对齐的模型进行count。count什么呢?

在初始化对齐后就可以count状态1->状态1的次数,状态1->状态2的次数,这就是转移次数,转移次数/总转移次数=转移概率。转移初始转移概率A(aij)就得出了。

Π就是[1,0,0,0...],一开始在状态一的概率是100%。在语音识别应用中由于HMM是从左到右的模型,第一个必然是状态一,即P(q0=1)=1。所以没有pi这个参数了。

还有B(bj(ot))参数怎么办?

一个状态对应一个gmm模型,一个状态对应若干帧数据,也就是若干帧数据对应一个gmm模型。一开始我们不知道哪些帧对应哪个状态,所以gmm模型的输入数据就无从得知。现在初始化后,状态1对应前6帧数据,我们就拿这六帧数据来计算状态1的gmm模型(单高斯,只有一个分量的gmm),得到初始均值 和方差 。

(完美的假想:假设我们初始化分配帧恰恰就是真实的样子,那么我们的gmm参数也是真实的样子,这个模型就已经训练好了。)

步骤三:重新对齐(viterbi硬对齐,Baum-welch软对齐)

假想想想就好了,现在得到的GMM-HMM模型就是个胚芽,还有待成长,懂事,这就需要重新对齐,向真实情况逼近的重新对齐。如何逼近真实情况?viterbi算法根据初始化模型λ=(A,B,Π)来计算。它记录每个时刻的每个可能状态的之前最优路径概率,同时记录最优路径的前一个状态,不断向后迭代,找出最后一个时间点的最大概率值对应的状态,如何向前回溯,得到最优路径。得到最优路径就得到最优的状态转移情况,哪些帧对应哪些状态就变了。转移概率A就变了。

哪些帧对应哪些状态变了导致状态对应的gmm参数自然就变了,也可以跟着更新均值 和方差,即发射概率B变了。

步骤四:迭代

新的A和新的B又可以进行下一次的Viterbi算法,寻找新的最优路径,得到新的对齐,新的对齐继续改变着参数A、B。如此循环迭代直到收敛,则GMM-HMM模型训练完成。

(灵魂的拷问:迭代何时是个头?

AI大语音:一般是设置固定轮数,也可以看一下对齐之后似然的变化,如果变化不大了,基本就是收敛了。)

3 三音子模型

决策树

考虑音素所在的上下文(context)进行建模,一般的,考虑当前音素的前一个(左边)音素和后一个(右边)音素,称之为三音素,并表示为A-B+C的形式,其中B表示当前音素,A表示B的前一个音素,C表示B的后一个音素。

使用三音素建模之后,引入了新的问题:

  1. N个音素,则共有N^3 个三音素,若N=100,则建模单元又太多了,每个音素有三个状态,每个状态对应的GMM参数,参数就太多了。

  2. 数据稀疏问题,有的三音素数据量很少

  3. unseen data问题。有的三音素在训练数据没有出现,如K-K+K,但识别时却有可能出现,这时如何描述未被训练的三音素及其概率。

所以通常我们会根据数据特征对triphone的状态进行绑定,常见的状态绑定方法有数据驱动聚类和决策树聚类,现在基本上是使用决策树聚类的方式。

三音素GMM-HMM模型是在单音素GMM-HMM模型的基础上训练的。

为什么要先进行单音素GMM-HMM训练?

通过在单音素GMM-HMM模型上viterbi算法得到与输入 对应的最佳状态链,就是得到对齐的结果。

对每个音素的每个state建立一颗属于他们自己的决策树,从而达到状态绑定的目的。

  • 从根节点经过一些列的问题,相近(相似度高)的(绑定)三音素到达同一个叶子节点。

  • 决策树建立的基本单元是状态,对每个三音子的每个state建立一颗属于他们自己的决策树。

  • 每个三音素对于该问题都会有一个Yes或No的的答案,那么对所有的三音素来讲,该问题会把所有三音素分成Yes集合和No集合。

  • 根节点是说这是以zh为中心音素的三音素的第三个状态的决策树,第一个状态和第二个状态也都有各自独立的决策树

  • 即使zh-zh+zh从未在训练语料中出现过,通过决策树,我们最终将它绑定到一个与之相近的叶子节点上。

通过单音素系统,我们可以得到单音素各个状态所有对应的特征集合,做一下上下文的扩展,我们可以得到三音素的各个状态所有对应特征集合。通过这样的方法,我们可以把训练数据上所有的单音素的数据对齐转为三音素的对齐。

决策树的生成流程:

  1. 初始条件(单音素系统对齐,一个根节点)

  2. 选择当前所有待分裂的节点、计算所有问题的似然增益,选择使似然增益最大的节点和问题对该节点进行分裂。

  3. 直至算法满足一定条件终止。

4 总结

从单音素GMM-HMM到三音子GMM-HMM的过程就是发现问题,解决当前问题又引入了新问题,再解决新问题的过程。 单音素建模单元少,难以做到精细化建模,识别率不高,单音素发音受上下文影响。 为了优化或者说解决这些问题,引进三音子模型,导致建模单元又太多,所谓过犹不及。同时还出现数据稀疏问题,unseen data问题。 为了解决这些问题,引入带决策树的GMM-HMM模型,解决了上面问题。 为了提高识别率,在三音子GMM-HMM模型基础上,又用DNN模型取代GMM模型,达到了识别率明显的提升。

——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

—————————————————————

投稿吧   | 留言吧

▼下期预告▼

AI大语音(九)——基于GMM-HMM的连续语音识别系统

▼往期精彩回顾▼

AI大语音(一)——语音识别基础

AI大语音(二)——语音预处理

AI大语音(三)——傅里叶变换家族

AI大语音(四)——MFCC特征提取

AI大语音(五)——隐马尔科夫模型(HMM)

AI大语音(六)——混合高斯模型(GMM)

AI大语音(七)——基于GMM的0-9语音识别系统

留你心,言你想

AI大语音(八)——GMM-HMM声学模型(深度解析)相关推荐

  1. AI大语音(七)——基于GMM的0-9语音识别系统(深度解析)

    本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 1 系统概要 孤立词识别:语音中只包含一个单词的英文识别 识别对象:0-9以及o的英文语音 ...

  2. python gmm em算法 2维数据_AI大语音(六)——混合高斯模型(GMM)(深度解析)...

    1 GMM基础 高斯混合模型(GMM)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况. 灵魂的拷问:为什么GMM可以拟合出 ...

  3. AI大语音(一)——语音识别基础(深度解析)

    本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 1 语音识别基础 1.1 声音特性 声音是由物体振动产生的声波.是通过介质传播并能被人或动 ...

  4. 语音视频社交背后技术深度解析

    演讲 / 蒋宁波 整理 / LiveVideoStack 伴随智能硬件设备快速发展和网络条件提升,实时语音视频的应用越来越广泛,从互动直播.到休闲游戏.再到陌生人社交,而如何保障实时互动过程流畅不卡顿 ...

  5. AI大语音(十)——N-gram语言模型(深度解析)

    本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音. 但若不是 ...

  6. 大快搜索大数据可视化平台监控功能深度解析

    在上一篇的文章中已经明确说过DKM作为大快发行版DKhadoop的管理平台,它的四大功能分别是:管理功能,监控功能,诊断功能和集成功能.管理功能已经给大家列举了一些做了说明,今天就DKM平台的监控功能 ...

  7. c++ 提取傅里叶描述子_AI大语音(四)——MFCC特征提取(深度解析)

    1 特征提取流程 在语音识别和话者识别方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients,简称MFCC). MFCC提取过程包括 ...

  8. 利用函数wavread对语音信号进行采样_AI大语音(一)——语音识别基础(深度解析)...

    1 声音特性​ 声音(sound)是由物体振动产生的声波.是通过介质传播并能被人或动物听觉器官所感知的波动现象.最初发出振动的物体叫声源.声音以波的形式振动传播.声音是声波通过任何介质传播形成的运动. ...

  9. c语言实现语音检测vad_AI大语音(二)——语音预处理

    点击上方"AI大道理",选择"置顶"公众号 重磅干货,细致入微AI大道理 ------ 1 预滤波 CODEC说得通俗一点,对于音频就是A/D和D/A转换.前端 ...

最新文章

  1. BitMap 内存使用优化
  2. NLP(二十八)多标签文本分类
  3. 解决IndexClosedException: closed
  4. 怎样将网站未收录的页面重新收录?
  5. 【Jenkins系列1】Jenkins定时任务设置
  6. Effective Java之EnumMap代替序数索引(三十三)
  7. 从一个Android码农视角回顾2018GDD大会
  8. 转:日志组件logback的介绍及配置使用方法
  9. r语言 图形一览_R语言实战(第2版):第三章 图形初阶(01)
  10. ES6新特性_ES6箭头函数的实践以及应用场景---JavaScript_ECMAScript_ES6-ES11新特性工作笔记010
  11. Table变量和临时表区别
  12. cdr添加节点快捷键_CDR X8中怎么添加节点
  13. 大三第一次参加ACM ICPC Regional打了两块铁,怎么办?
  14. 解密库尔勒可靠性检测
  15. realtek是什么意思_realtek bluetooth是什么意思
  16. Matlab数字图像处理学习记录【2】——亮度变换与空间滤波
  17. 上个厕所的功夫弄清楚了ES搜索服务器
  18. 《设计进化论日本版式设计速查手查手册》菜单版式
  19. Directory 与 DirectoryInfo 的区别
  20. 1076: [SCOI2008]奖励关

热门文章

  1. 如何在SQL中实现排序间接
  2. selenium使用webdriver自动化浏览器打不开无法输入网址
  3. 三星android se干啥得,结果竟然这样!看iPhone SE与最强Android旗舰三星S7对比!
  4. 设定行车路线实验matlab,避障最优路径系统研究
  5. linux退出guest用户_用户、组及其它 Linux 特性 | Linux 中国
  6. 关联算法①——《啤酒与尿布》购物篮分析
  7. 引入CSS样式的三种方法
  8. SpringSecurity实现动态鉴权
  9. 北京有哪些牛逼的中小型公司?
  10. python获得股票数据并画图