http://blog.csdn.net/u013677156/article/details/77893661
1、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->grammar
HCLG = asl(min(rds(det(H' o min(det(C o min(det(Lo G))))))))
上面的o表示組合,det表示確定化,min表示最小化,rds表示去除消岐符號,asl表示增加自環。
Kaldi中,單獨的C.fst是不存在的。L和G合並生成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