Whisper 微调指南:如何让语音识别模型听懂你的行业黑话
【免费下载链接】whisperRobust Speech Recognition via Large-Scale Weak Supervision项目地址: https://gitcode.com/GitHub_Trending/whisp/whisper
客服录音里"型号 X7-Pro"被转成"型号 7pro"、手术录音里的药名全部打错,通常不是模型不够大,而是缺一次领域适配。下面是 Whisper 微调与语音识别模型定制的完整流程:用 10 小时自己的录音,让通用语音识别模型学会你的术语。
Whisper 微调的本质:不换翻译官,只搞一周岗前培训
微调不是重新训一个模型,相当于给全能翻译官做一周岗前培训:听力和语法(编码器把 30 秒音频变成特征向量,解码器逐 token 生成文本)都是现成的,你只让它背熟你公司的术语、口音和语速。改动集中在网络后段,所以收敛快,代价大约是一张卡跑一晚。
语音识别模型定制选型:规格跟着数据量和显存走
| 模型规格 | 参数量 | 最低显存(微调,fp16+梯度累积) | 适合谁 |
|---|---|---|---|
| tiny / tiny.en | 39 M | 6 GB | 先跑通流程,验证数据管道 |
| base / base.en | 74 M | 8 GB | 数据少于 10 小时,快速试错 |
| small / small.en | 244 M | 12 GB | 10~30 小时数据,12 GB 显存的甜点 |
| medium / medium.en | 769 M | 16 GB | 30 小时以上中文数据的主力,24 GB 卡 |
| large / large-v3 | 1.55 B | 40 GB | 数据量大、精度要求高,A100/H100 |
| turbo | 809 M | 24 GB | 推理速度敏感场景;编码器基本冻结,微调上限低于 medium |
表内显存是全量微调的估算,冻结编码器只训解码器还能再省一半。如果你有 10 小时中文数据 + 24 GB 显存,选 medium 稳——它在中文短音频上的特征提取已够用,large 的边际收益在 10 小时数据时基本吃不到;只有 12 GB 显存就先跑 small,验证完数据质量再升规格;纯英文场景选 .en 变体,词表小一半,解码更快。
硬件门槛一行说清:GPU 12 GB 显存起步(24 GB 更从容) / 内存 32 GB / 磁盘 100 GB 可用空间(数据 + checkpoint + 日志)。
语音识别模型定制的数据准备:格式、清洗清单与 10 小时门槛
说白了,数据质量是微调的上限:超参只能把你带到数据质量的 80 分,带不到 100 分。
数据从哪来
- 自录:成本最低,但麦克风、距离、背景噪音要和真实部署场景一致,否则学到的是不存在的环境。
- 业务录音:最有价值,但先走隐私合规(脱敏、审批或匿名化)⚠️,省了这步后面全白搭。
- 标注平台:适合放量,用双标 + 第三方仲裁控制拼写一致率。
- 开源数据集:当通用能力底料,按约 7:3 与领域数据混合,防止模型"忘了怎么说话"。
格式
最稳的是两列 CSV(JSON 列表同结构也行),一行一条音频:
audio,text audio/0001.wav,这是第一个音频文件的转录文本 audio/0002.wav,请把 X7-Pro 的规格书发到我的邮箱按 train / val / test 切成三份(建议 8:1:1),路径写成相对路径,别用绝对路径——换台机器训练就全崩。
清洗清单
- 统一重采样到 16 kHz:模型特征提取就是按 16 kHz 做的,混入 44.1 kHz 音频会直接错位
- 去首尾静音和长无声段:长静音会让解码器脑补出不存在的话
- 文本统一小写、标点全半角风格:标注风格混用会让模型在"该不该带标点"上反复横跳
- 单说话人、单条 ≤30 秒:超过的按自然停顿切开,30 秒是模型单次输入的窗口
- 抽 10 条人耳核对音频和文本是否对齐:错位是头号杀手,比任何超参都致命
数据量门槛
10 小时起步,30 小时以上效果明显。只有 2 小时录音时,要么先微调 small(小数据下小模型收益更稳,不容易过拟合到垃圾),要么先用标注平台 + 开源数据把量凑上去再训 medium。
三个常见坑
| 坑 | 表现 | 解法 |
|---|---|---|
| 标注不一致 | 同一术语两个标注员写出两种拼法 | 建一份别名术语表,训练前统一映射 |
| 方言混杂 | 普通话和方言录音混在一个集里 | 按地区分层,或先只收普通话数据,方言单独一轮 |
| 背景噪音 | 开放办公区、机器轰鸣 | 源头降噪;实在要用,混入 20%~30% 干净数据压制幻觉 |
Whisper 微调训练实操:跑 medium 的关键配置与监控
第 1 步:环境搭建。两行搞定,装完后import whisper能过就算成功:
git clone https://gitcode.com/GitHub_Trending/whisp/whisper cd whisper && pip install -e . pip install transformers datasets accelerate jiwer librosa第 2 步:数据加载与预处理。用 datasets 库读三份 CSV,预处理做三件事:音频重采样到 16 kHz;WhisperProcessor 把音频切成 30 秒窗口并提取 mel 频谱;文本标签 tokenize 后把 padding 位置置为 -100,让损失函数忽略填充。整条管道用 map 批处理并缓存到磁盘。另外注意 decoder prompt 要锁死 language 和 task=transcribe,多语言模型不加这个约束会给你"翻译"而不是转写。
第 3 步:训练参数。下面是 medium + 30 小时中文数据的验证组合:
| 参数 | 建议值 | 为什么这么设 |
|---|---|---|
| learning_rate | 1e-5 ~ 2e-5 | 全量微调的安全区;再大 1 个 epoch 就过拟合,再小 10 个 epoch 也爬不动 |
| per_device_train_batch_size | 1~8,按显存定 | 一条 30 秒音频是 3000 个 mel 帧,24 GB 卡跑 medium 大约 8 起步,12 GB 就设 1 |
| gradient_accumulation_steps | 4 | 等效大 batch 但显存按 batch 1 算,小显存的关键 |
| num_train_epochs | 8~12 | 实际大概率早停,先给上限再砍 |
| fp16 / bf16 | 开 | 速度翻倍、显存减半;A100 优先 bf16,溢出更少 |
| warmup_ratio | 0.03 | 前几步稳定梯度,避免 loss 开头飙高 |
第 4 步:启动训练。核心就两行调用:
trainer = Trainer( model=model, args=training_args, train_dataset=ds["train"], eval_dataset=ds["val"], processing_class=processor, compute_metrics=compute_metrics, ) trainer.train()其中 model 是加载的预训练 checkpoint(用与目标同规格的,如 openai/whisper-medium),compute_metrics 里用 jiwer 算 WER。
第 5 步:监控。别急着调参,先看三样东西:train loss 整体平滑下降、没有持续尖峰;eval WER 才是真北极星,连续 2 个 epoch 不降就是拐点;train loss 还在降而 eval WER 开始反弹——过拟合了,直接停,加载 eval WER 最低的那个 checkpoint(load_best_model_at_end 会自动帮你留好)。
评估与调优:WER 合格线与三层调优路径
WER(词错误率)=(替换+删除+插入)÷ 参考词数,英文 < 0.15 算能用,< 0.1 算好;中文切词不稳,看 CER(字符错误率)更直观,< 0.10 可上线。更有用的判断:同一个测试集先跑一遍未微调的基线,微调后 WER 降 30% 以上才算这次微调有效 ✅ 如果基线和新模型差距不大,问题多半在数据不在超参。
调优按三层递进,别跳层:
- 数据侧(优先级最高):加数据 > 重新清洗 > 数据增强(加噪、变速、频谱增广各能抹平一部分分布差异)。
- 超参侧:过拟合就降学习率、加 warmup、上早停;欠拟合就加 epoch,确认训练/验证 WER 都在动。
- 模型侧:换更大规格(30 小时以上数据才有意义);或冻结编码器只训解码器——小数据下这招能保住预训练特征不塌。
训练翻车别慌,对号入座:
| 症状 | 大概率原因 | 解法 |
|---|---|---|
| CUDA out of memory | batch 太大、没做梯度累积 | batch 降到 1 + 加大累积步数;开 fp16/bf16 |
| loss 高且震荡不收敛 | 学习率过大,或音频-文本错位 | 降到 1e-5;先查 -100 填充和 10 条抽检 |
| train loss 降、eval WER 反升 | 过拟合,数据不够 | 早停取最佳 checkpoint;加数据或增强 |
| 推理慢、不满足实时 | beam 太大、模型过大 | 改贪心解码(num_beams=1)、fp16、或降级规格 |
微调后的模型落地部署:保存、推理与三条加速
训练结束 Trainer 会把 eval WER 最低的 checkpoint 存在输出目录,手动再对 model 和 processor 各存一份 save_pretrained 就齐了。推理最小可用代码:
from transformers import WhisperForConditionalGeneration, WhisperProcessor import librosa processor = WhisperProcessor.from_pretrained("./whisper-finetuned") model = WhisperForConditionalGeneration.from_pretrained( "./whisper-finetuned", torch_dtype=torch.float16, device_map="cuda" ) inputs = processor(*librosa.load("test.wav", sr=16000), sampling_rate=16000, return_tensors="pt").to("cuda") print(processor.batch_decode(model.generate(inputs.input_features, num_beams=1), skip_special_tokens=True)[0])三条加速,各一句话:fp16 / int8 量化,推理约快一倍、精度损失几乎无感;导出 ONNX Runtime 再提速 30% 以上,CPU 部署尤其划算;批处理,一次塞多条音频,GPU 利用率比逐条跑高得多。习惯命令行的话,还可以把 checkpoint 导出成 .pt 格式,用本仓库命令行入口 whisper/main.py 跑:python -m whisper your.wav --model your.pt --language zh,天然支持多文件批量转写。
只有 2 小时、只有一张 3090:快速启动
只有 2 小时:抽 20 条录音,small 模型跑 3 个 epoch,先验证 WER 是否往对的方向走。只有一张 3090:medium + fp16 + 梯度累积,30 小时数据一晚上能训完。跑通之后再考虑流式推理或多任务微调(同时输出时间戳)。
【免费下载链接】whisperRobust Speech Recognition via Large-Scale Weak Supervision项目地址: https://gitcode.com/GitHub_Trending/whisp/whisper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考