OpenAI Whisper-tutorial: complete gids voor spraak-naar-teksttranscriptie

OpenAI Whisper-tutorial: complete gids voor spraak-naar-teksttranscriptie

Eric King

Eric King

Author


OpenAI Whisper-tutorial: complete gids voor spraak-naar-teksttranscriptie

OpenAI Whisper is een open source-model voor automatische spraakherkenning (ASR) dat is bedoeld voor spraak-naar-teksttranscriptie en spraakvertaling. Het ondersteunt meerdere talen, gaat goed om met accenten en achtergrondgeluid en wordt veel gebruikt voor podcasts, vergaderingen, interviews en video-ondertiteling.
Deze uitgebreide tutorial leidt je door alles wat je nodig hebt om met Whisper aan de slag te gaan, van installatie tot geavanceerd gebruik.

Wat is OpenAI Whisper?

Whisper is getraind op 680.000 uur meertalige audio en is daardoor extra sterk op imperfecte audio uit de praktijk. Het behoort tot de nauwkeurigste open source-modellen voor spraakherkenning die beschikbaar zijn.

Belangrijkste kenmerken

  • Meertalige ondersteuning — 99+ talen
  • Spraak-naar-teksttranscriptie — zet audio om naar tekst
  • Spraakvertaling — vertaal spraak rechtstreeks naar het Engels
  • Taaldetectie — detecteert automatisch de gesproken taal
  • Timestampgeneratie — timestamps op woord- en segmentniveau
  • Open source en gratis — MIT-licentie, geen API-kosten
  • Offline bruikbaar — draait lokaal op je machine
  • Meerdere formaten — ondersteunt diverse audio- en videoformaten

Whisper-modelgroottes uitgelegd

Whisper biedt meerdere modelgroottes om snelheid en nauwkeurigheid af te wegen:
ModelParametersSnelheidNauwkeurigheidGeheugenToepassing
tiny39M⭐⭐⭐⭐⭐⭐⭐~1 GBSnelle tests, demo's
base74M⭐⭐⭐⭐⭐⭐⭐~1 GBEenvoudige audio, snelle taken
small244M⭐⭐⭐⭐⭐⭐⭐~2 GBAlgemeen gebruik, gebalanceerd
medium769M⭐⭐⭐⭐⭐⭐⭐~5 GBRuisende audio, hoge nauwkeurigheid
large1550M⭐⭐⭐⭐⭐⭐~10 GBBeste nauwkeurigheid, productie
Aanbevelingen:
  • Voor snelheid: gebruik tiny of base
  • Voor balans: gebruik small of medium
  • Voor nauwkeurigheid: gebruik large of large-v3
  • Voor productie: vaak medium of large-v2

Vereisten

Voordat je Whisper gebruikt, zorg dat je het volgende hebt:
  • Python 3.8 of nieuwer (aanbevolen: Python 3.9+)
  • pip als pakketbeheerder
  • FFmpeg geïnstalleerd (voor audio- en videoverwerking)
  • (Optioneel) NVIDIA-GPU met CUDA voor snellere verwerking
  • (Optioneel) 4 GB+ RAM voor het basismodel, 10 GB+ voor het large-model

Stap 1: Installatie

Whisper installeren

Installeer het OpenAI Whisper-pakket met pip:
pip install openai-whisper
Of met een specifieke versie:
pip install openai-whisper==20231117

FFmpeg installeren

FFmpeg is nodig om audio- en videobestanden te decoderen.
macOS (met Homebrew):
brew install ffmpeg
Ubuntu / Debian:
sudo apt update
sudo apt install ffmpeg
Windows:
  1. Download FFmpeg van ffmpeg.org
  2. Pak uit en voeg toe aan je systeem-PATH
  3. Of gebruik: choco install ffmpeg (met Chocolatey)
Installatie controleren:
ffmpeg -version
whisper --version

Stap 2: Basisgebruik — Python

Eenvoudige transcriptie

Dit is de eenvoudigste manier om audio te transcriberen:
import whisper

# Load model (downloads automatically on first use)
model = whisper.load_model("base")

# Transcribe audio file
result = model.transcribe("audio.mp3")

# Print transcription
print(result["text"])
Uitvoer:
Hello everyone, welcome to today's meeting. We will discuss the project timeline and upcoming milestones.

Volledig voorbeeld met foutafhandeling

import whisper
import os

