基于TensorFlow的RNN语音识别

基于TensorFlow的RNN语音识别,tensorflow,speech-recognition,speech-to-text,lstm,recurrent-neural-network,Tensorflow,Speech Recognition,Speech To Text,Lstm,Recurrent Neural Network,我还没有成功地使用TensorFlow训练RNN解决语音到文本的问题。我已决定使用纯FFT(即频谱图)作为训练数据,以再现中所述方法的结果,并用300个LSTM单元对3层双向RNN进行编码。我想描述一下从预处理音频信号到解码logits的步骤 预处理: 使用来自的specgram函数将时域中的每个音频信号分割为20ms的帧,NFFT=(fs/1000*20个采样)长度,并以7ms的重叠执行加窗和FFT 我最初尝试计算功率谱ps | fft | ^2,并通过10*log10(ps)计算dB,但Te

我还没有成功地使用TensorFlow训练RNN解决语音到文本的问题。我已决定使用纯FFT(即频谱图)作为训练数据,以再现中所述方法的结果,并用300个LSTM单元对3层双向RNN进行编码。我想描述一下从预处理音频信号到解码logits的步骤

预处理:

  • 使用来自的specgram函数将时域中的每个音频信号分割为20ms的帧,NFFT=(fs/1000*20个采样)长度,并以7ms的重叠执行加窗和FFT

  • 我最初尝试计算功率谱
    ps | fft | ^2
    ,并通过
    10*log10(ps)
    计算dB,但TensorFlow CTC损耗函数产生nan值,并且优化器进一步将所有参数更新为nan,因此我没有进一步使用该函数

  • 值得一提的是,光谱图并没有标准化,因为出于某种原因,它只会使TensorFlow产生nan值。请有人澄清为什么会发生这种情况。我感觉梯度正在消失。关于使用什么样的初始化器范围有什么建议吗

  • 由于不同的音频文件长度不同,我用max_time填充了每个批次的帧,因为这是形成
    形状
    [max_time,batch,NFFT]
    小批次

  • 因为所有的目标转录本都是大写的,所以我只在类列表中包含了A-Z、空格和一些标点符号(总共32个),用于将字符串目标转录本转换为Sparstensor

  • RNN配置:

  • 前向和后向单元,每个LSTM单元在每层中有300个单元,使用窥视孔结构,忘记偏差最初设置为0以查看性能

  • 双向动态RNN,项目大小设置为
    隐藏大小500

  • 序列长度张量以其最大时间长度为批处理中的每个数据适当地赋值

  • 由于
    tf.nn.bidirectional\u dynamic\u rnn
    不包括输出层
    sigmoid或softmax
    ,因此我执行一个线性回归,其外部权重将为shape=
    [隐藏的大小,n个字符]

  • 我使用了loss函数
    tf.nn.ctc\u loss
    ,它最初返回650或700这样的大值,经过几百个时代后,最大值下降到500

  • 最后使用CTC波束搜索解码器从输出
    softmax或sigmoid
    层生成的logits中找到最佳路径

  • 现在,我不知道我哪里出错了,但我只是没有得到想要的转录(即,权重没有收敛到产生目标结果)。我请某人澄清为什么会发生这种情况。我试图用100个音频剪辑来覆盖网络,但没有用。预测的结果与预期的结果相差甚远


    感谢您的时间和支持。

    如果您想尝试此功能,最好复制


    如果您仍然需要tensorflow,可以在中找到完整的。

    有许多参数可供使用。我发现具有高动量(大于
    0.99
    )的
    momentum
    优化器往往工作得很好。其他人发现,批处理会导致问题,应该使用较小的批处理大小


    无论哪种方式,这些模型的收敛都需要很长时间。

    您可以在以下位置看到TensorFlow的工作示例(使用玩具数据集):


    请随意使用

    我使用的是小批量:100,总共有47K个音频剪辑,我需要训练。在这种情况下,您会推荐什么样的最小批量?您必须进行实验。有些人发誓你应该使用1号批次,否则梯度会被搞混。其他的使用接近64-128。一般来说,批量大小的二次幂导致计算速度稍快(但这与您的问题无关)。由于您没有太多的数据,我建议使用Momentum或RMSProp优化器,将Momentum参数在0.9、0.95、0.99之间更改,然后尝试批量大小为1、8、64和128。非常感谢您提供代码链接。我会马上研究它。我相信我们有几乎相同的代码,但收敛速度太慢,尤其是47K数据。链接:请看你是否也能回答这个问题。非常感谢。