语音识别|基于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张图片
  (1)简化版
  在记忆单元计算上,使用的是类似sfsmn中的标量权重来计算第 t t t时刻的隐藏状态,且没有引入步长因子 s t r i d e stride stride,即
p ~ ⃗ t l = p ~ ⃗ t l − 1 + p ⃗ t l + ∑ i = 1 l _ m e m _ s i z e m e m _ w e i g h t l _ m e m _ s i z e − i ⋅ p ⃗ t − i l + ∑ i = 0 r _ m e m _ s i z e m e m _ w e i g h t l _ m e m _ s i z e + i ⋅ p ⃗ t + i l \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} p tl=p tl1+p tl+i=1l_mem_sizemem_weightl_mem_sizeip til+i=0r_mem_sizemem_weightl_mem_size+ip t+il
其中, l l l表示dfsmn的第 l l l层, t t t表示第 t t t时刻的隐藏状态, l _ m e m _ s i z l\_mem\_siz l_mem_siz表示前向记忆单元长度, r _ m e m _ s i z r\_mem\_siz r_mem_siz表示后向记忆单元长度, m e m _ w e i g h t mem\_weight mem_weight用于存储权重,是一个长度为 l _ m e m _ s i + r _ m e m _ s i z + 1 l\_mem\_si+r\_mem\_siz+1 l_mem_si+r_mem_siz+1一维向量。
  (2)完整版
  在记忆单元计算上,使用的是类似vfsmn中的向量权重来计算第 t t t时刻的隐藏状态,且引入步长因子 s t r i d e stride stride,即
p ~ ⃗ t l = p ~ ⃗ t l − 1 + p ⃗ t l + ∑ i = 1 l _ m e m _ s i z e m e m _ w e i g h t ⃗ l _ m e m _ s i z e − i ⊙ p ⃗ t − i ∗ s t r i d e l + ∑ i = 0 r _ m e m _ s i z e m e m _ w e i g h t ⃗ l _ m e m _ s i z e + i ⊙ p ⃗ t + i ∗ s t r i d e l \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} p tl=p tl1+p tl+i=1l_mem_sizemem_weight l_mem_sizeip tistridel+i=0r_mem_sizemem_weight l_mem_size+ip t+istridel
此时, m e m _ w e i g h t mem\_weight mem_weight是一个形状为 [ l _ m e m _ s i + r _ m e m _ s i z + 1 , h i d d e n _ n u m ] [l\_mem\_si+r\_mem\_siz+1,hidden\_num] [l_mem_si+r_mem_siz+1hidden_num]的二维矩阵。

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

  • 模型实现代码
    • 1.卷积层
    • 2.DFSMN层
    • 3.softmax层
    • 4.梯度更新部分
  • 模型调用方式
  • 模型训练数据
  • 已训练模型库

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

你可能感兴趣的:(语音识别)