def transcribe_audio(audio_path, model_size="base"):
    """
    Transcribe an audio file using Whisper.
    
    Args:
        audio_path (str): Path to the audio file
        model_size (str): Whisper model size (tiny, base, small, medium, large)
    
    Returns:
        dict: Transcription result with text and segments
    """
    try:
        # Check if audio file exists
        if not os.path.exists(audio_path):
            raise FileNotFoundError(f"Audio file not found: {audio_path}")
        
        # Load the Whisper model
        print(f"Loading Whisper model: {model_size}")
        model = whisper.load_model(model_size)
        
        # Transcribe the audio
        print(f"Transcribing: {audio_path}")
        result = model.transcribe(audio_path)
        
        print(f"✓ Transcription complete!")
        print(f"  Language: {result['language']}")
        print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
        
        return result
    
    except Exception as e:
        print(f"Error during transcription: {str(e)}")
        return None

# Example usage
if __name__ == "__main__":
    audio_file = "meeting.mp3"
    result = transcribe_audio(audio_file, model_size="base")
    
    if result:
        print("\n" + "="*50)
        print("TRANSCRIPTION:")
        print("="*50)
        print(result["text"])

Stap 3: Taaldetectie en specificatie

Taal automatisch detecteren

Whisper detecteert de taal automatisch:
import whisper

model = whisper.load_model("base")
result = model.transcribe("audio.mp3")

print(f"Detected language: {result['language']}")
print(f"Language probability: {result.get('language_probability', 0):.2%}")
print(f"\nTranscription:\n{result['text']}")

Taal specificeren (sneller en nauwkeuriger)

Als je de taal kent, verbetert specificatie snelheid en nauwkeurigheid:
import whisper

model = whisper.load_model("base")

# Specify language
result_en = model.transcribe("audio.mp3", language="en")  # English
result_zh = model.transcribe("audio.mp3", language="zh")   # Chinese
result_es = model.transcribe("audio.mp3", language="es")  # Spanish
result_fr = model.transcribe("audio.mp3", language="fr")  # French
result_de = model.transcribe("audio.mp3", language="de")  # German
result_ja = model.transcribe("audio.mp3", language="ja")   # Japanese

print(result_en["text"])
Ondersteunde talen: Whisper ondersteunt 99+ talen. Veelgebruikte taalcodes:
  • en - English
  • zh - Chinese
  • es - Spanish
  • fr - French
  • de - German
  • ja - Japanese
  • ko - Korean
  • pt - Portuguese
  • ru - Russian
  • it - Italian

Stap 4: Timestamps en segmenten

Segmenten met timestamps benaderen

import whisper

model = whisper.load_model("base")
result = model.transcribe("audio.mp3")

# Print full transcription
print("Full Text:")
print(result["text"])

# Print segments with timestamps
print("\n" + "="*50)
print("Segments with Timestamps:")
print("="*50)

for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"].strip()
    print(f"[{start:6.2f}s - {end:6.2f}s] {text}")
Uitvoer:
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.

==================================================
Segments with Timestamps:
==================================================
[  0.00s -   5.20s] Hello everyone, welcome to today's meeting.
[  5.20s -  12.50s] We will discuss the project timeline.

Timestamps als timecode formatteren

def format_timestamp(seconds):
    """Format seconds to HH:MM:SS."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    return f"{hours:02d}:{minutes:02d}:{secs:02d}"

for segment in result["segments"]:
    start_time = format_timestamp(segment["start"])
    end_time = format_timestamp(segment["end"])
    print(f"[{start_time} - {end_time}] {segment['text']}")

Timestamps op woordniveau

Schakel timestamps op woordniveau in voor nauwkeurige timing:
import whisper

model = whisper.load_model("base")

result = model.transcribe(
    "audio.mp3",
    word_timestamps=True  # Enable word-level timestamps
)

for segment in result["segments"]:
    print(f"\n[{segment['start']:.2f}s - {segment['end']:.2f}s]")
    print(f"Text: {segment['text']}")
    
    # Word-level timestamps
    if "words" in segment:
        print("Words:")
        for word in segment["words"]:
            print(f"  {word['word']} [{word['start']:.2f}s - {word['end']:.2f}s]")

Stap 5: Spraakvertaling

Whisper kan niet-Engelse spraak rechtstreeks naar het Engels vertalen:
import whisper

model = whisper.load_model("base")

# Translate to English (regardless of source language)
result = model.transcribe("spanish_audio.mp3", task="translate")

print("Translated to English:")
print(result["text"])

# Original transcription (in original language)
result_original = model.transcribe("spanish_audio.mp3", task="transcribe")
print("\nOriginal language transcription:")
print(result_original["text"])
Praktijkvoorbeelden:
  • Internationale vergaderingen
  • Meertalige contentverwerking
  • Lokalisatie van content
  • Taalleermaterialen

Stap 6: Geavanceerde parameters

Temperatuur en beam size

Stuur transcriptiekwaliteit en -snelheid bij:
import whisper

model = whisper.load_model("base")

result = model.transcribe(
    "audio.mp3",
    temperature=0.0,        # Lower = more deterministic (0.0 recommended)
    beam_size=5,            # Higher = more accurate but slower (default: 5)
    best_of=5,              # Number of candidates to consider
    patience=1.0,           # Beam search patience
    condition_on_previous_text=True,  # Use context from previous segments
    initial_prompt="This is a technical meeting about AI and machine learning."  # Context prompt
)

Temperatuurwaarden

  • temperature=0.0 — Meest deterministisch, aanbevolen
  • temperature=0.2-0.4 — Iets meer variatie
  • temperature=1.0 — Creatiever, minder nauwkeurig

Initiële prompt voor context

Geef context om de nauwkeurigheid te verbeteren:
result = model.transcribe(
    "technical_meeting.mp3",
    initial_prompt="This meeting discusses API endpoints, microservices, Kubernetes, and CI/CD pipelines."
)

result = model.transcribe(
    "medical_audio.mp3",
    initial_prompt="This is a medical consultation discussing patient symptoms and treatment options."
)

Stap 7: Command-line interface (CLI)

Whisper biedt een krachtige command-line interface:

Basis-CLI-gebruik

whisper audio.mp3

Model specificeren

whisper audio.mp3 --model small
whisper audio.mp3 --model medium
whisper audio.mp3 --model large-v2

Taal specificeren

whisper audio.mp3 --language en
whisper audio.mp3 --language zh

Uitvoerformaten

# SRT subtitles
whisper audio.mp3 --output_format srt

# VTT subtitles
whisper audio.mp3 --output_format vtt

# Text file
whisper audio.mp3 --output_format txt

# JSON (with all metadata)
whisper audio.mp3 --output_format json

# TSV (tab-separated values)
whisper audio.mp3 --output_format tsv

Geavanceerde CLI-opties

# Full example with all options
whisper audio.mp3 \
  --model medium \
  --language en \
  --task transcribe \
  --output_format srt \
  --output_dir ./transcripts \
  --verbose True \
  --temperature 0.0 \
  --beam_size 5 \
  --best_of 5 \
  --fp16 True

CLI-optiereferentie

OptieBeschrijvingStandaard
--modelModelgrootte (tiny, base, small, medium, large)base
--languageTaalcode (en, zh, es, enz.)Automatisch detecteren
--tasktranscribe of translatetranscribe
--output_formatUitvoerformaat (txt, srt, vtt, json, tsv)txt
--output_dirUitvoermapHuidige map
--temperatureTemperatuur voor sampling0.0
--beam_sizeBeam size voor beam search5
--best_ofAantal kandidaten5
--fp16FP16-precisie gebruiken (GPU)True
--verboseUitgebreide uitvoer afdrukkenFalse

Stap 8: Ondersteunde audio- en videoformaten

Whisper ondersteunt de meeste gangbare formaten via FFmpeg:

Ondersteunde formaten

  • Audio: MP3, WAV, M4A, FLAC, OGG, AAC, WMA
  • Video: MP4, AVI, MKV, MOV, WebM, FLV
  • Streaming: kan audiostromen verwerken

Voorbeelden van formaten

import whisper

model = whisper.load_model("base")

# Audio formats
model.transcribe("audio.mp3")
model.transcribe("audio.wav")
model.transcribe("audio.m4a")
model.transcribe("audio.flac")

# Video formats (extracts audio automatically)
model.transcribe("video.mp4")
model.transcribe("video.mkv")
model.transcribe("video.webm")

Stap 9: Volledig productievoorbeeld

Hier is een volledig, productieklare voorbeeldimplementatie:
import whisper
import json
from pathlib import Path
from datetime import datetime

class WhisperTranscriber:
    """Production-ready Whisper transcription service."""
    
    def __init__(self, model_size="base"):
        """Initialize transcriber with specified model."""
        print(f"Loading Whisper model: {model_size}")
        self.model = whisper.load_model(model_size)
        print("✓ Model loaded successfully")
    
    def transcribe_file(self, audio_path, output_dir="transcripts", **kwargs):
        """
        Transcribe audio file and save results.
        
        Args:
            audio_path: Path to audio file
            output_dir: Directory to save outputs
            **kwargs: Additional transcribe parameters
        """
        audio_path = Path(audio_path)
        if not audio_path.exists():
            raise FileNotFoundError(f"Audio file not found: {audio_path}")
        
        output_path = Path(output_dir)
        output_path.mkdir(exist_ok=True)
        
        print(f"\nTranscribing: {audio_path.name}")
        
        # Transcribe
        result = self.model.transcribe(
            str(audio_path),
            word_timestamps=True,
            **kwargs
        )
        
        # Prepare output data
        output_data = {
            "file": str(audio_path),
            "transcribed_at": datetime.now().isoformat(),
            "language": result["language"],
            "language_probability": result.get("language_probability", 0),
            "duration": result["segments"][-1]["end"] if result["segments"] else 0,
            "text": result["text"],
            "segments": result["segments"]
        }
        
        # Save outputs
        base_name = audio_path.stem
        
        # Save as text
        text_file = output_path / f"{base_name}.txt"
        with open(text_file, "w", encoding="utf-8") as f:
            f.write(result["text"])
        
        # Save as JSON
        json_file = output_path / f"{base_name}.json"
        with open(json_file, "w", encoding="utf-8") as f:
            json.dump(output_data, f, indent=2, ensure_ascii=False)
        
        # Save as SRT
        srt_file = output_path / f"{base_name}.srt"
        self._save_srt(result["segments"], srt_file)
        
        print(f"✓ Transcription saved:")
        print(f"  - Text: {text_file}")
        print(f"  - JSON: {json_file}")
        print(f"  - SRT: {srt_file}")
        
        return output_data
    
    def _save_srt(self, segments, output_path):
        """Save segments as SRT subtitle file."""
        with open(output_path, "w", encoding="utf-8") as f:
            for i, segment in enumerate(segments, start=1):
                start = self._format_srt_time(segment["start"])
                end = self._format_srt_time(segment["end"])
                text = segment["text"].strip()
                f.write(f"{i}\n{start} --> {end}\n{text}\n\n")
    
    def _format_srt_time(self, seconds):
        """Format seconds to SRT timestamp."""
        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__":
    transcriber = WhisperTranscriber(model_size="base")
    
    result = transcriber.transcribe_file(
        "meeting.mp3",
        output_dir="transcripts",
        language="en",
        temperature=0.0
    )
    
    print(f"\nLanguage: {result['language']}")
    print(f"Duration: {result['duration']:.2f}s")
    print(f"\nTranscription preview:")
    print(result['text'][:200] + "...")

Stap 10: Best practices

1. Het juiste model kiezen

# For speed (testing, demos)
model = whisper.load_model("tiny")

# For balance (general use)
model = whisper.load_model("base")  # or "small"

# For accuracy (production)
model = whisper.load_model("medium")  # or "large-v2"

2. Taal specificeren als die bekend is

# Faster and more accurate
result = model.transcribe("audio.mp3", language="en")

# Instead of auto-detection
result = model.transcribe("audio.mp3")  # Slower

3. Passende temperatuur gebruiken

# Recommended for most cases
result = model.transcribe("audio.mp3", temperature=0.0)

# For creative content (not recommended for transcription)
result = model.transcribe("audio.mp3", temperature=0.2)

4. Context geven met een initiële prompt

# Technical content
result = model.transcribe(
    "meeting.mp3",
    initial_prompt="This meeting discusses software architecture, APIs, and deployment strategies."
)

# Medical content
result = model.transcribe(
    "consultation.mp3",
    initial_prompt="This is a medical consultation about patient symptoms and treatment."
)

5. Modelinstanties hergebruiken

# Load once, reuse multiple times
model = whisper.load_model("base")

# Process multiple files
for audio_file in ["file1.mp3", "file2.mp3", "file3.mp3"]:
    result = model.transcribe(audio_file)
    # Process result...

6. Lange audiobestanden afhandelen

Voor zeer lange audiobestanden kun je segmentatie overwegen:
import whisper
from pydub import AudioSegment

def transcribe_long_audio(audio_path, chunk_length_ms=600000):  # 10 minutes
    """Transcribe long audio by splitting into chunks."""
    model = whisper.load_model("base")
    
    # Load audio
    audio = AudioSegment.from_file(audio_path)
    duration_ms = len(audio)
    
    all_text = []
    all_segments = []
    
    # Process in chunks
    for i in range(0, duration_ms, chunk_length_ms):
        chunk = audio[i:i + chunk_length_ms]
        chunk_path = f"chunk_{i}.wav"
        chunk.export(chunk_path, format="wav")
        
        result = model.transcribe(chunk_path)
        all_text.append(result["text"])
        all_segments.extend(result["segments"])
        
        # Clean up chunk file
        os.remove(chunk_path)
    
    return {
        "text": " ".join(all_text),
        "segments": all_segments
    }

Veelvoorkomende problemen en oplossingen

Probleem 1: FFmpeg niet gevonden

Fout: FileNotFoundError: ffmpeg
Oplossing:
# Install FFmpeg
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Verify
ffmpeg -version

Probleem 2: Onvoldoende geheugen

Fout: RuntimeError: CUDA out of memory of het systeem raakt RAM tekort
Oplossingen:
# Use smaller model
model = whisper.load_model("base")  # Instead of "large"

# Or use CPU
import torch
model = whisper.load_model("base", device="cpu")

# Or process in chunks (see above)

Probleem 3: Trage transcriptie

Probleem: transcriptie is erg traag
Oplossingen:
# Use GPU if available
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model("base", device=device)

# Use smaller model
model = whisper.load_model("tiny")  # or "base"

# Reduce beam size (faster but slightly less accurate)
result = model.transcribe("audio.mp3", beam_size=1)

Probleem 4: Lage nauwkeurigheid

Probleem: de transcriptie bevat veel fouten
Oplossingen:
# Use larger model
model = whisper.load_model("medium")  # or "large"

# Specify language
result = model.transcribe("audio.mp3", language="en")

# Provide context
result = model.transcribe(
    "audio.mp3",
    initial_prompt="Context about the audio content..."
)

# Use optimal settings
result = model.transcribe(
    "audio.mp3",
    temperature=0.0,
    beam_size=5,
    best_of=5
)

Use cases

1. Podcasttranscriptie

model = whisper.load_model("medium")
result = model.transcribe("podcast.mp3", language="en")

# Save transcript
with open("podcast_transcript.txt", "w") as f:
    f.write(result["text"])

2. YouTube-ondertitels genereren

model = whisper.load_model("base")
result = model.transcribe("video.mp4", language="en")

# Generate SRT
# (Use CLI: whisper video.mp4 --output_format srt)

3. Vergadernotities

model = whisper.load_model("base")
result = model.transcribe(
    "meeting.mp3",
    language="en",
    initial_prompt="This is a business meeting discussing project updates and deadlines."
)

# Save with timestamps
for segment in result["segments"]:
    print(f"[{segment['start']:.0f}s] {segment['text']}")

4. Interviewtranscriptie

model = whisper.load_model("medium")
result = model.transcribe("interview.mp3", language="en")

# Export for editing
with open("interview.txt", "w") as f:
    for segment in result["segments"]:
        f.write(f"[{segment['start']:.2f}s] {segment['text']}\n")

5. Meertalige contentvertaling

model = whisper.load_model("base")

# Translate to English
result = model.transcribe("spanish_audio.mp3", task="translate")
print(result["text"])  # English translation

Whisper versus alternatieven

KenmerkWhisperCloud-API'sFaster-Whisper
KostenGratisBetaald per minuutGratis
Offline
SnelheidGemiddeldSnelSnel (2-4×)
NauwkeurigheidHoogHoogHoog (zelfde)
SetupEenvoudigZeer eenvoudigEenvoudig
Realtime
Privacy✅ Lokaal❌ Cloud✅ Lokaal
Kies Whisper wanneer:
  • Je gratis, offline transcriptie wilt
  • Privacy belangrijk is
  • Je controle over de infrastructuur hebt
  • Je batchbestanden of gearchiveerde content verwerkt
Kies cloud-API's wanneer:
  • Je realtime-transcriptie nodig hebt
  • Je beheerde infrastructuur wilt
  • Je budget hebt voor API-kosten
  • Je enterprise-ondersteuning nodig hebt

Volgende stappen

Nu je de basis kent, verdiep je verder in:

Conclusie

OpenAI Whisper is een van de krachtigste open source-modellen voor spraak-naar-tekst die vandaag beschikbaar zijn. Met sterke meertalige ondersteuning, hoge transcriptienauwkeurigheid en volledige offline-mogelijkheden is het een uitstekende keuze voor ontwikkelaars en makers die volledige controle willen over hun transcriptieworkflow.
Belangrijkste punten:
  • Whisper ondersteunt 99+ talen met hoge nauwkeurigheid
  • Kies de juiste modelgrootte voor jouw behoeften
  • Specificeer de taal als die bekend is voor betere prestaties
  • Gebruik woordtimestamps voor nauwkeurige timing
  • Herbruik modelinstanties voor meerdere bestanden
  • Overweeg faster-whisper voor productie-implementaties
Of je nu podcasts transcribeert, ondertitels genereert of vergaderopnames verwerkt: Whisper biedt een robuuste, gratis en privacybewuste oplossing voor spraak-naar-teksttranscriptie.

Op zoek naar een professionele spraak-naar-tekstoplossing? Bezoek SayToWords om ons AI-transcriptieplatform te ontdekken 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!