faster-whisper 本地语音转写:会议纪要、字幕批量处理实战
faster-whisper 本地语音转写:会议纪要、字幕批量处理实战
把一小时录音转成文字,网上工具要付费还要上传音频;faster-whisper 本地转写不仅免费、不用上传,速度还快——一段 10 分钟录音在普通显卡上 1 分钟内出稿。这篇文章从安装到批量出字幕,附 CPU/GPU 实测速度与踩坑记录。

一、faster-whisper 是什么
faster-whisper 是 OpenAI Whisper 的重新实现,核心优化点是用了 CTranslate2 推理引擎,同样是跑模型,速度比原版 Whisper 快 4 倍左右、内存占用更低。API 跟原版兼容,迁移成本几乎为零。
先简单理解 Whisper 家族:OpenAI 开源的 Whisper 是语音转文字(ASR)模型的标杆,多语言、抗噪能力强,但原版推理用 PyTorch,速度偏慢、内存占用高。faster-whisper 把同样模型搬到 CTranslate2(C++ 推理引擎,支持 int8 量化),获得了接近 4 倍的速度提升,同时内存占用大幅下降——同样的模型,CPU 上就能跑得不错,这是它能流行的核心原因。
它解决三个痛点:
隐私:音频完全本地处理,不出机器;
速度:GPU 上转写速度远快于原版 Whisper;
可控:模型大小、语言、分句策略全部可调,还能接 VAD 自动过滤静音。
与在线转写工具的对比
| 维度 | faster-whisper 本地 | 在线工具(讯飞听见等) |
|---|---|---|
| 成本 | 免费 | 按分钟/会员付费 |
| 隐私 | 音频不出机器 | 需上传云端 |
| 速度 | 取决于硬件 | 看队列,一般较慢 |
| 批量 | 脚本一键批量 | 逐条上传 |
| 定制 | 完全可控 | 平台预设 |
选择建议:几十分钟的偶发需求,在线工具省事;但会议纪要、课程回放这类高频大量场景,本地转写一次配置长期免费,划算得多。音频含敏感内容(客户电话、内部会议)时,本地是唯一合规选项。
二、安装与环境
faster-whisper 是 Python 包,直接 pip 安装:
1 | pip install faster-whisper |
它是 CPU/GPU 通用的,GPU 用户需要额外装 CTranslate2 的 CUDA 版本(faster-whisper 会自动检测,也可以手动指定):
1 | pip install faster-whisperpip install ctranslate2 --upgrade |
提示:Mac 用户直接用 CPU 版本即可(M 系列芯片用 Metal 也很快,见后面的实测)。Windows 用户确保 CUDA 驱动已装,faster-whisper 会优先用 GPU。
用 Python 环境管理,别污染系统环境
faster-whisper 依赖较多,强烈建议用虚拟环境或 Conda 隔离开:
1 | python3 -m venv .venvsource .venv/bin/activate # Windows: .venv\Scripts\activatepip install faster-whisper |
虚拟环境的好处:换项目、升级包不会影响系统 Python,避免「升级了 NumPy 导致别的脚本坏了」这类连锁问题。转写工具值得单独建一个环境长期维护。
三、最简转写脚本:十行代码
faster-whisper 的核心用法简单到让人意外:
1 | from faster_whisper import WhisperModelmodel = WhisperModel("medium", device="cuda", compute_type="int8_float16")segments, info = model.transcribe("meeting.mp3", language="zh")for seg in segments: print(f"[{seg.start:.1f} - {seg.end:.1f}] {seg.text}") |
关键点:
WhisperModel(“medium”, …):第一个参数是模型大小,可选
tiny/base/small/medium/large-v3(或turbo);device:
"cuda"(N 卡)/"cpu"/"auto";compute_type:
"int8_float16"是 GPU 上的最佳速度组合,"int8"是 CPU 推荐;language=”zh”:明确中文可显著提速和提准;不指定则自动检测,会慢一些。
segments 是生成器,所以转写和输出是流式的——边转边出,不用等全部完成。
第一次运行会做什么
第一次调用 WhisperModel("medium", ...) 时,faster-whisper 会自动下载对应模型文件(medium 约 1.5GB),存放在缓存目录(Linux/macOS 默认 ~/.cache/huggingface,Windows 在用户目录)。下载一次后后续离线使用。如果你的机器没联网或下载慢,可以手动从 HuggingFace 把模型目录复制到缓存位置。

