Faster-Whisper-gids: snellere spraak-naar-tekst met CTranslate2

Faster-Whisper-gids: snellere spraak-naar-tekst met CTranslate2


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

KenmerkOpenAI WhisperFaster-whisper
SnelheidReferentie2-4× sneller
GeheugenHogerLager (met kwantisatie)
NauwkeurigheidHoogGelijk (identieke modellen)
GPU-ondersteuningJaJa (geoptimaliseerd)
CPU-ondersteuningJaJa (geoptimaliseerd)
KwantisatieBeperktVolledig (INT8, FP16)
BatchverwerkingHandmatigIngebouwd
InstallatieEenvoudigEenvoudig (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-typeSnelheidGeheugenNauwkeurigheidGebruik
int8SnelstLaagstIets lagerCPU, beperkte resources
int8_float16Zeer snelLaagHoogGPU met beperkte VRAM
float16SnelGemiddeldHoogGPU (aanbevolen)
float32TraagstHoogstHoogstMaximale 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:
ConfiguratieTijdVRAM-gebruikVersnelling
OpenAI Whisper (FP16, beam=5)~2m 23s~4708 MBReferentie
Faster-whisper (FP16, beam=5)~1m 03s~4525 MB2.3× sneller
Faster-whisper (INT8, beam=5)~59s~2926 MB2.4× sneller
Faster-whisper (FP16, batch=8)~17s~6090 MB8.4× sneller
Faster-whisper (INT8, batch=8)~16s~4500 MB8.9× sneller

CPU-prestaties (Intel Core i7-12700K)

ConfiguratieTijdRAM-gebruikVersnelling
OpenAI Whisper (FP32, beam=5)~6m 58s~2335 MBReferentie
Faster-whisper (FP32, beam=5)~2m 37s~2257 MB2.7× sneller
Faster-whisper (INT8, beam=5)~1m 42s~1477 MB4.1× sneller
Faster-whisper (FP32, batch=8)~1m 06s~4230 MB6.3× sneller
Faster-whisper (INT8, batch=8)~51s~3608 MB8.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

  1. Model laden: WhisperModel() in plaats van whisper.load_model()
  2. Retourformaat: tuple (segments, info) in plaats van dict
  3. Segmenten: iterator van segmentobjecten in plaats van lijst
  4. Device/compute-type: device en compute_type zijn verplicht
  5. 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 found
Oplossing:
# 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

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)

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.

Probeer het nu gratis

Probeer nu onze AI‑oplossing voor spraak, audio en video. Je profiteert niet alleen van zeer nauwkeurige spraak‑naar‑tekst‑transcriptie, meertalige vertaling en slimme sprekerherkenning, maar ook van automatische ondertitelgeneratie voor video, intelligente audio‑ en videobewerking en gesynchroniseerde audio‑visuele analyse. Het dekt alle scenario’s: vergaderverslagen, short‑video creatie, podcastproductie en meer. Start vandaag nog je gratis proefperiode!