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