编程 faster-whisper 实践:batch_size=8 把 13 分钟音频从 1m03s 压到 17s,CUDA 12/cuDNN 9 配对与 int8 取舍

2026-10-02 00:04:05

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/whisperfp1652m23s4708MB
whisper.cpp(Flash Attention)fp1651m05s4127MB
transformers(SDPA)fp1651m52s4960MB
faster-whisperfp1651m03s4525MB
faster-whisper(batch_size=8)fp16517s6090MB
faster-whisperint8559s2926MB
faster-whisper(batch_size=8)int8516s4500MB

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/whisperfp326m58s2335MB
whisper.cppfp322m05s1049MB
whisper.cpp OpenVINOfp321m45s1642MB
faster-whisperfp322m37s2257MB
faster-whisper(batch_size=8)fp321m06s4230MB
faster-whisperint81m42s1477MB
faster-whisper(batch_size=8)int851s3608MB

环境要求

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

推荐文章

程序员茄子在线接单