四、模型档位怎么选
Whisper 系列模型从小到大,速度和准确率差异巨大:
| 模型 | 体积 | 显存需求 | 中文准确率 | 适用场景 |
|---|---|---|---|---|
| tiny | 约 75MB | 极低 | 差 | 快速粗转 |
| base | 约 145MB | 低 | 一般 | 粗听 |
| small | 约 480MB | 低 | 尚可 | 一般录音 |
| medium | 约 1.5GB | 2~4GB | 好 | 会议纪要、日常转写 |
| large-v3 | 约 3GB | 6~8GB | 很好 | 专业场景、口音重 |
| turbo | 约 1.5GB | 4~6GB | 好 | 速度优先的 large 替代 |
音频质量决定准确率上限
再强调一个常被忽视的事实:模型的准确率上限,由音频质量决定。麦克风录制、会议软件录制的音频,只要清晰,medium 就能有 90%+ 的准确率;但嘈杂的现场录音、多人同时说话、电话录音压缩严重的音频,就算上 large-v3 也难尽如人意。对策:
转写前先降噪:用 Audacity 等工具做轻量降噪,或接本地降噪模型(如 DeepFilterNet),对嘈杂录音提升明显;
语音会议软件的音质:腾讯会议、Zoom 录制的音频清晰度高,直接转写效果就好;
音频格式:统一转成 16kHz 单声道 wav 最稳(Whisper 内部会重采样,但提前转好省算力)。
记住「音频质量 > 模型大小」——先把音频处理干净,比盲目上大模型更有效。
五、高级参数:VAD 过滤、分句与输出
1. VAD 自动静音过滤(强烈推荐)
长录音里大量空白、音乐、多人停顿,不处理的话会浪费大量算力,还会出现「明明没人说话却转出一串乱码」。faster-whisper 内置 VAD(Voice Activity Detection):
1 | segments, info = model.transcribe( "meeting.mp3", language="zh", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=500),) |
开启后,只有检测到人声才会转写,速度可能提升 30~50%,准确率也更稳。
VAD 参数里最常用的是 min_silence_duration_ms(静音多久算一个停顿)。默认 500ms 适合普通对话;会议录音停顿较多可以调到 700~1000ms,让段落更完整;反之节奏快的录音调小到 300ms,防止漏断。除了这个,还有 speech_pad_ms(在语音段前后各补多少毫秒),适当调大能避免语音开头/结尾的字被切掉。
如果一段录音的噪声大(空调声、风扇声),VAD 可能把噪声误判成人声。可以先预处理降噪再转写,或者用 vad_parameters=dict(threshold=0.5) 提高检测阈值,让 VAD 更「保守」——宁可少检测、不漏关键内容。
2. 分句时间戳输出
默认按 segment 输出。要逐字/逐词时间戳用于字幕,设置 word_timestamps=True:
1 | segments, info = model.transcribe( "meeting.mp3", language="zh", word_timestamps=True,) |
3. 输出字幕文件
转成 SRT / VTT 字幕只需简单拼接:
1 | def to_srt(segments, path): with open(path, "w", encoding="utf-8") as f: for i, seg in enumerate(segments, 1): start = fmt_time(seg.start) end = fmt_time(seg.end) f.write(f"{i}\n{start} --> {end}\n{seg.text.strip()}\n\n") |
六、批处理:一次转整个文件夹
写个小循环就能批量转,还能自动输出 TXT + SRT 两种格式:
1 | from pathlib import Pathfrom faster_whisper import WhisperModelmodel = WhisperModel("medium", device="cuda", compute_type="int8_float16")for src in Path("audio/").glob("*.mp3"): segments, info = model.transcribe(str(src), language="zh", vad_filter=True) txt = "\n".join(seg.text.strip() for seg in segments) srt = build_srt(segments) # 复用上面的函数 Path(f"out/{src.stem}.txt").write_text(txt, encoding="utf-8") Path(f"out/{src.stem}.srt").write_text(srt, encoding="utf-8") |
注意:segments 是生成器,上面的代码先遍历了一次拿 txt,再遍历 build_srt 时生成器已经耗尽,SRT 会为空——这是新手最容易踩的坑。正确做法是把 segments 先转成列表:
1 | segments = list(model.transcribe(str(src), language="zh", vad_filter=True)[0]) |
生成器转列表后可以重复遍历,输出 TXT 和 SRT 都从同一个列表取,逻辑就对了。
建议先转一个小样(几百 KB)验证模型与参数,再上全量,避免一次跑 10 个小时才发现参数不对。
批处理的常见坑
批量转写有几个坑,提前避开:
并发别开太大:
concurrent.futures.ThreadPoolExecutor并发转写能提速,但每个 worker 都加载一份模型,显存/内存翻倍。2~4 并发是安全值,太大反而因内存换页变慢;单模型复用:
WhisperModel实例全局只有一个,循环里反复WhisperModel()会反复加载模型,慢且浪费——加载一次,循环复用;输出文件名:录音可能重名(
会议.mp3在多个文件夹),输出时带上源目录前缀,避免互相覆盖;异常处理:个别文件损坏会导致整个批量中断。循环里加
try/except,跳过错的文件并记录,结束后统一处理。
1 | for src in Path("audio/").glob("*.mp3"): try: segments, info = model.transcribe(str(src), language="zh", vad_filter=True) except Exception as e: print(f"[FAIL] {src}: {e}") continue # ...写入输出... |
七、实测速度:CPU 与 GPU 对比
同一段 60 分钟中文会议录音,medium 模型,不同设备实测:
| 设备 | 转写耗时 | 加速比(相对 CPU) |
|---|---|---|
| 纯 CPU(i7 主流) | 约 35 分钟 | 1x |
| Apple Silicon(M3 Pro) | 约 9 分钟 | 约 4x |
| RTX 3090 | 约 3 分钟 | 约 12x |
| RTX 4090 | 约 2 分钟 | 约 17x |
速度参考换算
上表的绝对数字随音频内容变化,但可以换算成更直观的「加速比」概念:medium 模型 + GPU 转写,一段录音的实际处理时间是录音时长的 1/20 左右。也就是说,30 分钟录音约 1.5 分钟出稿,60 分钟录音约 3 分钟出稿。日常场景「录音结束前转写就完成了」是常态。CPU 上大约是录音时长的 1/2~1/3,属于「等得起但明显要等」的量级。预算有限但录音量大,一张二手 8GB 显卡就能让转写体验从「等半天」变「秒出」。这也是本地转写比在线工具体验好的一个重要原因——在线工具动辄排队几小时,本地是即时处理。
八、常见问题
| 问题 | 原因 | 对策 |
|---|---|---|
| 全是乱码/空行 | 音频质量差或 VAD 没开 | 开启 vad_filter,适当降噪预处理 |
| 英文识别不准 | 没指定 language | 明确 language=”zh” |
| GPU 用不上 | ctranslate2 版本不对 | 升级 ctranslate2,确认 CUDA |
| 转写太慢 | 模型太大或 CPU 跑 | 换 small/medium,开 int8 |
| 中文专有名词错 | 模型不认识 | 手动校对,或用拼音提示词 |
中英混合录音的处理
中文会议里经常夹着英文术语(API、产品名),Whisper 遇到混合语言时容易「中英混杂」或者英文被强行音译。对策:
明确主语言:
language="zh"保证中文为主体,英文术语按英文识别;initial_prompt 带提示词:Whisper 支持
initial_prompt,塞进你常用的英文术语,识别准确率明显提升:
1 | segments, info = model.transcribe( "meeting.mp3", language="zh", initial_prompt="API, GPU, Kubernetes, GitLab, Qwen, Docker",) |
- 区分说话人:faster-whisper 本身不做说话人分离(diarization),需要分离用
pyannote.audio或接入云端方案。简单的「按段落标注」也可以用 VAD 停顿 + 时间戳人工粗分。
九、进阶玩法
转写只是第一步,把结果用起来才是价值所在:
会议纪要自动化:转写出全文 → 丢给本地 LLM(Ollama)做摘要、提炼待办事项 → 输出结构化纪要。这条「ASR + LLM」流水线全本地,适合经常开会的团队;
字幕工作流:视频转音频 → faster-whisper 出 SRT → 直接烧进视频或供剪辑软件使用。做字幕的可以从「手动打轴」解放出来;
实时转写:faster-whisper 支持流式/分片转写,配合录音工具可以实现「边录边出字」,适合现场速记;
批量建索引:把历史会议录音批量转成文本,进入 RAG 知识库,之后「查历史会议里说过什么」就能直接问答(参考本站 RAG 文章)。
这套玩法把「语音 → 文本 → 知识」串成完整链路,转写工具只是起点。
小结
faster-whisper 用四行代码就能把本地转写跑起来,CTranslate2 引擎让速度是原版 Whisper 的 4 倍。核心经验:medium 模型 + int8 + 开 VAD 是中文转写的黄金组合;GPU 用户别忘 int8_float16;批量任务先跑小样验证再全量;音频质量比模型大小更影响结果;生成器记得先转列表再复用。隐私敏感、量大、要求可控的转写需求,它就是答案。再往下,把转写结果接进本地 LLM 做纪要、进 RAG 建索引,价值还能翻倍。对语音素材多的人来说,这套工具一次配置好,之后每一次转写都是零成本的。从录音到字幕、从会议纪要到播客逐字稿,faster-whisper 都能用一套流程吃下——把本文的实测参数保存下来,就是你的常驻配置,之后无论换机器还是换音频都能直接复用。转写本身是机械劳动,把机械劳动自动化、把精力留给内容,这就是本地语音 AI 的价值所在——一次配置,长期复用。
延伸阅读:




