HMM学习笔记2
HMM学习笔记2 再请教了大神时候,发现前面并没有走对路子,有很多问题没有搞懂,记录在这里希望指正。工作:1、找到几个版本的HMM:(1、 HTK(Hidden Markov Model Toolkit): HTK是英国剑桥大学开发的一套基于C语言的隐马尔科夫模型工具箱,主要应用于语音识别、语音合成的研究,也被用在其他领域,如字符识别和DNA排序等。HTK是重量级的HMM
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中训练模块用Viterbi加fst来实现而并不是前面介绍的前向-后向算法,迭代到一定次数认为结束。这种算法可以让训练速度更快,想要全面了解需要先了解一下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里也不需要我们去做,这个我们只要设定一些参数就可以。这个目的就是减少计算。
更多推荐
所有评论(0)