OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  Faster Whisper — 基于 CTranslate2 的高性能 Whisper 实现

Faster Whisper — 基于 CTranslate2 的高性能 Whisper 实现

 
  nine ·  2026-07-18 11:00:18 · 24 次点击  · 0 条评论  

CI PyPI version

Faster Whisper 基于 CTranslate2 的快速转录

faster-whisper 是 OpenAI Whisper 模型的一个重实现版本,底层基于 CTranslate2——一个专为 Transformer 模型设计的高性能推理引擎。

在保持相同精度的前提下,该实现相比 openai/whisper 速度提升最高可达 4 倍,同时占用更少内存。通过在 CPU 和 GPU 上使用 8 位量化技术,运行效率还能进一步提高。

性能对比

Whisper

以下为不同实现转录 13 分钟音频 所需的时间与内存资源对比:

GPU 上的 Large-v2 模型

实现 精度 束搜索大小 耗时 显存占用
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

GPU 上的 distil-whisper-large-v3 模型

实现 精度 束搜索大小 耗时 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 上执行。

CPU 上的 Small 模型

实现 精度 束搜索大小 耗时 内存占用
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 线程执行。

系统要求

  • Python 3.9 或更高版本

与 openai-whisper 不同,系统上 不需要 安装 FFmpeg。音频解码由 Python 库 PyAV 完成,该库已在其包中包含了 FFmpeg 库。

GPU

GPU 执行需要安装以下 NVIDIA 库:

注意ctranslate2 的最新版本仅支持 CUDA 12 和 cuDNN 9。对于 CUDA 11 和 cuDNN 8,暂时可通过降级 ctranslate23.24.0 版本解决;对于 CUDA 12 和 cuDNN 8,降级到 4.4.0 版本(可通过 pip install --force-reinstall ctranslate2==4.4.0 或在 requirements.txt 中指定版本实现)。

有多种方式安装上述 NVIDIA 库。推荐的方式参见官方 NVIDIA 文档,但下文也提供了一些其他安装方法。

其他安装方法(点击展开) **注意:** 以下所有方法均需注意上述关于 CUDA 版本的说明。根据你的具体环境,你可能需要安装对应 CUDA 11 版本的库,而非下文中列出的 CUDA 12 库。 #### 使用 Docker 这些库(cuBLAS、cuDNN)已预装在 NVIDIA 官方 CUDA Docker 镜像中:`nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04`。 #### 通过 `pip` 安装(仅限 Linux) 在 Linux 上,可通过 `pip` 安装这些库。注意在启动 Python 前需要设置 `LD_LIBRARY_PATH`。
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"

使用方法

Faster-whisper

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

Faster Distil-Whisper

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

VAD 过滤器

该库集成了 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 的开源项目(非详尽列表)。欢迎将你的项目添加进来!

  • speaches:一个兼容 OpenAI 的服务器,使用 faster-whisper。可通过 Docker 轻松部署,兼容 OpenAI SDK/CLI,支持流式传输和实时转录。
  • WhisperX:一个获奖的 Python 库,提供说话人日志功能,并使用 wav2vec2 对齐实现精确的词级时间戳。
  • whisper-ctranslate2:基于 faster-whisper 的命令行客户端,兼容 openai/whisper 的原始客户端。
  • whisper-diarize:基于 faster-whisper 和 NVIDIA NeMo 的说话人日志工具。
  • whisper-standalone-win:为 Windows、Linux 和 macOS 提供的 faster-whisper 独立 CLI 可执行文件。
  • asr-sd-pipeline:使用 AzureML 流水线实现的可扩展、模块化、端到端多说话人语音转文本解决方案。
  • Open-Lyrics:一个 Python 库,使用 faster-whisper 转录语音文件,并使用 OpenAI-GPT 将结果文本翻译/精炼成所需语言的 .lrc 歌词文件。
  • wscribe:一个灵活的转录生成工具,支持 faster-whisper,可导出词级转录文本,并可配合 wscribe-editor 进行编辑。
  • aTrain:由格拉茨大学 BANDAS-Center 开发的 faster-whisper 图形用户界面实现,适用于 Windows(Windows 商店应用)和 Linux 下的转录和说话人日志。
  • Whisper-Streaming:为离线 Whisper 类语音转文本模型(推荐使用 faster-whisper 作为后端)实现实时模式。其流式处理策略可根据实际源复杂度自适应延迟,展示了业界先进水平。
  • WhisperLive:OpenAI Whisper 的近乎实时实现,使用 faster-whisper 作为后端进行实时音频转录。
  • Faster-Whisper-Transcriber:一款简单可靠的语音转录器,提供友好的用户界面。
  • Open-dubbing:一个 AI 配音系统,利用机器学习模型自动将音频对话翻译并同步到不同语言。
  • Whisper-FastAPI:一个非常简单的脚本,提供兼容 OpenAI、HomeAssistant 和 Konele(Android 语音输入)格式的 API 后端。

模型转换

当通过模型大小(如 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 文档。

加载已转换的模型

  1. 直接从本地目录加载模型:
model = faster_whisper.WhisperModel("whisper-large-v3-ct2")
  1. 将你的模型上传到 Hugging Face Hub 并通过名称加载:
model = faster_whisper.WhisperModel("username/whisper-large-v3-ct2")

与其他实现的性能比较

如果你正在与其他 Whisper 实现的性能进行比较,请确保在类似的设置下进行对比。尤其要注意:

  • 验证是否使用了相同的转录选项,特别是相同的束搜索大小。例如在 openai/whisper 中,model.transcribe 默认束搜索大小为 1,而我们这里默认使用 5。
  • 转录速度与转录文本中的单词数量密切相关,因此请确保其他实现与本实现具有相近的 WER(词错误率)。
  • 在 CPU 上运行时,务必设置相同的线程数。许多框架会读取环境变量 OMP_NUM_THREADS,可以在运行脚本时设置它:
OMP_NUM_THREADS=4 python3 my_script.py

  1. transformers 在 batch size > 1 时会内存溢出(OOM)。 

24 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私 ·  条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 23 ms
Developed with Cursor