【kaldi】常用工具和mono训练结果解析

一、内容介绍

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        还这个不太清楚是什么

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值