天天看点

语音识别系列2--基于WFST解码器

一、总述

解码器是ASR重要的组件之一,在传统的基于GMM-HMM/DNN-HMM混合系统中,解码器架起语言模型、声学模型、发音词典等知识源的桥梁,得到最终的识别结果,如图1所示。

语音识别系列2--基于WFST解码器

随着深度学习技术的盛行,一系列ASR端到端系统、ASR-NLP端到端系统甚至ASR-NLP-TTS端到端系统被相继提出,解码器的作用在被一步步弱化,但是笔者认为,抛弃解码器,实现完全的端到端系统还有相当长的路要走。因为文本数据和语音数据之间存在着很大的数据差异,单靠一个网络很难有比较好的效果,使用语言模型,往往会使结果更佳。

解码器是一个系统性的东西,要写一个好的解码器,不仅需要扎实的工程实现能力,而且要对声学模型、语言模型、发音词典等知识有一定的理解。所以下面简单介绍ASR每个组件。

二、声学特征提取

利用声音信号的短时平稳性,对音频进行分帧,提取每帧的特征,ASR常用的特征有Fbank、MFCC等。当然也有一些利用DNN提取特征的方法,目前还不是主流方法。

图2为Fbank提取过程,图3为MFCC提取过程。

语音识别系列2--基于WFST解码器
语音识别系列2--基于WFST解码器

MFCC是在Fbank的基础上做DCT变换,去除特征维度之间的相关性,同时也可以起降维的作用。

三、声学模型

利用声学特征和对应的标签,训练声学模型,目的是建立声学信号和建模单元之间对应的概率分布,常用的建模单元有HMM状态、音素、音节、字等。主流的模型结构有GMM-HMM、DNN-HMM、DNN-CTC等。随着深度学习的兴起,GMM-HMM已经逐步被DNN-HMM及端到端技术所替代。

在基于HMM框架中,GMM、DNN建立信号的静态分类,作为HMM的发射概率,HMM建立信号的动态时间特性。

图4为一般的DNN,HMM模型,图中上图表示三个状态的HMM模型,0状态和4状态分别是起始状态和结束状态,一般用一个HMM来表示一个音素(monophone或triphone),即如果有100个音素,那么就有100个HMM(音素绑定另说),如果每个音素有3个状态(状态绑定另说),那么总共的状态个数就是100*3=300,状态的个数等于DNN的输出节点个数,图中下图表示一个简单的DNN,输入层维度是3,两个隐藏层维度为5,输出层维度是3,在识别任务中,输入层的维数是特征向量的维数(输入层有拼帧另说),输出层的维数是建模单元的个数,如果以音素建模,那么输出层的维数就是音素的个数,隐藏层的层数和节点数依据任务的复杂度而定。

语音识别系列2--基于WFST解码器

在基于WFST解码过程中,特征做为DNN的输入,输出为各建模单元的概率。HMM与发音词典、语言模型组合,形成一个大的FST解码网络,解码网络的输入是各建模单元。这里DNN是泛指一切神经网络,包括DNN、CNN、RNN、LSTM、GRU等。

可以通过查看DNN的后验概率分布分析声学模型优略,比如,概率比较平均说明模型的区分性不是很好,可以使用区分性训练准则加强声学模型等。

四、语言模型

语言模型建立文本逻辑的合理性模型,统计词与词之间的相关性。常用的语言模型有NGRAM、RNN-LM、正则语法JSGF等,由于RNN语言模型很难用于实时解码,所以一般和NGRAM语言模型结合使用,即用RNN重新计算NGRAM的统计概率。

图5为二元NGRAM语言模型arpa文件,从arpa文件可以容易看出,高元概率一般比低元概率要大,这样在解码中,尽量少回退,回退会使累计概率降低,候选路径惩罚加大,容易被裁。

语音识别系列2--基于WFST解码器

大规模连续语音识别中,NGRAM语言模型元数越高越好,但是限于效率的考虑,一般做到三元或四元即可。有些限定领域比如古诗词等领域,可以做到六元、八元甚至十元模型。视具体的应用场景而定语言模型的规模。

