Whisper 识别总翻车?用你自己的数据微调(fine-tune)实战
前面那篇讲怎么部署 Whisper 出字幕,但很多人跑起来发现:专有名词崩、方言听不懂、嘈杂环境瞎写。通用大模型在垂直场景就是会翻车。这时候与其换更大的模型,不如用你自己的数据微调。这篇记我微调 Whisper-small 的全过程,和几个省算力的前置招。
先别急着微调,试两招
微调要数据、要显卡,成本高。先试:
initial_prompt:给模型一个提示,比如"这是一段医学讲座,含术语 XXX";temperature回退:默认会重试,设好候选温度;condition_on_previous_text=False:长音频一段话错全段崩时关掉。
很多场景调 prompt 就够,没必要微调。
什么时候真要微调
- 固定术语/人名(如你们公司产品名、主播昵称);
- 固定口音/方言;
- 固定噪声环境(车间、车内)。
数据准备
要"音频切片 + 文字标注",格式 jsonl:
{"audio": "clip/001.wav", "text": "今天我们讲 VidDown 的并发下载模型"}
每段最好 5~30 秒,太长 Whisper 会丢。我拿已有的 200 条标注,约 40 分钟,够了先试水。
训练
用官方 whisper 的 finetune 脚本(或 whisper-trainer):
python train.py --model_name openai/whisper-small --train_data train.jsonl --eval_data eval.jsonl --output_dir ./whisper-finetuned --epochs 5 --batch_size 8 --learning_rate 1e-5
单卡 3090,40 分钟数据、5 轮,跑了一晚上。
坑一:数据少容易过拟合
不到 1 小时的数据,epochs 别太高,否则训练集完美、验证集拉胯。我最后用 3 轮 + 早停。
坑二:长音频先切片
Whisper 对 30s 以上段处理差。微调前把语料按静音切到 30s 内(接前面 silencedetect 那篇),标注也对应切。
部署成快的
微调完是 PyTorch 权重,生产用 CTranslate2 转一下快 4 倍、显存省一半:
ct2-transformers-converter --model ./whisper-finetuned --output_dir ./whisper-ct2 --copy_files tokenizer.json
然后 faster-whisper 直接加载。前面 Whisper 部署篇的玩法不变,只是模型换成你自己的。
提醒
小团队用 large-v3 + 好 prompt 往往比费力微调 small 更划算。真到术语满天飞才值得微调。