Whisper 模型实战:多语言语音识别与翻译
什么是 Whisper
Whisper 是 OpenAI 开源的多语言语音识别与翻译模型,基于大规模弱监督训练。它能够将语音转录为文本,并支持近百种语言。除了识别,Whisper 还能直接将非英语语音翻译成英语文本,适用于会议记录、内容创作、无障碍工具等场景。
本教程将带你快速上手 Whisper,完成多语言语音识别以及翻译任务。
环境准备
在开始之前,确保你的系统安装了 Python 3.8 或更高版本,并且已经配置好 pip。推荐使用虚拟环境避免依赖冲突。
安装依赖
pip install openai-whisper
如果使用 GPU 加速,请确保已安装 CUDA 和 cuDNN,并安装支持 GPU 的 PyTorch 版本。你可以通过以下命令验证:
python -c "import torch; print(torch.cuda.is_available())"
此外,Whisper 需要 ffmpeg 处理多种音频格式。安装方式:
- macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt update && sudo apt install ffmpeg - Windows: 从 ffmpeg.org 下载后添加到系统路径。
快速开始:加载模型
Whisper 提供多种模型尺寸,在准确度和速度之间取得平衡:
| 模型 | 参数量 | 显存占用(约) | 相对速度 | 适用场景 |
|---|---|---|---|---|
| tiny | 39M | ~1 GB | 最快 | 低资源设备、实时预览 |
| base | 74M | ~1 GB | 较快 | 一般精度需求 |
| small | 244M | ~2 GB | 中等 | 平衡速度与准确度 |
| medium | 769M | ~5 GB | 较慢 | 高质量转录 |
| large | 1550M | ~10 GB | 最慢 | 最高精度、多语言翻译 |
加载模型只需一行代码:
import whisper
model = whisper.load_model("base") # 可替换为 tiny, small, medium, large
模型会在第一次使用时自动下载。
语音识别(转录)
使用 transcribe() 方法将音频转换为文本。最基本用法:
result = model.transcribe("audio.mp3")
print(result["text"])
返回结果结构
result 是一个字典,包含:
text:完整转录文本。segments:带时间戳的片段列表,每个片段有start、end、text。language:检测到的语言代码(如zh、en)。
示例:打印带时间戳的片段。
for segment in result["segments"]:
print(f"[{segment['start']:.2f}s -> {segment['end']:.2f}s] {segment['text']}")
多语言语音识别
Whisper 能自动检测语言并进行转录。你无需事先指定语言,但也可以强制设置语言以提升准确率:
# 自动检测语言
result = model.transcribe("french_audio.wav")
print(f"检测语言: {result['language']}")
print(result["text"])
# 强制指定法语(fr)
result = model.transcribe("french_audio.wav", language="fr")
支持的语言代码可在官方文档查找,常见如:
- 中文:
zh - 英文:
en - 日文:
ja - 韩文:
ko - 法文:
fr - 德文:
de
将非英语语音翻译为英语
Whisper 可以将任何语言的语音直接翻译成英文文本。使用 task="translate" 参数:
result = model.transcribe("spanish_speech.mp3", task="translate")
print(result["text"]) # 输出英文翻译
翻译任务会自动忽略 language 参数(始终输出英文),且不能与转录任务同时执行。适用场景:快速生成英文摘要、跨语言会议记录。
高级选项与性能优化
音频预处理
确保音频为单声道、16kHz 采样率,可获得最佳效果。可使用 ffmpeg 转换:
ffmpeg -i input.wav -ar 16000 -ac 1 output.wav
分段与上下文
默认情况下,Whisper 以 30 秒为窗口处理音频,并使用 VAD(语音活动检测)分割。对于长音频,通过 word_timestamps 和 condition_on_previous_text 可提升连贯性:
result = model.transcribe(
"lecture.mp3",
word_timestamps=True,
condition_on_previous_text=True,
)
调整静音修剪
vad_filter 参数开启静音修剪,vad_parameters 可微调:
result = model.transcribe(
"interview.wav",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=500),
)
提升非英语转录精度
- 使用
large-v3模型。 - 明确指定
language。 - 设置
temperature=0降低随机性,产生更确定的结果。 - 使用
initial_prompt提供上下文词汇(如专有名词)。
result = model.transcribe(
"tech_talk.wav",
language="zh",
temperature=0.0,
initial_prompt="专业词汇:机器学习, 神经网络, 大模型"
)
常见问题
如何处理 GPU 显存不足?
- 使用较小的模型(如
base或small)。 - 调用
model.transcribe(..., fp16=False)在 CPU 上运行(速度较慢)。 - 分批处理长音频。
识别结果出现重复短语怎么办?
这是 Whisper 偶尔会出现的幻觉问题。尝试:
- 降低
temperature(如0.0)。 - 关闭
condition_on_previous_text(设为False)。 - 使用
no_speech_threshold过滤静音区域。
result = model.transcribe("audio.wav", condition_on_previous_text=False, temperature=0.0)
音频包含多个人说话怎么办?
Whisper 本身不分说话人。可用第三方工具(如 PyAnnote)结合的 WhisperX 项目实现说话人分离。
总结
通过本教程,你已掌握:
- 环境配置与模型加载。
- 基础语音识别与带时间戳的结果处理。
- 多语言识别与强制语言指定。
- 语音到英文的直接翻译。
- 适用于长音频和高精度场景的高级选项。
Whisper 开箱即用,适合嵌入到各类应用中。你可以进一步探索 WhisperX 获取文字对齐和说话人分割能力,或结合 FFmpeg 构建完整的语音处理流水线。