Whisper 模型微调实战:10 小时数据训练专属语音引擎

发布时间:2026/8/29 8:35:20
Whisper 模型微调实战:10 小时数据训练专属语音引擎 Whisper 模型微调实战10 小时数据训练专属语音引擎【免费下载链接】whisperRobust Speech Recognition via Large-Scale Weak Supervision项目地址: https://gitcode.com/GitHub_Trending/whisp/whisper医院听写里阿托伐他汀常被写成阿托伐他挺客服录音里川渝口音的啥子直接输出乱码。两个场景同病通用模型没见过你的领域数据。Whisper 模型微调就是补这一课——用你自己的标注数据继续训练让模型适配专业词汇、方言口音与高噪背景语音识别准确率随之上来。一页看懂核心逻辑通用模型 领域数据如何变专用Whisper 是编码器-解码器结构的 seq2seq 模型音频先变成 log-mel 频谱图编码器把它压成上下文向量解码器再逐 token 生成文本。微调不改这条链路里的任何一环只换监督信号——把通用语料换成你的音频-文本对训练目标仍是交叉熵所以一套现成的训练代码就能复用。从零训练需要 6800 小时级语料和数周 GPU 时间微调只是在预训练权重之上做几十小时的增量学习。下面这张图来自 Whisper 论文上半部分是预训练的多任务数据流下半部分把 text-only transcription 明确标为 dataset-specific fine-tuning 的形态——你后面所有操作就是往这个入口灌自己的数据完成领域适配。档位怎么选看这张表档位参数训练显存 (fp16)微调定位tiny39 M~4 GB不建议微调容量太小领域词学不进去small244 M~6 GB8GB 显存或快速验证流程时的保底档medium769 M~12 GB首选特征容量足够12GB 显存可稳定训练large1.55 B~24 GB数据充足、追求极限准确率再上turbo809 M~12 GB推理快但微调生态不成熟暂不推荐优先选 medium十几小时的领域数据配它正合适直接上 large小数据下更容易先过拟合。4 条命令搭好微调环境硬件门槛一句话12GB 显存的 GPUmedium fp16 的训练基线8GB 就选 small 档、32GB 内存、50GB 磁盘留给数据集和 checkpoint。Whisper 仓库以可编辑模式安装后面改训练代码不用重装transformers 和 datasets 承担训练主流程jiwer 算错误率librosa 处理音频。git clone https://gitcode.com/GitHub_Trending/whisp/whisper cd whisper pip install -e . pip install torch torchaudio transformers datasets jiwer librosa装完跑一行确认环境与权重都能拉下来import whisper; m whisper.load_model(base); print(环境就绪base 参数:, sum(p.numel() for p in m.parameters()) // 10**6, M)数据工程微调数据集准备的 5 条量化标准数据是微调的天花板。先把标准量化成可勾选的清单采样率统一 16kHz——Whisper 编码器的固定输入不转就是浪费总量 ≥ 10 小时低于 3 小时收益通常不稳定单条 5–30 秒太短缺上下文太长在 30 秒窗口内会漂移覆盖 ≥ 5 位说话人、不同语速单人数据极易过拟合转写与口播一致不改写、不做语法修正否则模型学到错误映射⚠️ 最后一条最容易被忽略文本标注的是说了什么不是应该说什么。采样率重采样用 soxr 或 librosa 都可以关键是全库统一别混着来。没有标注的录音不用愁先跑一遍 base 模型批量转写再人工修正。10 小时音频的修正工作量约 20–30 小时人时比从零标注快得多。修正时注意同音字错误必须改重复、口头禅按真实说话保留多人混杂的片段只保留主说话人文本。去重同样重要同一句话录了十遍只会让模型过度自信。两种最小可用格式列都只有audio和textaudio,text data/audio_001.wav,请给我开阿托伐他汀二十毫克 data/audio_002.wav,肌钙蛋白升高提示心肌损伤[ {audio: data/audio_001.wav, text: 请给我开阿托伐他汀二十毫克}, {audio: data/audio_002.wav, text: 肌钙蛋白升高提示心肌损伤} ]预处理只做三件事代码注释解释为什么import librosa, soundfile as sf def resample_16k(src, dst): y, sr librosa.load(src, srNone) # 按原始采样率读避免双重重采样糊音质 if sr ! 16000: # 只在不匹配时转换省时间 y librosa.resample(y, orig_srsr, target_sr16000) sf.write(dst, y, 16000)import re from sklearn.model_selection import train_test_split def clean(text): text re.sub(r[^\w\s], , text.lower()) # 去标点让模型专注字本身 return re.sub(r\s, , text).strip() # 8:1:1数据紧张时可改 9:0.5:0.5但 test 全程不许碰 train_df, temp train_test_split(df, test_size0.2, random_state42) val_df, test_df train_test_split(temp, test_size0.5, random_state42)推荐按这个目录布局组织整个 dataset 目录可以整体拷贝换机器dataset/ ├── train.csv # 80% ├── val.csv # 10% ├── test.csv # 10% └── audio/ ├── 0001.wav # 5~30 秒16kHz统一 wav └── ...训练实战跑通第一次 Whisper 微调整个训练是一个连贯脚本顺序固定用 load_dataset 读三份 CSV → map 里做两次变换 → 配置 TrainingArguments → Trainer 开跑没有任何一步需要自己写 dataloader。map 阶段做的事音频走 processor 变成 80 维 mel 特征文本走 tokenizer 变 label并把 label 里的 pad 位置改成 -100——这是 PyTorch 的约定值交叉熵只统计真实 token填充位不贡献 loss。from datasets import load_dataset from transformers import WhisperProcessor import librosa processor WhisperProcessor.from_pretrained(openai/whisper-medium) dataset load_dataset(csv, data_files{train: train.csv, val: val.csv, test: test.csv}) def preprocess(batch): audio [librosa.load(p, sr16000)[0] for p in batch[audio]] inputs processor(audio, sampling_rate16000, return_tensorspt, paddingTrue) labels processor.tokenizer(batch[text]).input_ids # -100 标记填充位loss 计算时自动忽略 inputs[labels] [[-100 if t processor.tokenizer.pad_token_id else t for t in row] for row in labels] return inputs processed dataset.map(preprocess, batchedTrue)from transformers import TrainingArguments args TrainingArguments( output_dir./whisper-finetuned, per_device_train_batch_size8, # 单卡批大小显存紧就减半 gradient_accumulation_steps4, # 与批大小相乘才是真实批量 learning_rate1e-5, # 微调基线学习率 num_train_epochs10, # 小数据 5~10 轮足够 fp16True, # 混合精度显存省一半 evaluation_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, # 结束自动回滚到最优 checkpoint metric_for_best_modeleval_loss, )启动训练时顺手锁死解码器输出模式——指定中文转写推理时才能一致复现from transformers import WhisperForConditionalGeneration, Trainer model WhisperForConditionalGeneration.from_pretrained(openai/whisper-medium) model.config.forced_decoder_ids processor.get_decoder_prompt_ids(languagezh, tasktranscribe) trainer Trainer(modelmodel, argsargs, train_datasetprocessed[train], eval_datasetprocessed[val]) trainer.train()10 小时数据、medium 档、fp16单张 3090 跑 10 个 epoch 约 1–2 小时每个 epoch 落一个 checkpoint。训练超参数调优真正值得动的只有两个learning_rate与批大小 × 累积步数的有效批量。学习率 1e-5 是基线欠拟合试 1e-4loss 震荡就降到 3e-6显存不够时保持有效批量不变、加大累积即可。num_train_epochs更多不等于更好看 val 曲线说话——train loss 单调降、eval loss 先降后平就该停eval 先降后升说明过拟合已经开始。 结果怎么判断WER/CER 越低越好 0.15 算好 0.3 可接受 0.5 就停下别调参了回去查数据。import jiwer # refs / hyps 为 test 集的标注与预测文本列表 wer sum(jiwer.wer(r, h) for r, h in zip(refs, hyps)) / len(refs) print(ftest WER {wer:.3f})效果调优如果……那么……四种典型症状各给首选和备选动作按顺序自查如果数据不足 2 小时首选让 base 模型先转一遍生成伪标签人工修正后并入训练集用自定义数据训练的思路把数据滚起来备选改 LoRA只更新少量参数小数据下更稳。如果训练 loss 一路降、验证 WER 反而回升过拟合首选按验证集挑最佳 checkpoint 直接用load_best_model_at_end已帮你留好备选给音频加噪声或变速增强或把学习率降一个量级。如果 CUDA out of memory显存不足首选批大小减半、梯度累积翻倍有效批量不变备选降到 small 档或换 8-bit 优化器量化训练。如果推理速度撑不住实时首选导出 ONNX RuntimeCPU 上也有 2–3 倍加速备选调小num_beams与max_new_tokens或直接换 small 档。落地与加速导出、推理、量化一次讲清训练结束后processor和model各调一次save_pretrained(./whisper-finetuned)部署时直接从该目录加载不需要重新下载预训练权重import torch, librosa from transformers import WhisperProcessor, WhisperForConditionalGeneration processor WhisperProcessor.from_pretrained(./whisper-finetuned) model WhisperForConditionalGeneration.from_pretrained(./whisper-finetuned).to(cuda) def transcribe(path): audio, _ librosa.load(path, sr16000) inputs processor(audio, sampling_rate16000, return_tensorspt).to(cuda) with torch.no_grad(): ids model.generate(inputs.input_features) return processor.batch_decode(ids, skip_special_tokensTrue)[0]线上调用就是这一个函数批量场景把多条音频拼成 batch 一次性过 processor吞吐能翻倍。省显存的场景加载时加torch_dtypetorch.float16纯 CPU 部署则走 ONNX 导出 onnxruntime不占 GPU。延伸方向微调之后还能做什么多轮微调先通用领域、再子领域两段式比一次性更稳LoRA/PEFT一个领域一套适配器推理时热切换一份基座服务多场景低资源策略伪标签蒸馏 人工修正是当前性价比最高的路径跨语言迁移源语种数据先微调再向目标语种迁移流式场景滑动窗口分块推向准实时听写【免费下载链接】whisperRobust Speech Recognition via Large-Scale Weak Supervision项目地址: https://gitcode.com/GitHub_Trending/whisp/whisper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考