从GMM-HMM到DNN-HMM

2021-10-13 10:21:11 浏览数 (1)

GMM-HMM

1. 语音识别总体框架

首先,如下图所示是一个常见的语音识别框架图,语音识别系统的模型通常由声学模型和语言模型两部分组成,分别对应于语音到音节概率的计算和音节到字概率的计算。这里我们要探讨的GMM-HMM模型属于其中的声学模型。

而语言模型是用来计算一个句子出现概率的概率模型。它主要用于决定哪个词序列的可能性更大,或者在出现了几个词的情况下预测下一个即将出现的词语的内容,即用来约束单词搜索。

接下来,如下所示是一个更具体一些的语音识别框架图。很明显,在这个图中,我们已经将声学模型明确为GMM-HMM模型。

从这两个图中,可以归纳语音识别的主要步骤包括:

(1)预处理模块: 对输入的原始语音信号进行处理,滤除掉其中的不重要的信息以及背景噪声,并进行相关变换处理。

(2)特征提取:提取出反映语音信号特征的关键特征参数形成特征矢量序列,常用的是由频谱衍生出来的Mel频率倒谱系数(MFCC)。

典型地,用长度约为10ms的帧去分割语音波形,然后从每帧中提取出MFCC特征,共39个数字,用特征向量来表示。

(3)声学模型训练:根据训练语音库的特征参数训练出声学模型参数,识别时将待识别的语音的特征参数同声学模型进行匹配,得到识别结果。

目前的主流语音识别系统多采用隐马尔可夫模型HMM进行声学模型建模,这将在下一节进行介绍。

(4)语言模型训练:语言建模能够有效的结合汉语语法和语义的知识,描述词之间的内在关系,从而提高识别率,减少搜索范围。

对训练文本数据库进行语法、语义分析,经过基于统计模型训练得到语言模型。

(5)语音解码:即指语音技术中的识别过程。

针对输入的语音信号,根据己经训练好的HMM声学模型、语言模型及字典建立一个识别网络,根据搜索算法在该网络中寻找最佳的一条路径,这个路径就是能够以最大概率输出该语音信号的词串。

2. GMM-HMM结构和识别过程

首先,如下图是一个典型的HMM结构图。隐藏节点是我们不能直接观察到的节点,我们只能通过观察节点的状态去推测隐藏节点的状态。

隐藏节点的各个状态之间可以相互转换,每一种状态下又以一定的概率函数生成观察节点的状态。如下所述,一个HMM 由初始概率,状态转移矩阵和混淆矩阵组成。

在单词词典(lexicon)中,根据每个单词的发音过程,以音素作为隐藏节点,音素的变化过程构成了HMM状态序列。

每一个音素以一定的概率密度函数生成观测向量(即MFCC特征向量)。

在GMM-HMM中,用高斯混合函数去拟合这样的概率密度函数。如下图所示是一个GMM-HMM的模型框架示意图。

再来看一个语音识别中HMM的示意图,如下英文单词“six”所示,可以看到隐藏节点的每一个状态对应于一个单独音素,单词“six”的HMM结构由这一系列的音素状态连接而成。

需要注意的是,在这里的HMM结构中,由于语音的时间序列特性,HMM不允许靠后状态到靠前状态之间的状态转换。

一般地,状态转换只允许自环转换和到后一节点的转换。自环转换的存在是因为有的音素可能会持续较长时间。

如果我们得到了各个"单词"的HMM模型,那么识别的过程如下图所示。

我们以单词“one”,“two”,“three”为例,分别计算观测数据的后验概率,并从中取概率最大的"单词"作为识别结果。

那么如何计算在某个HMM模型下,已知观测数据的后验概率呢?

这对应的就是隐马尔科夫的第一类问题,我们采用前向算法计算这一概率值。以单词“five”为例,为了计算概率该模型下已知观测数据出现的概率P(O|M),我们对所有可能的隐状态序列的概率值进行加和。

