TransitionModel的成员变量
- HmmTopology topo_;
- std::vector<Triple> triples_: 每个Triple结构是一个(phone,hmm_state,pdf)的三元组
- transition_state: 每个Triple对应一个transition_state,对应关系为(triples indexed by transition_state-1),也就是triples_[0]=transition_state[1]
- transition_id: 由于每个音素的每个状态都有多个transition;transition_id用来标记其中每个跳转
- state2id: 为vector<int32>变量,索引值为transition_state,所以从1开始,对应第i条Triple记录,存的值为每个transition_state的第一个transition_id。state2id_的长度为triples_.size+2,其中state2id
[0]为空,state2id[last]=总的transition数+1,起一个上界的作用。
- id2state: 为vector<int32>变量,索引值为transition_id,存的值为对应的transition_state
- log_probs :为vector<BaseFloat>,由transition_id索引
- non_self_loop_log_probs :为vector<BaseFloat>类型,由transition_state索引,值=log(1-self_loop_prob)
- num_pdfs_ : 为int32类型,值=(1+pdf最大值),由于pdf从0开始,所以为pdf的数量
HmmTopology类的成员变量
- phones_ : 为vector<int32>类型,为顺序的所有phone的编号
- phone2idx_ : 为vector<int32>类型,长度为phones_+1,记录第i个phone对应第几类TopologyEntry(可能是对应3状态类型的TopologyEntry或者5状态等)
- entries_ : 为vector<TopologyEntry>类型,从0开始编号,每一个TopologyEntry为final.mdl中的一种Hmm结构
主程序
- 里面三个参数
- model_filename通常为gmm模型,包括topo和triples记录
- alignments_rspecifier
- pdfs_wspecifier
- 转换
std::vector<int32> alignment = reader.Value();
for (size_t i = 0; i < alignment.size(); i++) {
alignment[i] = trans_model.TransitionIdToPdf(alignment[i]);
}
TransitionModel的读取
- 读拓扑结构
- 顺序将Triple存入triples_
- ComputeDerived()函数构建transition_id和transition_state之间的对应关系,即state2id_和id2state_
TransitionIdToPdf函数
- 核心代码
传入的是trans_id
trans_state = id2state_[trans_id];
triples_[trans_state-1].pdf;
- triples_是一个vector<Triple>; Triple是一个(phone,hmm_state,pdf) 三元组
- id2state_是一个vector<int32>
- 首先transition_model已经存储了id2state_的对应关系,根据transition_id找到对应的transition_state,找到第transition_state条Triple,也就是triples_[trans_id-1],