[轉] kaldi中FST的可視化-以yesno爲例

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例子中的語言模型很簡單

 

[plain]  view plain  copy
 
  1. cat input/task.arpabo  
  2.   
  3. \data\  
  4. ngram 1=4  
  5.   
  6. \1-grams:  
  7. -1      NO  
  8. -1      YES  
  9. -99 <s>  
  10. -1 </s>  
  11.   
  12. \end\  


這個語言模型生成的G.fst,將其用fstprint打印出來(symbols選words.txt)

 

 

[html]  view plain  copy
 
  1. 0   0   NO  NO  2.30258512  
  2. 0   0   YES YES 2.30258512  
  3. 0   2.30258512  

 

上面是G.fst的打印結果。對於fst,其打印結果,一行通常有5列。一行對應一個弧。第一列和第二列,表示這個弧的起始狀態和終止狀態。第三列和第四列,表示輸入和輸出。第五列是權重。

將其對應的圖打印出來,用fstdraw命令

 

  3.2 詞典文件生成的L.fst

 yesno例子中的詞典文件也很簡單,以下所示

 

[plain]  view plain  copy
 
  1. cat data/local/dict/lexicon.txt  
  2. <SIL> SIL  
  3. YES Y  
  4. NO N  

在data/lang目錄下會找到兩個fst,分別是 L.fst和L_disambig.fst。後者是在L.fst上加消岐符號。

 

用fstprint查看這兩個fst

 

[plain]  view plain  copy
 
  1. fstprint --isymbols=phones.txt --osymbols=words.txt L.fst  
  2. 0   1   <eps> <eps> 0.693147182  
  3. 0   1   SIL <eps> 0.693147182  
  4. 1   1   SIL <SIL>  
  5. 1   1   N   NO  0.693147182  
  6. 1   2   N   NO  0.693147182  
  7. 1   1   Y   YES 0.693147182  
  8. 1   2   Y   YES 0.693147182  
  9. 1  
  10. 2   1   SIL <eps>  
  11.   
  12. fstprint --isymbols=phones.txt --osymbols=words.txt L_disambig.fst  
  13. 0       1       <eps>   <eps>   0.693147182  
  14. 0       2       SIL     <eps>   0.693147182  
  15. 1       1       SIL     <SIL>  
  16. 1       1       N       NO      0.693147182  
  17. 1       3       N       NO      0.693147182  
  18. 1       1       Y       YES     0.693147182  
  19. 1       3       Y       YES     0.693147182  
  20. 1       1       #0      #0  
  21. 1  
  22. 2       1       #1      <eps>  
  23. 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。

 

[plain]  view plain  copy
 
  1. 1   0   SIL <eps> 0.829214692  
  2. 1   1   Y   YES 2.99609375  
  3. 1   1   N   NO  2.99609375  
  4. 1   2.99609375  
  5. 0   2   #1  <eps> 0.533971608  
  6. 2   1   Y   YES 1.63290751  
  7. 2   1   N   NO  1.63290751  
  8. 2   1.63290739  



 

 

 3.4將LG.fst生成CLG.fst,獲得的結果以下;由於是單音素,因此跟原先的LG.fst是同樣的。

 

[plain]  view plain  copy
 
  1. 0   1   SIL <eps> 0.829214692  
  2. 0   0   Y   YES 2.99609375  
  3. 0   0   N   NO  2.99609375  
  4. 0   2.99609375  
  5. 1   2   #0  <eps> 0.533971608  
  6. 2   0   Y   YES 1.63290751  
  7. 2   0   N   NO  1.63290751  
  8. 2   1.63290739  

 

 

  3.5 hmm模型生成的ha.fst。這裏的hmm對應的fst,是不帶自環的。

 

[plain]  view plain  copy
 
  1. 0   1   0   1  
  2. 0   7   20  2   1.1920929e-07  
  3. 0   10  26  3  
  4. 0   13  31  4  
  5. 0  
  6. 1   2   2   0   2.70571232  
  7. 1   3   3   0   2.70571232  
  8. 1   4   4   0   0.14340198  
  9. 2   3   6   0   0.936247587  
  10. 2   4   7   0   1.19049001  
  11. 2   5   8   0   1.19049001  
  12. 3   2   9   0   1.80542946  
  13. 3   4   11  0   0.398507833  
  14. 3   5   12  0   1.80542946  
  15. 4   2   13  0   2.34313083  
  16. 4   3   14  0   2.34313083  
  17. 4   5   16  0   0.213165522  
  18. 5   6   18  0  
  19. 6   0   0   0  
  20. 7   8   22  0  
  21. 8   9   24  0   -2.38418579e-07  
  22. 9   0   0   0  
  23. 10  11  28  0  
  24. 11  12  30  0   4.76837158e-07  
  25. 12  0   0   0  
  26. 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

相關文章
相關標籤/搜索