解决SenseVoice识别专业名词不准问题 | Paraformer和SenseVoice模型训练
这是一个国内大厂开源的ASR模型,这篇文章主要讲述如何微调SenseVoice和Paraformer模型使得可以准确识别专业名词。
0.数据准备
如果是训练paraformer模型,我们只需要准备train_wav.scp和train_text.txt以及验证集val_wav.scp和val_text.txt即可。
如果是训练SenseVoice模型,我们需要准备下面几个文件:
train_text.txt
train_wav.scp
train_text_language.txt
train_emo.txt
train_event.txt
其中必须的是train_wav.scp和train_text.txt文件。
下面是每个文件的格式要求:
BAC009S0764W0121 甚至出现交易几乎停滞的情况
BAC009S0916W0489 湖北一公司以员工名义贷款数十员工负债千万
asr_example_cn_en 所有只要处理 data 不管你是做 machine learning 做 deep learning 做 data analytics 做 data science 也好 scientist 也好通通都要都做的基本功啊那 again 先先对有一些 > 也许对
ID0012W0014 he tried to think how it could be
注意:如果是中英混杂的句子,中文和英文之间要有空格。
BAC009S0764W0121 /root/train/data/BAC009S0764W0121.wav
BAC009S0916W0489 /root/train/data/BAC009S0916W0489.wav
asr_example_cn_en /root/train/data/asr_example_cn_en.wav
ID0012W0014 /root/train/data/ID0012W0014.wav
注意:音频路径不能使用URL路径,使用URL路径会导致生成的jsonl文件没有内容。
BAC009S0764W0121 <|zh|>
BAC009S0916W0489 <|zh|>
asr_example_cn_en <|zh|>
ID0012W0014 <|en|>
BAC009S0764W0121 <|NEUTRAL|>
BAC009S0916W0489 <|NEUTRAL|>
asr_example_cn_en <|NEUTRAL|>
ID0012W0014 <|NEUTRAL|>
BAC009S0764W0121 <|Speech|>
BAC009S0916W0489 <|Speech|>
asr_example_cn_en <|Speech|>
ID0012W0014 <|Speech|>
下面生成jsonl文件时需要注意,如果你只准备了train_wav.scp和train_text.txt文件,那么执行下面这样的命令。
# generate train.jsonl and val.jsonl from wav.scp and text.txt
sensevoice2jsonl \
++scp_file_list='["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt"]' \
++data_type_list='["source", "target"]' \
++jsonl_file_out="../../../data/list/train.jsonl" \
++model_dir='iic/SenseVoiceSmall'
注意:SenseVoice会自动打标。
如果是准备了全部文件,那么执行下面命令。
# generate train.jsonl and val.jsonl from wav.scp, text.txt, text_language.txt, emo_target.txt, event_target.txt
sensevoice2jsonl \
++scp_file_list='["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt", "../../../data/list/train_text_language.txt", "../../../data/list/train_emo.txt", "../../../data/list/train_event.txt"]' \
++data_type_list='["source", "target", "text_language", "emo_target", "event_target"]' \
++jsonl_file_out="../../../data/list/train.jsonl"
生成的jsonl文件会保存到上面指定的路径下。我们训练之前最好检查一下生成的jsonl文件是否对。
1.训练
现在我们可以开始训练了,首先是检查finetune.sh脚本中的参数看看对不对,如显卡索引对不对,默认是使用了两张显卡,如果你只有一张,那么就需要修改,如果你是两张,那么可以不用修改直接运行这个脚本。
训练中的loss曲线可通过tensorboard来查看,下面是我使用了300多条专业名词数据集做的微调训练的loss曲线。

可以看到这个训练是有效果的,如果这个loss曲线是上升的,说明这个模型训练的参数设置的不对或者训练的数据集不干净,比如音频或文本没有对应上,或者音频采样率过低,比如8k。训练这个模型,我们推荐使用的音频采样率是大于等于16k。
训练的时候我们执行bash finetune.sh就可以了。
如果像哟查看tensorboard曲线,需要先安装这个tensorboard依赖,如果你使用的是autodl平台训练的,那么可以执行下面命令先把默认启动的tensorboard结束掉,然后重新执行,并且指定端口和路径。
ps -ef | grep tensorboard | awk '{print $2}' | xargs kill -9
nohup tensorboard --port 6007 --logdir /path/to/your/tf-logs/direction > tensorboard.log 2>&1 &
2. 评估模型字错率
如何评估模型字错率,可以看我发布到我博客的文章。
3. 微调训练前后模型效果对比
SenseVoice模型微调前后效果对比 | 如何解决SenseVoice识别专业名词不准问题
4. 联系
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)