AIBigKaldi(七)| Kaldi的解码图构造(上)(源码解析)
本文来自公众号“AI大道理”。
上篇训练完了单音子模型。
不管模型好坏先进行解码试试效果。
解码之前首先要构建解码图,即HCLG.fst。
(本篇主要解析kaldi源码实现,详细算法原理请阅读
1 解码图构造
4 mkgraph.sh
源码解析:
Usage: utils/mkgraph.sh [options] <lang-dir> <model-dir> <graphdir>
过程之道:
2 LoG = LG
4.1 LoG = LG
L.fst即Lexicon词典构造的WFST。
上面的小词典可以构造出下图:
G.fst即语言模型构造的WFST。
3-gram语言模型
可以构造出下图
LG.fst
LoG = LG是由这几个命令完成的:
fsttablecompos,fstdeterminizestar,fstminimizeencoded,fstpushspecial,fstisstochastic。
4.1.1 fsttablecompose(合成算法)
功能:
将L.fst与G.fst合成LG.fst。
fsttablecompose与fstcompose类似,但是速度更快。
源码解析:
过程之道:
函数解析:
TableCompose()
真正进行compose操作的函数,因最后一个参数的不同分两种TableCompose()。
4.1.2 fstdeterminizestar(确定化算法)
功能:
对LG.fst进行去除ε和确定化操作。
stdeterminizestar与fstdeterminize类似,但其中包含空转移去除处理。
源码解析:
过程之道:
函数解析:
DeterminizeStarInLog()
DeterminizeStar()
DeterminizeStarInLog确定log半环中的“fst”,使用DeterminizeStar算法,同时也进行对epsilons的删除。
DeterminizeStarInLog()内部调用了 DeterminizeStar()。
DeterminizeStar()才是真正操作的函数。
4.1.3 fstminimizeencoded(最小化算法)
功能:
对LG.fst进行最小化操作。
在编码后最小化FST[类似于fstminimize,但没有进行权重推移]
源码解析:
过程之道:
函数解析:
MinimizeEncoded(fst, delta)
真正做最小化操作的函数。
编码后最小化;适用于所有FST。它就像从Minimize()函数中得到的一样,只是它不会推动权重或符号。
4.1.4 fstpushspecial(权重推移)
功能:
权重推移
源码解析:
过程之道:
函数解析:
PushSpecial(fst, delta)
真正进行权重推移的函数。
这个函数在对数半环中进行重量推送,但是以一种特殊的方式,使得任何推后的“剩余权重”都均匀地分布在FST上,并且不会在开始或结束时结束。推送权重使得每个状态的总权重(即弧概率加上最终概率之和)对于所有状态都是相同的。
4.1.5 fstisstochastic(随机性检测)
stochastic性质:
一个WFST从任意状态出发的跳转的权重之⨁ 运算为1。
在符合stochastic性质的WFST上解码,解码效率较高。
功能:
检查FST是否是随机的,如果是,则成功退出。打印出最大误差(以日志单位为单位)
源码解析:
过程之道:
函数解析:
IsStochasticFstInLog(*fst, delta, &min, &max)内部经过一些处理之后调用了
IsStochasticFst(*fst, delta, &min, &max)。
检验热带FST在对数半环上是否是随机的。(强制转换并执行检查。)此函数处理通用的fst。
3 LGoC = CLG
4.2 LGoC = CLG
LG.fst
C.fst即context dependent,上下文相关三音子构造的FST,没有权重,只有映射。
可以构造出下图
CLG.fst
CoLG = CLG是由这几个命令完成的:
fstcomposecontext,fstarcsort,fstisstochastic
4.2.1 fstcomposecontext(合成算法)
功能:
C.fst与LG.fst合成为CLG.fst。
kaldi中并没有真正的构造完整的C,而是根据LG一边动态的构建局部的C,一边和LG合成,避免不必要的生成C的全部状态和跳转。
使用三音子代替单音子。
源码解析:
其中ilabels是一个二维vector
ilabel_info[1000]=={3,20,12}表示当C中的输入标签为1000时,对应的音素为第20号音素,左边是3号音素,右边是12好音素。
过程之道:
函数解析:
ComposeContext()与ComposeContextLeftBiphone()
真正进行合成操作的函数,因三音子与双音子的不同分为两种函数。
4.2.2 fstarcsort(弧排序)
功能:
对FST的弧进行排序。
fstarcsort.cc在tools下面的openfst工具里,内部调用了fstarcsort-main()进行实际操作。
源码解析:
4.2.3 fstisstochastic(随机性检查)
功能:
检查FST是否是随机的,如果是,则成功退出。打印出最大误差(以日志单位为单位)
4 总结
L.fst与G.fst经过合成、确定化、最小化、权重推移和随机性检查后成为了LG.fst。
紧接着加入C,构造了CLG.fst。
接下来继续加入H,构造HCLG.fst。
下期预告
往期精选
AIBigKaldi(六)| Kaldi的单音子模型训练(下)
AIBigKaldi(五)| Kaldi的单音子模型训练(上)
AI大语音(十四)——区分性训练
AI大语音(十三)——DNN-HMM
AI大语音(十二)——WFST解码器(下)
AI大语音(十一)——WFST解码器(上)
AI大语音(十)——N-gram语言模型
AI大语音(九)——基于GMM-HMM的连续语音识别系统
AI大语音(八)——GMM-HMM声学模型
AI大语音(七)——基于GMM的0-9语音识别系统
AI大语音(六)——混合高斯模型(GMM)
AI大语音(五)——隐马尔科夫模型(HMM)
AI大语音(四)——MFCC特征提取
AI大语音(三)——傅里叶变换家族
AI大语音(二)——语音预处理
AI大语音(一)——语音识别基础
——————
浅谈则止,细致入微AI大道理
扫描下方“AI大道理”,选择“关注”公众号
—————————————————————
—————————————————————