15分钟跑通多语种语音转文字:faster-whisper 实战指南
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
为什么选 faster-whisper:4倍速的语音识别方案
用 openai/whisper 在 CPU 上转录 13 分钟音频要 6 分 58 秒,GPU 上 large-v2 模型 fp16 精度也要 2 分 23 秒、占约 4.7GB 显存——批量处理几十小时的会议录音时,这个代价很难接受。
faster-whisper 是基于 CTranslate2 推理引擎的 OpenAI Whisper 重实现,做语音转文字(speech-to-text):同一模型精度下最高 4 倍于原版的速度,内存占用更低,CPU 和 GPU 均可开 INT8 量化进一步压缩。
一句话定位:如果你的场景是录音类音频(会议、课程、客服通话)的批量转录,而不是实时对话,值得直接换用它。
快速上手:安装与第一段可运行代码
安装一行命令,无需系统安装 FFmpeg(音频解码由 PyAV 内置的 FFmpeg 库完成):
pip install faster-whisper # 国内镜像备选 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple faster-whisper仓库自带测试音频,clone 下来即可验证:
git clone https://gitcode.com/GitHub_Trending/fa/faster-whisper cd faster-whisper && ls tests/data # jfk.flac、multilingual.mp3 等样本最小示例(CPU + INT8,GPU 把 device 改为 "cuda"、compute_type 改为 "float16" 即可):
from faster_whisper import WhisperModel # small 模型 + INT8 量化,CPU 即可运行 model = WhisperModel("small", device="cpu", compute_type="int8") segments, info = model.transcribe("tests/data/jfk.flac", beam_size=5) print(f"检测到语言: {info.language} (置信度 {info.language_probability:.2f})") for seg in segments: print(f"[{seg.start:.2f}s -> {seg.end:.2f}s] {seg.text}")跑成功的样子:先打印检测到语言: en (置信度 0.99...),随后按 30 秒窗口逐段输出带起止时间戳的 JFK 演讲文本。
核心功能拆解
量化与批量推理(BatchedInferencePipeline)
CTranslate2 支持int8(CPU)和int8_float16(GPU)量化;BatchedInferencePipeline把音频切成 30 秒片段后并行解码,是 GPU 提速的主要来源。
from faster_whisper import WhisperModel, BatchedInferencePipeline model = WhisperModel("large-v2", device="cuda", compute_type="float16") batched = BatchedInferencePipeline(model) # transcribe 是 WhisperModel.transcribe 的替代品 segments, info = batched.transcribe("audio.mp3", batch_size=8)关键参数batch_size:并行解码的片段数,直接决定 GPU 利用率和显存占用,8~16 是常见区间。
VAD 静音过滤
内置 Silero VAD 先标出有人声的区间,静音部分直接跳过不喂给模型,长音频省时明显。
segments, _ = model.transcribe( "audio.mp3", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=500), # 0.5s 以上静音作为切分点 )注意:批量推理流水线里vad_filter默认开启,而WhisperModel.transcribe需要手动打开。
词级时间戳
word_timestamps=True输出每个单词的起止时间,是做字幕对齐、关键词检索的前置能力。
segments, _ = model.transcribe("audio.mp3", word_timestamps=True) for seg in segments: for word in seg.words: # word 带 start / end / probability print(f"{word.start:.2f}-{word.end:.2f} {word.word}")参数调优策略
| 参数 | 推荐值 | 作用 | 适用场景 |
|---|---|---|---|
| compute_type | CPU 用 int8 / GPU 用 int8_float16 | 量化加速、省显存 | 生产环境默认 |
| beam_size | 5(默认) | 搜索宽度,越大越准越慢 | 通用转录 |
| language | None 自动 / 明确指定 "zh"、"en" | 自动检测只看前 30 秒 | 单语音频建议显式指定 |
| vad_filter | True | 跳过非语音片段 | 长音频、静音多 |
| word_timestamps | True | 词级时间戳 | 字幕生成 |
| batch_size | 8~16 | 批量流水线的并行片段数 | GPU 批量处理 |
最常用组合:CPU 上small+ int8 + vad_filter=True;GPU 上int8_float16+ 批量流水线batch_size=8。
真实场景案例:会议录音批量转文字
场景:一批 20~60 分钟的会议录音,要求在单张消费级 GPU 上当天转完并落盘成带时间戳的文本。
from faster_whisper import WhisperModel, BatchedInferencePipeline model = WhisperModel("large-v2", device="cuda", compute_type="float16") batched = BatchedInferencePipeline(model) segments, info = batched.transcribe("meeting.mp3", beam_size=5) lines = [f"[{s.start:7.2f} -> {s.end:7.2f}] {s.text}" for s in segments] open("meeting.txt", "w").write("\n".join(lines)) # info.duration_after_vad 可用来核对 VAD 过滤比例 print(f"原始 {info.duration:.0f}s,VAD 后 {info.duration_after_vad:.0f}s")预期输出(meeting.txt 节选):
[ 0.42 -> 4.10] 好,我们开始今天的版本评审。 [ 4.35 -> 8.92] 第一部分是排期风险,后端接口比计划晚两天。性能参考(README 官方基准,13 分钟音频):
| 实现 | 耗时 | 资源占用 |
|---|---|---|
| openai/whisper(GPU fp16,large-v2) | 2m23s | 4708MB 显存 |
| faster-whisper(GPU int8 + batch_size=8,large-v2) | 16s | 4500MB 显存 |
| faster-whisper(CPU int8 + batch_size=8,small) | 51s | 3608MB 内存 |
生产环境建议
容器化部署
仓库自带docker/Dockerfile,基于 NVIDIA 官方 CUDA 镜像,cuBLAS 和 cuDNN 已配好,避免本地环境版本错位:
docker build -t faster-whisper -f docker/Dockerfile . docker run --gpus all faster-whisper # 运行 docker/infer.py 示例批量与多卡处理
批量任务统一走BatchedInferencePipeline,batch_size从 8 起步按显存上调。多张 GPU 时WhisperModel(..., device_index=[0, 1])配合多线程调用transcribe,并把num_workers设为大于 1,才能真正并行。
模型选择
纯英语场景选.en系列模型,更小更快;兼顾精度与速度选large-v3-turbo;无 GPU 时用small或medium+ int8。量化策略记住一条:CPU 用int8,GPU 用int8_float16。
常见坑与注意事项
- 调用 transcribe 后没有任何输出:
segments是生成器,不迭代就不推理,也不会报错。解法:segments = list(segments),或放进 for 循环消费。 - GPU 环境报 cuBLAS / cuDNN 加载失败:最新 ctranslate2 只支持 CUDA 12 + cuDNN 9,环境是 CUDA 11 就会报这个错。解法:升级 CUDA 12,或临时降级
pip install --force-reinstall ctranslate2==4.4.0。 - 长音频出现整句重复(幻觉):静音片段被模型"脑补"成重复文本,常见于
vad_filter未开启。解法:vad_filter=True;仍重复时显式指定language,或关闭condition_on_previous_text=False打断失败循环。
写在最后
faster-whisper 适合需要批量转录录音、且要同时控制速度、显存与精度的开发场景;核心优势是精度对齐原版 Whisper、最高 4 倍速,INT8 量化进一步压内存,批量流水线再叠一层并行加速。下一步:先装依赖,用仓库里的tests/data/jfk.flac跑通上面第一节的最小示例,确认环境没问题后再上你自己的音频。
pip install faster-whisper【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考