schneller-Whisper ist eine Neuimplementierung des Whisper-Modells von OpenAI unter Verwendung von CTranslate2, einer schnellen Inferenz-Engine für Transformer-Modelle.
Diese Implementierung ist bis zu viermal schneller als Openai/Whisper bei gleicher Genauigkeit und verbraucht weniger Speicher. Die Effizienz kann durch 8-Bit-Quantisierung sowohl auf CPU als auch auf GPU weiter verbessert werden.
Als Referenz finden Sie hier die Zeit- und Speichernutzung, die erforderlich sind, um 13 Minuten Audio mit verschiedenen Implementierungen zu transkribieren:
Durchführung | Präzision | Strahlgröße | Zeit | Max. GPU-Speicher | Max. CPU-Speicher |
---|---|---|---|---|---|
openai/flüstern | fp16 | 5 | 4:30 Minuten | 11325 MB | 9439 MB |
schneller-flüstern | fp16 | 5 | 54s | 4755 MB | 3244 MB |
schneller-flüstern | int8 | 5 | 59er | 3091 MB | 3117 MB |
Ausgeführt mit CUDA 11.7.1 auf einem NVIDIA Tesla V100S.
Durchführung | Präzision | Strahlgröße | Zeit | Max. Erinnerung |
---|---|---|---|---|
openai/flüstern | fp32 | 5 | 10:31 Minuten | 3101 MB |
whisper.cpp | fp32 | 5 | 17:42 Sekunden | 1581 MB |
whisper.cpp | fp16 | 5 | 12:39 Minuten | 873 MB |
schneller-flüstern | fp32 | 5 | 2:44 Minuten | 1675 MB |
schneller-flüstern | int8 | 5 | 2:04 Minuten | 995 MB |
Ausgeführt mit 8 Threads auf einem Intel(R) Xeon(R) Gold 6226R.
Durchführung | Präzision | Strahlgröße | Zeit | Gigaspeech WER |
---|---|---|---|---|
destillieren-flüstern/distil-groß-v2 | fp16 | 4 | - | 10.36 |
schneller-destillieren-groß-v2 | fp16 | 5 | - | 10.28 |
distil-whisper/distil-medium.en | fp16 | 4 | - | 11.21 |
schneller-distil-medium.en | fp16 | 5 | - | 11.21 |
Ausgeführt mit CUDA 11.4 auf einer NVIDIA 3090.
Für distil-whisper/distil-large-v2
wird der WER mit dem Codebeispiel aus dem Link getestet. für faster-distil-whisper
wird der WER mit folgender Einstellung getestet:
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" )
Für die GPU-Ausführung müssen die folgenden NVIDIA-Bibliotheken installiert sein:
Hinweis : Die neuesten Versionen von ctranslate2
unterstützen nur CUDA 12 und cuDNN 9. Für CUDA 11 und cuDNN 8 ist die aktuelle Problemumgehung ein Downgrade auf die Version 3.24.0
von ctranslate2
, für CUDA 12 und cuDNN 8 ein Downgrade auf die Version 4.4.0
von ctranslate2
, (Dies kann mit pip install --force-reinstall ctranslate2==4.4.0
erfolgen pip install --force-reinstall ctranslate2==4.4.0
oder Angabe der Version in einer requirements.txt
).
Es gibt mehrere Möglichkeiten, die oben genannten NVIDIA-Bibliotheken zu installieren. Die empfohlene Methode ist in der offiziellen NVIDIA-Dokumentation beschrieben, wir schlagen jedoch unten auch andere Installationsmethoden vor.
Hinweis: Beachten Sie für alle unten aufgeführten Methoden den obigen Hinweis zu CUDA-Versionen. Abhängig von Ihrem Setup müssen Sie möglicherweise die CUDA 11- Versionen von Bibliotheken installieren, die den in den folgenden Anweisungen aufgeführten CUDA 12-Bibliotheken entsprechen.
Die Bibliotheken (cuBLAS, cuDNN) sind in diesen offiziellen NVIDIA CUDA Docker-Images installiert: nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04
.
pip
installieren (nur Linux) Unter Linux können diese Bibliotheken mit pip
installiert werden. Beachten Sie, dass LD_LIBRARY_PATH
vor dem Start von Python festgelegt werden muss.
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 von Purfview stellt die erforderlichen NVIDIA-Bibliotheken für Windows und Linux in einem einzigen Archiv bereit. Dekomprimieren Sie das Archiv und platzieren Sie die Bibliotheken in einem Verzeichnis, das im PATH
enthalten ist.
Das Modul kann von PyPI aus installiert werden:
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 ))
Warnung: segments
ist ein Generator , daher startet die Transkription nur, wenn Sie darüber iterieren. Die Transkription kann vollständig ausgeführt werden, indem die Segmente in einer Liste oder einer for
Schleife gesammelt werden:
segments , _ = model . transcribe ( "audio.mp3" )
segments = list ( segments ) # The transcription will actually run here.
Der folgende Codeausschnitt veranschaulicht, wie eine Batch-Transkription für eine Beispiel-Audiodatei ausgeführt wird. BatchedInferencePipeline.transcribe
ist ein Drop-In-Ersatz für 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 ))
Die Distil-Whisper-Kontrollpunkte sind mit dem Faster-Whisper-Paket kompatibel. Insbesondere der neueste Distil-Large-V3-Checkpoint ist von Natur aus für die Zusammenarbeit mit dem Faster-Whisper-Transkriptionsalgorithmus konzipiert. Der folgende Codeausschnitt zeigt, wie man mit distil-large-v3 eine Inferenz für eine bestimmte Audiodatei ausführt:
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 ))
Weitere Informationen zum Modell „distil-large-v3“ finden Sie auf der Originalmodellkarte.
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 ))
Die Bibliothek integriert das Silero VAD-Modell, um Teile des Audios ohne Sprache herauszufiltern:
segments , _ = model . transcribe ( "audio.mp3" , vad_filter = True )
Das Standardverhalten ist konservativ und entfernt nur Stille, die länger als 2 Sekunden dauert. Sehen Sie sich die verfügbaren VAD-Parameter und Standardwerte im Quellcode an. Sie können mit dem Wörterbuchargument vad_parameters
angepasst werden:
segments , _ = model . transcribe (
"audio.mp3" ,
vad_filter = True ,
vad_parameters = dict ( min_silence_duration_ms = 500 ),
)
Der Vad-Filter ist standardmäßig für die Batch-Transkription aktiviert.
Die Protokollierungsstufe der Bibliothek kann wie folgt konfiguriert werden:
import logging
logging . basicConfig ()
logging . getLogger ( "faster_whisper" ). setLevel ( logging . DEBUG )
Weitere Modell- und Transkriptionsoptionen finden Sie in der WhisperModel
-Klassenimplementierung.
Hier ist eine nicht erschöpfende Liste von Open-Source-Projekten, die Faster-Whisper verwenden. Fügen Sie Ihr Projekt gerne zur Liste hinzu!
faster-whisper
verwendet. Es lässt sich leicht mit Docker bereitstellen, funktioniert mit OpenAI SDKs/CLI, unterstützt Streaming und Live-Transkription..lrc
Dateien in der gewünschten Sprache übersetzt/poliert. Beim Laden eines Modells aus seiner Größe wie WhisperModel("large-v3")
wird das entsprechende CTranslate2-Modell automatisch vom Hugging Face Hub heruntergeladen.
Wir stellen auch ein Skript zum Konvertieren aller Whisper-Modelle bereit, die mit der Transformers-Bibliothek kompatibel sind. Dabei kann es sich um die ursprünglichen OpenAI-Modelle oder um vom Benutzer fein abgestimmte Modelle handeln.
Der folgende Befehl konvertiert beispielsweise das ursprüngliche Whisper-Modell „large-v3“ und speichert die Gewichte in 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
akzeptiert einen Modellnamen auf dem Hub oder einen Pfad zu einem Modellverzeichnis.--copy_files tokenizer.json
nicht verwendet wird, wird die Tokenizer-Konfiguration automatisch heruntergeladen, wenn das Modell später geladen wird.Modelle können auch aus dem Code konvertiert werden. Sehen Sie sich die Konvertierungs-API an.
model = faster_whisper . WhisperModel ( "whisper-large-v3-ct2" )
model = faster_whisper . WhisperModel ( "username/whisper-large-v3-ct2" )
Wenn Sie die Leistung mit anderen Whisper-Implementierungen vergleichen, sollten Sie darauf achten, den Vergleich mit ähnlichen Einstellungen durchzuführen. Insbesondere:
model.transcribe
in openai/whisper eine Standardstrahlgröße von 1, aber hier verwenden wir eine Standardstrahlgröße von 5.OMP_NUM_THREADS
, die beim Ausführen Ihres Skripts festgelegt werden kann: OMP_NUM_THREADS=4 python3 my_script.py