
Faster-Whisper-gids: snellere spraak-naar-tekst met CTranslate2
Eric King
Author
Faster-Whisper-gids: snellere spraak-naar-tekst met CTranslate2
Faster-whisper is een hoogwaardige herimplementatie van het Whisper-model van OpenAI met CTranslate2, een snelle transformer-inferentie-engine. Het levert 2-4× snellere transcriptie met vergelijkbare nauwkeurigheid en is ideaal voor productie en batchverwerking.
Deze gids behandelt alles rond faster-whisper: installatie, voorbeelden, prestatieoptimalisatie en wanneer u het boven de standaard OpenAI Whisper verkiest.
Wat is Faster-whisper?
Faster-whisper is een geoptimaliseerde implementatie van OpenAI Whisper die CTranslate2 gebruikt voor snellere inferentie. Het behoudt dezelfde nauwkeurigheid als het origineel, verbetert de snelheid sterk en verlaagt het geheugengebruik.
Belangrijkste kenmerken
- 2-4× snellere inferentie dan OpenAI Whisper
- Lager geheugengebruik dankzij kwantisatie-ondersteuning
- Dezelfde nauwkeurigheid als de originele Whisper-modellen
- GPU- en CPU-ondersteuning met geoptimaliseerde backends
- Batchverwerking voor meerdere bestanden
- Woordniveau-tijdstempels
- Kwantisatie-opties (FP32, FP16, INT8, INT8_FLOAT16)
- Spraakactiviteitsdetectie (VAD) om te filteren
Hoe het werkt
Faster-whisper zet Whisper-modellen om naar het CTranslate2-formaat, met geoptimaliseerde C++-code voor inferentie. Dat levert:
- Snellere matrixbewerkingen met geoptimaliseerde BLAS-bibliotheken
- Beter geheugenbeheer met minder overhead
- Kwantisatie voor lager geheugengebruik
- Batchverwerking voor hogere doorvoer
Faster-whisper vs OpenAI Whisper
Prestatievergelijking
| Kenmerk | OpenAI Whisper | Faster-whisper |
|---|---|---|
| Snelheid | Referentie | 2-4× sneller |
| Geheugen | Hoger | Lager (met kwantisatie) |
| Nauwkeurigheid | Hoog | Gelijk (identieke modellen) |
| GPU-ondersteuning | Ja | Ja (geoptimaliseerd) |
| CPU-ondersteuning | Ja | Ja (geoptimaliseerd) |
| Kwantisatie | Beperkt | Volledig (INT8, FP16) |
| Batchverwerking | Handmatig | Ingebouwd |
| Installatie | Eenvoudig | Eenvoudig (inclusief CTranslate2) |
Wanneer Faster-whisper gebruiken
Kies faster-whisper wanneer:
- U snellere transcriptie nodig heeft voor productieworkloads
- U meerdere bestanden in batch verwerkt
- U resourcebeperkte systemen gebruikt (gebruik INT8)
- U realtime of bijna-realtime toepassingen bouwt
- U lager geheugengebruik bij deployment nodig heeft
Blijf bij OpenAI Whisper wanneer:
- U maximale compatibiliteit met bestaande code nodig heeft
- U fine-getunede modellen gebruikt (faster-whisper vereist conversie)
- U de eenvoudigere API prefereert (faster-whisper is vergelijkbaar)
- U experimentele functies gebruikt die eerst in OpenAI Whisper verschijnen
Installatie
Vereisten
- Python 3.9+ (vereist)
- FFmpeg (optioneel: faster-whisper gebruikt PyAV, FFmpeg kan nodig zijn voor sommige formaten)
- NVIDIA-GPU (optioneel, voor GPU-acceleratie)
Basisinstallatie
Installeer faster-whisper met pip:
pip install faster-whisper
Dit installeert automatisch:
- het pakket
faster-whisper ctranslate2(CTranslate2-inferentie-engine)pyav(audiodecodering, vervangt FFmpeg-afhankelijkheid)
GPU-installatie (NVIDIA CUDA)
Voor GPU-acceleratie zijn CUDA-bibliotheken nodig:
CUDA 12 (aanbevolen):
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*
Stel het bibliotheekpad in:
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):
Met CUDA 11 gebruikt u een oudere CTranslate2-versie:
pip install ctranslate2==3.24.0 faster-whisper
Installatie controleren
from faster_whisper import WhisperModel
# Test basic import
print("Faster-whisper installed successfully!")
Basisgebruik
Eenvoudige transcriptie
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}")
Volledige tekst ophalen
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)
Met woordtijdstempels
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]")
Apparaat- en compute-type-opties
Apparaatopties
device="cpu"— CPU-inferentie (overal bruikbaar)device="cuda"— GPU-inferentie (NVIDIA-GPU en CUDA vereist)
Compute-types
Kies op basis van hardware en de afweging snelheid/nauwkeurigheid:
| Compute-type | Snelheid | Geheugen | Nauwkeurigheid | Gebruik |
|---|---|---|---|---|
int8 | Snelst | Laagst | Iets lager | CPU, beperkte resources |
int8_float16 | Zeer snel | Laag | Hoog | GPU met beperkte VRAM |
float16 | Snel | Gemiddeld | Hoog | GPU (aanbevolen) |
float32 | Traagst | Hoogst | Hoogst | Maximale nauwkeurigheid |
Voorbeelden per 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 met beperkte VRAM:
# Use INT8_FLOAT16 for large models
model = WhisperModel("large-v2", device="cuda", compute_type="int8_float16")
Maximale nauwkeurigheid:
# Use FP32 (slower but most accurate)
model = WhisperModel("large-v2", device="cuda", compute_type="float32")
Geavanceerde functies
1. Batchverwerking
Verwerk meerdere audiobestanden efficiënt:
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. Spraakactiviteitsdetectie (VAD)
Filter stilte en niet-spraaksegmenten:
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. Taal specificeren
Geef de taal op voor betere nauwkeurigheid en snelheid:
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 size en andere parameters
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. Aangepaste modelpaden
Gebruik lokale of geconverteerde modellen:
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"
)
Prestatiebenchmarks
GPU-prestaties (NVIDIA RTX 3070 Ti)
Transcriptie van ~13 minuten audio:
| Configuratie | Tijd | VRAM-gebruik | Versnelling |
|---|---|---|---|
| OpenAI Whisper (FP16, beam=5) | ~2m 23s | ~4708 MB | Referentie |
| Faster-whisper (FP16, beam=5) | ~1m 03s | ~4525 MB | 2.3× sneller |
| Faster-whisper (INT8, beam=5) | ~59s | ~2926 MB | 2.4× sneller |
| Faster-whisper (FP16, batch=8) | ~17s | ~6090 MB | 8.4× sneller |
| Faster-whisper (INT8, batch=8) | ~16s | ~4500 MB | 8.9× sneller |
CPU-prestaties (Intel Core i7-12700K)
| Configuratie | Tijd | RAM-gebruik | Versnelling |
|---|---|---|---|
| OpenAI Whisper (FP32, beam=5) | ~6m 58s | ~2335 MB | Referentie |
| Faster-whisper (FP32, beam=5) | ~2m 37s | ~2257 MB | 2.7× sneller |
| Faster-whisper (INT8, beam=5) | ~1m 42s | ~1477 MB | 4.1× sneller |
| Faster-whisper (FP32, batch=8) | ~1m 06s | ~4230 MB | 6.3× sneller |
| Faster-whisper (INT8, batch=8) | ~51s | ~3608 MB | 8.2× sneller |
Belangrijkste inzichten
- Batchverwerking levert de grootste versnelling (8×+ op GPU)
- INT8-kwantisatie verlaagt geheugen ~40% met minimale nauwkeurigheidsverlies
- GPU-acceleratie is essentieel voor grote modellen en batches
- CPU met INT8 is haalbaar voor kleinere modellen en één bestand
Volledig voorbeeld: productieklare transcriptie
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]}...")
Best practices
1. Juiste modelgrootte kiezen
# 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. Optimaliseren voor uw hardware
Alleen CPU:
model = WhisperModel("base", device="cpu", compute_type="int8")
GPU met voldoende VRAM:
model = WhisperModel("large-v2", device="cuda", compute_type="float16")
GPU met beperkte VRAM:
model = WhisperModel("medium", device="cuda", compute_type="int8_float16")
3. Batchverwerking voor meerdere bestanden
# 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 inschakelen bij rumoerige audio
segments, info = model.transcribe(
"noisy_audio.mp3",
vad_filter=True,
vad_parameters=dict(
min_silence_duration_ms=1000,
threshold=0.5
)
)
5. Taal opgeven indien bekend
# Faster and more accurate when language is known
segments, info = model.transcribe(
"audio.mp3",
language="en" # Specify instead of auto-detect
)
6. Modelinstanties hergebruiken
# 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)
Migratie vanaf OpenAI Whisper
Codevergelijking
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)
Belangrijkste verschillen
- Model laden:
WhisperModel()in plaats vanwhisper.load_model() - Retourformaat: tuple
(segments, info)in plaats van dict - Segmenten: iterator van segmentobjecten in plaats van lijst
- Device/compute-type:
deviceencompute_typezijn verplicht - Teksttoegang: segmenten samenvoegen voor volledige tekst
Hulpfunctie voor migratie
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
Probleemoplossing
Probleem 1: CUDA geen geheugen
Probleem: GPU raakt zonder geheugen bij grote modellen.
Oplossingen:
# 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")
Probleem 2: trage CPU-prestaties
Probleem: transcriptie is traag op CPU.
Oplossingen:
# 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)
Probleem 3: CUDA-bibliotheken niet gevonden
Probleem:
RuntimeError: CUDA runtime not foundOplossing:
# 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__))')
Probleem 4: modeldownload mislukt
Probleem: modeldownload time-out of mislukking.
Oplossing:
# 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")
Wanneer Faster-whisper gebruiken
Gebruik Faster-whisper wanneer:
✅ Productie-implementaties snelheid vereisen
✅ Batchverwerking van meerdere bestanden
✅ Resourcebeperkte omgevingen (gebruik INT8)
✅ Realtime of bijna-realtime toepassingen
✅ GPU-acceleratie beschikbaar is
✅ Lager geheugengebruik belangrijk is
✅ Batchverwerking van meerdere bestanden
✅ Resourcebeperkte omgevingen (gebruik INT8)
✅ Realtime of bijna-realtime toepassingen
✅ GPU-acceleratie beschikbaar is
✅ Lager geheugengebruik belangrijk is
Gebruik OpenAI Whisper wanneer:
✅ Maximale compatibiliteit met bestaande code nodig is
✅ Fine-getunede modellen (eenvoudigere integratie)
✅ Eenvoudigere API de voorkeur heeft
✅ Experimentele functies eerst in OpenAI Whisper
✅ Leren/ontwikkeling (meer documentatie/voorbeelden)
✅ Fine-getunede modellen (eenvoudigere integratie)
✅ Eenvoudigere API de voorkeur heeft
✅ Experimentele functies eerst in OpenAI Whisper
✅ Leren/ontwikkeling (meer documentatie/voorbeelden)
Conclusie
Faster-whisper levert aanzienlijke prestatiewinst ten opzichte van OpenAI Whisper met dezelfde nauwkeurigheid. Met de juiste configuratie haalt u 2-4× snelheidswinst op CPU en tot 8× op GPU met batchverwerking.
Kernpunten:
- Gebruik INT8 voor CPU en beperkte systemen
- Gebruik FP16 voor GPU met voldoende VRAM
- Schakel batchverwerking in voor meerdere bestanden
- Geef de taal op indien bekend voor betere prestaties
- Hergebruik modelinstanties voor meerdere transcripties
Meer over Whisper-transcriptie vindt u in onze gidsen Whisper Python-voorbeeld, Tips voor Whisper-nauwkeurigheid en Whisper-transcriptopmaak.
Zoekt u een professionele spraak-naar-tekstoplossing? Bezoek SayToWords voor ons AI-transcriptieplatform met geoptimaliseerde prestaties en meerdere uitvoerformaten.
