由于我主要研究问答系统,因此本博客仅更新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。
该声学模型使用的输入是具有16KHZ采样率,单声道音频数据经过fbank特征提取以后的特征数据。
DFSMN结构如下图,与语音识别|基于CNN+DFSMN(简化版:标量+无步长因子)的声学模型实现及代码开源(keras)相比:
(1)简化版
在记忆单元计算上,使用的是类似sfsmn中的标量权重来计算第 t t t时刻的隐藏状态,且没有引入步长因子 s t r i d e stride stride,即
其中, 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,即
此时, 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+1,hidden_num]的二维矩阵。
在该模块中,主要包含了以下4个部分内容:
模型结构和模型调用方式和简化版基本相同,这里不再描述,主要区别在dfsmn单元的实现方式。
已训练模型库
Name | WER | date | link | extraction code | ps |
---|---|---|---|---|---|
3cnn[64-1]-6dfsmn[2048-512-20-20-2]-1289 | 16% | 2020.1.5 | 点击 | vzk4 | 该模型可继续训练,目前效果最好为13% WER |
更新内容
2019.12.7
- 优化fbank特征提取方式,采用80维的log mel fbank
- 优化数据读取方式,模型训练前需要调用generate_data_set()函数
- 优化记忆单元的计算方式
2020.1.5
- 优化gpu模型训练方式,可指定具体的gpu核
- 引入混合精度进行模型训练,
Bug汇总
- 该模型由于v2版本记忆单元的计算方式,最少能够处理1.615s的音频文件,解决方案:1.在模型预测时可使用v1版本的记忆单元计算;2.对输入数据补长