fast-whisper是使用 CTranslate2 重新实现 OpenAI 的 Whisper 模型,CTranslate2 是 Transformer 模型的快速推理引擎。
此实现速度比 openai/whisper 快 4 倍,但使用的内存更少,且具有相同的精度。通过 CPU 和 GPU 上的 8 位量化,可以进一步提高效率。
作为参考,以下是使用不同实现转录13 分钟音频所需的时间和内存使用情况:
执行 | 精确 | 光束尺寸 | 时间 | 最大限度。 GPU显存 | 最大限度。中央处理器内存 |
---|---|---|---|---|---|
开放/耳语 | FP16 | 5 | 4分30秒 | 11325MB | 9439MB |
更快的耳语 | FP16 | 5 | 54秒 | 4755MB | 3244MB |
更快的耳语 | 整型8 | 5 | 59秒 | 3091MB | 3117MB |
在 NVIDIA Tesla V100S 上使用 CUDA 11.7.1 执行。
执行 | 精确 | 光束尺寸 | 时间 | 最大限度。记忆 |
---|---|---|---|---|
开放/耳语 | FP32 | 5 | 10分31秒 | 3101MB |
耳语.cpp | FP32 | 5 | 17分42秒 | 1581MB |
耳语.cpp | FP16 | 5 | 12分39秒 | 873MB |
更快的耳语 | FP32 | 5 | 2分44秒 | 1675MB |
更快的耳语 | 整型8 | 5 | 2分04秒 | 995MB |
在 Intel(R) Xeon(R) Gold 6226R 上使用 8 个线程执行。
执行 | 精确 | 光束尺寸 | 时间 | 千兆语音WER |
---|---|---|---|---|
distil-whisper/distil-large-v2 | FP16 | 4 | - | 10.36 |
更快-蒸馏-大-v2 | FP16 | 5 | - | 10.28 |
distil-whisper/distil-medium.en | FP16 | 4 | - | 11.21 |
更快的蒸馏介质.en | FP16 | 5 | - | 11.21 |
在 NVIDIA 3090 上使用 CUDA 11.4 执行。
对于distil-whisper/distil-large-v2
,使用链接中的代码示例测试 WER。对于faster-distil-whisper
,WER 通过以下设置进行测试:
from faster_whisper import WhisperModel
model_size = "distil-large-v2"
# model_size = "distil-medium.en"
# Run on GPU with FP16
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
segments , info = model . transcribe ( "audio.mp3" , beam_size = 5 , language = "en" )
GPU 执行需要安装以下 NVIDIA 库:
注意:最新版本的ctranslate2
仅支持 CUDA 12 和 cuDNN 9。对于 CUDA 11 和 cuDNN 8,当前的解决方法是降级到ctranslate2
3.24.0
版本,对于 CUDA 12 和 cuDNN 8,降级到4.4.0
版本ctranslate2
,(这可以通过pip install --force-reinstall ctranslate2==4.4.0
来完成pip install --force-reinstall ctranslate2==4.4.0
或在requirements.txt
中指定版本)。
有多种方法可以安装上面提到的 NVIDIA 库。推荐的方式在 NVIDIA 官方文档中进行了描述,但我们还在下面建议了其他安装方法。
注意:对于下面的所有这些方法,请记住上面有关 CUDA 版本的注释。根据您的设置,您可能需要安装与以下说明中列出的 CUDA 12 库相对应的CUDA 11版本库。
库(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 的 Whisper-standalone-win 在单个存档中提供了 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"
# Run on GPU with FP16
model = WhisperModel ( model_size , device = "cuda" , compute_type = "float16" )
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
# model = WhisperModel(model_size, device="cpu", compute_type="int8")
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
是一个生成器,因此只有在迭代它时才会开始转录。可以通过将片段收集到列表或for
循环中来运行完成:
segments , _ = model . transcribe ( "audio.mp3" )
segments = list ( segments ) # The transcription will actually run here.
以下代码片段说明了如何对示例音频文件运行批量转录。 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
类实现中查看更多模型和转录选项。
以下是使用 Fast-Whisper 的开源项目的非详尽列表。请随意将您的项目添加到列表中!
faster-whisper
OpenAI 兼容服务器。它可以使用 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
接受集线器上的模型名称或模型目录的路径。--copy_files tokenizer.json
,则稍后加载模型时会自动下载 tokenizer 配置。模型也可以从代码转换。请参阅转换 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