Kaldi 源码阅读--hmm-topology

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 与 状态的转移概率。

你可能感兴趣的:(speech,recognition)