Kaldi HMM拓扑和状态转换模型
2017-11-10 09:20
344 查看
HMM拓扑
使用c++的HmmTopology来描述音素的HMM拓扑。其描述的一个实例(3-state Bakis模型)如下:<Topology> <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 </State> <State> 3 </State> </TopologyEntry> </Topology>
在这个实例中只有一个
TopologyEntry,其包括了音素1~8(所以这个例子总共8个音素,这些音素共享相同的拓扑)。有三个发射状态,每个状态包括一个自循环和发射到其它状态的概率。还有最后一个非发射状态(状态3,没有入口)。kaldi把状态0作为初始状态,最后一个状态作为作为终止状态(无发射状态,其概率等于1)。
HmmTopology对象中的概率用于初始化训练。训练的概率是上下文相关的
HMM并且存储在
TransitionModel对象。
TransitionModel以
c++类成员的方式存储
HmmTopology对象。
HmmTopology的转换概率通常除了初始化
TransitionModel对象其它地方并不会被用到。
Pdf-class
Pdf-class是和对象
HmmTopology有关的一个对象。
HmmTopology为每一个音素指定了一个HMM模型,每一个有编号的状态有两个变量
forward_pdf_class和
self_loop_pdf_class。
self_loop_pdf_class是转换到状态自身的概率,缺省值是和
forward_pdf_class一样的。但是两者的概率也可以不一样。
音素的HMM状态通常从0开始,连续的(1,2,。。。),这是为了图构建的方便。
状态转换模型(TransitionModel对象)
TransitionModel对象存储了音素的HMM拓扑对应的转变概率和信息。构建图的代码根据
TransitionModel和
ContextDependencyInterface对象来获得拓扑结构和状态转换概率。
状态转化概率建模
状态转换的概率是和上下文相关的HMM状态相关的,其依赖如下5项内容(5元组):音素
源HMM状态(
HmmTopology对象解析,通常是0,1,2…)
前向概率(
forward-pdf-id,)
自循环概率(
self-loop-pdf-id)
HmmTopology对象的状态索引
后四项可以看成是目标HMM状态编码成
HmmTopology对象。
transition-ids
TrainsitionModel对象在初始化时建立了音素和整数之间的映射关系,此外还有转换标识符 (transition identifiers)
transition-ids,转换索引(transition indexes),转换状态(transition states)这些量。引入这些量为了完全使用基于FST的训练方法。
TransitionModel
使用的整型标识符
音素(从1开始):可以从OpenFst符号表转换成音频的名字,并不要求音素是连续标号的。hmm状态(从0开始):用于索引
HmmTopology::TopologyEntry对象。
概率或者pdf-ids(从0开始):源于决策树聚类后结果,通常一个ASR系统有数以千计的pdf-id.
transition-state(从1开始):
TransitionModel定义。每一个可能的三元组(音素,hmm状态,概率)映射到一个独一无二的转换状态。
transition-index(从0开始):是对
HmmTopology::HmmState的索引。
transition-id(从1开始):是状态转换模型的转换概率。二元组(
transition-state,
transition-index)和
transition-id可以互相映射。
转换模型(transition model)训练
用于训练和测试的FST将transition-id做为输入label。在训练过程中使用维特比解码获得输入transition-id序列(每一个都是一个特征向量),函数
Transition::Update()对每个
transition-state做最大似然估计。
对齐
和的语句长度一样的包含一系列transition-ids的vector向量描述了对齐关系。
transition-ids序列从解码器得到。对齐用于维特比训练和测试时自适应。由于
transition-ids编码了音素信息,可以通过工具
SplitToPhones()和
ali-to-phones.cc根据对齐取出音素序列。
通常kaldi中需要处理由句子索引的对齐集合,这通常使用表的方式来实现。
函数
ConvertAlignment()(命令行是
convert-ali)将对齐从一个状态转变模型转换到另一个模型。
状态层次后验概率
状态级后验概率是“对齐”概念的扩展,区别在于“对齐”概念上每帧对应一个状态转变ID,而状态级后验概率每帧的状态转变ID的数量没有限制,且每个状态ID都有一个权重对应。通常按如下结构存储:typedef std::vector<std::vector<std::pair<int32, BaseFloat> > > Posterior;
如果使用
Posterior创建了一个名为post的对象,则
post.size()将等于句子帧数,
post[i]存储的是
(transition-id, posterior)信息。
当前程序中,只有两个方法创建
posteriors。
使用
ali-to-post程序将对齐转换成后延概率。
使用
weight-silence-post修改后验概率。
当加入lattice是,也有工具从Lattice生成后验概率。
高斯层次后验概率
表示高斯层次的后验概率类型如下:typedef std::vector<std::vector<std::pair<int32, Vector<BaseFloat> > > > GauPost;
其状态是使用向量浮点数来表示的。向量的size和高斯量的数目是一样的。
post-to-gpost将
Posterior结构转换成
GauPost结构。使用模型和特征计算高斯层次的后验概率。
HMMs转成FSTs
GetHTransducer()
fst::VectorFst<fst::StdArc>* GetHTransducer (const std::vector<std::vector<int32> > &ilabel_info, const ContextDependencyInterface &ctx_dep, const TransitionModel &trans_model, const HTransducerConfig &config, std::vector<int32> *disambig_syms_left);
该函数返回输入是
transition-ids,输出是上下文相关音素的FST。FST具有初始和终止状态,转换出FST的状态变换将输出音素符号。通常转出FST状态会转入一个表示3状态HMM的结构体中,然后跳到起始状态。
HTransducerConfig配置类
HTransducerConfig控制着
GetHTransducer的行为。
变量
trans_prob_scale是状态转变缩放因子。当转变概率添加到图里时,会乘以缩放因子。命令行工具是
transition-scale。
GetHmmAsFst()
函数GetHmmAsFst()输入是一段音素,返回的是状态机最终状态时得到的
transition-ids序列。
AddSelfLoops()
是向图中添加自循环。添加自循环的意义是可以进行状态重新调整,而不加的意义在于决策过程可以更高效。FST添加状态转变概率
函数AddTransitionProbs()向FST添加概率。这样可以在无概率时就可以创建图了。
相关文章推荐
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- 从Java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换
- (转)线程栈模型与线程的变量、线程状态转换
- 线程栈模型与线程的变量、线程状态转换
- 进程的描述与控制 进程的状态和转换 三态模型和五态模型
- Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext
- Dreamweaver 8 代码视图状态到设计视图状态转换速度很慢解决方法
- hibernate对象三种状态及其转换
- PowerDesigner中三种模型的转换关系图
- Java设计模式之从[游戏中的兵种状态转换]分析状态(State)模式
- JZOJ4722 跳楼机 巧妙地转换为最短路模型
- 购物网站28:类型转换器---日期----配送方式----性别----订单状态----支付方式----性别----系统权限
- UE4 button插件,简单的把Max Transform 转换 然后在关卡中生成模型
- 训练中文分词HMM模型,得到A(状态转移矩阵)、B(混淆矩阵)、Pi(初始状态概率)
- part based model 模型 mat结构模型转换为opencv中的xml的格式
- TCP状态转换
- 操作系统进程的概念,进程的状态及状态转换,进程控制
- TCP状态转换
- 地图区域划分转换成数学模型解决问题
- 进程的3种状态及转换情况(占坑)