语音识别|基于CNN+DFSMN(完整版:向量+有步长因子)的声学模型实现及代码开源(tensorflow)

由于我主要研究问答系统,因此本博客仅更新NLP及问答相关内容,最近创了一个群,如果大家感兴趣可加q群号:376564367
github:https://github.com/makeplanetoheaven/NlpModel/tree/master/SpeechRecognition/AcousticModel/dfsmn_v2

背景知识

FSMN和DFSMN系列模型的结构及其实现原理可参考如下两篇博客:
1.FSMN结构快速解读
2.DFSMN结构快速解读

基于CNN+DFSMN的声学模型实现

本模型是在传统CNN模型的基础上,引入2018年阿里提出的声学模型DFSMN,论文地址:https://arxiv.org/pdf/1803.05030.pdf。

该声学模型使用的输入是经过fbank特征提取以后的具有16ms采样率,单声道音频数据。

DFSMN结构如下图,与语音识别|基于CNN+DFSMN(简化版:标量+无步长因子)的声学模型实现及代码开源(keras)相比:
语音识别|基于CNN+DFSMN(完整版:向量+有步长因子)的声学模型实现及代码开源(tensorflow)
  (1)简化版
  在记忆单元计算上,使用的是类似sfsmn中的标量权重来计算第tt时刻的隐藏状态,且没有引入步长因子stridestride,即
p~tl=p~tl1+ptl+i=1l_mem_sizemem_weightl_mem_sizeiptil+i=0r_mem_sizemem_weightl_mem_size+ipt+il\vec{\widetilde{p}}^l_t=\vec{\widetilde{p}}^{l-1}_t+\vec{p}^l_t+\sum_{i=1}^{l\_mem\_size}mem\_weight_{l\_mem\_size-i}\cdot \vec{p}^l_{t-i} + \sum_{i=0}^{r\_mem\_size}mem\_weight_{l\_mem\_size+i}\cdot\vec{p}^l_{t+i}
其中,ll表示dfsmn的第ll层,tt表示第tt时刻的隐藏状态,l_mem_sizl\_mem\_siz表示前向记忆单元长度,r_mem_sizr\_mem\_siz表示后向记忆单元长度,mem_weightmem\_weight用于存储权重,是一个长度为l_mem_si+r_mem_siz+1l\_mem\_si+r\_mem\_siz+1一维向量。
  (2)完整版
  在记忆单元计算上,使用的是类似vfsmn中的向量权重来计算第tt时刻的隐藏状态,且引入步长因子stridestride,即
p~tl=p~tl1+ptl+i=1l_mem_sizemem_weightl_mem_sizeiptistridel+i=0r_mem_sizemem_weightl_mem_size+ipt+istridel\vec{\widetilde{p}}^l_t=\vec{\widetilde{p}}^{l-1}_t+\vec{p}^l_t+\sum_{i=1}^{l\_mem\_size}\vec{mem\_weight}_{l\_mem\_size-i}\odot \vec{p}^l_{t-i*stride} + \sum_{i=0}^{r\_mem\_size}\vec{mem\_weight}_{l\_mem\_size+i}\odot\vec{p}^l_{t+i*stride}
此时,mem_weightmem\_weight是一个形状为[l_mem_si+r_mem_siz+1hidden_num][l\_mem\_si+r\_mem\_siz+1,hidden\_num]的二维矩阵。

在该模块中,主要包含了以下4个部分内容:

模型结构和模型调用方式和简化版基本相同,这里不再描述,主要区别在dfsmn单元的实现方式。