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