zoukankan      html  css  js  c++  java
  • [转] kaldi中FST的可视化-以yesno为例

    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例子中的语言模型很简单

    [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

  • 相关阅读:
    Android Gradle使用总结
    Jenkins实现Android自动化打包
    RxJava 2.x 使用最佳实践
    Android 路由框架ARouter最佳实践
    Android 加载GIF图最佳实践
    Java 锁机制 synchronized
    Fiddler抓包使用教程-断点调试
    Fiddler抓包使用教程-Android应用抓包
    Fiddler抓包使用教程-QuickExec
    Fiddler抓包使用教程-模拟低速网络环境
  • 原文地址:https://www.cnblogs.com/welen/p/7611320.html
Copyright © 2011-2022 走看看