1. 为什么需要微调语音识别模型?
通用语音识别模型在日常对话场景下表现良好,但在处理专业术语、行业黑话或特定口音时,准确率往往会大幅下降。我在金融行业的一次项目部署中就遇到过这种情况——模型将"CDS(信用违约互换)"识别为"CD碟片",把"OTC场外交易"误转为"欧提斯交易"。这种错误在业务场景中是完全不可接受的。
Fun-ASR-Nano作为轻量级模型(仅0.8B参数),其优势在于:
- 本地部署成本低(普通消费级GPU即可运行)
- 支持全参数微调(不需要LoRA等适配技术)
- 保持通用能力的同时可深度适配垂直领域
实测数据显示:在未微调的医疗场景测试中,通用模型WER(词错误率)达28%,而使用500小时医疗对话数据微调后,WER降至9.3%,专业术语识别准确率提升近3倍。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与数据准备
2.1 训练环境配置
推荐使用Linux系统(Ubuntu 20.04+)搭配NVIDIA显卡(显存≥16GB)。以下是完整的依赖安装流程:
bash复制# 创建Python虚拟环境(推荐3.8-3.10版本)
conda create -n funasr python=3.8 -y
conda activate funasr
# 安装PyTorch(根据CUDA版本选择)
pip install torch==2.0.1+cu118 torchaudio==2.0.2 --extra-index-url https://download.pytorch.org/whl/cu118
# 克隆仓库并安装依赖
git clone https://github.com/FunAudioLLM/Fun-ASR.git
cd Fun-ASR
pip install -r requirements.txt
常见问题排查:
- 如遇libsndfile相关错误,需先安装系统依赖:
sudo apt-get install libsndfile1-dev - CUDA内存不足时可尝试降低batch_size(修改finetune.sh中的train_conf.batch_size)
2.2 数据格式详解
Fun-ASR采用ChatML格式,其核心结构如下:
json复制{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "语音转写:<|startofspeech|>!path/to/audio.wav<|endofspeech|>"},
{"role": "assistant", "content": "转写文本"}
],
"speech_length": 145,
"text_length": 3
}
关键字段说明:
speech_length:音频帧数(10ms/帧)text_length:文本token数(使用Qwen-0.6B分词器)
对于已有wav+txt格式的数据,使用转换工具处理:
bash复制python tools/scp2jsonl.py \
++scp_file=data/train_wav.scp \
++transcript_file=data/train_text.txt \
++jsonl_file=data/train.jsonl
数据质量建议:音频采样率需统一为16kHz,单声道,时长建议3-30秒。文本需去除特殊符号,数字建议转为中文写法(如"100元"→"一百元")
3. 模型微调实战
3.1 微调策略选择
根据数据量选择微调方案:
| 数据量 | 推荐方案 | 训练时间(A100 40G) |
|---|---|---|
| <1000小时 | 仅微调audio_adaptor | 2-4小时 |
| 1000-5000小时 | 微调audio_encoder+adaptor | 8-12小时 |
| >10000小时 | 全参数微调 | 24+小时 |
配置文件关键参数(finetune.sh):
bash复制# 冻结设置(true为冻结)
audio_encoder_conf.freeze=false
audio_adaptor_conf.freeze=false
llm_conf.freeze=true
# 训练参数
train_conf.batch_size=32
train_conf.max_epoch=20
optim_conf.lr=5e-5
3.2 启动训练与监控
执行训练命令:
bash复制bash finetune.sh
实时监控训练状态:
bash复制tensorboard --logdir outputs/tensorboard
重点关注指标:
- train/loss:应持续下降(理想曲线下降30%+后趋于平稳)
- val/wer:验证集词错误率(当连续3轮不下降时可提前停止)
4. 模型评估与部署
4.1 效果评测
使用解码脚本测试模型:
bash复制python decode.py \
++model_dir=outputs/checkpoint \
++scp_file=data/test_wav.scp \
++output_file=results.txt
计算WER(词错误率):
bash复制python tools/whisper_mix_normalize.py data/test_text.txt ref.txt
python tools/whisper_mix_normalize.py results.txt hyp.txt
compute-wer --mode=present ref.txt hyp.txt
4.2 部署优化技巧
- 量化部署(减少显存占用):
python复制from funasr import AutoModel
model = AutoModel(model="outputs/checkpoint", quantize=True)
- 流式识别配置:
python复制model = AutoModel(
model="outputs/checkpoint",
vad_model="fsmn-vad",
punc_model="ct-punc",
streaming=True,
chunk_size=96 # 每96帧(960ms)处理一次
)
- 热词增强(提升特定术语识别):
python复制model.set_hotwords(["CDS", "OTC", "IPO"])
5. 常见问题解决方案
5.1 训练阶段问题
Q1:Loss波动大/不收敛
- 检查学习率(建议5e-5到1e-4)
- 验证数据质量(音频与文本是否对齐)
- 尝试减小batch_size(32→16)
Q2:显存不足
- 开启梯度检查点(在finetune.sh添加
train_conf.use_amp=true) - 使用LoRA微调(需修改模型代码)
5.2 部署阶段问题
Q1:实时识别延迟高
- 调整chunk_size(96→48)
- 关闭VAD(
vad_model=None)
Q2:专业术语识别不准
- 收集bad case加入训练集
- 使用热词加权(set_hotwords)
我在法律文书识别项目中总结的经验是:微调后的模型需要定期(每3个月)用新数据迭代训练,行业术语的更新速度远超预期。另外,建议保留5%的领域外数据(如日常对话)以维持模型的通用能力。
