Kaldi 源码阅读–HMM
关于kaldi源码的阅读已经计划很久,今日从HMM开始:
切入点是hmm的topo文件:
<TopologyEntry>
<ForPhones> 1 2 3 4 5 6 7 8 </ForPhones>
<State> 0 <PdfClass> 0
<Transition> 0 0.5
<Transition> 1 0.5
</State>
<State> 1 <PdfClass> 1
<Transition> 1 0.5
<Transition> 2 0.5
</State>
<State> 2 <PdfClass> 2
<Transition> 2 0.5
<Transition> 3 0.5
<Final> 0.5
</State>
<State> 3
</State>
</TopologyEntry>
</Topology>
kaldi 在src/hmm/hmm-topology.h 中定义了一个class HmmTopology。它包含三个成员变量:
std::vector< int32> phones_; //list of all phones we have topo for
std::vector< int32 > phone2idx_; //map phones to indexes
std::vector < TopologyEntry> entries_;
hmmTopology定义了一个TopologyEntry。TopologyEntry是一个hmmstate的数组:
typedef std::vector TopologyEntry;
hmmstate则是在其内部定义的一个结构体:
struct HmmState {
int32 forward_pdf_class;
int32 self_loop_pdf_class;
std::vector< std::pair< int32, BaseFloat> > transitions;
} 还定义了构造函数
总之一个模型有若干个phones,会包含若干个hmmstate, 每一个hmmstate 定义了其上的pdf_classs 与 状态的转移概率。