语音识别入门:Whisper模型初探

OpenAI 在 2022 年 9 月开源了 Whisper 语音识别模型,支持多语言转录和翻译,效果惊人地好。这里记录下我的使用体验和一些实践细节。

Whisper 是什么

Whisper 是一个基于 Transformer 的 encoder-decoder 语音识别模型,在 68 万小时的多语言音频数据上训练。它的特点是「大力出奇迹」——不靠什么精巧的架构创新,而是用海量弱监督数据堆出来的泛化能力。

模型有多个尺寸:

模型 参数量 英语 WER 多语言
tiny 39M ~8% 一般
base 74M ~6% 还行
small 244M ~4.5% 不错
medium 769M ~3.5% 很好
large 1550M ~3% 最佳

安装与基本使用

pip install openai-whisper
# 需要 ffmpeg
sudo apt install ffmpeg

命令行最简用法:

whisper audio.mp3 --model small --language Chinese

Python 调用:

import whisper

model = whisper.load_model("small")

# 转录
result = model.transcribe("meeting.mp3", language="zh")
print(result["text"])

# 带时间戳的分段结果
for seg in result["segments"]:
    print(f"[{seg['start']:.1f}s -> {seg['end']:.1f}s] {seg['text']}")

transcribe vs translate

Whisper 支持两种模式:

  • transcribe:保持原语言输出。中文音频 -> 中文文本
  • translate:翻译成英文。中文音频 -> 英文文本
# 翻译模式
result = model.transcribe("chinese_audio.mp3", task="translate")
print(result["text"])  # 输出英文

translate 模式只支持翻译到英文,不支持其他目标语言。

实际体验

我用几段不同场景的音频测试了 small 模型:

  1. 播客(普通话):准确率非常高,95% 以上,偶尔在专业术语上出错
  2. 会议录音(带方言口音):准确率约 85%,方言重的部分会出一些离谱的错
  3. 英文技术演讲:效果很好,专业术语识别比预期好
  4. 嘈杂环境:背景噪音大的时候识别率下降明显,medium 模型会好一些

中文识别一个常见问题是标点符号——Whisper 会自动加标点,但中文的逗号句号位置有时不太对。

用 API 调用

如果不想本地跑模型(需要 GPU),可以用 OpenAI 的 API:

import openai

audio_file = open("meeting.mp3", "rb")
transcript = openai.Audio.transcribe(
    model="whisper-1",
    file=audio_file,
    language="zh",
    response_format="verbose_json"
)

for seg in transcript["segments"]:
    print(f"[{seg['start']:.1f} - {seg['end']:.1f}] {seg['text']}")

API 价格是 $0.006/分钟,一小时会议录音不到 $0.4,很便宜。

长音频处理

Whisper 的上下文窗口是 30 秒。对于长音频,库内部会自动切分。但如果你想更精细地控制,可以手动分段:

import whisper
from pydub import AudioSegment

audio = AudioSegment.from_mp3("long_meeting.mp3")
chunk_ms = 30 * 1000  # 30秒一段

model = whisper.load_model("small")
full_text = []

for i in range(0, len(audio), chunk_ms):
    chunk = audio[i:i + chunk_ms]
    chunk.export("temp_chunk.wav", format="wav")
    result = model.transcribe("temp_chunk.wav", language="zh")
    full_text.append(result["text"])

print("\n".join(full_text))

小结

Whisper 的开源让语音识别的门槛大幅降低。small 模型在大多数场景下够用,对中文的支持也不错。我目前主要用它来做会议录音的转文字,再丢给 GPT 做总结,整个流程非常顺滑。