一、内容介绍
1、介绍kaldi非常实用的工具:如查看GMM-HMM模型参数(如40.mdl)的指令、查看决策树(tree)文件参数的指令、数据对齐结果的指令等。
2、基于数据堂200h的训练结果,使用kaldi工具查看输出结果,并解析输出结果中参数的意义。
训练根目录在 /home/MachineCYL/kaldi/egs/aidatatang_200zh/s5/ 中。(后面指令示例中,都是在该目录下执行的;并且需要传路径的地方,用的都是关于这个根目录的相对路径)
【注意】在执行下面指令之前,要在根目录下执行如下指令,否则会提示找不到指令:
bash ./path.sh
3、参考链接:
(1) kaldi常用的工具_jinmingz的博客-CSDN博客_kaldi工具
(2) kaldi常用工具(原理分析)_jinmingz的博客-CSDN博客
二、查看生成的状态机文件(L.fst)
1、相关指令:
fstprint --isymbols=data/lang/phones.txt --osymbols=data/lang/words.txt data/lang/L.fst | head -n 10
2、输出结果截图和说明:
截图中分别截取了头部数据尾部数据和中间数据的结果,以下是部分数据的说明:
(1)第1列第2列还不太确定是什么。
(2)第3列是输入符号,是个单音素符号,值是来自 data/lang/phones.txt 第1列的数据。
(3)第4列是输出符号是中文/英文字符,值是来自 data/lang/words.txt 第1列的数据。
3、words.txt 和 phones.txt 的内容如下:(后面的模型解析,也和这里面的内容有关)
(1)这里可以留意一下phones.txt里:静音音素有4个(SIL、SPN、NSN、LAU对应的ID是1、2、3、4),而从AA(ID 5)开始到之后都是一般音素。
4、查看音素分组的情况:
/home/MachineCYL/kaldi/egs/aidatatang_200zh/s5/data/lang/phones/sets.txt
该文件中可以看到音素的分组情况,一行为一组,每组共用一个HMM状态转移模型。由下面的内容,我们也知道静音音素用5个转态表示HMM状态转移模型,一般音素用3个转态表示HMM状态转移模型。
所以一共有: 4 * 5 + 36 * 3 = 128个转态(即128个GMM模型)
三、查看单音素的GMM模型
1、看初始化的模型(0.mdl)
(1)相关指令:
gmm-copy --binary=false exp/mono/0.mdl - > mono-0-model.txt
指令说明:输出结果重定向到mono-0-model.txt文件中
(2)mono-0-model.txt中的部分结果截图:
(3)0.mdl模型输出文件的结构说明:
(a)<ForPhones>...</ForPhones>
表示包含的音素,文件中出现了2次,第一个<ForPhones>里面有115个音素ID,从ID 5 到 ID 119,分别对应phones.txt中的一般音素;第二个<ForPhones>里面有4个音素ID,从ID 1 到 ID 4,分别对应phones.txt中的静音音素。
(b)每个<ForPhones>下面跟着几行<State>的数据,这是初始化的状态转移概率模型:
** 一般音素的初始化的状态转移概率模型用3个转态表示,如下图的红框:
用矩阵的形式表示如下(每个一般音素都对应一个这样的初始化模型):(截图中红框的表示成矩阵如图下)
S-1 S0 S1 S2 S3
S-1 0 1 0 0 0 # S-1为开始转态可以理解为进入此音素的状态,有1的概率跳转到S0转态
S0 0 0.75 0.25 0 0 # 对应红框第1行,表示S0转态有0.75的概率跳转到S0转态、有0.25的状态跳转到S1转态
S1 0 0 0.75 0.25 0 # 对应红框第2行,表示S1转态有0.75的概率跳转到S1转态、有0.25的状态跳转到S2转态
S2 0 0 0 0.75 0.25 # 对应红框第3行,表示S2转态有0.75的概率跳转到S2转态、有0.25的状态跳转到S3转态
S3 0 0 0 0 0 # S3为结束转态
这个图就是扩展的HMM三状态的图,S-1 为开始状态可以理解为进入此音素状态,S3为结束转态,也可以理解为出此音素的转态,一般到S2->S3就判定为结束,所以S3一行都是0 ,跟我们之前的认知是一致的。
** 静音音素的初始化的状态转移概率模型用5个转态表示,如下图的红框:
初始模型用矩阵的形式表示如下(每个静音音素都对应一个这样的初始化模型):(截图中红框的表示成矩阵如图下)
S-1 S0 S1 S2 S3 S4 S5
S-1 0 1 0 0 0 0 0 # S-1为开始转态可以理解为进入此音素状态,有1的概率跳转到S0转态
S0 0 0.25 0.25 0.25 0.25 0 0
S1 0 0 0.25 0.25 0.25 0.25 0 # S1、S2、S3 转态的初始跳转概率都一样
S2 0 0 0.25 0.25 0.25 0.25 0
S3 0 0 0.25 0.25 0.25 0.25 0
S4 0 0 0 0 0 0.75 0.25
S5 0 0 0 0 0 0 0
S-1表示开始,S5表述结束转态,初始状态转移矩阵同上。
(c)<Triples>...</Triples>
是三元组数据,共有365行数据;表示音素ID和转态ID与GMM(pdf)的映射关系。
365怎么来?115 * 3 + 4 * 5 = 365
第1列: 表示上面<ForPhones>里音素的ID、包括静音音素,共119个;
第2列: 表示第几个状态,注意静音音素有5个转态(0-4),一般音素有3个转态(0-2);
第3列: 表示对应的GMM模型(pdf),总共128个模型;
从上面数据可以看出来,一共120个音素,共有365个转态;而只有128个GMM模型(所以说有一些GMM模型是共用的,共用关系是在建立决策树的时候就确定了),如下图:
可以看出来,音素ID为5(AA),6(AA1),7(AA2),8(AA3),9(AA4),10(AA5)的音素的三个转态分别共用三个HMM模型:0 --> 20、1 --> 21、2 --> 22
(d)<DIMENSION> 48
表示下面的GMM模型中,均值向量数据有48维,48维和输入的特征的维度是一致;
【注意】不过这边要注意一下,训练数据中mfcc特征只有16维,而这边的48维是怎么来的呢?看代码知道是做了二阶差分(add-deltas),所以 16 * 3 = 48
(e)<NUMPDFS> 128
表示初始化模型一共用到128个高斯混合模型来;下面也接了128个DiagGMM(高斯混合模型)的详细参数;
(f)<DiagGMM> ... </DiagGMM>
记录每个高斯混合模型的具体参数,如权重系数、均值矩阵、方差矩阵等。(不过在初始化模型中,只有1个高斯模型,所以矩阵只有1行)。
内部数据记录:
** <GCONSTS> [ -64.28251 ] # 还不太清楚作用
** <WEIGHTS> [ 1 ] # 权重系数,只有1个,所以为1;
** <MEANS_INVVARS> # 均值矩阵,只有1列 * 48维
** <INV_VARS> # 方差矩阵,只有1列 * 48维
2、看训练后的模型(40.mdl)
(1)相关指令:
gmm-copy --binary=false exp/mono/40.mdl - > mono-40-model.txt
(2)mono-40-model.txt中与mono-0-model.txt较大差异部分的截图如下:
(3)解析:
可以看到很大的区别在于GMM模型中的参数:
原因是训练之后,每个GMM模型由多个高斯模型和对应的权重系数来刻画。
** <WEIGHTS> 权重系数,由1维 变成 n维,n个值累和为1
** <MEANS_INVVARS> 均值向量,由1列 * 48维 变成 n列 * 48维,表示n列均值向量
四、查看状态绑定决策树
1、以文本的形式查看:
(1)相关指令:
copy-tree --binary=false exp/mono/tree - > mono-tree.txt
(2)输出结果截图和说明:
这种方式不好看,推荐用下面的方式;
2、以图片的形式查看(推荐):
(1)相关指令:
draw-tree data/lang/phones.txt exp/mono/tree | dot -Tps -Gsize=8,10.5 | ps2pdf - mono-tree.pdf
(2)输出结果截图和说明:
(3)每个叶子节点对应一个转态(GMM模型),所以:
SIL 对应左边的大红框,含5个转态(GMM模型),他们的pdf id分别是0、1、2、3、4
AA、AA1、AA2、AA3、AA4、AA5 对应右边的大红框,这6个一般音素共用含3个转态(GMM模型),他们的pdf id分别是20、21、22
五、查看强制对齐标签以及对应的音素结果
1、相关指令:
gunzip -c exp/mono/ali.1.gz > exp/mono/ali.1.txt
show-alignments data/lang/phones.txt exp/mono/40.mdl ark:exp/mono/ali.1.txt | head
2、输出结果截图和说明:
这里T0055G0013S0001是uttId,后面的 [4 1 1 1 ...是transtion-id(transtion-id推测是HMM状态转移的弧ID)。并且这里输出了每个中括号对应的音素是哪一个。
六、查看训练后的转移概率
1、相关指令:
2、输出结果截图和说明:
(1)静音音素的HMN转移概率模型
(2)一般音素的HMM转移概率模型
(3)内容解析:
phone 音素,含一般音素和静音音素
hmm-state hmm状态,一般音素(0,1,2),静音音素(0,1,2,3,4)
pdf 对phone和hmm-state绑定到哪一个HMM模型(例子中HMM模型有128个,部分是共用的)
transtion-id 推测是HMM中的弧的ID,有762条:18 * 4 + 6 * 115 = 762(静音音素有18条,一般音素有6条)
count of pdf 还这个不太清楚是什么