本地语音识别实战:Whisper 三种方案横评,把会议录音和视频字幕交给 AI 搞定
最近有朋友问我:公司例会、网课录屏,还有一堆…
最近有朋友问我:公司例会、网课录屏,还有一堆教学视频,想整理成文字稿做知识库,有没有离线又免费的办法?说实话,云端的语音转文字服务要么按分钟收费,要么把录音传到别人服务器上,隐私这一关就过不去。作为习惯把数据攥在自己手里的人,我的答案永远是——本地跑一个 Whisper。
Whisper 是 OpenAI 开源的自动语音识别(ASR)模型,注意是开源的那个,跟闭源 API 没半毛钱关系。它支持 99 种语言,中文识别效果在开源模型里属于第一梯队,最关键的是能完全离线跑,而且有五花八门的工程化实现,从纯 Python 到纯 C++ 一应俱全。这两年生态也成熟了,部署成本从”要一张好显卡”降到”一块树莓派也能跑”,正是入坑的好时候。
三种实现方案,先搞清楚再动手
别一上来就 pip install whisper,这玩意儿有好几个”马甲”,选错了体验天差地别:
- openai-whisper:官方原版,PyTorch 实现,功能最全(时间戳、语言检测、直接翻译),但速度一般,适合做基准对比。
- faster-whisper:用 CTranslate2 重写的版本,速度是原版 4 倍,显存占用砍一半,精度几乎无损。有 GPU 的服务器首选这个。
- whisper.cpp:纯 C/C++ 实现,CPU 上也能跑得飞快,还支持量化模型,树莓派、软路由这种弱鸡设备都能带得动。
我的结论很干脆:有显卡的机器用 faster-whisper,纯 CPU 或边缘设备用 whisper.cpp,原版留着研究对比就行。下面重点讲 faster-whisper,这也是大叔分布式架构里音频节点上的主力。
部署 faster-whisper,三步搞定
第一步装 ffmpeg,Whisper 解码音频全靠它,不管你是 mp3、m4a 还是 wav,底层都走 ffmpeg。没有它,再好的模型也是白搭:
# Debian/Ubuntu
sudo apt update && sudo apt install -y ffmpeg
第二步装 faster-whisper,建议用 venv 或 uv 隔离,别污染系统环境。因为它底层会拉 CTranslate2 和 cuBLAS,跟其他 Python 项目混装容易打架:
pip install faster-whisper
装完就能直接用了,命令行一行转写一个音频文件(模型首次运行会自动从 HuggingFace 下载到缓存目录,需要能联网):
faster-whisper audio.mp3 --model large-v3 --language zh --output_format txt
命令行只是开胃菜,真正落地的姿势是用 Python 脚本批处理。下面这段是大叔在用的核心逻辑,注释都写清楚了:
from faster_whisper import WhisperModel
# device="cuda" 走显卡,纯 CPU 改成 "cpu",显存紧张用 int8 量化
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe(
"meeting.mp3",
language="zh", # 强制中文,别让模型自己猜
vad_filter=True, # 自动跳过静音段,减少幻觉
initial_prompt="以下是普通话会议录音的转写。", # 给个中文引导
)
for seg in segments:
print(f"[{seg.start:.1f}s -> {seg.end:.1f}s] {seg.text}")
whisper.cpp:纯 CPU 也能跑,边缘设备救星
如果你的场景是纯 CPU,或者想把语音识别塞进树莓派、软路由这种连显卡槽都没有的设备,那 whisper.cpp 是唯一解。它是 Georgi Gerganov 用 C++ 写的,支持 ggml 量化模型,4 核小主机跑 base 模型就能实时转写。三步走:
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp && make
# 下载量化模型(base 平衡速度与精度,tiny 最快)
bash ./models/download-ggml-model.sh base
# 转写音频
./main -m models/ggml-base.bin -f audio.wav -l zh -otxt
注意 whisper.cpp 认的是 16kHz 的 wav 输入,mp3 得先用 ffmpeg 转一下,别直接喂。量化模型体积从 75MB(tiny)到 1.5GB(large-v3)不等,按设备内存挑,别贪大。
视频直接喂?先抽音轨,再批量跑
Whisper 吃的是音频,视频文件得先把音轨抽出来。一条 ffmpeg 命令搞定,顺便把采样率转成 16kHz 单声道,这是 Whisper 最舒服的输入格式:
ffmpeg -i lecture.mp4 -vn -ac 1 -ar 16000 -c:a pcm_s16le lecture.wav
日常用起来就是批量。把目录里所有音频丢给一个循环,顺手输出 srt 字幕,直接给剪映、Premiere 当字幕用。下面这个脚本大叔一直在跑:
#!/bin/bash
# 批量转写:目录下所有 mp3/wav 转成 txt 和 srt
mkdir -p ./transcripts
for f in *.mp3 *.wav; do
[ -e "$f" ] || continue
echo "正在处理: $f"
faster-whisper "$f" \
--model large-v3 --language zh \
--output_format txt --output_format srt \
--output_dir ./transcripts/
done
echo "全部完成,结果在 ./transcripts/"
避坑指南,这几条能省你半天时间
- 中文一定指定 language=”zh”:让模型自动检测语言,速度慢不说,还容易中英夹杂、简繁乱飘。
- initial_prompt 别省:给一句中文提示,能明显减少误判和漏字,尤其是有专业术语的录音。
- vad_filter=True 一定要开:长录音里的静音段是”脑补”重灾区,模型闲着没事会瞎编内容,开了 VAD 过滤能大幅改善。
- 模型按显存选:8G 显存用 medium,12G 以上用 large-v3,纯 CPU 用 small 或者 int8 量化的 medium,别贪大。
- 超长音频先切段:一小时以上的录音别一次性塞进去,内存会爆,时间戳也会漂移,按 5-10 分钟切段最稳。
- 输出 srt 直接可用:–output_format srt 生成的字幕文件,时间戳是现成的,视频后期直接导入。
顺便说一句,如果你纠结 whisper 到底能不能打,大叔的实测结论是:large-v3 的中文转写准确率已经能应付会议纪要和字幕场景,遇到人名、专有名词会偶有错字,但配合 initial_prompt 和术语表能补回来一大半。真正拉开差距的往往不是模型,而是前处理——音频质量、语速、口音、背景噪音,这些对结果的影响比换模型大得多。所以别一上来就怪模型不行,先检查你的录音环境。
再说句硬件上的实话:语音识别是个吃算力但不怎么吃显存带宽的活,一块 RTX 3060 12G 跑 large-v3 就能接近实时,比跑大语言模型亲民多了。这也意味着你完全可以拿退役的旧显卡搭一个专门的语音节点,跟推理节点错开跑,互不抢资源。多节点分布式架构的意义,恰恰就是让这种”小活儿”不占用主力机的命脉。
和 IndexTTS 组成语音闭环
大叔的分布式架构里,音频节点本来跑着 IndexTTS 做文字转语音(TTS),现在把 Whisper 加进去做语音转文字(ASR),等于把”说→文字→说”整条链路都本地化了。语音笔记自动归档、会议纪要自动生成、视频字幕批量压制,一个节点全包,数据不出内网,这才是本地 AI 该有的样子。
下一篇文章我打算讲讲怎么把 Whisper 的结果直接喂进向量库做可检索的语音知识库,感兴趣的老铁点个关注,咱们下期见。
