HMM学习笔记2

 

再请教了大神时候,发现前面并没有走对路子,有很多问题没有搞懂,记录在这里希望指正。

工作:

1、找到几个版本的HMM:

(1、 HTK(Hidden Markov Model Toolkit):

  HTK是英国剑桥大学开发的一套基于C语言的隐马尔科夫模型工具箱,主要应用于语音识别、语音合成的研究,也被用在其他领域,如字符识别和DNA排序等。HTK是重量级的HMM版本。

  HTK主页:http://htk.eng.cam.ac.uk/

(2、 GHMM Library:
  GHMM主页:http://www.ghmm.org/

(3、 UMDHMM(Hidden Markov Model Toolkit):

UMDHMM主页:http://www.kanungo.com/software/software.html

看懂UMDHMM中前线算法、维特比算法、前向-后向算法的程序,测试并加注释。

2、利用kaldi中单音素训练的例子:

数据库:timit;

特征:39维MFCC并作CMVN;

声学模型:HMM。

结果:

---------------------------------DevSet------------------------------------------

%WER 31.7 | 40015057 | 71.8 19.5 8.7 3.5 31.7 100.0 | -0.457 |

--------------------------------TestSet------------------------------------------

%WER 32.7 | 1927215 | 70.5 19.8 9.6 3.2 32.7 100.0 | -0.482 |

 

问题:

1、结果的阅读;

2、在kaldi工具箱中,自带的gmm和hmm模块是分开编写的,放在不同的文件夹中。但是在之前看的理论中,GMM-HMM系统的声学模型部分通常是写在一起的。网上查到有关kaldi的资料中显示,将gmm类写好之后,是用hmm程序来调用的(hmm-topology),但是在所跑的例子中,脚本直接调用的是make好的gmm模块。并且,在工具箱中我也没有找到make完成的hmm可执行文件。

3、分别阅读了kaldi中gmm程序和hmm程序,大部分没有明白。其中gmm部分本来了解不多,而hmm部分与理论中讲到的算法并不相同。在kaldi中训练模块用Viterbifst来实现而并不是前面介绍的前向-后向算法,迭代到一定次数认为结束。这种算法可以让训练速度更快,想要全面了解需要先了解一下kaldi中嵌入式训练的内容。

4、kaldi在训练hmm过程中引入了一个关键的概念:“对齐”。

我的理解是,对齐就是找到每一帧对应的状态。程序在初始化状态向量时用的是全局的均值和方差,每个状态对应多个帧数的特征(任意分配的),例如10帧,通常在计算时,会将这10帧的均值和方差放到一起计算,其中用到EM算法。然后利用Viterbi算法:第一帧来时,我们可以默认为第一个状态,那么下一帧来时我们根据viterbi更新的公式,可以看下图的算法来得到一条路径,这个路径我们会知道每帧分别对应的是哪个状态。

总结来说,kaldi中hmm训练分以下四步:

(1. 单高斯模型的初始化,这里均值和方差我们使用全局的均值和方差;

(2. 生成每个句子的topo结构;

(3. 首先给每个状态分配相同的帧数,然后开始做对齐;

(4. 迭代做对齐,然后计算每个音素对应的HMM。

以上是我自己归纳,需要验证正确性。

5、kaldi在初始化向量时用到了聚类机制,需要进一步了解。

6、如何利用hmm-topology生成topo结构,并计算状态转移矩阵。

 

下一步工作:

在实际连续语音识别的训练过程中,通常用三因素训练(考虑了上下文的影响),现在可以查到的资料大部分针对三因素做处理。三因素模型的训练过程与单音素类似,其实只是状态变了而已。

第一步就是单音素到三音素的过程。假如我们有60个单因素,那么总共有60的三次方个三音素。

第二步就是聚类,这里主要使用决策树来完成。kaldi里也不需要我们去做,这个我们只要设定一些参数就可以。这个目的就是减少计算。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