假设单词“five”由三个音素[f],[ay]和[v]组成(或者说,隐藏节点包含这三种状态),那么一个由10帧构成的观测序列可能对应如下一些隐状态序列:

对于每一种隐状态序列,根据初始概率向量,状态转移矩阵和混合高斯模型计算隐状态和观测状态同时出现的概率,然后对所有以上情形进行概率求和,便得到了P(O|M)。

以上部分是针对每个单词分别建立HMM,但这种思路在连续大词汇量语音识别中就不太实用,因为单词数量太多,而且连续语音中相同单词的发音也可能会有所不同。

这时,我们将识别单元缩小,为每个音素建立一个HMM。连续语音识别的基本思想就是找出所有音素,并为它们分别建立HMM模型。

对于每一个音素HMM,它通常由5个状态组成,其中第一个和最后一个状态没有实际意义,中间三个状态分别代表着音素开始阶段、音素稳定阶段和音素结束阶段,如下图所示。

3. 学习算法

以上展示了在训练好GMM-HMM模型之后,如何对语音信号进行识别,那么GMM-HMM模型的训练过程又是怎么样的呢?

首先,GMM的训练采用的是EM算法:

(1) E(estimate)-step: 根据当前参数(means, variances, mixing parameters)估计P(j|x)

(2) M(maximization)-step: 根据当前P(j|x) 计算GMM参数

而HMM也是采用的类似于EM算法的前向后向算法(Baum-Welch算法),过程为:

(1) E-step: 给定observation序列,估计时刻t处于状态sj的概率

(2) M-step: 根据该概率重新估计HMM参数aij.

综合来看,对于GMM-HMM模型,我们需要训练的有对应于混淆矩阵B的高斯混合模型参数,以及状态转移矩阵A。

其中,在状态转移矩阵A中,只有对应于自环和后继的状态转移概率需要被训练,其它项全都设置为0,并且不再改变。

最直观的方式,我们人工地将训练样本切分为不同的单词,然后对不同的单词分别训练不同的矩阵B和矩阵A。

但是在实际的连续语音训练当中,这种人工方式不太可行,一是因为人力成本大,二是因为对比音素更小的单元人工切分表现差。

因此,一般语音识别系统并不单独对句子中的音素或者单词进行训练,而是让训练算法自动地去对音素或者单词进行分割和拼合。这种对整个声学模型进行训练的过程就称为嵌入式训练。

如下图所示为一个数字识别系统的训练示意图,我们构建的HMM模型时针对整个句子。

然后开始在整个训练集上对参数A和B进行迭代地更新,Baum-Welch算法是嵌入式训练中的一个组成部分。整个嵌入式训练过程如下:

给定:语音波形数据集(Wavefile),对应翻译(Transcription),单词发音词典(Pronunciation Lexicon)

Step 1:构建整个句子的HMM结构

Step 2:将A矩阵中对应于自环和后继的项初始化为0.5,其他项初始化为0

Step 3:用整个训练集的全集均值和方差对B矩阵进行初始化

Step4:运行Baum-Welch算法的迭代过程。在每一次迭代中,计算前向概率和后向概率以得到t时刻处于状态i的概率,

然后将它用于更新参数A和B。重复迭代过程,直至系统收敛。

LVCSR概述

大词汇量连续语音识别 (Large-scale Vocabulary Continuous Speech Recognition, LVCSR)

(1) 问题1. 每一个HMM模型所表达的“单词”是什么?

(2) 问题2. 在识别流程中如何对测试声音文件做时间轴的划分,使每一个分段(SEGMENT)对应一个“单词”?

(3) 问题3. 如何搜索最佳的“单词”组合?

(4) 问题4. 如何构造语言模型 (Language Model)?

大词汇量,就是想说什么就说什么。连续语音,就是想怎么说就怎么说,想说多长就说多长。

每一个HMM模型所表达的“单词”是什么?

答:可以是三连音。

