kaldi中FST的可视化-以yesno为例

1、kaldi解码过程

kaldi识别解码一段语音的过程是:首先提取特征,然后过声学模型AM,然后过解码网络HCLG.fst,最后输出识别结果。

HCLG是解码时的重要组成部分。HCLG.fst是由4个fst经过一系列算法(组合、确定化和最小化等)组合而成的。4个fst分别是H.fst、C.fst、L.fst和G.fst,分别是HMM模型、上下文环境、词典和语言模型对应的fst。

HCLG = asl(min(rds(det(H' o min(det(C o min(det(Lo G))))))))

上面的o表示组合,det表示确定化,min表示最小化,rds表示去除消岐符号,asl表示增加自环。

Kaldi中,单独的C.fst是不存在的。LG合并生成LG.fst,然后在其基础上,根据决策树的结果,直接生成CLG.fst


2、fst可视化的两个基本命令

fstprint和fstdraw是可视化用到的两个基本命令
fstprint用于打印fst,可以将二进制的fst以文件形式打印出来。Fstprint的基本用法如下
fstprint  [--isymbols=xxxx --osymbols=xxxx ]  FST
参数—isymbols和—osymbols分别表示输入符号表和输出符号表,这两个参数可以省略。
fstdraw用于画fst图,其使用方式跟fstprint类似。Fstdraw得到的结果是dot文件,通过dot命令转为ps格式,然后可以由ps2pdf命令转为pdf文档。

fstdraw使用示例
fstdraw [--isymbols=phones.txt --osymbols=words.txt] L.fst | dot –Tps  |  ps2pdf – L.pdf


3、yesno例子中各个fst的可视化

  3.1 语言模型生成的G.fst可视化

yesno例子中的语言模型很简单

cat input/task.arpabo

\data\
ngram 1=4

\1-grams:
-1      NO
-1      YES
-99 <s>
-1 </s>

\end\

这个语言模型生成的G.fst,将其用fstprint打印出来(symbols选words.txt)

0	0	NO	NO	2.30258512
0	0	YES	YES	2.30258512
0	2.30258512

上面是G.fst的打印结果。对于fst,其打印结果,一行一般有5列。一行对应一个弧。第一列和第二列,表示这个弧的起始状态和终止状态。第三列和第四列,表示输入和输出。第五列是权重。

将其对应的图打印出来,用fstdraw命令



  3.2 词典文件生成的L.fst

 yesno例子中的词典文件也很简单,如下所示

cat data/local/dict/lexicon.txt
<SIL> SIL
YES Y
NO N
在data/lang目录下会找到两个fst,分别是 L.fst和L_disambig.fst。后者是在L.fst上加消岐符号。

用fstprint查看这两个fst

fstprint --isymbols=phones.txt --osymbols=words.txt L.fst
0	1	<eps>	<eps>	0.693147182
0	1	SIL	<eps>	0.693147182
1	1	SIL	<SIL>
1	1	N	NO	0.693147182
1	2	N	NO	0.693147182
1	1	Y	YES	0.693147182
1	2	Y	YES	0.693147182
1
2	1	SIL	<eps>

fstprint --isymbols=phones.txt --osymbols=words.txt L_disambig.fst
0       1       <eps>   <eps>   0.693147182
0       2       SIL     <eps>   0.693147182
1       1       SIL     <SIL>
1       1       N       NO      0.693147182
1       3       N       NO      0.693147182
1       1       Y       YES     0.693147182
1       3       Y       YES     0.693147182
1       1       #0      #0
1
2       1       #1      <eps>
3       2       SIL     <eps>

用fstdraw看两个fst图,第一个图是 L.fst;第二个是 L_disambig.fst。实际生成HCLG时,用的是L_disambig.fst。



  3.3 将L.fst(这里指L_disambig.fst)和G.fst合并起来,生成LG.fst。

1	0	SIL	<eps>	0.829214692
1	1	Y	YES	2.99609375
1	1	N	NO	2.99609375
1	2.99609375
0	2	#1	<eps>	0.533971608
2	1	Y	YES	1.63290751
2	1	N	NO	1.63290751
2	1.63290739


 3.4将LG.fst生成CLG.fst,得到的结果如下;因为是单音素,所以跟原先的LG.fst是一样的。

0	1	SIL	<eps>	0.829214692
0	0	Y	YES	2.99609375
0	0	N	NO	2.99609375
0	2.99609375
1	2	#0	<eps>	0.533971608
2	0	Y	YES	1.63290751
2	0	N	NO	1.63290751
2	1.63290739


  3.5 hmm模型生成的ha.fst。这里的hmm对应的fst,是不带自环的。

0	1	0	1
0	7	20	2	1.1920929e-07
0	10	26	3
0	13	31	4
0
1	2	2	0	2.70571232
1	3	3	0	2.70571232
1	4	4	0	0.14340198
2	3	6	0	0.936247587
2	4	7	0	1.19049001
2	5	8	0	1.19049001
3	2	9	0	1.80542946
3	4	11	0	0.398507833
3	5	12	0	1.80542946
4	2	13	0	2.34313083
4	3	14	0	2.34313083
4	5	16	0	0.213165522
5	6	18	0
6	0	0	0
7	8	22	0
8	9	24	0	-2.38418579e-07
9	0	0	0
10	11	28	0
11	12	30	0	4.76837158e-07
12	0	0	0
13	0	0	0


这个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

没有更多推荐了,返回首页