Whisper 3分钟跑通本地语音识别:一条命令把任意语言音频转成文字
播客编辑把 3 小时访谈录音丢给我,人工整理稿根本没法完成。她只给我一条命令:whisper interview.m4a,几分钟后完整文稿就躺在文件夹里。这就是 Whisper,一个可完全离线跑通的本地语音识别模型——不用 API、不上传云端,支持 98 种语言的转写与翻译。
项目能做什么
Whisper 是 OpenAI 用大规模弱监督数据训练的 Transformer 序列到序列模型,一个模型就把传统语音处理流水线的多个环节全包了:
- 多语言语音识别:98 种语言直接输出原语言文字
- 语音翻译:非英语音频可一键翻译成英文,
--task translate即可 - 语言自动识别:不指定
--language时,用前 30 秒音频自动判断语种 - 多格式落盘:一次跑出 txt、srt、vtt、tsv、json、jsonl 六种文件
它的工作方式如下图:音频按 30 秒窗口进入编码器,变成 mel 频谱表示后,解码器逐词输出文本;token 序列里的一组特殊符号用来标记"正在执行哪个任务",识别、翻译、语种检测共用同一套权重。
三步跑通最小Demo
第一步:安装
唯一的外部依赖是 ffmpeg,负责解码各种音频格式,装完再装 Python 包:
sudo apt update && sudo apt install ffmpeg # macOS 可换成 brew install ffmpeg
pip install -U openai-whisper
第二步:初始化
模型权重首次使用时会自动下载并缓存,之后直接复用:
import whisper
model = whisper.load_model("base") # 缓存在 ~/.cache/whisper
第三步:调用
命令行最快,默认输出全部六种格式:
whisper meeting.mp3 --model base
程序里调用则只需要两行:
result = model.transcribe("meeting.mp3")
print(result["text"])
关键机制速览
30 秒滑动窗口。 编码器只认固定 30 秒的输入,长音频被切成连续的 30 秒窗口逐个处理,像读书翻页一样翻完为止。窗口切到哪里由模型输出里的时间戳 token 决定,所以断句和字幕时间码都是模型自己给的,不需要后处理。固定窗口、采样率 16 kHz 等参数都写死在 whisper/audio.py 顶部。
温度回退。 模型"没把握"时不会硬着头皮输出:先以温度 0 解码,若结果被判失败——文字压缩比超过 2.4(意味着大量重复),或平均对数概率低于 -1.0——就把温度调高 0.2 重试,直到 1.0。相当于先认真读一遍,读不通就放松重猜。这段逻辑在 whisper/transcribe.py 的 decode_with_fallback 里。
真实场景落地:外网公开课一键出字幕
需求:两小时日语公开课,要英文 SRT 字幕。流程很简单:先用小模型试跑确认语种,再用正式规格出片,最后只保留 srt 文件:
whisper lecture.mp4 --model medium --language Japanese --task translate --output_format srt
产出的 lecture.mp4.srt 可直接挂到播放器上。规格怎么选?下面是官方在 A100 上的相对速度数据(源自 README.md),实际快慢还要看你的机器:
| 规格 | 参数量 | 显存需求 | 相对速度 | 适用场景 |
|---|---|---|---|---|
| tiny | 39 M | ~1 GB | ~10x | 草稿验证、低配机器 |
| base | 74 M | ~1 GB | ~7x | 日常英语转写 |
| small | 244 M | ~2 GB | ~4x | 多语种、精度要求更高 |
| turbo | 809 M | ~6 GB | ~8x | 大批量转写(不支持翻译) |
| large | 1550 M | ~10 GB | 1x | 翻译任务、最高精度 |
turbo 是 large-v3 的加速版,精度损失小、速度接近 small,批量转写的首选;但注意它没有针对翻译任务训练,指定 --task translate 时只会原样输出。另外,语种已知就显式指定 --language,既稳定又能省掉检测步骤。
避坑清单
| 问题 | 原因 | 解法 |
|---|---|---|
启动就报 Failed to load audio | 系统缺少 ffmpeg | 先按第一步装上 ffmpeg |
--task translate 后仍是原文 | turbo 模型未训练翻译能力 | 换成 medium 或 large |
用 .en 模型传其他语言被警告 | .en 是纯英文模型 | 多语种一律用不带 .en 的规格 |
| 文稿陷入同一句话无限重复 | 前文输出被当作下一窗口的提示,形成死循环 | --condition_on_previous_text False |
| 开头长静音导致语种识别错误 | 自动检测只取前 30 秒 | 手动指定 --language |
收尾
模型本身跑顺之后,纵深在下游:
- 加
--word_timestamps拿词级时间码,做逐词高亮字幕 - 用
--initial_prompt注入领域词表,纠正专有名词 - 跑一遍 notebooks/Multilingual_ASR.ipynb 看完整多语种示例
更多细节可查 model-card.md。当音频变成文本流之后,检索、归档、翻译、喂给知识库就都只是普通的文本处理了。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




