faster-whisper 实践:batch_size=8 把 13 分钟音频从 1m03s 压到 17s,CUDA 12/cuDNN 9 配对与 int8 取舍
faster-whisper 用 CTranslate2 重新实现了 OpenAI 的 Whisper。CTranslate2 是一个面向 Transformer 的快速推理引擎。在相同精度下,faster-whisper 比 openai/whisper 快最多 4 倍,内存占用更低;CPU 和 GPU 上都支持 8-bit 量化进一步提速。
仓库:
Benchmark
13 分钟音频,Large-v2,GPU(CUDA 12.4,RTX 3070 Ti 8GB):
| 实现 | 精度 | beam size | 时间 | 显存 |
|---|---|---|---|---|
| openai/whisper | fp16 | 5 | 2m23s | 4708MB |
| whisper.cpp(Flash Attention) | fp16 | 5 | 1m05s | 4127MB |
| transformers(SDPA) | fp16 | 5 | 1m52s | 4960MB |
| faster-whisper | fp16 | 5 | 1m03s | 4525MB |
| faster-whisper(batch_size=8) | fp16 | 5 | 17s | 6090MB |
| faster-whisper | int8 | 5 | 59s | 2926MB |
| faster-whisper(batch_size=8) | int8 | 5 | 16s | 4500MB |
distil-whisper-large-v3,GPU:
- transformers(SDPA),batch=16,fp16:46m12s,WER 14.801
- faster-whisper,batch=16,fp16:25m50s,WER 13.527
transformers 在 batch>1 时会 OOM。
Small 模型,CPU(8 线程,i7-12700K):
| 实现 | 精度 | 时间 | 内存 |
|---|---|---|---|
| openai/whisper | fp32 | 6m58s | 2335MB |
| whisper.cpp | fp32 | 2m05s | 1049MB |
| whisper.cpp OpenVINO | fp32 | 1m45s | 1642MB |
| faster-whisper | fp32 | 2m37s | 2257MB |
| faster-whisper(batch_size=8) | fp32 | 1m06s | 4230MB |
| faster-whisper | int8 | 1m42s | 1477MB |
| faster-whisper(batch_size=8) | int8 | 51s | 3608MB |
环境要求
Python 3.9+。
和 openai-whisper 不同,不需要安装 FFmpeg:音频由 PyAV 解码,PyAV 自带 FFmpeg 库。
GPU 需要 CUDA 12 版本的 cuBLAS,以及 cuDNN 9。
这里有个版本配对坑:最新版 ctranslate2 只支持 CUDA 12 + cuDNN 9,版本对不上就得降级 ctranslate2。
- CUDA 11 + cuDNN 8 → 把 ctranslate2 降到 3.24.0
- CUDA 12 + cuDNN 8 → 降到 4.4.0:
pip install --force-reinstall ctranslate2==4.4.0
Docker 镜像:nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04。
Linux 上用 pip 装 CUDA 库:
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*
然后用 python -c 打印 nvidia.cublas.lib 和 nvidia.cudnn.lib 所在目录,拼出 LD_LIBRARY_PATH。这个变量必须在启动 Python 之前设置好。
Windows/Linux 也可以直接取 Purfview 的 whisper-standalone-win releases/tag/libs 里的库文件,放进 PATH。
安装
pip install faster-whisper
使用
from faster_whisper import WhisperModel
model_size = "large-v3"
# GPU 用 float16,也可以 int8_float16;CPU 用 int8
model = WhisperModel(model_size, device="cuda", compute_type="float16")
segments, info = model.transcribe("audio.mp3", beam_size=5)
print("Detected language '%s' with probability %f" % (info.language, info.language_probability))
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
注意:segments 是生成器,转写不会在 transcribe() 调用时启动,只有开始迭代才真正执行。要跑完整段音频,用 list(segments) 或 for 循环走完。
批量转写
from faster_whisper import WhisperModel, BatchedInferencePipeline
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
batched_model = BatchedInferencePipeline(model=model)
segments, info = batched_model.transcribe("audio.mp3", batch_size=16)
BatchedInferencePipeline 是 drop-in replacement,可以直接替换原来的 model.transcribe() 调用。
Distil-Whisper
distil-large-v3 与 faster-whisper 的算法兼容,就是为它设计的。设置 model_size="distil-large-v3"、language="en"、condition_on_previous_text=False。
词级时间戳
传 word_timestamps=True,结果在 segment.words 里。
VAD 过滤
内置 Silero VAD,vad_filter=True 开启。默认策略偏保守,会移除超过 2 秒的静音。要调阈值用 vad_parameters=dict(min_silence_duration_ms=500)。批量转写时 VAD 默认开启。
日志
import logging
logging.getLogger("faster_whisper").setLevel(logging.DEBUG)
模型转换
WhisperModel("large-v3") 会自动从 Hugging Face Hub(huggingface.co/Systran)下载 CTranslate2 格式的模型。要转换其他 Transformers 兼容的 Whisper 模型:
ct2-transformers-converter --model openai/whisper-large-v3 --output_dir whisper-large-v3-ct2 \
--copy_files tokenizer.json preprocessor_config.json --quantization float16
转换完成后,从本地目录加载或推到 Hub 再按模型名加载都可以。
性能对比的注意事项
比较不同实现时:
- 用相同的 beam size。openai/whisper 默认 beam 1,faster-whisper 默认 beam 5。
- 确认 WER 接近,再比速度。
- CPU 上设置相同的
OMP_NUM_THREADS。
项目信息与社区实现
仓库:
围绕它的一些社区项目:
- speaches:OpenAI 兼容 server
- WhisperX:说话人分离 + 词级时间戳
- whisper-ctranslate2:CLI
- whisper-diarization
- whisper-standalone-win
- Open-Lyrics
- wscribe
- aTrain
- Whisper-Streaming
- WhisperLive
- Whisper-FastAPI