http://blog.csdn.net/u013677156/article/details/77893661html
一、kaldi解码过程算法
kaldi识别解码一段语音的过程是:首先提取特征,而后过声学模型AM,而后过解码网络HCLG.fst,最后输出识别结果。网络
HCLG是解码时的重要组成部分。HCLG.fst是由4个fst通过一系列算法(组合、肯定化和最小化等)组合而成的。4个fst分别是H.fst、C.fst、L.fst和G.fst,分别是HMM模型、上下文环境、词典和语言模型对应的fst。 trans-id -> context-tri -> mono ->word->grammarspa
HCLG = asl(min(rds(det(H' o min(det(C o min(det(Lo G)))))))).net
上面的o表示组合,det表示肯定化,min表示最小化,rds表示去除消岐符号,asl表示增长自环。xml
Kaldi中,单独的C.fst是不存在的。L和G合并生成LG.fst,而后在其基础上,根据决策树的结果,直接生成CLG.fst。htm
二、fst可视化的两个基本命令blog
fstprint和fstdraw是可视化用到的两个基本命令
fstprint用于打印fst,能够将二进制的fst以文件形式打印出来。Fstprint的基本用法以下
fstprint [--isymbols=xxxx --osymbols=xxxx ] FST
参数—isymbols和—osymbols分别表示输入符号表和输出符号表,这两个参数能够省略。
fstdraw用于画fst图,其使用方式跟fstprint相似。Fstdraw获得的结果是dot文件,经过dot命令转为ps格式,而后能够由ps2pdf命令转为pdf文档。ip
fstdraw使用示例
fstdraw [--isymbols=phones.txt --osymbols=words.txt] L.fst | dot –Tps | ps2pdf – L.pdf文档
三、yesno例子中各个fst的可视化
3.1 语言模型生成的G.fst可视化
yesno例子中的语言模型很简单
这个语言模型生成的G.fst,将其用fstprint打印出来(symbols选words.txt)
上面是G.fst的打印结果。对于fst,其打印结果,一行通常有5列。一行对应一个弧。第一列和第二列,表示这个弧的起始状态和终止状态。第三列和第四列,表示输入和输出。第五列是权重。
将其对应的图打印出来,用fstdraw命令
3.2 词典文件生成的L.fst
yesno例子中的词典文件也很简单,以下所示
在data/lang目录下会找到两个fst,分别是 L.fst和L_disambig.fst。后者是在L.fst上加消岐符号。
用fstprint查看这两个fst
用fstdraw看两个fst图,第一个图是 L.fst;第二个是 L_disambig.fst。实际生成HCLG时,用的是L_disambig.fst。
3.3 将L.fst(这里指L_disambig.fst)和G.fst合并起来,生成LG.fst。
3.4将LG.fst生成CLG.fst,获得的结果以下;由于是单音素,因此跟原先的LG.fst是同样的。
3.5 hmm模型生成的ha.fst。这里的hmm对应的fst,是不带自环的。
这个fst的第三列,输入,是transition-id;输出是音素。其对应的图以下
上面图中,圆圈表示的就是状态,里面的数字是状态的id。弧上面,冒号前面的数字时transition-id,冒号后面的数字是输出的音素;斜杠后面的数字是权重。
其中0-7-8-9-0这条“路径”,表示的就是音素Y; 0-10-11-12-0表示的就是音素N。
按照一样的方法,能够打印和画出 HCLGa.fst 和 HCLG.fst的内容。
其余有用的fst相关的命令: fstinfo fstcopy