用 Whisper 把视频 / 录音转中文字幕(本地、免费、断点续传)

起因

存了 200 小时的会议录音 + 课程视频,想搜里面"我哪节课讲过 X 主题"。
传统方案:手工转录(贵 / 慢)、剪映等付费云转录(隐私 + 钱)。
Whisper 是 OpenAI 开源的 ASR 模型,本地跑能转 90+ 种语言,
中文识别质量直接打过国内大多数云服务。

解决方案

最快的方式是 whisper.cpp(C++ 重新实现,CPU/GPU 都很快,无需 PyTorch)。

git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp
# Apple Silicon 用 Metal;NVIDIA 用 CUDA;纯 CPU 也可以
make -j

# 下模型(large-v3 中文最准;medium 速度+准确度平衡;base 最快但中文一般)
bash ./models/download-ggml-model.sh large-v3
# 1.5 GB 左右

转录单个文件

# 输入要是 16kHz mono WAV
ffmpeg -i lecture.mp4 -vn -ar 16000 -ac 1 -c:a pcm_s16le tmp.wav

./build/bin/whisper-cli -m models/ggml-large-v3.bin \
  -l zh -f tmp.wav -osrt -otxt
# 生成 tmp.wav.srt + tmp.wav.txt

参数解释:
- -l zh:源语言中文(不指定的话自动检测)
- -osrt:输出 SubRip 字幕
- -otxt:输出纯文本

批量脚本

#!/usr/bin/env bash
for f in *.mp4; do
  base="${f%.mp4}"
  [ -f "$base.srt" ] && { echo "skip $f (already done)"; continue; }
  ffmpeg -y -i "$f" -vn -ar 16000 -ac 1 -c:a pcm_s16le /tmp/_audio.wav
  ./whisper-cli -m models/ggml-large-v3.bin -l zh -f /tmp/_audio.wav \
    -osrt -of "$base"
done

[ -f "$base.srt" ] && continue 做断点续传:跑了一半中断重启不重做。

Python 版(openai-whisper)

如果要嵌入到 pipeline:

uv add openai-whisper
import whisper
model = whisper.load_model('large-v3')   # 第一次自动下载

result = model.transcribe('lecture.mp4', language='zh', verbose=True)
print(result['text'])

# 带时间戳
for seg in result['segments']:
    print(f"[{seg['start']:.1f}s] {seg['text']}")

GPU 大模型一篇 1 小时音频约 5-10 分钟。CPU 慢 5-10 倍。

性能 / 选型

我笔记本 M1 Pro + whisper.cpp + large-v3:

模型 中文 WER 速度 显存
tiny ~25% 30x realtime 1 GB
base ~18% 16x 1 GB
small ~13% 6x 2 GB
medium ~9% 2x 5 GB
large-v3 ~6% 1x 10 GB

"realtime" = 处理 1 分钟音频要多少秒。large-v3 比 medium 准确率明显
但速度慢 2 倍,中文场景值得。

效果

  • 200 小时录音转完一晚上跑完
  • .srt 字幕直接拖进 VLC / 剪映对应视频
  • 搜索 grep -l "知识点关键词" *.srt 一秒定位"哪一节哪一段说过"
  • 转录质量手工抽查:科技 / 普通话清晰场景准确率 > 95%,方言 / 嘈杂
    环境降到 80% 左右

踩过的坑

  1. GPU 装错版本:whisper-py 默认装 CPU torch。要手动装 CUDA 版:
    uv add torch --index https://download.pytorch.org/whl/cu124

  2. 音频不是 16kHz mono:whisper.cpp 严格要求格式;自动失败但 error
    message 不明显。永远先 ffmpeg -ar 16000 -ac 1

  3. 长视频中间 hallucination:超过 30 秒的安静段落 whisper 会"幻想"
    一些重复的"谢谢观看"之类的话。--no-speech-threshold 0.6 加严格点
    过滤,或者 --temperature 0 减少创造性。

  4. 断句不准:whisper 自动给句号但有时一长串没标点。后处理用 ja-tokenize
    或者再过一遍 LLM 加标点:
    python client.chat.completions.create(messages=[{ 'role': 'user', 'content': f'给下面文本加合理标点,不要改字:\n{raw_text}' }])

  5. GPU 显存不够:large-v3 需要 10 GB+。降级到 medium(5 GB)+
    --word-timestamps 也能拿很好结果。

精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。