
Faster-Whisper-Leitfaden: Schnellere Sprach-zu-Text-Transkription mit CTranslate2
Eric King
Author
Faster-Whisper-Leitfaden: Schnellere Sprach-zu-Text-Transkription mit CTranslate2
Faster-whisper ist eine leistungsstarke Neuimplementierung von OpenAIs Whisper-Modell mit CTranslate2, einer schnellen Transformer-Inferenz-Engine. Sie bietet 2–4× schnellere Transkription bei ähnlicher Genauigkeit und eignet sich ideal für Produktionsumgebungen und Stapelverarbeitung.
Dieser umfassende Leitfaden behandelt alles Wichtige zu faster-whisper: Installation, Nutzungsbeispiele, Leistungsoptimierung und wann Sie es dem Standard-OpenAI-Whisper vorziehen sollten.
Was ist Faster-Whisper?
Faster-whisper ist eine optimierte Implementierung von OpenAI Whisper, die CTranslate2 für schnellere Inferenz nutzt. Sie behält dieselbe Genauigkeit wie das Original bei, verbessert jedoch die Geschwindigkeit deutlich und reduziert den Speicherbedarf.
Hauptmerkmale
- 2–4× schnellere Inferenz im Vergleich zu OpenAI Whisper
- Geringerer Speicherbedarf dank Unterstützung für Quantisierung
- Gleiche Genauigkeit wie die Original-Whisper-Modelle
- GPU- und CPU-Unterstützung mit optimierten Backends
- Stapelverarbeitung für mehrere Dateien
- Wortgenaue Zeitstempel
- Quantisierungsoptionen (FP32, FP16, INT8, INT8_FLOAT16)
- Sprachaktivitätserkennung (VAD) zur Filterung
Funktionsweise
Faster-whisper konvertiert Whisper-Modelle in das CTranslate2-Format, das für die Inferenz optimierten C++-Code nutzt. Das ermöglicht:
- Schnellere Matrixoperationen mit optimierten BLAS-Bibliotheken
- Besseres Speichermanagement mit geringerem Overhead
- Quantisierung für geringeren Speicherverbrauch
- Stapelverarbeitung zur Durchsatzoptimierung
Faster-Whisper vs. OpenAI Whisper
Leistungsvergleich
| Merkmal | OpenAI Whisper | Faster-Whisper |
|---|---|---|
| Geschwindigkeit | Referenz | 2–4× schneller |
| Speichernutzung | Höher | Geringer (mit Quantisierung) |
| Genauigkeit | Hoch | Gleich (identische Modelle) |
| GPU-Unterstützung | Ja | Ja (optimiert) |
| CPU-Unterstützung | Ja | Ja (optimiert) |
| Quantisierung | Begrenzt | Vollständig (INT8, FP16) |
| Stapelverarbeitung | Manuell | Integriert |
| Installation | Einfach | Einfach (inkl. CTranslate2) |
Wann Faster-Whisper nutzen
Faster-whisper wählen, wenn:
- Sie schnellere Transkription für Produktionslast benötigen
- Sie mehrere Dateien im Batch verarbeiten
- Sie ressourcenbeschränkte Systeme einsetzen (INT8 nutzen)
- Sie Echtzeit- oder nahezu Echtzeit-Anwendungen bauen
- Sie weniger Arbeitsspeicher für den Einsatz brauchen
Bei OpenAI Whisper bleiben, wenn:
- Sie maximale Kompatibilität mit bestehendem Code brauchen
- Sie feinabgestimmte Modelle nutzen (faster-whisper erfordert Konvertierung)
- Sie eine einfachere API bevorzugen (faster-whisper ist jedoch ähnlich)
- Sie experimentelle Funktionen nutzen, die zuerst in OpenAI Whisper erscheinen
Installation
Voraussetzungen
- Python 3.9+ (erforderlich)
- FFmpeg (optional – faster-whisper nutzt PyAV, für manche Formate kann FFmpeg nötig sein)
- NVIDIA-GPU (optional, für GPU-Beschleunigung)
Basisinstallation
Installieren Sie faster-whisper mit pip:
pip install faster-whisper
Dabei werden automatisch installiert:
- Paket
faster-whisper ctranslate2(CTranslate2-Inferenz-Engine)pyav(Audiodekodierung, ersetzt die FFmpeg-Abhängigkeit)
GPU-Installation (NVIDIA CUDA)
Für GPU-Beschleunigung benötigen Sie CUDA-Bibliotheken:
CUDA 12 (empfohlen):
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*
Legen Sie den Bibliothekspfad fest:
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__))')
CUDA 11 (Legacy):
Bei CUDA 11 verwenden Sie eine ältere CTranslate2-Version:
pip install ctranslate2==3.24.0 faster-whisper
Installation prüfen
from faster_whisper import WhisperModel
# Test basic import
print("Faster-whisper installed successfully!")
Grundlegende Nutzung
Einfache Transkription
from faster_whisper import WhisperModel
# Load model (automatically downloads if not present)
model = WhisperModel("base", device="cpu", compute_type="int8")
# Transcribe audio
segments, info = model.transcribe("audio.mp3")
# Print detected language
print(f"Detected language: {info.language} (probability: {info.language_probability:.2f})")
# Print transcription
for segment in segments:
print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")
Vollständigen Text erhalten
from faster_whisper import WhisperModel
model = WhisperModel("base")
segments, info = model.transcribe("audio.mp3")
# Collect all text
full_text = " ".join([segment.text for segment in segments])
print(full_text)
Mit Wort-Zeitstempeln
from faster_whisper import WhisperModel
model = WhisperModel("base", device="cpu", compute_type="int8")
segments, info = model.transcribe(
"audio.mp3",
word_timestamps=True,
beam_size=5
)
for segment in segments:
print(f"[{segment.start:.2f}s - {segment.end:.2f}s] {segment.text}")
# Word-level timestamps
for word in segment.words:
print(f" {word.word} [{word.start:.2f}s - {word.end:.2f}s]")
Gerät- und Compute-Typ-Optionen
Geräteoptionen
device="cpu"– CPU-Inferenz (funktioniert überall)device="cuda"– GPU-Inferenz (NVIDIA-GPU und CUDA erforderlich)
Compute-Typen
Wählen Sie basierend auf Ihrer Hardware und dem Kompromiss zwischen Geschwindigkeit und Genauigkeit:
| Compute-Typ | Geschwindigkeit | Speicher | Genauigkeit | Anwendungsfall |
|---|---|---|---|---|
int8 | Am schnellsten | Am geringsten | Etwas geringer | CPU, ressourcenbeschränkt |
int8_float16 | Sehr schnell | Gering | Hoch | GPU mit begrenztem VRAM |
float16 | Schnell | Mittel | Hoch | GPU (empfohlen) |
float32 | Am langsamsten | Am höchsten | Am höchsten | Maximale Genauigkeit |
Beispiele nach Hardware
CPU (Intel/AMD):
# Best for CPU: INT8
model = WhisperModel("base", device="cpu", compute_type="int8")
GPU (NVIDIA):
# Best for GPU: FP16
model = WhisperModel("large-v2", device="cuda", compute_type="float16")
GPU mit begrenztem VRAM:
# Use INT8_FLOAT16 for large models
model = WhisperModel("large-v2", device="cuda", compute_type="int8_float16")
Maximale Genauigkeit:
# Use FP32 (slower but most accurate)
model = WhisperModel("large-v2", device="cuda", compute_type="float32")
Erweiterte Funktionen
1. Stapelverarbeitung
Verarbeiten Sie mehrere Audiodateien effizient:
from faster_whisper import WhisperModel
from pathlib import Path
model = WhisperModel("base", device="cuda", compute_type="float16")
audio_files = ["audio1.mp3", "audio2.mp3", "audio3.mp3"]
for audio_file in audio_files:
print(f"Transcribing: {audio_file}")
segments, info = model.transcribe(audio_file)
text = " ".join([seg.text for seg in segments])
print(f"Result: {text[:100]}...")
print()
2. Sprachaktivitätserkennung (VAD)
Filtern Sie Stille und nicht-sprachliche Segmente heraus:
from faster_whisper import WhisperModel
model = WhisperModel("base")
segments, info = model.transcribe(
"audio.mp3",
vad_filter=True, # Enable VAD filtering
vad_parameters=dict(
min_silence_duration_ms=500, # Minimum silence duration
threshold=0.5 # VAD threshold
)
)
for segment in segments:
print(f"[{segment.start:.2f}s] {segment.text}")
3. Sprachangabe
Geben Sie die Sprache an, um Genauigkeit und Geschwindigkeit zu verbessern:
from faster_whisper import WhisperModel
model = WhisperModel("base")
# Specify language (faster and more accurate)
segments, info = model.transcribe(
"audio.mp3",
language="en" # English
)
# Or let it auto-detect
segments, info = model.transcribe("audio.mp3") # Auto-detect
print(f"Detected: {info.language}")
4. Beam-Größe und weitere Parameter
from faster_whisper import WhisperModel
model = WhisperModel("base")
segments, info = model.transcribe(
"audio.mp3",
beam_size=5, # Higher = more accurate but slower (default: 5)
best_of=5, # Number of candidates to consider
temperature=0.0, # Lower = more deterministic
condition_on_previous_text=True, # Use context from previous segments
initial_prompt="This is a technical meeting about AI and machine learning."
)
5. Eigene Modellpfade
Lokale Modelle oder konvertierte Custom-Modelle verwenden:
from faster_whisper import WhisperModel
# Use local model directory
model = WhisperModel(
"base",
device="cpu",
compute_type="int8",
download_root="./models" # Custom download directory
)
# Or specify full path to converted model
model = WhisperModel(
"/path/to/converted/model",
device="cuda",
compute_type="float16"
)
Leistungs-Benchmarks
GPU-Leistung (NVIDIA RTX 3070 Ti)
Transkription von ~13 Minuten Audio:
| Konfiguration | Zeit | VRAM-Nutzung | Speedup |
|---|---|---|---|
| OpenAI Whisper (FP16, beam=5) | ~2m 23s | ~4708 MB | Referenz |
| Faster-whisper (FP16, beam=5) | ~1m 03s | ~4525 MB | 2,3× schneller |
| Faster-whisper (INT8, beam=5) | ~59s | ~2926 MB | 2,4× schneller |
| Faster-whisper (FP16, batch=8) | ~17s | ~6090 MB | 8,4× schneller |
| Faster-whisper (INT8, batch=8) | ~16s | ~4500 MB | 8,9× schneller |
CPU-Leistung (Intel Core i7-12700K)
| Konfiguration | Zeit | RAM-Nutzung | Speedup |
|---|---|---|---|
| OpenAI Whisper (FP32, beam=5) | ~6m 58s | ~2335 MB | Referenz |
| Faster-whisper (FP32, beam=5) | ~2m 37s | ~2257 MB | 2,7× schneller |
| Faster-whisper (INT8, beam=5) | ~1m 42s | ~1477 MB | 4,1× schneller |
| Faster-whisper (FP32, batch=8) | ~1m 06s | ~4230 MB | 6,3× schneller |
| Faster-whisper (INT8, batch=8) | ~51s | ~3608 MB | 8,2× schneller |
Wichtige Erkenntnisse
- Stapelverarbeitung liefert den größten Speedup (8×+ auf der GPU)
- INT8-Quantisierung reduziert den Speicher um ~40 % bei minimaler Genauigkeitseinbuße
- GPU-Beschleunigung ist für große Modelle und Stapelverarbeitung wesentlich
- CPU mit INT8 ist für kleinere Modelle und Einzeldateien praktikabel
Vollständiges Beispiel: produktionsreife Transkription
from faster_whisper import WhisperModel
from pathlib import Path
import json
from datetime import datetime
class TranscriptionService:
"""Production-ready transcription service using faster-whisper."""
def __init__(self, model_size="base", device="cpu", compute_type="int8"):
"""Initialize the transcription service."""
print(f"Loading model: {model_size} on {device} ({compute_type})")
self.model = WhisperModel(
model_size,
device=device,
compute_type=compute_type
)
print("Model loaded successfully!")
def transcribe_file(self, audio_path, output_format="txt", **kwargs):
"""
Transcribe an audio file.
Args:
audio_path: Path to audio file
output_format: Output format (txt, json, srt, vtt)
**kwargs: Additional transcription parameters
"""
audio_path = Path(audio_path)
if not audio_path.exists():
raise FileNotFoundError(f"Audio file not found: {audio_path}")
print(f"Transcribing: {audio_path.name}")
# Transcribe
segments, info = self.model.transcribe(
str(audio_path),
word_timestamps=True,
**kwargs
)
# Collect results
result = {
"file": str(audio_path),
"language": info.language,
"language_probability": info.language_probability,
"duration": info.duration,
"segments": []
}
full_text_parts = []
for segment in segments:
segment_data = {
"start": segment.start,
"end": segment.end,
"text": segment.text,
"words": [
{
"word": word.word,
"start": word.start,
"end": word.end,
"probability": word.probability
}
for word in segment.words
]
}
result["segments"].append(segment_data)
full_text_parts.append(segment.text)
result["text"] = " ".join(full_text_parts)
# Save based on format
output_path = audio_path.parent / f"{audio_path.stem}_transcript"
if output_format == "txt":
self._save_txt(result, output_path.with_suffix(".txt"))
elif output_format == "json":
self._save_json(result, output_path.with_suffix(".json"))
elif output_format == "srt":
self._save_srt(result, output_path.with_suffix(".srt"))
elif output_format == "vtt":
self._save_vtt(result, output_path.with_suffix(".vtt"))
print(f"✓ Transcription saved: {output_path}.{output_format}")
return result
def _save_txt(self, result, path):
"""Save as plain text."""
with open(path, "w", encoding="utf-8") as f:
f.write(result["text"])
def _save_json(self, result, path):
"""Save as JSON."""
with open(path, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
def _save_srt(self, result, path):
"""Save as SRT subtitles."""
with open(path, "w", encoding="utf-8") as f:
for i, seg in enumerate(result["segments"], start=1):
start = self._format_srt_time(seg["start"])
end = self._format_srt_time(seg["end"])
f.write(f"{i}\n{start} --> {end}\n{seg['text']}\n\n")
def _save_vtt(self, result, path):
"""Save as WebVTT."""
with open(path, "w", encoding="utf-8") as f:
f.write("WEBVTT\n\n")
for seg in result["segments"]:
start = self._format_vtt_time(seg["start"])
end = self._format_vtt_time(seg["end"])
f.write(f"{start} --> {end}\n{seg['text']}\n\n")
def _format_srt_time(self, seconds):
"""Format time for SRT."""
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
secs = int(seconds % 60)
millis = int((seconds % 1) * 1000)
return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"
def _format_vtt_time(self, seconds):
"""Format time for VTT."""
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
secs = int(seconds % 60)
millis = int((seconds % 1) * 1000)
return f"{hours:02d}:{minutes:02d}:{secs:02d}.{millis:03d}"
# Usage
if __name__ == "__main__":
# Initialize service
service = TranscriptionService(
model_size="base",
device="cpu", # Change to "cuda" for GPU
compute_type="int8" # Use "float16" for GPU
)
# Transcribe file
result = service.transcribe_file(
"meeting.mp3",
output_format="json",
beam_size=5,
language="en"
)
print(f"\nLanguage: {result['language']}")
print(f"Duration: {result['duration']:.2f}s")
print(f"Text: {result['text'][:200]}...")
Bewährte Praktiken
1. Passende Modellgröße wählen
# For speed (CPU)
model = WhisperModel("tiny", device="cpu", compute_type="int8")
# For balance
model = WhisperModel("base", device="cpu", compute_type="int8")
# For accuracy (GPU recommended)
model = WhisperModel("large-v2", device="cuda", compute_type="float16")
2. Hardware optimieren
Nur CPU:
model = WhisperModel("base", device="cpu", compute_type="int8")
GPU mit ausreichend VRAM:
model = WhisperModel("large-v2", device="cuda", compute_type="float16")
GPU mit begrenztem VRAM:
model = WhisperModel("medium", device="cuda", compute_type="int8_float16")
3. Stapelverarbeitung für mehrere Dateien
# Process multiple files efficiently
audio_files = ["file1.mp3", "file2.mp3", "file3.mp3"]
model = WhisperModel("base", device="cuda", compute_type="float16")
for audio_file in audio_files:
segments, info = model.transcribe(audio_file)
# Process results...
4. VAD bei verrauschtem Audio aktivieren
segments, info = model.transcribe(
"noisy_audio.mp3",
vad_filter=True,
vad_parameters=dict(
min_silence_duration_ms=1000,
threshold=0.5
)
)
5. Sprache angeben, wenn bekannt
# Faster and more accurate when language is known
segments, info = model.transcribe(
"audio.mp3",
language="en" # Specify instead of auto-detect
)
6. Modellinstanzen wiederverwenden
# Load model once, reuse for multiple files
model = WhisperModel("base")
# Process multiple files with same model
for audio_file in audio_files:
segments, info = model.transcribe(audio_file)
Migration von OpenAI Whisper
Code-Vergleich
OpenAI Whisper:
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(result["text"])
Faster-whisper:
from faster_whisper import WhisperModel
model = WhisperModel("base", device="cpu", compute_type="int8")
segments, info = model.transcribe("audio.mp3")
text = " ".join([seg.text for seg in segments])
print(text)
Wichtige Unterschiede
- Modell laden:
WhisperModel()stattwhisper.load_model() - Rückgabeformat: Tupel
(segments, info)statt Dictionary - Segmente: Iterator von Segmentobjekten statt Liste
- Device/Compute-Typ:
deviceundcompute_typemüssen angegeben werden - Textzugriff: Segmente müssen für den Volltext verkettet werden
Hilfsfunktion für die Migration
def convert_to_whisper_format(segments, info):
"""Convert faster-whisper output to OpenAI Whisper format."""
return {
"text": " ".join([seg.text for seg in segments]),
"language": info.language,
"segments": [
{
"id": i,
"start": seg.start,
"end": seg.end,
"text": seg.text,
"words": [
{
"word": word.word,
"start": word.start,
"end": word.end
}
for word in seg.words
] if hasattr(seg, 'words') else []
}
for i, seg in enumerate(segments)
]
}
# Usage
segments, info = model.transcribe("audio.mp3", word_timestamps=True)
result = convert_to_whisper_format(segments, info)
# Now compatible with OpenAI Whisper format
Fehlerbehebung
Problem 1: CUDA – nicht genug Speicher
Problem: Die GPU geht bei großen Modellen dem Speicher aus.
Lösungen:
# Use smaller model
model = WhisperModel("base", device="cuda", compute_type="float16")
# Or use INT8 quantization
model = WhisperModel("large-v2", device="cuda", compute_type="int8_float16")
# Or use CPU
model = WhisperModel("large-v2", device="cpu", compute_type="int8")
Problem 2: Langsame CPU-Leistung
Problem: Die Transkription auf der CPU ist langsam.
Lösungen:
# Use INT8 quantization
model = WhisperModel("base", device="cpu", compute_type="int8")
# Use smaller model
model = WhisperModel("tiny", device="cpu", compute_type="int8")
# Reduce beam size
segments, info = model.transcribe("audio.mp3", beam_size=1)
Problem 3: CUDA-Bibliotheken nicht gefunden
Problem:
RuntimeError: CUDA runtime not foundLösung:
# Install CUDA libraries
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*
# Set library path
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__))')
Problem 4: Modell-Download schlägt fehl
Problem: Der Modell-Download läuft ins Timeout oder schlägt fehl.
Lösung:
# Specify download directory
model = WhisperModel(
"base",
download_root="./models", # Custom directory
local_files_only=False
)
# Or download manually from Hugging Face
# Then use local path
model = WhisperModel("/path/to/local/model")
Wann Faster-Whisper einsetzen
Faster-whisper nutzen, wenn:
✅ Produktionsumgebungen Geschwindigkeit erfordern
✅ Stapelverarbeitung mehrerer Dateien
✅ Ressourcenbeschränkte Umgebungen (INT8 nutzen)
✅ Echtzeit- oder nahezu Echtzeit-Anwendungen
✅ GPU-Beschleunigung verfügbar ist
✅ Geringere Speichernutzung wichtig ist
✅ Stapelverarbeitung mehrerer Dateien
✅ Ressourcenbeschränkte Umgebungen (INT8 nutzen)
✅ Echtzeit- oder nahezu Echtzeit-Anwendungen
✅ GPU-Beschleunigung verfügbar ist
✅ Geringere Speichernutzung wichtig ist
OpenAI Whisper nutzen, wenn:
✅ Maximale Kompatibilität mit bestehendem Code nötig ist
✅ Feinabgestimmte Modelle (einfachere Integration)
✅ Einfachere API bevorzugt wird
✅ Experimentelle Funktionen zuerst in OpenAI Whisper verfügbar sind
✅ Lernen/Entwicklung (mehr Dokumentation/Beispiele)
✅ Feinabgestimmte Modelle (einfachere Integration)
✅ Einfachere API bevorzugt wird
✅ Experimentelle Funktionen zuerst in OpenAI Whisper verfügbar sind
✅ Lernen/Entwicklung (mehr Dokumentation/Beispiele)
Fazit
Faster-whisper bietet deutliche Leistungssteigerungen gegenüber OpenAI Whisper bei gleichbleibender Genauigkeit. Mit passender Konfiguration erreichen Sie 2–4× schnellere Verarbeitung auf der CPU und bis zu 8× auf der GPU mit Stapelverarbeitung.
Kernaussagen:
- INT8 für CPU und ressourcenbeschränkte Systeme
- FP16 für GPU mit ausreichend VRAM
- Stapelverarbeitung für mehrere Dateien aktivieren
- Sprache angeben, wenn bekannt, für bessere Leistung
- Modellinstanzen wiederverwenden für mehrere Transkriptionen
Weitere Informationen zur Whisper-Transkription finden Sie in unseren Leitfäden Whisper Python-Beispiel, Tipps zur Whisper-Genauigkeit und Whisper-Transkriptformatierung.
Sie suchen eine professionelle Sprach-zu-Text-Lösung? Besuchen Sie SayToWords und entdecken Sie unsere KI-Transkriptionsplattform mit optimierter Leistung und mehreren Ausgabeformaten.
