AIBigKaldi(七)| Kaldi的解码图构造(上)(源码解析)

本文来自公众号“AI大道理”。

 

上篇训练完了单音子模型。
不管模型好坏先进行解码试试效果。
解码之前首先要构建解码图,即HCLG.fst。

(本篇主要解析kaldi源码实现,详细算法原理请阅读

AI大语音(十二)——WFST解码器(下)(深度解析))



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的单音子模型训练(下)

AIBigKaldi(五)|  Kaldi的单音子模型训练(上)

AIBigKaldi(四)|  Kaldi的特征提取

AIBigKaldi(三)|  Kaldi的数据准备

AIBigKaldi(二)|  Kaldi的I/O机制

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大道理”,选择“关注”公众号

 

—————————————————————

​     

—————————————————————

 

投稿吧   | 留言吧

 

posted on 2020-12-28 16:43  AI大道理  阅读(759)  评论(0编辑  收藏  举报

导航