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

VM_*_*_AI 5 speech-recognition speech-to-text lstm tensorflow recurrent-neural-network

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

预处理:

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

  2. 我最初尝试计算功率谱ps |fft|^2和dB by 10 * log10(ps),但是TensorFlow CTC损失函数会产生nan值,并且进一步,优化器显然将所有参数更新为nan,因此我不再继续使用它。

  3. 值得一提的是,频谱图未规范化,因为它仅出于某种原因使TensorFlow产生nan值。请有人说明为什么会这样。我有一种感觉,梯度正在消失。关于要使用的初始化范围的任何建议?

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

  5. 由于所有目标转录均以大写字母表示,因此我仅将AZ,空格和一些标点符号包括在类别列表中(总共32个),这些类别用于将字符串目标转录转换为SparseTensor。

RNN配置:

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

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

  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层生成的对数中找到最佳路径。

现在,我不明白我要去哪里错了,但我只是没有得到想要的转录(即权重未收敛以产生目标结果)。我要求某人说明原因。我曾尝试用100个音频片段过度拟合网络,但没有用。预测的结果远不及所需的转录。

感谢您的时间和支持。

Nik*_*rev 1

如果你想尝试这个,最好重现Eesen

如果您仍然需要 TensorFlow,可以在TensorFlow CTC 示例中找到完整的内容。