kaldi中的解码过程
语言模型
困惑度
语言模型的评价方法为困惑度(perplexity,ppl),大小表示当前句子的“通顺”程度。
WeNet利用WFST的一些参数
max_active
。和beam
参数共同控制beam search的波束大小。min_active
。acoustic_scale
。声学模型给出的似然度放缩系数。blank_skip_thresh
。跳过blank的阈值。nbest
。
语音识别的建模单元
- 整句文本。如“Hello World”,对应的语音建模尺度为整条语音。
- 词。如孤立词“Good”、“World”,对应的语音建模尺度大约为每个词的发音范围。
- 音素。比如将“World”进一步表示为“/werld/”,其中每个音素(phone)作为基本单位,对应的语音建模尺度缩减为每个音素的发音范围。
- 三音素,也就是考虑了上下文的音素。如将音素“/d/”进一步表示为“{/l-d-sil/,/u-d-l/,...}”,对应的语音建模尺度是每个三音素的发音范围,长度与单音素差不多。
- 隐马尔科夫模型状态,也就是将每个三音素(triphone)都用一个三状态隐马尔科夫模型表示,并用每个状态作为建模粒度,对应的语音建模尺度将进一步缩短。
上图中,“DNN-HMM”表示深度神经网络-隐马尔科夫模型结构,“CTC”表示基于CTC损失函数的端到端结构,“Attention”表示基于注意力机制的端到端结构。
如上图所示,字词是由音素(Phone)组成;音素的上下文不同,因此同一个音素就有了不同的变体,结合了上下文的音素称之为三音素(Triphone),比如对于音素/d/,三音素/l-d-sil/、/u-d-l/是一对亲兄弟却是两家子;每个三音素又可以用一个独立的三状态HMM建模。由于很多三音素在语料中并未出现或者数量不多,并且可以通过决策树(Decision Tree)共享三音素的状态,所以对于拥有
上图展示了Phone、Triphone、Senone三者之间的关系,其中Senone是借助数学模型定义出来的音素变种,并没有直接的听觉感受;音素/sil/无实际发音,仅表示静音、字间停顿或者无意义的声音,
解码器
语音识别建模目标是:
其中,
语音识别的最终目标是选择能使
上图中,粗圆表示开始,双线圆表示结束,其余圆表示中间状态。如上图所示,定义输入、输出均为词的WFST为G,定义输入为Phone、输出为词的WFST为L,定义输入为Triphone、输出为Phone的WFST为C,定义输入为Senone、输出为Triphone的WFST为H,至此得到4个WFST,也就是HCLG:
WFST | 转换对象 | 输入 | 输出 |
---|---|---|---|
H | HMM | Senone序列 | 三音素 |
C | 上下文关系 | 三音素序列 | 音素序列 |
L | 发音词典 | 音素序列 | 词 |
G | 语言模型 | 词序列 | 词序列 |
上表中,“输入”、“输出”表示走完一条完整路径后整个WFST的输入、输出,而不是一条边上的输入、输出,可见前者的输出是后者的输入,因此可以将它们融合(Composition)成一条WFST,实现了Senone到Triphone(H)、Triphone到Phone(C)、Phone到Word(L)、Word到Sentence(G),这就是解码图(Decoding Graph)。
WFST的融合一般从大到小,也就是先将G和L融合,再依次融合C、H,每次融合都将进行确定化(Determination)和最小化(Minimisation)操作。WFST的确定化是指,确保给定某个输入符号,对应输出符号是惟一的;WFST的最小化是指,将WFST转换为一个状态节点和边更少的等价WFST。H、C、L、G的融合,常见过程为:
其中HCLG为最终的解码图WFST,
最终解码时,由于HMM已经在解码图中,因此只需要GMM或者DNN就可以利用HCLG进行解码了。给定语音特征序列
假设路径上的权重定义为惩罚,将W路径上的权重相加,再减去各状态针对输入的发射概率得到最终得分,该分数越小,则说明该语音X转录为W的可能性越大。由于HCLG中的权重是固定的,不同的
由于HCLG搜索空间巨大,通常采用束搜索(Beam Search)方法,也就是每一步根据当前得分仅保留指定数目的最优路径,也就是N-best,直至走到终点,选择一条最优路径。
语音识别基本法 Decoders used in the Kaldi toolkit faster-decoder.h 京东:基于WeNet的端到端语音识别优化方案与落地 LiJian-kaldi搭建在线语音识别系统/P4 WeNet训练初体验 语音识别中的WFST和语言模型 如何通俗的理解beam search?