三连音(Triphone)

英语中有效的Triphone个数大致在55000左右(过多,需要简化!)

三连音,就是about、above这种建的是同一个模型。

不仅单词内要建模,单词间也要建模。也就是把所有的三连音穷举一遍。

多个Triphone 合并(Tying)

每个三连音模型是5个状态,silence=>三连音=>silence

多个triphone联合的训练,降低了triphone的数量。同时在单个triphone里,也把共同的状态联合起来增加它的数据。

为了建模的方便,把相似的合到了一起,比如wiy和riy。识别的时候是根据上下文拆开。

多个Triphone 联合训练(Tying)

语言模型:猜上下文的词,比如说了一个“我”,接下来说啥。

汉语中Triphone个数:音节内270多个,音节间3800多个,这是包含声调后的结果 。这就意味着,汉语构造声学模型比英语更容易。

如何对声音文件做时间轴的划分并搜索最佳“单词”组合?

这是一个搜索问题,搜索就是在由语句构成的空间中,寻找最优句子的过程,也就是利用已掌握的声学知识、语音学知识、语言模型及语法语义知识等,在状态(指词组、词、HMM的状态)空间中找到最优的状态序列。

搜索方法有很多种,这里归纳如下:

(1) VITERBI搜索 (有多种形式)

(2) A*搜索

(3) 随机搜索

语音:

待求变量:L, 所有t, 所有w。

以下介绍VITERBI搜索的一种:Two-Level Dynamic Programming

英语里V有10000个左右

起始位置是0、终止于e、有l个单词的最佳匹配,等于,终止于b-1、有l-1个单词,加上,b到e、有1个单词

l有上界,就是固定时间内说的triphone数量有限。

如何构造语言模型?

定义 (N-gram): 一个单词出现的概率,只与它前面的N个单词相关。

P(w1, w2, w3, … , wn) = P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

比如:

(1)在1-gram模型下 P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1) ≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1) (2)在2-gram模型下: P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1) ≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)

(3)在3-gram模型下: P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1) ≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)

在N-Gram 中, N越大,模型越复杂,对训练样本需求越多。

当然,样本足够情况下,N越大,训练后效果会更好。因此需要选一个合适的N来平衡准确度与样本数量要求。

一般来说,英语N=3, 汉语N=4。

N-gram用文本训练就可以,不需要用语音。

结合深度网络模型的语音识别

DNN-HMM模型框架

DNN-HMM 与 GMM-HMM对比:

假设输入语音为{x_1,x_2,…,x_T},且HMM有N个状态。

1. GMM-HMM (Gaussian Mixture Models-Hidden Markov Models) 是用GMM来模拟概率密度函数p(xt|si), 其中i=1,2,…,N。

2. DNN-HMM (Deep Neural Networks-Hidden Markov Models ) 是用DNN来模拟概率密度函数p(si|xt),其中i=1,2,…,N

GMM-HMM模拟的是bjo

DNN-HMM 理论推导:

由于p(xt)对不同的HMM模型都不变,在识别过程中可以忽略,因此我们可以简化如下:

在识别中,某段语音属于某个“单词”w 是这样判断的:

其中p(w)表示某个“单词”w 出现的先验概率,可以通过统计获得。而

最终决策过程:

如何获得π(q0), aqt−1qt, p(qt)和p(qt|xt)?

答:首先训练一个GMM-HMM模型,由GMM-HMM模型获得π(q0), aqt−1qt。通过GMM-HMM预测每个xt的标签qt,统计获得p(qt)。最后用深度网络获得p(qt|xt)。

Dong Yu and Li Deng, Automatic Speech Recognition: A Deep Learning Approach, Springer, 2014. (Chapter 6)

算法流程

实验结果 (9层神经网络,用自编码器初始化)

参考资料:

https://blog.csdn.net/wbgxx333/article/details/18516053 https://blog.csdn.net/davidie/article/details/46929269

0 人点赞