$cmd JOB=1 $dir/log/init.log \ gmm-init-mono $shared_phones_opt "--train-feats=$feats subset-feats --n=10 ark:- ark:-|" $lang/topo $feat_dim \ $dir/0.mdl $dir/tree || exit 1;
训练结果是生成0.mdl和tree
查看0.mdl方法
~/williamli/project/kaldi/kaldi/src/gmmbin/gmm-copy --binary=false 0.mdl -
输出结果
第一部分
<TransitionModel>
<Topology>
<TopologyEntry>
<ForPhones>
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
显示出音素的个数,这里音素用序列号代表
第二部分
<TransitionModel>
<Topology>
<TopologyEntry>
<ForPhones>
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
<TransitionModel>
<Topology>
<TopologyEntry>
<ForPhones>
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
kaldi做文件分析时,需要使用命令调用可执行程序打印文件结构,下面对几种常见的文件做一下说明
1.words.txt 文件和 phones.txt文件(这是数据准备的prepare_lang.sh脚本生成)里面的格式是openfst格式
对应的是词 和整数的映射
接下来看一下phone文件夹,里面有三种格式 csl int txt ,其实内容都是一样的, 从上往下说,
align_lexicon 表示对齐文件,是由lexiconp.txt的第一列第三列提取出来生成
context_indep 里面包含的是那些非正常音素,包含(静音(SIL),口语噪声(SPN),非口语噪声(NSN)和笑声(LAU)
silence 里面包含了静音音素
nonsilence 里面包含了正常音素 可以认为和上面的silence是互斥的,两个文件音素的合集可以认为是整个音素集
sets 包含了一些列的音素集,在聚类音素时被分组,以建立相关的问题集(决策树的决策条件)
extra_question 包含了自动生成以外的问题
disambig 文件里面包含的是消歧符号 ,这些消歧符号在phones.txt中当作音素使用
word_boundary 里面是音素和词位的关联信息,建立这种对应关系是需要这些信息在音素网络中恢复词的边界
roots 里面包含的是建立音素上下文决策树信息,里面的shared 表示共享根,一般语气和语调会在同一行,认为共享
2.一些scp文件的说明
wav.scp 文件格式 <recording-id > <extended-filename> , 第一个字段可能是发音编号或则是文件名
segment文件,表示的是发音在一段录音中的时间偏移量,格式 <utterance-id> <recording-id> <segment-begin> <segment-end> ,后面的begin和end是以秒为单位的,这里的recording-id 和上面wav.scp的recording-id 是一样的,就把它看成是一个名称就行了
utt2spk文件,这个文件是表示一段语音是哪个人说出来的,格式是 <utterance-id> <speaker-id>
spk2gender文件,这里面是表示说话人的性别,没啥说的:
feats.scp 文件,指已经提取好的特征文件,特征提取是通过MFCC,每个特征文件都是一个矩阵
cmvn.scp文件,这里保存的是倒谱均值和方差归一化的统计量,和feat不同,这个文件是以说话人编号为索引,不是以发音编号,如图:
3. mdl文件说明 , 文件里面加载的是topo文件,打开topo文件也能看到
路径:exp/mono/*.mdl 0.mdl(初始化模型) 40.mdl(结果模型)< –GMM模型
查看final.mdl文件: /kaldi/src/gmmbin/gmm-copy--binary=false exp/mono/final.mdl - | head -n 200
结果如下图:
首先是一个transitionModel(转换模型),里面包含了TopoLogy(拓扑信息),对应的ForPhone表示包含的音素,一般是下面
的(如上图的1)表示的是静音,噪音等,上面包含的是所有的音素ID,音素2~48共享相同的拓扑结构,里面有三种发射状态,每
个都有自环和下一个状态,还包括了最后一个不发射状态(state 3没有pdf,没有转移)
先看一下官方的解释:
第一列代表的是单音素的序号,第二列代表的是前面音素的三个状态的其中一个状态,第三列代表的是pdf,也就是概率
分布函数的序号。再来张图:
这里对triples做一下总结:
1. 总共有144个这样的三元组
2. 第三列只有0-143这144个值(有些mdl,第三列的值是比数量值小的 pdf <= 数量)
这里面 pdf和state是如何对应的?
使用命令:/kaldi/src/bin/show-transitionsphones.txt final.mdl
部分输出如图:
再来官网的一段话:
我的理解是两个状态有着同样的pdf,那么它们就会共享同样的概率分布函数
打开ali文件后发现是这样的:
这里面最大数字是288,正是对应上面的transition-id
网上找到的:ali文件里面跟着的数据是每帧对应的transition-id,如上图所示:
zh相关的transition-id是283-288,通过transition-id就能找到特征文件sh代表的帧数,再来个代码注释图:
可以看到transitionModel可以得到transition-state和transition-id,而解码里面的fst是用transition-id作为输入序列的
接着继续看下final.mdl文件,之后是LogProbs 里面包含了289个数据
这个289(144*2+1=289)是对应音素的(1-48)至于原因还是没找到
到此transitionModel结束
可以看到transitionModel之后是GMM相关的数据了
DIMENSION: 39 表示了39维(包含能量是40,能量一维)
GCONSTS 应该是期望
NUMPDFS: 144 对角GMM参数重复144次,每个hmm对应pdf(144个)
WEIGHTS: 权重
MEANS_INVVARS :39维的均值
INV_VAR: 39维方差
*.mdl文件分析完成
FST文件分析地址: fst文件说明
————————————————
版权声明:本文为CSDN博主「张念」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_25867649/article/details/78435959