语音识别项目(数据集用的是thchs-30)

首选,我必须吐槽一下,这个数据集我下了快两个星期(ps:没错,你没有看错,我真的下了快两个星期,中途要么是网络断了,然后下载失败,要么是不知道是啥莫名其妙的原因导致下载失败,对了,中途那个网站好像还关闭过,当时我正在下载!!!)。在这里感谢一下师姐,她帮我请另一个师兄用迅雷最后下载好了,对,就是昨晚,我终于见到了完整的thchs-30数据集(哈哈哈)。

OK,正式开始,首先我把这个项目总结一下:
语音识别–基于深度学习的中文语音识别系统
这里采用了两个模型,一个是声学模型,一个是语言模型,将输入的音频信号识别为汉字。其中用的RNN可以长依赖问题(ps:嗯…,这里是从我的笔记本上摘抄下来,所以可能有些话会突然崩出来,但是也是知识)。

基于深度学习的语音识别中的声学模型和语言模型建模
声学模型:CNN-CTC,GRU-CTC,CNN-RNN-CTC
语言模型:transformer,CBHG,n-gram(这个模型仅仅是用来测试一个小文件)
介绍一下语言模型:
CBHG模块是state-of-art的seq2seq模型,用在Google的机器翻译和语音合成中,该模型放在cbhg.py中
基于transformer结构的语言模型transformer.py,该模型已经被证明有强于其他框架的语言表达能力。该模型是自然语言处理这两年最火的模型,今年的bert就是使用的该结构。
数据集用的是中文免费数据集:thchs-30,aishell,prime words,st-cmd,总计450小时。

声学模型
介绍一下模型:
GRU-CTC
利用循环神经网络可以利用语音上下文相关的信息,得到更加准确地信息,而GUR又能选择性的保留需要的长时信息,使用双向rnn又能够充分的利用上下文信号。
但该方法缺点是一句话说完之后才能进行识别,且训练相对cnn较慢。该模型使用python/keras进行搭建,本文系统都使用python搭建。
网络结构如下:

    def _model_init(self):
        self.inputs = Input(name='the_inputs', shape=(None, 200, 1))
        x = Reshape((-1, 200))(self.inputs)
        x = dense(512, x)
        x = dense(512, x)
        x = bi_gru(512, x)
        x = bi_gru(512, x)
        x = bi_gru(512, x)
        x = dense(512, x)
        self.outputs = dense(self.vocab_size, x, activation='softmax')
        self.model = Model(inputs=self.inputs, outputs=self.outputs)
        self.model.summary()

DFCNN
使用GRU作为语音识别的时候我们会遇到问题,原因如下:
一方面是我们常常使用双向循环神经网络才能取得更好的识别效果,这样会影响解码实时性。
另一方面随着网络结构复杂性增加,双向GRU的参数是相同节点数全连接层的6倍,这样会导致训练速度非常缓慢。
利用CNN参数共享机制,可以将参数数量下降几个数量级别,且深层次的卷积和池化层能够充分考虑语音信号的上下文信息,且可以在较短的时间内就可以得到识别结果,具有较好的实时性。
该模型在cnn_ctc.py中,实验中该模型是所有网络中结果最好的模型,目前能够取得较好的泛化能力。

def cnn_cell(size, x, pool=True):
    x = norm(conv2d(size)(x))
    x = norm(conv2d(size)(x))
    if pool:
        x = maxpool(x)
    return x

class Am():
    def _model_init(self):
        self.inputs = Input(name='the_inputs', shape=(None, 200, 1))
        self.h1 = cnn_cell(32, self.inputs)
        self.h2 = cnn_cell(64, self.h1)
        self.h3 = cnn_cell(128, self.h2)
        self.h4 = cnn_cell(128, self.h3, pool=False)
        self.h5 = cnn_cell(128, self.h4, pool=False)
        # 200 / 8 * 128 = 3200
        self.h6 = Reshape((-1, 3200))(self.h5)
        self.h7 = dense(256)(self.h6)
        self.outputs = dense(self.vocab_size, activation='softmax')(self.h7)
        self.model = Model(inputs=self.inputs, outputs=self.outputs)
        self.model.summary()

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

一:特征提取
二:数据处理
下载数据,生成音频文件和标签文件列表,label数据处理,音频数据处理,数据生成器(确定batch_size和batch_num)
其中有DFCNN模型(一种使用深度卷积神经网络来对时频图进行识别的方法),有论文。
三:模型搭建
构建模型组件,搭建cnn+dnn+ctc的声学模型
四:模型训练,模型推断
在这个模型中有一些比较重要的函数
source_get(),这个函数是用来获取音频文件
read_label() 读取音频文件对应的拼音label,为label建立拼音到id的映射即词典

音频数据处理,只需要获得对应的音频文件名,然后提取所需时频图
模型搭建:训练输入为时频图,标签为对应的拼音标签。

语言模型(1):基于自注意力机制的语言模型(拼音到汉字)
一:数据处理
二:模型搭建
构造建模组件:
layer norm层

def normalize(inputs, 
              epsilon = 1e-8,
              scope="ln",
              reuse=None):
    '''Applies layer normalization.

    Args:
      inputs: A tensor with 2 or more dimensions, where the first dimension has
        `batch_size`.
      epsilon: A floating number. A very small number for preventing ZeroDivision Error.
      scope: Optional scope for `variable_scope`.
      reuse: Boolean, whether to reuse the weights of a previous layer
        by the same name.

    Returns:
      A tensor with the same shape and data dtype as `inputs`.
    '''
    with tf.variable_scope(scope, reuse=reuse):
        inputs_shape = inputs.get_shape()
        params_shape = inputs_shape[-1:]

        mean, variance = tf.nn.moments(inputs, [-1], keep_dims=True)
        beta= tf.Variable(tf.zeros(params_shape))
        gamma = tf.Variable(tf.ones(params_shape))
        normalized = (inputs - mean) / ( (variance + epsilon) ** (.5) )
        outputs = gamma * normalized + beta

    return outputs

embedding层

def embedding(inputs, 
              vocab_size, 
            
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值