Whisper 微调实战:3 步把领域识别准确率拉上去的完整避坑指南

Whisper 微调实战:3 步把领域识别准确率拉上去的完整避坑指南 Whisper 微调实战3 步把领域识别准确率拉上去的完整避坑指南【免费下载链接】whisperRobust Speech Recognition via Large-Scale Weak Supervision项目地址: https://gitcode.com/GitHub_Trending/whisp/whisper第一次把通用的 Whisper 语音识别模型搬进医疗病历场景时多柔比星被写成了多柔红比斯。模型不是变笨了而是它的预训练语料里从没出现过你的行业词汇。出路有两条把术语塞进 prompt 让它凭感觉猜对或者用几小时标注数据微调fine-tuning模型把词表写进权重。这篇文章把数据准备、训练、评估到部署的完整流程走一遍每一步都给你能直接复制的代码。这个项目到底能干什么Whisper 是 OpenAI 的通用语音识别模型采用 Transformer 编码器-解码器结构编码器把 30 秒一窗的 Log-Mel 频谱压成语义向量解码器自回归地吐出文本语言识别和翻译任务也共享同一套权重。官方仓库自带 CLI 和 Python APIwhisper audio.wav --model medium一条命令就能出结果whisper/__init__.py里的load_model()负责模型下载、SHA256 校验和设备放置。做微调之前先想清楚用哪个规格当底座规格参数量显存需求相对速度适用场景tiny39 M~1 GB~10x快速验证流程base74 M~1 GB~7x数据 10 小时的英文任务small244 M~2 GB~4x中小规模数据medium769 M~5 GB~2x中文/多语言微调主力large-v31550 M~10 GB1x数据充足时的上限选择turbo809 M~6 GB~8x推理首选未训练翻译任务 经验值英文数据 10~100 小时选 small 或 medium中文建议直接从 medium 起步。跑通之前先确认这 5 件事检查项门槛说明GPU 显存≥12 GBmedium batch 8 fp16 需要这个余量内存 / 磁盘32 GB / 100 GB数据集、checkpoint、日志都要落盘Python≥3.8官方pyproject.toml声明的下限标注数据≥10 小时覆盖不同说话人、语速磁盘 IO顺序读 ≥500 MB/s训练时每个 batch 都要实时读音频装环境和依赖只需两条命令git clone https://gitcode.com/GitHub_Trending/whisp/whisper cd whisper pip install -e .pip install transformers datasets jiwer librosa soundfile装完跑一段自检能打印出参数量就算通过import whisper print(whisper.available_models()) model whisper.load_model(base) print(sum(p.numel() for p in model.parameters()))把你的数据喂给模型数据环节按输入→清洗→切分三步走质量决定天花板。输入一张 CSV 就够音频路径 逐字准确的转录文本audio,text audio/001.wav,患者予多柔比星注射液化疗 audio/002.wav,请核对输液卡上的床号清洗两条规则别跳过。其一统一采样率到 16kHz——模型输入端按 16k 抽梅尔特征实现见whisper/audio.py采样率不一致时 resample 一下import librosa, soundfile as sf def resample(path, out, sr16000): y, orig librosa.load(path, srNone) if orig ! sr: y librosa.resample(y, orig_srorig, target_srsr) sf.write(out, y, sr)其二文本规范化小写化、去多余空白但保留领域术语的原词不要为了干净把专有名词改掉。仓库里的data/meanwhile.json可以当作标注格式参考——每个片段带音频 ID、起止时间和文本。切分训练/验证/测试按 8:1:1 划分尽量按说话人分层避免同一个人在训练集和测试集里都出现否则 WER 会好看得不真实。从加载到出结果完整训练流程第一步载入数据集from datasets import load_dataset ds load_dataset(csv, data_files{train: train.csv, val: val.csv})第二步写预处理管道把音频和文本转成模型张量from transformers import WhisperProcessor processor WhisperProcessor.from_pretrained( openai/whisper-medium, languagezh, tasktranscribe) def preprocess(examples): audio [librosa.load(p, sr16000)[0] for p in examples[audio]] inputs processor(audio, sampling_rate16000, return_tensorspt, paddingTrue) labels processor(examples[text], return_tensorspt, paddingTrue).input_ids labels[labels processor.tokenizer.pad_token_id] -100 # 损失忽略 padding inputs[labels] labels return inputs processed ds.map(preprocess, batchedTrue, remove_columnsds[train].column_names)第三步训练配置。学习率 1e-5 是这个量级模型的稳妥起点梯度裁剪 1.0 防止损失爆掉from transformers import TrainingArguments args TrainingArguments( output_dir./whisper-ft, per_device_train_batch_size8, gradient_accumulation_steps4, learning_rate1e-5, num_train_epochs10, fp16True, eval_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, metric_for_best_modelwer, greater_is_betterFalse, max_grad_norm1.0, )第四步评估函数加 Trainer开训import jiwer def compute_metrics(pred): ids pred.label_ids ids[ids -100] processor.tokenizer.pad_token_id p processor.batch_decode(pred.predictions, skip_special_tokensTrue) r processor.batch_decode(ids, skip_special_tokensTrue) return {wer: jiwer.wer(p, r)} model WhisperForConditionalGeneration.from_pretrained(openai/whisper-medium) trainer Trainer(modelmodel, argsargs, train_datasetprocessed[train], eval_datasetprocessed[val], compute_metricscompute_metrics) trainer.train()第五步落盘trainer.save_model(./whisper-ft) processor.save_pretrained(./whisper-ft)⚠️ 想省事可以先不训练官方transcribe()定义在whisper/transcribe.py支持initial_prompt参数把术语写进上下文文本例如model.transcribe(a.wav, initial_prompt患者王某某用药多柔比星)。零样本 prompt 对部分高频术语就能见效先在小验证集上对比一下再决定微调值不值这个 GPU 时间。数字不好先查这 3 个方向指标以测试集 WER 为主指标同时人工抽查错误样本别只盯训练曲线。方向一WER 卡在某个值下不去 → 大概率是数据瓶颈。跑一遍错误分析把错误最多的样本排出来看errors sorted( ({p: p, r: r, wer: jiwer.wer(p, r)} for p, r in zip(preds, refs)), keylambda x: x[wer], reverseTrue)[:10] for e in errors: print(f{e[wer]:.2f} | {e[p]} | {e[r]})错误集中在某一类术语上就回数据章节补这类样本错误分布随机则是数据量或模型规格不够。方向二训练 WER 低、验证 WER 高 → 过拟合。动作对音频加高斯噪声或做 time-stretch 数据增强减少训练轮数配合早停必要时换小一档的底座模型。方向三loss 剧烈震荡不收敛 → 学习率或有效 batch 不匹配。把 learning_rate 降到 5e-6靠加大gradient_accumulation_steps补回有效 batch再开一个余弦调度器。这些报错你大概率会碰到现象训练中途 CUDA out of memory。根因medium 模型 batch 8 加上长音频样本激活内存峰值超出显存。解法batch 减半、梯度累积翻倍等效 batch 不变仍不够就换 small 底座。现象静音段输出同一句话反复循环幻觉。根因解码器在无语音区域持续自回归开始编。解法官方推理端已有防御——no_speech_threshold和hallucination_silence_threshold参数见whisper/transcribe.py推理时打开微调时检查数据集里是否混入了大段静音切片。现象loss 某一轮突然变成 NaN。根因fp16 数值溢出或学习率偏大。解法降到 5e-6显存允许时改用 bf16 替代 fp16确认max_grad_norm已开启。现象微调后模型推理效果和训练时不一致。根因推理时的语言/任务 prompt 与训练不一致解码起点就偏了。解法推理端用与训练相同的language和task配置 processor并通过forced_decoder_ids固定解码器 prompt。接下来可以做什么三个关键决策点回顾一遍底座模型决定上限数据 10 小时选 base/small10~100 小时选 medium更多考虑 turbo 或 large-v3标注质量比数量更决定下限评估永远用 WER 错误样本清单双通道训练曲线仅供参考。下一步按数据量分流标注够 100 小时以上把底座升到 large-v3 重训一遍验证上限还不够就先回到数据章节把错误分析里最高频的那批术语的样本补齐再训。部署侧训练产物可以量化成 fp16 或导出 ONNX 加速推理配合批量处理基本能压进实时需求。【免费下载链接】whisperRobust Speech Recognition via Large-Scale Weak Supervision项目地址: https://gitcode.com/GitHub_Trending/whisp/whisper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考