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所遵循的步骤。
预处理:
使用了来自matplotlib.mlab的频谱图函数将时域中的每个音频信号分割为20ms的帧,NFFT =(fs / 1000 * 20个样本)长度,并执行窗口加FFT并重叠7ms。
我最初尝试计算功率谱ps |fft|^2
和dB by 10 * log10(ps)
,但是TensorFlow CTC损失函数会产生nan值,并且进一步,优化器显然将所有参数更新为nan,因此我不再继续使用它。
值得一提的是,频谱图未规范化,因为它仅出于某种原因使TensorFlow产生nan值。请有人说明为什么会这样。我有一种感觉,梯度正在消失。关于要使用的初始化范围的任何建议?
由于不同的音频文件的长度各不相同,因此我用max_time填充了每个批次的帧,因为这需要形成mini-batch
shape [max_time,batch,NFFT]
。
由于所有目标转录均以大写字母表示,因此我仅将AZ,空格和一些标点符号包括在类别列表中(总共32个),这些类别用于将字符串目标转录转换为SparseTensor。
RNN配置:
前向和后向单元,每个LSTM单元使用窥孔架构在每层中具有300个单元,并且忘记将偏差初始设置为0才能查看性能。
将project_size设置为的双向动态RNN 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个音频片段过度拟合网络,但没有用。预测的结果远不及所需的转录。
感谢您的时间和支持。
归档时间: |
|
查看次数: |
4357 次 |
最近记录: |