我没有成功使用TensorFlow训练RNN for Speech to text问题 . 我已决定使用纯FFT(即频谱图)作为训练数据来再现Alex Graves, and Navdeep Jaitley, 2014中描述的方法的结果,并且编码3层双向RNN,每个具有300个LSTM单元 . 我想描述从预处理音频信号到解码日志所遵循的步骤 .
预处理:
-
来自matplotlib.mlab的已使用的规格函数将时域中的每个音频信号分段为20ms的帧,NFFT =(fs / 1000 * 20个样本)长度,并执行重叠7ms的加窗和FFT .
-
我最初尝试计算功率谱
ps |fft|^2
,和10 * log10(ps)
的dB,但是TensorFlow CTC Loss函数产生nan值,并且优化器显然将所有参数更新为nan,因此我没有继续使用它 . -
要提到的是,谱图不是标准化的,因为它只会使TensorFlow由于某种原因产生纳米值 . 有人请说明为什么会这样 . 我有一种感觉渐变正在消失 . 有关使用初始化程序范围的任何建议吗?
-
由于不同的音频文件具有不同的长度,我使用max_time填充每个批次的帧,因为这需要形成
mini-batch
形状[max_time,batch,NFFT]
. -
由于所有目标转录都是大写字母,因此我只将A-Z,空格和一些标点符号列入类列表(共32个),用于将字符串目标转录转换为SparseTensor .
RNN配置:
-
前向和后向单元,每个LSTM单元,每层使用3个单元,使用窥孔结构,最初将忘记偏置设置为0以查看性能 .
-
双向动态RNN,project_size设置为
hidden_size 500
. -
序列长度张量为批量中的每个数据及其最大时间长度适当分配值 .
-
由于
tf.nn.bidirectional_dynamic_rnn
不包括输出层sigmoid or softmax
,我执行线性回归,其权重将为shape =[hidden_size,n_chars]
. -
我使用了损失函数
tf.nn.ctc_loss
,它最初返回650或700这样的巨大值,并在几百个历元之后向下滑动到最大值500 . -
最后,CTC波束搜索解码器用于从输出
softmax or sigmoid
层生成的对数中找到最佳路径 .
现在,我不明白我哪里出错了,但我只是没有得到所需的转录(即,权重没有收敛以产生目标结果) . 我请求有人请澄清为什么会这样 . 我试图用100个音频剪辑来装配网络,但没有用 . 预测结果远不及所需的转录 .
感谢您的时间和支持 .
3 回答
有很多参数可供使用 . 我发现具有高动量(大于
0.99
)的momentum
优化器往往效果很好 . 其他人发现配料会导致问题,而且应该使用较小的批量 .无论哪种方式,这些模型的收敛需要很长时间 .
如果你想尝试这个,最好重现Eesen .
如果你仍然需要张量流,你可以在tensorflow CTC example找到完整的 .
您可以在以下位置查看TensorFlow的工作示例(使用玩具数据集):https://github.com/igormq/ctc_tensorflow_example .
随意使用!