鉴定语言模型的优略可以通过测试集验证模型的困惑度(PPL)。如果PPL较小说明训练集与测试机越匹配,模型就越好。

五、发音词典

发音词典建立声学模型和语言模型之间的桥梁,一个好的词典对识别性能起着重要的作用,这一部分通常是语言专家制定并人工制作,常用的声学建模单元是以声韵母建模,发音词典就是每个词的发音符号表,如图6所示。

语音识别系列2--基于WFST解码器

中文识别中经常会出现同音异形字,一般会通过在发音后面添加消岐符加以区分,比如在中和忠后面加上#1和#2。这样每一个音会有特定的词与它对应,有利于最终FST的确定化。

词典的规模视具体应用而定,如果是通用领域,词典规模可以在百万级,如果是限定领域,词典规模可以在十万级,如果是命令词识别,词典规模则更低。

六、解码器

利用发音词典、声学模型、语言模型等知识源构建解码图,并在解码图中寻求最优路径。

根据语言模型使用的不同角度,解码可以分为动态解码和静态解码,在动态解码过程中,以词典树为中心,在语言模型中动态查找语言得分,而静态解码是语言模型提前静态编进解码图,通过确定化、权重前移、最小化等一些列优化操作,解码效率更高,但是内存占用率更大。所以选用哪种解码策略,依据具体的应用而定。比如,大词汇量在线语音识别,对实时率要求较高,可以选用静态解码,而对于专用芯片等对内存要求较高的场景,就需要选用动态解码。

这里我们以基于HCLG网络的静态解码为例。首先需要把语言模型、发音词典、声学模型表示成对应的FST格式,如果7所示,然后通过组合、确定化、最小化等操作编译成一个大的解码图,如图8为截取解码图的一部分(解码图太大)。

语音识别系列2--基于WFST解码器

图8

语音识别系列2--基于WFST解码器

一般的HCLG网络构建流程如下:

HCLG = ASL(min(RDS(det(H' o min(det(C o min(det(L o G))))))))

其中:

ASL:加自环

RDS:去消岐符

H’:去掉自环的HMM

解码的过程就是在解码图中寻求最优路径的过程,因为解码图经过确定化操作,不会有相同的两条输入路径,所以可以使用维特比进行解码。

在解码过程中,为了提升解码速度,需要在解码过程中采用不同的剪枝策略,把当前时刻概率比较低的路径进行裁剪,当然,剪枝后的路径不保证是最优路径,但是会尽最大可能保留最优路径。

常见的剪枝策略有:

  1. 累积beam剪枝。即从当前概率最大路径得分减去beam值作为阈值,小于阈值的路径被裁剪;
  2. 直方图剪枝。即每一时刻仅保留一定数量的令牌。
  3. 声学模型预测剪枝。即利用声学信号的平稳性,把当前的声学分作为下一帧的声学得分并剪枝。
  4. 语言模型预测剪枝。即使用LOOKAHEAD提前估计语言模型得分并剪枝。
  5. 空边剪枝。即为了防止空边指数级扩展,对于不必要的空边停止扩展,因为空边大多是由语言模型回退造成的,如果已经有三元模型概率,那么没必要回退到二元模型展开。

帧同步解码算法:

  • 找到解码图的开始节点,创建对应节点的令牌;
  • 从开始节点对应的令牌做空边(即输入不对应真实的建模单元)扩展,每一个可达的节点都绑定对应的令牌,剪枝,保留活跃令牌;
  • 每输入一帧,从当前活跃令牌中取出一个令牌,对应节点开始扩展后续非空边(即输入对应真实物理建模单元),遍历完所有活跃令牌,剪枝,保留当前帧活跃令牌;
  • 重复3步骤,直到所有的帧都扩展结束;
  • 找到得分最大令牌,回溯得到最后的识别结果。

七、展望

本小节先讲到这里,画图真是不易,下一节我们将结合kaldi代码,具体详述解码图构建及解码搜索,敬请期待。

继续阅读