一、项目背景
随着人工智能技术飞速发展,语音识别技术已成为人机交互的重要接口之一。在语音输入法、语音导航、智能会议纪要等多个应用场景中,高效的语音识别能力对于提升用户体验至关重要。本项目旨在通过SenseVoice产品,实现针对中文通用场景下的高精度语音识别自训练,以满足特定业务场景下的定制化需求。
二、SenseVoice介绍
SenseVoice是由FunAudioLLM团队开发的音频基础模型,SenseVoice作为一款专注于高精度多语言语音识别的模型,其独特之处在于其广泛的语言覆盖、强大的情感辨识能力以及高效的推理性能。该模型基于超过40万小时的多样化语音数据训练而成,能够支持超过50种语言的识别,展现出卓越的跨语言识别能力。与市场上其他主流模型相比,SenseVoice在识别精度上实现了显著提升,特别是在复杂场景下的表现尤为出色。此外,SenseVoice还提供了便捷的微调脚本与策略,帮助用户根据特定业务场景进行模型定制与优化。
三、方案选型
最开始准备使用的是百度推出的PaddleSpeech产品来完成语音识别任务,经过尝试发现该模型不适用,主要有以下3方面的原因:
- 模型版本比较旧,在服务器上部署存在一些依赖冲突问题需要解决,这个步骤很耗时。测试时使用的阿里云上的Ubantu服务器,这个问题是解决了。但如果部署到公司的服务器,之前的解决方案不一定行得通,可能需要重新探索;
- 官方GitHub代码很长时间没有维护,文档里的步骤和实际使用存在出入,需要自己改造,根据文档教程自训练时源代码会报错,这些bug无法在官网以及网络上找到解决方案。
- 使用PaddleSpeech训练时,要求的单样本时长不超过50s,只支持wav格式,这个限制不适用实际业务场景。经过以上原因分析,不采用PaddleSpeech,经过调研最终选SenseVoice产品。
四、模型选型
SenseVoice支持多种预训练模型,和魔搭集成度比较好。一般默认的是使SenseVoiceSmall模型,但在本方案中没有采用这个模型,基于以下几个理由:
1.SenseVoiceSmall支持富文本识别,包括情感识别和声音事件检测,所需要的数据集的格式也需要体现这两方面的内容。考虑到本项目只是基础的语音识别范畴,不需要额外的富文本识别;
2.SenseVoiceSmall模型对于时长在几个小时的长音频文件的识别效果还有待验证。
基于前面两点的考虑,最终我们选用Paraformer语音识别-中文-通用-16k-离线-large-长音频版
(iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch)这个模型,可以很好地解决上述问题。
五、环境准备
至少要采用单机多卡的配置来训练,最好能采用多机多卡的配置来加速训练。
1.安装python环境
conda create -y -n sense_voice python=3.10
conda init
conda activate sense_voice
2.下载SenseVoice
git clone GitHub - FunAudioLLM/SenseVoice: Multilingual Voice Understanding Model && cd SenseVoice
3.下载Paraformer模型
#创建模型存放目录
mkdir models
cd models
#更新系统软件包,安装git lfs用于拉取大文件
sudo apt update
sudo apt install git-lfs
git lfs install
#下载模型
git clone 魔搭社区
cd speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch
#拉取仓库里的大文件
git lfs pull
#检查文件完整性,文件名前是星号代表是完整的
git lfs ls-files
4.下载安装FunASR
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
六、数据集准备
音频文件的要求:建议统一使用wav格式,音频采样率为16K,文件时长在50s最佳,如果是长音频,文件大小最好不要超过10M。
首先需要按照train/val/test的类型划分数据集,样本比例为8:1:1。针对每个类型的数据集都需要先准备好wav.scp与text.txt文件,wav.scp与text.txt准备过程如下:
然后使用生成指令生成最终需要的jsonl格式文件
# 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'
Jsonl文件格式如下图所示
七、微调(自训练)流程
需要找到finetune.sh脚本,根据自己的实际情况修改参数,如下图所示,一般需要修改的地方有:把使用的模型地址替换成前面下载好的模型路径、把训练和验证使用的数据集路径替换成自己的、指定日志和模型参数文件的输出路径、指定使用的训练脚本为前面下载好的FunASR下的train.py、指定训练轮次、如果担心显存不够用,可以把批次数量batch_size调小一些。如下图所示:
fintune.sh脚本修改完后,执行bash finetune.sh命令即可开始训练,等待训练完成后,可以去output路径下查看训练结果,可以使用tensorboard --logdir xxx命令可视化查看训练的loss和acc等指标。
八、部署流程
找到api.py脚本,根据自己的业务需求调整其中的接口代码,如下图所示。
然后执行下面的命令就能快速将模型部署为Restful接口供后端工程师调用。
export SENSEVOICE_DEVICE=cuda:0
fastapi run --port 50000
执行下面的命令将模型量化导出为ONNX格式模型。
funasr-export ++model=paraformer ++quantize=false
测试ONNX
# pip3 install -U funasr-onnxfrom funasr_onnx import Paraformermodel_dir = "damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch"model = Paraformer(model_dir, batch_size=1, quantize=True)
wav_path = ['~/.cache/modelscope/hub/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/example/asr_example.wav']
result = model(wav_path)print(result)
九、模型推理流程
找到webui.py脚本,修改里面的内容,更换模型为前面训练好的模型。运行python webui.py命令运行脚本,生成网站访问链接。通过该前端网页可以快速对单个音频样本实现推理。如下图所示:
十、总结与展望
本项目通过SenseVoice产品和Paraformer语音识别模型,实现了针对中文通用场景下的高精度语音识别自训练。通过定制化训练和部署,满足了特定业务场景下的需求。未来,我们将继续提高识别准确率和效率,并探索更多应用场景下的语音识别解决方案。同时,我们也将关注行业动态和技术发展,及时引入新技术和新方法,保持技术领先性。