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

Posted

技术标签:

【中文标题】使用 TensorFlow 进行端到端语音识别的 RNN【英文标题】:RNN for End-End Speech Recognition using TensorFlow 【发布时间】:2016-11-18 00:36:37 【问题描述】:

我在使用 TensorFlow 训练 RNN 处理语音到文本问题方面没有成功。我决定使用纯 FFT(即频谱图)作为训练数据来重现 Alex Graves, and Navdeep Jaitley, 2014 中描述的方法的结果,并编码了 3 层双向 RNN,每个 RNN 有 300 个 LSTM 单元。我想描述一下我从预处理音频信号到解码 logits 所遵循的步骤。

预处理:

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

    我最初尝试计算功率谱ps |fft|^210 * log10(ps) 的dB,但是TensorFlow CTC Loss 函数产生nan 值,并且优化器显然将所有参数更新为nan,因此我没有进一步使用这个。

    值得一提的是,频谱图没有标准化,因为它只会使 TensorFlow 出于某种原因产生 nan 值。有人请澄清为什么会这样。我有一种感觉渐变正在消失。关于使用什么初始化范围的任何建议?

    由于不同的音频文件的长度不同,我用 max_time 填充了每批的帧,因为这是形成形状为 [max_time,batch,NFFT]mini-batch 所必需的。

    由于所有的目标转录都是大写字母,我只在类列表中包含了 AZ、空格和一些标点符号(总共 32 个),用于将字符串目标转录转换为 SparseTensor。

RNN 配置:

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

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

    序列长度张量以最大时间长度为批处理中的每个数据适当分配值。

    由于tf.nn.bidirectional_dynamic_rnn 不包括输出层sigmoid or softmax,我在外部执行线性回归,其权重的形状为=[hidden_size,n_chars]

    我使用了损失函数 tf.nn.ctc_loss,它最初会返回 650 或 700 之类的巨大值,并在数百个 epoch 后下滑至最大值 500。

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

现在,我不明白我哪里出错了,但我只是没有得到想要的转录(即,权重没有收敛以产生目标结果)。我要求有人澄清为什么会这样。我试图用 100 个音频剪辑过度拟合网络,但没有用。预测结果与预期的转录相去甚远。

感谢您的宝贵时间和支持。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我正在使用 mini-batch size: 100 并且总共有 47K 音频剪辑,我需要训练。在这种情况下,您会推荐多大的小批量? 您必须进行实验。有些人发誓你应该使用 batch_size 1,否则渐变会混淆。其他人使用更接近 64-128。通常,批量大小的 2 次方会导致计算速度稍快(但这与您的问题并不真正相关)。由于您没有大量数据,我建议您使用 Momentum 或 RMSProp 优化器,您可以在 0.9、0.95、0.99 之间改变动量参数,并尝试将 batch_sizes 设置为 1、8、64 和 128。【参考方案2】:

如果你想试试这个,最好复制Eesen。

如果你仍然想要 tensorflow,你可以在 tensorflow CTC example 找到完整的。

【讨论】:

非常感谢您提供代码链接。我会马上调查的。【参考方案3】:

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

请随意使用!

【讨论】:

我相信我们的代码几乎相同,但收敛时间太长了,尤其是 47K 数据。链接:***.com/questions/38880176/… 看看你是否也能回答这个问题。谢谢

以上是关于使用 TensorFlow 进行端到端语音识别的 RNN的主要内容,如果未能解决你的问题,请参考以下文章

CTPN+CRNN算法端到端实现文字识别的实战开发

基于python语言的tensorflow的‘端到端’的字符型验证码识别

端到端训练 CNN-LSTLM?

WebRTC 一对一语音通话中音频端到端分段延迟分析

什么是端到端(end2end)学习?

VoLTE端到端业务详解 | 高清语音的概念