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