- 数字信号的基本知识
- MFCC/Fbank特征
- GMM模型
- EM算法
- HMM的三个基本问题(概率问题,预测问题,学习问题)
终极目的:让机器听懂
首先要出三个概念:
- 对齐:“音频wav”和“文本txt“的对应关系
- 训练:已知对齐(wav和txt),迭代计算模型参数
- 解码:根据训练得到的模型参数,由wav推出txt
3.内容提要3.1基于孤立词的GMM-HMM语音识别系统
- 训练(前向后向训练/Viterbi训练)
- 解码
- 音素/词典
- 训练
- 解码
- 三音素
- 决策树
- 训练
- 解码
- 孤立词的概念:所谓孤立词就是对于训练数据和测试数据,语音数据仅包含一个数字或者一个词
- 考虑一个最简单的从0~9这样的一个语音识别系统
- 数据准备
- 建模
- 如何训练
- 如何测试(解码)
- 从上图中很明显可以看出,对于每个数字,我们都要建立一个对应的模型,对于训练数据中的语音数据,通常会提取其MFCC特征向量
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
- 3状态 , 为什么?前人的经验。
- 左右模型(上一个状态只能去往下一个状态或者自跳,不可逆),为什么?和人发音类似,都是不可逆的过程
- 拓扑结构(s1,s2,s3为状态)
如何结合起来
每个状态都有一个对应的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都有哪些参数?
初始概率,因为是从左到右模型,初始时刻看到在第一个状态上- 转移参数,一个状态只有两个概率,自跳概率和跳向下一个状态的概率
- 观测参数(对角GMM模型)
- 混合系数
- 均值
- 方差
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)的问题,词典中没有这个词,但我想识别出来
- 此时,可以考虑将一个语言的基本发音单元为建模单元来进行建模
- 由此,引出发音的基本单元:音素
- 静音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语音识别系统
- 单音素系统的缺点
- 建模数量少
- 一般英文音素在30~60个
- 一般中文音素大约100
- 音素的发音受其上下文的影响(协同发音)
- 连读 not at all,he is
- 吞音 first time
- 针对协同发音,提出解决措施,考虑音素的上下文,一般,考虑前一个/后一个,称之为三音素,表示为A-B C
- 例如keep K IY P => #-K IY k-Iy P IY-P #
- Q1:假设由N个音素,一共有多少个三音素? N^3
- Q2:有的三音素训练数据少或者不存在,怎么办?
- Q3:有的三音素在训练中不存在,但在测试中存在怎么办?
- 似乎,三音素又带来了新的问题
- 基本思想:上下文发音相近的三音素共享参数
- 这样的话就减少了建模数量,且增加了一些训练数据
- 自底向上 :聚类
- 自顶向下:决策树 (三音素绑定的实际解决方案 )
- 决策树
- 是一个二叉树
- 每个非叶子节点上都会有一个问题
- 叶子节点是一个绑定三音素的集合
- 绑定的粒度为状态
- A-B C和A-B D的第一个状态绑定在一起,并不意味着其2/3个状态也要在一起
- 也就是说B的每个状态都有一颗小的决策树
- zh-zh zh 这个三音素应该落在上图的NNN这条路径上,和其他的三音素共享参数
刚刚说每个非叶子节点都是一个问题,这些问题都是些什么?
- 常见问题
- 元音(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.6决策树的构建(最优问题)
- 总结:
- 1.初始状态(一个结点)
- 2.选择一个结点
- 从问题集中选择似然增益最大的问题作为该节点问题
- 建立该节点左右子节点,并将该节点上的统计量分为两部分
- 3.重复2 ,直至
- 达到一定数量的叶子结点
- 似然增益小于某个阈值,表示子节点和父结点之间的差别不大,可以停止了
,