fast-whisper est une réimplémentation du modèle Whisper d'OpenAI utilisant CTranslate2, qui est un moteur d'inférence rapide pour les modèles Transformer.
Cette implémentation est jusqu'à 4 fois plus rapide que openai/whisper pour la même précision tout en utilisant moins de mémoire. L'efficacité peut être encore améliorée avec une quantification 8 bits sur le CPU et le GPU.
À titre de référence, voici le temps et l'utilisation de la mémoire nécessaires pour transcrire 13 minutes d'audio à l'aide de différentes implémentations :
Mise en œuvre | Précision | Taille du faisceau | Temps | Max. Mémoire graphique | Max. Mémoire du processeur |
---|---|---|---|---|---|
ouvrir/chuchoter | fp16 | 5 | 4min30s | 11 325 Mo | 9439 Mo |
murmurer plus vite | fp16 | 5 | 54s | 4755 Mo | 3244 Mo |
murmurer plus vite | int8 | 5 | 59s | 3091 Mo | 3117 Mo |
Exécuté avec CUDA 11.7.1 sur une NVIDIA Tesla V100S.
Mise en œuvre | Précision | Taille du faisceau | Temps | Max. mémoire |
---|---|---|---|---|
ouvrir/chuchoter | fp32 | 5 | 10m31s | 3101 Mo |
murmure.cpp | fp32 | 5 | 17m42s | 1581 Mo |
murmure.cpp | fp16 | 5 | 12m39s | 873 Mo |
murmurer plus vite | fp32 | 5 | 2m44s | 1675 Mo |
murmurer plus vite | int8 | 5 | 2m04s | 995 Mo |
Exécuté avec 8 threads sur un Intel(R) Xeon(R) Gold 6226R.
Mise en œuvre | Précision | Taille du faisceau | Temps | Gigaspeech WER |
---|---|---|---|---|
distiller-chuchoter/distil-large-v2 | fp16 | 4 | - | 10.36 |
distillation-plus rapide-large-v2 | fp16 | 5 | - | 10.28 |
distiller-chuchoter/distil-medium.fr | fp16 | 4 | - | 11.21 |
quick-distil-medium.fr | fp16 | 5 | - | 11.21 |
Exécuté avec CUDA 11.4 sur un NVIDIA 3090.
Pour distil-whisper/distil-large-v2
, le WER est testé avec un exemple de code du lien. pour faster-distil-whisper
, le WER est testé avec le paramètre :
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" )
L'exécution GPU nécessite l'installation des bibliothèques NVIDIA suivantes :
Remarque : Les dernières versions de ctranslate2
ne prennent en charge que CUDA 12 et cuDNN 9. Pour CUDA 11 et cuDNN 8, la solution de contournement actuelle consiste à passer à la version 3.24.0
de ctranslate2
, pour CUDA 12 et cuDNN 8, à passer à la version 4.4.0
de ctranslate2
, (cela peut être fait avec pip install --force-reinstall ctranslate2==4.4.0
ou en spécifiant la version dans un requirements.txt
).
Il existe plusieurs façons d'installer les bibliothèques NVIDIA mentionnées ci-dessus. La méthode recommandée est décrite dans la documentation officielle de NVIDIA, mais nous suggérons également d'autres méthodes d'installation ci-dessous.
Remarque : Pour toutes ces méthodes ci-dessous, gardez à l'esprit la remarque ci-dessus concernant les versions CUDA. En fonction de votre configuration, vous devrez peut-être installer les versions CUDA 11 des bibliothèques qui correspondent aux bibliothèques CUDA 12 répertoriées dans les instructions ci-dessous.
Les bibliothèques (cuBLAS, cuDNN) sont installées dans ces images Docker officielles NVIDIA CUDA : nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04
.
pip
(Linux uniquement) Sous Linux, ces bibliothèques peuvent être installées avec pip
. Notez que LD_LIBRARY_PATH
doit être défini avant de lancer 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__)) ' `
Le système Whisper-Standalone-Win de Purfview fournit les bibliothèques NVIDIA requises pour Windows et Linux dans une seule archive. Décompressez l'archive et placez les bibliothèques dans un répertoire inclus dans le PATH
.
Le module peut être installé depuis 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 ))
Attention : segments
sont un générateur , donc la transcription ne démarre que lorsque vous parcourez dessus. La transcription peut être exécutée jusqu'à son terme en regroupant les segments dans une liste ou une boucle for
:
segments , _ = model . transcribe ( "audio.mp3" )
segments = list ( segments ) # The transcription will actually run here.
L'extrait de code suivant illustre comment exécuter une transcription par lots sur un exemple de fichier audio. BatchedInferencePipeline.transcribe
est un remplacement instantané 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 ))
Les points de contrôle Distil-Whisper sont compatibles avec le package Faster-Whisper. En particulier, le dernier point de contrôle distill-large-v3 est intrinsèquement conçu pour fonctionner avec l'algorithme de transcription Faster-Whisper. L'extrait de code suivant montre comment exécuter une inférence avec distill-large-v3 sur un fichier audio spécifié :
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 ))
Pour plus d'informations sur le modèle distill-large-v3, reportez-vous à la fiche du modèle d'origine.
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 bibliothèque intègre le modèle Silero VAD pour filtrer des parties de l'audio sans parole :
segments , _ = model . transcribe ( "audio.mp3" , vad_filter = True )
Le comportement par défaut est conservateur et supprime uniquement les silences de plus de 2 secondes. Consultez les paramètres VAD disponibles et les valeurs par défaut dans le code source. Ils peuvent être personnalisés avec l'argument du dictionnaire vad_parameters
:
segments , _ = model . transcribe (
"audio.mp3" ,
vad_filter = True ,
vad_parameters = dict ( min_silence_duration_ms = 500 ),
)
Le filtre Vad est activé par défaut pour la transcription par lots.
Le niveau de journalisation de la bibliothèque peut être configuré comme ceci :
import logging
logging . basicConfig ()
logging . getLogger ( "faster_whisper" ). setLevel ( logging . DEBUG )
Découvrez plus d’options de modèle et de transcription dans l’implémentation de la classe WhisperModel
.
Voici une liste non exhaustive de projets open source utilisant Fast-Whisper. N'hésitez pas à ajouter votre projet à la liste !
faster-whisper
. Il est facilement déployable avec Docker, fonctionne avec les SDK/CLI OpenAI, prend en charge le streaming et la transcription en direct..lrc
dans la langue souhaitée à l'aide d'OpenAI-GPT. Lors du chargement d'un modèle à partir de sa taille tel que WhisperModel("large-v3")
, le modèle CTranslate2 correspondant est automatiquement téléchargé depuis le Hugging Face Hub.
Nous fournissons également un script pour convertir tous les modèles Whisper compatibles avec la bibliothèque Transformers. Il peut s'agir des modèles OpenAI originaux ou de modèles affinés par l'utilisateur.
Par exemple, la commande ci-dessous convertit le modèle Whisper original « large-v3 » et enregistre les poids dans 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
accepte un nom de modèle sur le Hub ou un chemin vers un répertoire de modèle.--copy_files tokenizer.json
n'est pas utilisée, la configuration du tokenizer est automatiquement téléchargée lorsque le modèle est chargé ultérieurement.Les modèles peuvent également être convertis à partir du code. Voir l'API de conversion.
model = faster_whisper . WhisperModel ( "whisper-large-v3-ct2" )
model = faster_whisper . WhisperModel ( "username/whisper-large-v3-ct2" )
Si vous comparez les performances avec d'autres implémentations de Whisper, vous devez vous assurer d'exécuter la comparaison avec des paramètres similaires. En particulier:
model.transcribe
utilise une taille de faisceau par défaut de 1 mais ici nous utilisons une taille de faisceau par défaut de 5.OMP_NUM_THREADS
, qui peut être définie lors de l'exécution de votre script : OMP_NUM_THREADS=4 python3 my_script.py