问题描述:
我参考了Model Arts的例子
想要用MindSpore也实现语音识别,根据脚本迁移了网络。网络最后是调通了,但是Loss不收敛,训练得到的模型推理结果比预期长了一段。
请问有专家可以帮忙看看问题出在哪里吗?
附加一些说明,也许可以更好解决我遇到的问题
Model Arts上,是用两个网络组合完成语音识别的任务的:DFCNN+Transformer
首先构造了数据集get_data,可以把读取音频文件和标注的文本。
思路是先得到声音的时域信息,就是像如下的波形图
然后compute_fbank做傅里叶变换,转换为语谱图。
用这个代码可以把数据可视化,我在附件里提供了代码,注释掉了。
frame_time = [i * 0.025 for i in range(x.shape[1])] frequency_scale = [i *40 for i in range(200)] print(frame_time) print(frequency_scale) plt.pcolormesh(frame_time, frequency_scale, x.squeeze().T) plt.colorbar() plt.show()
这样可以把ASR的任务转换成CV的任务。DFCNN的目的就是根据这个语谱图,识别其中的语音信息,得到拼音序列。
Transformer是NLP的网络,可以把拼音序列转成文字。
我主要是迁移了DFCNN的部分,本质还是CV类的网络,不过使用的损失函数是P.CTCLoss,是对整个序列求Loss值。可能问题出在这里,因为原来的脚本是keras写的,好像这个ctcloss的入参不一致。
训练我没有用全部的数据集,就拿了一个音频文件,想看看效果,但是Loss值到140左右就不动了。
loss值
177.98982,175.98216, 175.95705,……,146.96646,147.22882,147.1331
验证我也是用同样的那个音频,推理后还需要解码,我调用了P.CTCGreedyDecoder。这个推理得到的是拼音,我直接用匹配汉字的方法,输出的结果,前面对的上,后面跟了一段尾巴。
绿是阳春烟景大块文章的底色四月的林峦更是绿得鲜活秀媚诗意盎然 (这个后面就是多出来 的)月月阳绿底林盎景盎的然意......
因为我使用keras的那个脚本,是可以训练收敛的,想知道是哪里对不上了。
使用的环境:
由于P.CTCGreedyDecoder只支持Ascend,脚本要在Ascend上执行。如果不推理只训练,可以用GPU。mindspore版本1.0以上好像都可以。
我还有几个建议
1.能不能提供一些供语音处理的算子,比如计算mfcc, spectrogram等,不然音频数据处理用python还是效率挺低的。
2.CTCGreedyDecoder,CTCLoss希望GPU,CPU都支持更好,比如我训练好,用自己电脑可以直接做推理。
3.mindspore是否可以提供读取音频文件的接口,像图片,文本都支持挺好,语音这块的能力希望也能补上。
脚本,训练数据见附件, 解压后有三个文件
wav是音频文件,我就用一个试着训练
dfcnn.py是我的脚本,里面一些路径设置,还要麻烦改一下
data.txt是音频的标注文件。这个是从华为云上拿下来的,已经整理好的标注数据全集,不过如果只训练一个,只会读取一条,可以用head -n 1 data.txt看一下,第一句就是我希望得到的识别结果。
解决方案:
问题
看问题的现象,前面字段对的上,说明训练应该是有一定效果的,模型还是学习到东西了的。
这个模型本身我不是很熟,后续的尾巴猜测是不是需要设置一些blank标识,不代表任务结果,就是占位符。
因为Ascend上运行的大部分都还是固定shape的数据,这样必定长数据必然存在一些padding数据,对应结果也需要一个blank标识来对应padding占位。
改进
您的意见很好,我们会考虑逐步完善音频方面的支持,对应建议可以考虑反馈到Mindspore代码仓(
https://gitee.com/mindspore/mindspore)提一些Issue来反馈并记录。