精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
最近结合kaldi的例子改出来一个语音识别在线服务器,编译通过,对里面的代码进行深入理解下,看到了TransitionModel,它用mdl初始化,是SingleUtteranceNnet2Decoder和OnlineSilenceWeighting这2个类对象构造函数中的参数,这表明 TransitionModel是语音识别的关键输入。下面是一些理论描述,感谢网络上前辈。
kaldi中的HMM模型,实际就是一个TransitionModel对象。这个对象描述了音素的HMM拓扑结构,并保存了pdf-id和transition-id相关的信息,并且可以进行各种变量的转换。
TransitionModel的定义和实现位于transition-model.h和transition-model.cc中。在了解此对象之前,应先阅读和理解hmm-topology相关的内容。
在介绍TransitionModel之前,先介绍一些概念。
phone: 音素,从1开始编号。可以根据phones.txt映射为具体音素
HMM-state: 音素HMM模型的状态,从0开始编号
pdf-id: 决策树和声学模型中用到的pdf的编号,从0开始
transition-state: 一个(虚拟的)状态,通过弧跳转到自己或其他状态。某些情况下,可以跟pdf-id一一对应。
transition-index: HMM状态中转移的索引,即HmmTopology::HmmState::transitions的索引,从0开始编号
transition-id: 所有的HMM状态的弧进行编号。从1开始编号。
通常,将phone、HMM-state和pdf-id(包括forward-pdf-id, self-loop-pdf-id)作为一个元组(Tuple),一个元组,可映射为一个transition-state。transition-state加一个具体的transition-index,可以映射出一个transition-id。各种映射关系如下:
(phone, HMM-state, forward-pdf-id, self-loop-pdf-id) -> transition-state
(transition-state, transition-index) -> transition-id
同时也存在着反向的映射关系,即:
transition-id -> transition-state
transition-id -> transition-index
transition-state -> phone
transition-state -> HMM-state
transition-state -> forward-pdf-id
transition-state -> self-loop-pdf-id
kaldi中TransitionModel的定义如下,为了方便阅读和理解,对代码做了修改。
实际写入模型文件(如final.mdl)中的HMM模型就是一个TransitionModel对象。但是写入到文件中的,并不是所有成员变量。只是写入了topo_、tuples_和log_probs_这三项。其他项,都是在后来计算出来的。下面的表格,也对几个成员变量,做了汇总介绍。
show-transitions phones.txt final.mdl
# -Gsize指定大小,-T指定保存类型,可以是png, jpg, pdf等
draw-tree phones.txt tree | dot -Gsize=80,100 -Tpng > tree.png
draw-tree phones.txt tree | dot -Tpdf > tree.pdf
# 输出到标准输出
gmm-copy --binary=false final.mdl -
# 输出到标准输出
eg: copy-tree --binary=false tree -
有些特殊情况可以带if语句的日志输出来判断,毕竟工具看的结果是已经运行后的结果,运行状态看不到。