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

  1. cat input/task.arpabo
  2. \data\
  3. ngram 1=4
  4. \1-grams:
  5. -1      NO
  6. -1      YES
  7. -99 <s>
  8. -1 </s>
  9. \end\

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

  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例子中的词典文件也很简单,如下所示

  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

  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. fstprint --isymbols=phones.txt --osymbols=words.txt L_disambig.fst
  12. 0       1       <eps>   <eps>   0.693147182
  13. 0       2       SIL     <eps>   0.693147182
  14. 1       1       SIL     <SIL>
  15. 1       1       N       NO      0.693147182
  16. 1       3       N       NO      0.693147182
  17. 1       1       Y       YES     0.693147182
  18. 1       3       Y       YES     0.693147182
  19. 1       1       #0      #0
  20. 1
  21. 2       1       #1      <eps>
  22. 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. 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是一样的。

  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,是不带自环的。

  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

[转] kaldi中FST的可视化-以yesno为例的更多相关文章

  1. [转]决策树在Kaldi中如何使用

    转自:http://blog.csdn.net/chenhoujiangsir/article/details/51613144 说明:本文是kaldi主页相关内容的翻译(http://kaldi-a ...

  2. kaldi中CD-DNN-HMM网络参数更新公式手写推导

    在基于DNN-HMM的语音识别中,DNN的作用跟GMM是一样的,即它是取代GMM的,具体作用是算特征值对每个三音素状态的概率,算出来哪个最大这个特征值就对应哪个状态.只不过以前是用GMM算的,现在用D ...

  3. Docker入门(四)——MySQL镜像中的数据库可视化

      在详细介绍这篇文章的内容前,需要说明下笔者写这篇文章的意图:笔者在现有的开发中,前后端联调的方式为Docker镜像对接,数据库使用MySQL镜像,开发环境为远程服务器,因此,笔者迫切需要一种能将远 ...

  4. Python 数据分析中常用的可视化工具

    Python 数据分析中常用的可视化工具 1 Matplotlib 用于创建出版质量图表的绘图工具库,目的是为 Python 构建一个 Matlab 式的绘图接口. 1.1 安装 Anaconada ...

  5. 关于 underscore 中模板引擎的应用演示样例

    //关于 underscore 中模板引擎的应用演示样例 <!doctype html> <html> <head> <meta charset=" ...

  6. OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式

    在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...

  7. 以kaldi中的yesno为例谈谈transition

    在基于GMM-HMM的传统语音识别里,比音素(phone)更小的单位是状态(state).一般每个音素由三个状态组成,特殊的是静音(SIL)由五个状态组成.这里所说的状态就是指HMM里的隐藏的状态,而 ...

  8. Kaldi中的Chain模型

    Chain模型的训练流程 链式模型的训练过程是MMI的无网格的版本,从音素级解码图生成HMM,对其使用前向后向算法,获得分母状态后验,通过类似的方式计算分子状态后验,但限于对应于转录的序列. 对于神经 ...

  9. 【Unity】13.1 场景视图中的GI可视化

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 在场景视图中设计不同的场景内容时,可以根据需要勾选相关的渲染选项,以便让场景仅显示其中的一部分或者全部渲染效果. 在这些 ...

随机推荐

  1. easyui 传递参数报错(错误:uncaught SyntaxError: Unexpected identifier)

    转自:https://www.cnblogs.com/javaboy2018/p/8733585.html 代码: 按钮事件: function formatOper(val, row, index) ...

  2. .net core中的分布式缓存和负载均衡

    通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性,缓存对不经常更改的数据效果最佳,缓存生成的数据副本的返回速度可以比从原始源返回更快.ASP.NET Core 支持多种不同的缓存,最简 ...

  3. JAVA多线程之线程间的通信方式

    (转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...

  4. ng环境搭建步骤

    1,安装node node -v查看版本号 2,安装淘宝镜像 npm config set registry https://registry.npm.taobao.org 3,安装cnpm npm ...

  5. mRNA文库构建

    mRNA文库构建 Posted: 三月 27, 2017  Under: Transcriptomics  By Kai  no Comments RNA-seq测序方法 在测mRNA过程中,首先要去 ...

  6. luogu P1064|| 01背包||金明的预算

    题目描述如下 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 NNN 元 ...

  7. 线程池ThreadPoolExecutor源码分析

    在阿里编程规约中关于线程池强制了两点,如下: [强制]线程资源必须通过线程池提供,不允许在应用中自行显式创建线程.说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源 ...

  8. MySQL数据库和表名大小写敏感开关的打开办法

    背景:window 10系统安装了MySQL57,使用可视化操作工具Navicat Premium 12进行相关操作,一切比较顺利.但在建立数据库和表时,发现大小写命名不敏感.区分大小写输入,保存后默 ...

  9. 返回上一页 html A标记代码

    <a class="sjad" href="#" onClick="javascript:history.back(-1);"> ...

  10. 图解HTTP第十章

    Web 的攻击技术 1>在客户端即可篡改请求 2>针对 Web 应用的攻击模式 3>因输出值转义不完全引发的安全漏洞 [1]跨站脚本攻击 [2]SQL 注入攻击 [3]OS 命令注入 ...