使用TensorFlow进行端到端语音识别的RNN

时间:2016-07-14 22:34:44

标签: tensorflow speech-recognition speech-to-text lstm recurrent-neural-network

我没有成功使用TensorFlow训练RNN for Speech to text问题。我已经决定使用纯FFT(即频谱图)作为训练数据来重现Alex Graves, and Navdeep Jaitley, 2014中描述的方法的结果,以及编码的3层双向RNN,每个RNN具有300个LSTM单元。我想描述从预处理音频信号到解码日志所遵循的步骤。

预处理:

  1. 来自matplotlib.mlab的使用的specgram函数将时域中的每个音频信号分段为20ms的帧,NFFT =(fs / 1000 * 20个样本)长度,并执行带重叠的加窗和FFT 7毫秒。

  2. 我最初尝试计算功率谱ps |fft|^2和dB 10 * log10(ps),但TensorFlow CTC Loss函数产生nan值,而且优化器显然将所有参数更新为nan,因此我没有继续使用这个。

  3. 要提到的是,谱图不是标准化的,因为它只会使TensorFlow因某种原因产生纳米值。有人请说明为什么会这样。我有一种感觉渐变正在消失。有关使用初始化程序范围的任何建议吗?

  4. 由于不同的音频文件长度不同,我使用max_time填充每个批次的帧,因为这需要形成mini-batch形状[max_time,batch,NFFT]

  5. 由于所有目标转录都是大写字母,因此我只将AZ,空格和一些标点符号列入类列表(共32个),用于将字符串目标转录转换为SparseTensor。

  6. RNN配置:

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

    2. 将project_size设置为hidden_size 500的双向动态RNN。

    3. 序列长度张量按批次的最大时间长度为每个数据分配适当的值。

    4. 由于tf.nn.bidirectional_dynamic_rnn不包含输出图层sigmoid or softmax,我执行线性回归,其权重将为shape [hidden_size,n_chars]

    5. 我使用了损失函数tf.nn.ctc_loss,它最初会返回650或700这样的巨大值,并在几百个时期之后向下滑动到最多500个。

    6. 最后,CTC波束搜索解码器用于查找输出softmax or sigmoid层生成的logits的最佳路径。

    7. 现在,我不明白我的错误在哪里,但我只是没有得到所需的转录(即,权重没有收敛以产生目标结果)。我请求有人请澄清为什么会这样。我试图用100个音频剪辑来装配网络,但没有用。预测结果远不及所需的转录。

      感谢您的时间和支持。

3 个答案:

答案 0 :(得分:1)

如果您想尝试这样做,最好重现Eesen

如果您仍想要张量流,可以在tensorflow CTC example找到完整。

答案 1 :(得分:1)

有很多参数可供使用。我发现具有高动量(大于momentum)的0.99优化器往往效果很好。其他人发现配料会导致问题,而且应该使用较小的批量。

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

答案 2 :(得分:0)

您可以在https://github.com/igormq/ctc_tensorflow_example看到TensorFlow的工作示例(使用玩具数据集)。

随意使用!