faster-whisper:更快的 Whisper 转写引擎

faster-whisper 基于 CTranslate2 重新实现 Whisper 推理,适合在本地或服务器上做更快、更省显存的语音转文字。

faster-whisper 是 SYSTRAN 维护的 Whisper 推理实现。它用 CTranslate2 作为后端,在保持 Whisper 使用方式接近的同时,把推理速度、显存占用和部署灵活性做得更适合工程场景。

如果你已经用过 openai/whisper,可以把 faster-whisper 理解成一个更偏生产环境的替代方案:接口仍然围绕模型加载、音频转写、分段结果展开,但底层执行效率更高,也更容易按 CPU、GPU、量化和批处理策略做取舍。

它解决什么问题

Whisper 的效果很好,但原版实现直接部署时经常会遇到几个问题:

  1. 长音频转写耗时明显。
  2. GPU 显存占用偏高。
  3. CPU 环境可用,但速度不一定理想。
  4. 批量处理大量音视频时,吞吐不容易压上去。

faster-whisper 主要就是围绕这些问题做优化。项目 README 中说明,在相同精度下,它可以比 openai/whisper 快到 4 倍,并且内存占用更低;如果使用 8-bit 量化,速度还可以进一步提升。

安装

常规 Python 环境里可以直接安装:

1
pip install faster-whisper

如果要使用 GPU,需要确认本机 CUDA、cuDNN 与 CTranslate2 版本匹配。这里最容易踩坑的是显卡驱动和 CUDA 运行时版本不一致:代码本身可能没问题,但运行时会在加载模型或首次推理时失败。

基本用法

最小示例很直接:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from faster_whisper import WhisperModel

model_size = "large-v3"

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))

这里有几个关键参数:

参数 作用
model_size 选择 Whisper 模型规格,例如 smallmediumlarge-v3
device 推理设备,常见值是 cudacpu
compute_type 计算精度,例如 float16int8_float16int8
beam_size 解码搜索宽度,通常越大越稳,但速度越慢

如果你的目标是本地快速转写,通常可以先从 mediumlarge-v3 开始测试。显存紧张时,再考虑量化。

CPU 和 GPU 怎么选

有 NVIDIA GPU 时,优先用:

1
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

显存不够时可以换成:

1
model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")

没有 GPU 时,可以在 CPU 上跑:

1
model = WhisperModel("small", device="cpu", compute_type="int8")

CPU 模式更适合轻量任务、后台低频任务,或者没有显卡的服务器。要处理大量长音频,GPU 仍然更合适。

批量转写

faster-whisper 也提供批量转写能力。批处理适合大量短音频,或者需要提升 GPU 吞吐的场景:

1
2
3
4
5
6
7
8
from faster_whisper import WhisperModel, BatchedInferencePipeline

model = WhisperModel("turbo", device="cuda", compute_type="float16")
batched_model = BatchedInferencePipeline(model=model)
segments, info = batched_model.transcribe("audio.mp3", batch_size=16)

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

batch_size 不是越大越好。它会提高吞吐,但也会增加显存压力。实际部署时建议从 4、8、16 这样的值逐步测试,找到机器能稳定承受的点。

VAD 和词级时间戳

语音转文字经常会遇到长静音、背景噪声和字幕对齐问题。faster-whisper 内置了一些实用参数,可以直接在转写时启用。

启用 VAD:

1
segments, info = model.transcribe("audio.mp3", vad_filter=True)

获取词级时间戳:

1
2
3
4
5
segments, info = model.transcribe("audio.mp3", word_timestamps=True)

for segment in segments:
    for word in segment.words:
        print("[%.2fs -> %.2fs] %s" % (word.start, word.end, word.word))

VAD 适合处理会议录音、播客、直播回放这类包含长静音的音频。词级时间戳则适合生成字幕、做逐字稿校对,或者后续接入播放器高亮。

模型怎么选

模型选择主要看三件事:准确率、速度、机器资源。

场景 建议
快速测试 smallmedium
中文内容质量优先 large-v3
GPU 显存紧张 int8_float16 或更小模型
CPU 跑后台任务 小模型加 int8
批量短音频 尝试 BatchedInferencePipeline

如果是中文语音,建议优先测试 large-v3。如果机器压力太大,再降模型规格或使用量化。不要一开始就只看速度,转写质量下降后,人工校对时间可能会把省下来的推理时间抵消掉。

适合的使用场景

faster-whisper 很适合这些任务:

  1. 视频字幕生成。
  2. 播客、会议、课程录音转文字。
  3. Bilibili、YouTube 等视频的本地转写流程。
  4. 批量音频归档和检索。
  5. 把语音内容接入 RAG、知识库或搜索系统。

它不直接解决说话人分离、摘要、章节切分这些上层问题,但可以作为稳定的转写层。后面可以再接 pyannote 做说话人分离,接 LLM 做摘要和结构化整理。

部署建议

实际使用时,可以按这个顺序调试:

  1. 先用一段 1 到 3 分钟的音频确认环境能跑通。
  2. 再换成目标语言和目标音质的样本测试准确率。
  3. 确认显存占用,再决定是否启用量化。
  4. 长音频先切分,避免一次性任务失败后重跑成本过高。
  5. 输出结果同时保存 TXT 和 SRT,后续校对更方便。

如果是服务器任务,最好把模型加载放在服务启动阶段,不要每次请求都重新加载模型。模型加载本身会消耗时间,频繁加载也容易让显存管理变得不稳定。

小结

faster-whisper 的价值在于把 Whisper 变成更适合长期使用的转写组件。它不是换一个模型,而是换一套更高效的推理后端和工程接口。

对于个人工作流,可以用它快速把视频、会议、课程音频变成文本。对于服务端任务,可以通过 GPU、量化、批处理和 VAD 做性能调优。只要机器环境配置正确,它会比原版 Whisper 更适合承担稳定、批量的语音转文字工作。

项目地址:https://github.com/SYSTRAN/faster-whisper

记录并分享
使用 Hugo 构建
主题 StackJimmy 设计