faster-whisper 是 OpenAI Whisper 模型的一个重实现版本,底层基于 CTranslate2——一个专为 Transformer 模型设计的高性能推理引擎。
在保持相同精度的前提下,该实现相比 openai/whisper 速度提升最高可达 4 倍,同时占用更少内存。通过在 CPU 和 GPU 上使用 8 位量化技术,运行效率还能进一步提高。
以下为不同实现转录 13 分钟音频 所需的时间与内存资源对比:
| 实现 | 精度 | 束搜索大小 | 耗时 | 显存占用 |
|---|---|---|---|---|
| openai/whisper | fp16 | 5 | 2分23秒 | 4708MB |
| whisper.cpp (Flash Attention) | fp16 | 5 | 1分05秒 | 4127MB |
| transformers (SDPA)1 | fp16 | 5 | 1分52秒 | 4960MB |
| faster-whisper | fp16 | 5 | 1分03秒 | 4525MB |
faster-whisper (batch_size=8) |
fp16 | 5 | 17秒 | 6090MB |
| faster-whisper | int8 | 5 | 59秒 | 2926MB |
faster-whisper (batch_size=8) |
int8 | 5 | 16秒 | 4500MB |
| 实现 | 精度 | 束搜索大小 | 耗时 | YT Commons WER |
|---|---|---|---|---|
transformers (SDPA) (batch_size=16) |
fp16 | 5 | 46分12秒 | 14.801 |
faster-whisper (batch_size=16) |
fp16 | 5 | 25分50秒 | 13.527 |
GPU 基准测试在搭载 CUDA 12.4 的 NVIDIA RTX 3070 Ti 8GB 上执行。
| 实现 | 精度 | 束搜索大小 | 耗时 | 内存占用 |
|---|---|---|---|---|
| openai/whisper | fp32 | 5 | 6分58秒 | 2335MB |
| whisper.cpp | fp32 | 5 | 2分05秒 | 1049MB |
| whisper.cpp (OpenVINO) | fp32 | 5 | 1分45秒 | 1642MB |
| faster-whisper | fp32 | 5 | 2分37秒 | 2257MB |
faster-whisper (batch_size=8) |
fp32 | 5 | 1分06秒 | 4230MB |
| faster-whisper | int8 | 5 | 1分42秒 | 1477MB |
faster-whisper (batch_size=8) |
int8 | 5 | 51秒 | 3608MB |
在 Intel Core i7-12700K 上使用 8 线程执行。
与 openai-whisper 不同,系统上 不需要 安装 FFmpeg。音频解码由 Python 库 PyAV 完成,该库已在其包中包含了 FFmpeg 库。
GPU 执行需要安装以下 NVIDIA 库:
注意:ctranslate2 的最新版本仅支持 CUDA 12 和 cuDNN 9。对于 CUDA 11 和 cuDNN 8,暂时可通过降级 ctranslate2 到 3.24.0 版本解决;对于 CUDA 12 和 cuDNN 8,降级到 4.4.0 版本(可通过 pip install --force-reinstall ctranslate2==4.4.0 或在 requirements.txt 中指定版本实现)。
有多种方式安装上述 NVIDIA 库。推荐的方式参见官方 NVIDIA 文档,但下文也提供了一些其他安装方法。
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*
export LD_LIBRARY_PATH=`python3 -c 'import os; import nvidia.cublas.lib; import nvidia.cudnn.lib; print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + os.path.dirname(nvidia.cudnn.lib.__file__))'`
#### 从 Purfview 的仓库下载库文件(Windows 和 Linux)
Purfview 的 [whisper-standalone-win](https://github.com/Purfview/whisper-standalone-win) 项目在 [一个压缩包](https://github.com/Purfview/whisper-standalone-win/releases/tag/libs) 中提供了适用于 Windows 和 Linux 的所需 NVIDIA 库。解压该压缩包,并将库文件放置于 `PATH` 环境变量所包含的目录中。
可以通过 PyPI 安装该模块:
pip install faster-whisper
pip install --force-reinstall "faster-whisper @ https://github.com/SYSTRAN/faster-whisper/archive/refs/heads/master.tar.gz"
### 安装特定提交
pip install --force-reinstall "faster-whisper @ https://github.com/SYSTRAN/faster-whisper/archive/a4f1cc8f11433e454c3934442b5e1a4ed5e865c3.tar.gz"
from faster_whisper import WhisperModel
model_size = "large-v3"
# 在 GPU 上使用 FP16 运行
model = WhisperModel(model_size, device="cuda", compute_type="float16")
# 或在 GPU 上使用 INT8 运行
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# 或在 CPU 上使用 INT8 运行
# model = WhisperModel(model_size, device="cpu", compute_type="int8")
segments, info = model.transcribe("audio.mp3", beam_size=5)
print("检测到语言 '%s',概率为 %f" % (info.language, info.language_probability))
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
警告: segments 是一个 生成器,因此只有在遍历它时,转录才开始执行。可以通过将分段收集到列表或 for 循环中来运行完整的转录:
segments, _ = model.transcribe("audio.mp3")
segments = list(segments) # 转录实际在此处开始。
以下代码示例演示了如何在示例音频文件上运行批量转录。BatchedInferencePipeline.transcribe 是 WhisperModel.transcribe 的即插即用替代品。
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))
Distil-Whisper 的检查点与 Faster-Whisper 包兼容。特别是最新的 distil-large-v3 检查点,其设计初衷就是与 Faster-Whisper 转录算法协同工作。以下代码演示了如何使用 distil-large-v3 在指定音频文件上运行推理:
from faster_whisper import WhisperModel
model_size = "distil-large-v3"
model = WhisperModel(model_size, device="cuda", compute_type="float16")
segments, info = model.transcribe("audio.mp3", beam_size=5, language="en", condition_on_previous_text=False)
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
有关 distil-large-v3 模型的更多信息,请参考原始 模型卡片。
segments, _ = 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))
该库集成了 Silero VAD 模型,用于滤除音频中无人声的部分:
segments, _ = model.transcribe("audio.mp3", vad_filter=True)
默认行为较为保守,仅移除长于 2 秒的静音。有关可用的 VAD 参数及其默认值,请参阅 源代码。可通过字典参数 vad_parameters 自定义这些设置:
segments, _ = model.transcribe(
"audio.mp3",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=500),
)
在批量转录中,VAD 过滤器默认启用。
库的日志级别可以按如下方式配置:
import logging
logging.basicConfig()
logging.getLogger("faster_whisper").setLevel(logging.DEBUG)
更多模型和转录选项,请参阅 WhisperModel 类的实现。
以下是使用 faster-whisper 的开源项目(非详尽列表)。欢迎将你的项目添加进来!
faster-whisper。可通过 Docker 轻松部署,兼容 OpenAI SDK/CLI,支持流式传输和实时转录。.lrc 歌词文件。当通过模型大小(如 WhisperModel("large-v3"))加载模型时,相应的 CTranslate2 模型会自动从 Hugging Face Hub 下载。
我们也提供了一个脚本,用于转换任何与 Transformers 库兼容的 Whisper 模型。这些模型可以是原始的 OpenAI 模型,也可以是用户微调后的模型。
例如,以下命令会转换原始的 "large-v3" Whisper 模型 并以 FP16 格式保存权重:
pip install transformers[torch]>=4.23
ct2-transformers-converter --model openai/whisper-large-v3 --output_dir whisper-large-v3-ct2
--copy_files tokenizer.json preprocessor_config.json --quantization float16
--model 选项接受 Hub 上的模型名称或本地模型目录的路径。--copy_files tokenizer.json 选项,则在后续加载模型时会自动下载分词器的配置。模型也可以通过代码进行转换。请参阅 转换 API 文档。
model = faster_whisper.WhisperModel("whisper-large-v3-ct2")
model = faster_whisper.WhisperModel("username/whisper-large-v3-ct2")
如果你正在与其他 Whisper 实现的性能进行比较,请确保在类似的设置下进行对比。尤其要注意:
model.transcribe 默认束搜索大小为 1,而我们这里默认使用 5。OMP_NUM_THREADS,可以在运行脚本时设置它:OMP_NUM_THREADS=4 python3 my_script.py
transformers 在 batch size > 1 时会内存溢出(OOM)。 ↩