1.背景知识回顾
1.1特征提取
- 数字信号的基本知识
- MFCC/Fbank特征
1.2混合高斯模型GMM
- GMM模型
- EM算法
1.3隐马尔科夫模型
- HMM的三个基本问题(概率问题,预测问题,学习问题)
2.GMM-HMM语音识别框架与概念
终极目的:让机器听懂
首先要出三个概念:
- 对齐:“音频wav”和“文本txt“的对应关系
- 训练:已知对齐(wav和txt),迭代计算模型参数
- 解码:根据训练得到的模型参数,由wav推出txt
3.内容提要
3.1基于孤立词的GMM-HMM语音识别系统
- 训练(前向后向训练/Viterbi训练)
- 解码
3.2基于单音素的GMM-HMM语音识别系统
- 音素/词典
- 训练
- 解码
3.3基于三音素的GMM-HMM语音识别系统
- 三音素
- 决策树
- 训练
- 解码
3.4基于GMM-HMM语音识别系统流程
4.基于孤立词的GMM-HMM语音识别系统
4.1目标
X_{test}测试特征,P_w(X)是词w的概率模型,vocab是词表(在该实例中为0~9 10个数字)
- 为每个词都建立了一个模型P_{one}(X),P_{two?(X)},P_{three}(X)...
- 计算在每个词上的概率
- 选择所有词中概率最大的此作为识别结果
但是对于该语音任务具有的特性,序列性、不定长性,又该如何建模?
4.2建模
词(语音)是一个序列,P_w(X)可以用HMM的概率问题来进行描述,并且语音经过MFCC特征提取后也会变成连续概率密度分布
回想一下GMM-HMM
- GMM概率密度建模
- HMM序列建模
这时候对于这十个词,我们可以为每个词建立一个GMM-HMM模型
语音识别中的GMM与之前学习的GMM有何区别?
- 语音识别中的GMM为对角的,因为其协方差矩阵为对角阵
- 为什么协方差矩阵为对角阵?因为MFCC特征之间相互独立,作了去相关,直接使用对角阵就可以描述
- 对角的GMM模型参数量更少,计算也更少一些
语音识别中的HMM
如何结合起来
每个状态都有一个对应的GMM,每个词又有对应的HMM,给出一段未知序列的时侯,就会在HMM上计算一下观测概率、转移概率,也就是做一个Viterbi算法,计算一个序列在HMM-GMM上的概率
4.3训练
- 从系统的角度思考
- 输入:词w和w所对应的训练数据
- 输出:词w的HMM-GMM模型,也就是其参数
- 关键点
- 任务:训练数据X_{w1},X_{w2},X_{w3}...中训练P_w(X),估计HMM-GMM参数
- 准则:最大似然
- 方法:Vertibi学习(Viterbi训练)、Baum-Welch算法(前向后向训练)
- 回忆一下GMM-HMM都有哪些参数?
count(hard)这部分的话count只能是0或者1,确定值
count(soft)这部分只能说count是一定的概率,不确定
4.3.1Viterbi训练
- 类比问题:性别已知,求男生的平均身高
- E步(hard count)
- Viterbi算法得到最优的状态序列(对齐alignment),在t时刻处于状态i的概率非0即1,假设观测和状态对应上了,概率就是1,否则为0
- GMM模型中在t时刻处于状态i第k个分量的概率(依旧是个soft count)
- M步(normalize)
- 更新转移参数、GMM参数(混合系数、均值、方差)
- 重复E/M步
- 此处学习见学习笔记四:HMM-Viterbi学习算法
拿到每个状态对应的所有特征之后更新GMM参数
4.3.2前向后向训练(Baum-Welch训练)
- 类比问题:知道每个人属于男生的概率,求男生的平均身高
- E步(soft count)
- 前向+后向算法,在t时刻处于状态i的概率
- 在t时刻处于状态i且为GMM第k个分量的概率
- M步(normalize)
- 更新转移参数、GMM参数(混合系数、均值、方差)
- 重复E/M步
- 此处学习见学习笔记四:HMM-Baum-Welch学习算法
Viterbi训练和Baum-Welch训练的区别在于如何计算t时刻处于状态i的概率
4.4解码
- 从系统的角度思考
- 输入
- 各个词的HMM-GMM模型
- 未知的测试语音X_{test}
- 输出
- X_{test}是哪个词
- 输入
- 关键点
- 概率问题对所有的w,如何计算P_w(X_{test})
- 方法:前向算法、Viterbi算法(可以回溯到最优的状态序列)
只需要加一条从E->S的线就可以识别one-two字符串
5.基于单因素的GMM-HMM语音识别系统
- 孤立词系统的缺点:
- 建模单元数、计算量和词典大小成正比
- 词的状态数不应该是固定的3状态,词的长度不一样(a/accomplishment)
- OOV(Out of Vocabulary)的问题,词典中没有这个词,但我想识别出来
- 此时,可以考虑将一个语言的基本发音单元为建模单元来进行建模
5.1音素
- 由此,引出发音的基本单元:音素
- 静音Silence(SIL)没有发音的时候使用
5.2词典
词到音素序列的映射(文件),比如0~9 10个数字的词典如下:
5.3单因素的HMM拓扑结构
- 每个音素使用经典的3状态结构
5.4训练
现在假设一句话里面包含一个单词,例如one(W AA N)
- 如何做Viterbi训练?
- 如何做前向后向训练?
就是将孤立词里面的词3状态,转变为每个因素3状态,做一个HMM的平滑连接,相当于一个9状态的HMM,再去使用Viterbi训练或者前向后向训练
单音素GMM-HMM语音识别系统流程
词 --> 音素序列,3状态变成拼接的多状态
5.5解码
- 基于单因素的解码图
6.基于三音素的GMM-HMM语音识别系统
6.1三音素
- Q1:假设由N个音素,一共有多少个三音素? N^3
- Q2:有的三音素训练数据少或者不存在,怎么办?
- Q3:有的三音素在训练中不存在,但在测试中存在怎么办?
- 似乎,三音素又带来了新的问题
6.2绑定
- 自底向上 :聚类
- 自顶向下:决策树 (三音素绑定的实际解决方案 )
6.3决策树
- 决策树
- 是一个二叉树
- 每个非叶子节点上都会有一个问题
- 叶子节点是一个绑定三音素的集合
- 绑定的粒度为状态
- A-B+C和A-B+D的第一个状态绑定在一起,并不意味着其2/3个状态也要在一起
- 也就是说B的每个状态都有一颗小的决策树
- zh-zh+zh 这个三音素应该落在上图的NNN这条路径上,和其他的三音素共享参数
6.4问题集
刚刚说每个非叶子节点都是一个问题,这些问题都是些什么?
- 常见问题
- 元音(Vowel):AA AE AH AO AW AX AXR AY EH ...
- 爆破音(Stop):B D G P T K
- 鼻音(Nasal):M N NG
- 摩擦音(Fricative):CH DH F JH S SH TH V Z ZH
- 留音(Liquid):L R W Y
- 位置:左/右
- 问题及的构建
- 语言学家的定义
- Kaldi中通过自顶向下的聚类自动构建问题集
6.5基于状态的绑定
这是基于状态的绑定,而不是整个三音素的绑定