前沿

本文大家一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉子

该系统实现了基于深度框架的语音识别中的声学模型和语言模型建模,其中声学模型包括CNN-CTC、GRU-CTC、CNN-RNN-CTC,语言模型包含transformer、CBHC。

数据采集用了目前能找到的所有中文免费数据,包括:thchs-30、aishell、primewords、st-cmd四个数据集,训练集总计大约450个小时。


声学模型

声学模型目前开源了部分示例模型,后期将不定期更新一些模型


1.1 GRU-CTC

我们使用GRU-CTC的结构搭建了第一个声学模型,该模型在项目的gru_ctc.py文件中。

利用循环神经网络可以利用语音上下文相关的信息,得到更加准确信息,而GUR又能选择性的保留需要的长时信息,使用双向rnn又能够充分的利用上下文信号。

但该方法缺点是一句话说完之后才能进行识别,且训练相对cnn较慢。该模型使用python/keras进行搭建,本文系统都使用python搭建。


网络结构如下:



1.2 DFCNN

由于两个原因在使用GRU作为语音识别的时候我们会遇到问题。
一方面是我们常常使用双向循环神经网络才能取得更好的识别效果,这样会影响解码实时性。
另一方面随着网络结构复杂性增加,双向GRU的参数是相同节点数全连接层的6倍,这样会导致训练速度非常缓慢。
科大讯飞提出了一种使用深度卷积神经网络来对时频图进行识别的方法,就是DFCNN。
利用CNN参数共享机制,可以将参数数量下降几个数量级别,且深层次的卷积和池化层能够充分考虑语音信号的上下文信息,且可以在较短的时间内就可以得到识别结果,具有较好的实时性。

该模型在cnn_ctc.py中,实验中是所有网络结果最好的模型,目前能够取得较好的泛化能力。其网络结构如下:



1.3 DFSMN

而前馈记忆神经网络也也解决了双向GRU的参数过多和实时性较差的缺点,它利用一个记忆模块,包含了上下几帧信息,能够得到不输于双向GRU-CTC的识别结果,阿里最新的开源系统就是基于DFSMN的声学模型,只不过在kaldi的框架上实现的。
我们将考虑使用DFSMN+CTC的结构在python上实现。该网络实质上是用一个特殊的CNN就可以取得相同的效果,我们将CNN的宽设置为memory size,将高度设置为feature dim,将channel设置为hidden units,这样一个cnn的层就可以模仿fsmn的实现了。

结构如下:



语言模型

2.1 n-gram

n元语法是一个非常经典的语言模型,这里不过多介绍啦。

如果想要通过语料来训练一个n-gram的模型,可以参考我的小实验的实现方法。


2.2 CBHG

该想法来自于一个大神搞输入法的项目,下面部分也引用此处:搜喵出入法

他是利用该模型建立一个按键到汉字的作用,本文对其结构和数据处理部分稍作改动,作为语言模型。
拼音输入的本质上就是一个序列到序列的模型:输入拼音序列,输出汉字序列。所以天然适合用在诸如机器翻译的seq2seq模型上。
模型初始输入是一个随机采样的拼音字母的character embedding,经过一个CBHG的模型,输出是五千个汉字对应的label。
这里使用的CBHG模块是state-of-art的seq2seq模型,用在Google的机器翻译和语音合成中,该模型放在cbhg.py中,结构如下:


(图片来源 Tacotron: Towards End-to-End Speech Synthesis)
    该模型训练实验结果如下,实际上,后续和transformer的比较中,该模型无论是收敛速度还是识别效果上都是很难和transformer比较。


    2.3 transformer

    新增基于transformer结构的语言模型transformer.py,该模型已经被证明有强于其他框架的语言表达能力。

      建议使用transformer作为语言模型,该模型是自然语言处理这两年最火的模型,今年的bert就是使用的该结构。本文最近更新系统使用的语言模型就是transformer。



      数据集

      数据集采用了目前我能找到的所有中文免费数据,包括:thchs-30、aishell、primewords、st-cmd四个数据集,训练集总计大约450个小时,在之前实验过程中,使用thchs-30+aishell+st-cmd数据集对DFCNN声学模型进行训练,以64batch_size训练。

      包括stc、primewords、Aishell、thchs30四个数据集,共计约430小时。

      相关链接:http://www.openslr.org/resources.php


      数据标签整理在data路径下,其中primewords、st-cmd目前未区分训练集测试集。若需要使用所有数据集,只需解压到统一路径下,然后设置utils.py中datapath的路径即可。


      配置

        本项目现已训练一个迷你的语音识别系统,将项目下载到本地上,下载thchs数据集并解压至data,运行test.py,不出意外能够进行识别,结果如下:


        若自己建立模型则需要删除现有模型,重新配置参数训练。
        与数据相关参数在utils.py中:
        ▪ data_type: train, test, dev
        ▪ data_path: 对应解压数据的路径
        ▪ thchs30, aishell, prime, stcmd: 是否使用该数据集
        ▪batch_size: batch_size
        ▪ data_length: 我自己做实验时写小一些看效果用的,正常使用设为None即可
        ▪ shuffle:正常训练设为True,是否打乱训练顺序


        使用train.py文件进行模型的训练。

          声学模型可选cnn-ctc、gru-ctc,只需修改导入路径即可:


            语言模型可选transformer和cbhg:



            文章来源于CSDN,本文作者:Audior@CSDN