Fast-Whisper es una reimplementación del modelo Whisper de OpenAI utilizando CTranslate2, que es un motor de inferencia rápido para modelos Transformer.
Esta implementación es hasta 4 veces más rápida que openai/whisper para lograr la misma precisión y utilizar menos memoria. La eficiencia se puede mejorar aún más con la cuantificación de 8 bits tanto en la CPU como en la GPU.
Como referencia, aquí está el tiempo y el uso de memoria necesarios para transcribir 13 minutos de audio usando diferentes implementaciones:
Implementación | Precisión | Tamaño del haz | Tiempo | Máx. memoria GPU | Máx. memoria de la CPU |
---|---|---|---|---|---|
openai/susurro | fp16 | 5 | 4m30s | 11325MB | 9439MB |
susurro más rápido | fp16 | 5 | 54s | 4755MB | 3244MB |
susurro más rápido | int8 | 5 | 59s | 3091MB | 3117MB |
Ejecutado con CUDA 11.7.1 en una NVIDIA Tesla V100S.
Implementación | Precisión | Tamaño del haz | Tiempo | Máx. memoria |
---|---|---|---|---|
openai/susurro | fp32 | 5 | 10m31s | 3101MB |
susurro.cpp | fp32 | 5 | 17m42s | 1581MB |
susurro.cpp | fp16 | 5 | 12m39s | 873MB |
susurro más rápido | fp32 | 5 | 2m44s | 1675MB |
susurro más rápido | int8 | 5 | 2m04s | 995MB |
Ejecutado con 8 subprocesos en un Intel(R) Xeon(R) Gold 6226R.
Implementación | Precisión | Tamaño del haz | Tiempo | Gigaspeech WER |
---|---|---|---|---|
distil-whisper/distil-grande-v2 | fp16 | 4 | - | 10.36 |
destilar-más-rápido-grande-v2 | fp16 | 5 | - | 10.28 |
distil-whisper/distil-medium.en | fp16 | 4 | - | 11.21 |
fast-distil-medium.en | fp16 | 5 | - | 11.21 |
Ejecutado con CUDA 11.4 en una NVIDIA 3090.
Para distil-whisper/distil-large-v2
, el WER se prueba con un ejemplo de código del enlace. para faster-distil-whisper
, el WER se prueba con la configuración:
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" )
La ejecución de GPU requiere la instalación de las siguientes bibliotecas NVIDIA:
Nota : Las últimas versiones de ctranslate2
solo admiten CUDA 12 y cuDNN 9. Para CUDA 11 y cuDNN 8, la solución alternativa actual es degradar a la versión 3.24.0
de ctranslate2
, para CUDA 12 y cuDNN 8, degradar a la versión 4.4.0
de ctranslate2
, (Esto se puede hacer con pip install --force-reinstall ctranslate2==4.4.0
o especificando la versión en requirements.txt
).
Hay varias formas de instalar las bibliotecas de NVIDIA mencionadas anteriormente. La forma recomendada se describe en la documentación oficial de NVIDIA, pero también sugerimos otros métodos de instalación a continuación.
Nota: Para todos estos métodos a continuación, tenga en cuenta la nota anterior sobre las versiones de CUDA. Dependiendo de su configuración, es posible que necesite instalar las versiones de bibliotecas CUDA 11 que corresponden a las bibliotecas CUDA 12 enumeradas en las instrucciones a continuación.
Las bibliotecas (cuBLAS, cuDNN) están instaladas en estas imágenes oficiales de NVIDIA CUDA Docker: nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04
.
pip
(solo Linux) En Linux, estas bibliotecas se pueden instalar con pip
. Tenga en cuenta que LD_LIBRARY_PATH
debe configurarse antes de iniciar Python.
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__)) ' `
Whisper-standalone-win de Purfview proporciona las bibliotecas NVIDIA necesarias para Windows y Linux en un solo archivo. Descomprima el archivo y coloque las bibliotecas en un directorio incluido en la PATH
.
El módulo se puede instalar desde 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 ))
Advertencia: segments
son un generador , por lo que la transcripción solo comienza cuando lo itera. La transcripción se puede ejecutar hasta su finalización reuniendo los segmentos en una lista o un bucle for
:
segments , _ = model . transcribe ( "audio.mp3" )
segments = list ( segments ) # The transcription will actually run here.
El siguiente fragmento de código ilustra cómo ejecutar la transcripción por lotes en un archivo de audio de ejemplo. BatchedInferencePipeline.transcribe
es un reemplazo directo de 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 ))
Los puntos de control Distil-Whisper son compatibles con el paquete Faster-Whisper. En particular, el último punto de control distil-large-v3 está intrínsecamente diseñado para funcionar con el algoritmo de transcripción Faster-Whisper. El siguiente fragmento de código demuestra cómo ejecutar la inferencia con distil-large-v3 en un archivo de audio específico:
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 ))
Para obtener más información sobre el modelo distil-large-v3, consulte la tarjeta del modelo original.
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 ))
La biblioteca integra el modelo Silero VAD para filtrar partes del audio sin voz:
segments , _ = model . transcribe ( "audio.mp3" , vad_filter = True )
El comportamiento predeterminado es conservador y solo elimina el silencio de más de 2 segundos. Vea los parámetros VAD disponibles y los valores predeterminados en el código fuente. Se pueden personalizar con el argumento del diccionario vad_parameters
:
segments , _ = model . transcribe (
"audio.mp3" ,
vad_filter = True ,
vad_parameters = dict ( min_silence_duration_ms = 500 ),
)
El filtro Vad está habilitado de forma predeterminada para la transcripción por lotes.
El nivel de registro de la biblioteca se puede configurar así:
import logging
logging . basicConfig ()
logging . getLogger ( "faster_whisper" ). setLevel ( logging . DEBUG )
Vea más opciones de modelo y transcripción en la implementación de la clase WhisperModel
.
Aquí hay una lista no exhaustiva de proyectos de código abierto que utilizan Fast-Whisper. ¡Siéntete libre de agregar tu proyecto a la lista!
faster-whisper
. Se puede implementar fácilmente con Docker, funciona con OpenAI SDK/CLI, admite transmisión y transcripción en vivo..lrc
en el idioma deseado usando OpenAI-GPT. Al cargar un modelo de su tamaño, como WhisperModel("large-v3")
, el modelo CTranslate2 correspondiente se descarga automáticamente desde Hugging Face Hub.
También proporcionamos un script para convertir cualquier modelo de Whisper compatible con la biblioteca Transformers. Podrían ser los modelos originales de OpenAI o modelos ajustados por el usuario.
Por ejemplo, el siguiente comando convierte el modelo Whisper original "large-v3" y guarda los pesos en 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
acepta un nombre de modelo en el Hub o una ruta a un directorio de modelo.--copy_files tokenizer.json
, la configuración del tokenizer se descarga automáticamente cuando el modelo se carga más tarde.Los modelos también se pueden convertir desde el código. Consulte la API de conversión.
model = faster_whisper . WhisperModel ( "whisper-large-v3-ct2" )
model = faster_whisper . WhisperModel ( "username/whisper-large-v3-ct2" )
Si está comparando el rendimiento con otras implementaciones de Whisper, debe asegurarse de ejecutar la comparación con configuraciones similares. En particular:
model.transcribe
usa un tamaño de haz predeterminado de 1, pero aquí usamos un tamaño de haz predeterminado de 5.OMP_NUM_THREADS
, que se puede configurar al ejecutar el script: OMP_NUM_THREADS=4 python3 my_script.py