
OpenAI Whisper-tutorial: complete gids voor spraak-naar-teksttranscriptie
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:
| Model | Parameters | Snelheid | Nauwkeurigheid | Geheugen | Toepassing |
|---|---|---|---|---|---|
| tiny | 39M | ⭐⭐⭐⭐⭐ | ⭐⭐ | ~1 GB | Snelle tests, demo's |
| base | 74M | ⭐⭐⭐⭐ | ⭐⭐⭐ | ~1 GB | Eenvoudige audio, snelle taken |
| small | 244M | ⭐⭐⭐ | ⭐⭐⭐⭐ | ~2 GB | Algemeen gebruik, gebalanceerd |
| medium | 769M | ⭐⭐ | ⭐⭐⭐⭐⭐ | ~5 GB | Ruisende audio, hoge nauwkeurigheid |
| large | 1550M | ⭐ | ⭐⭐⭐⭐⭐⭐ | ~10 GB | Beste nauwkeurigheid, productie |
Aanbevelingen:
- Voor snelheid: gebruik
tinyofbase - Voor balans: gebruik
smallofmedium - Voor nauwkeurigheid: gebruik
largeoflarge-v3 - Voor productie: vaak
mediumoflarge-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:
- Download FFmpeg van ffmpeg.org
- Pak uit en voeg toe aan je systeem-PATH
- 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- Englishzh- Chinesees- Spanishfr- Frenchde- Germanja- Japaneseko- Koreanpt- Portugueseru- Russianit- 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, aanbevolentemperature=0.2-0.4— Iets meer variatietemperature=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
| Optie | Beschrijving | Standaard |
|---|---|---|
--model | Modelgrootte (tiny, base, small, medium, large) | base |
--language | Taalcode (en, zh, es, enz.) | Automatisch detecteren |
--task | transcribe of translate | transcribe |
--output_format | Uitvoerformaat (txt, srt, vtt, json, tsv) | txt |
--output_dir | Uitvoermap | Huidige map |
--temperature | Temperatuur voor sampling | 0.0 |
--beam_size | Beam size voor beam search | 5 |
--best_of | Aantal kandidaten | 5 |
--fp16 | FP16-precisie gebruiken (GPU) | True |
--verbose | Uitgebreide uitvoer afdrukken | False |
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: ffmpegOplossing:
# 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 tekortOplossingen:
# 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
| Kenmerk | Whisper | Cloud-API's | Faster-Whisper |
|---|---|---|---|
| Kosten | Gratis | Betaald per minuut | Gratis |
| Offline | ✅ | ❌ | ✅ |
| Snelheid | Gemiddeld | Snel | Snel (2-4×) |
| Nauwkeurigheid | Hoog | Hoog | Hoog (zelfde) |
| Setup | Eenvoudig | Zeer eenvoudig | Eenvoudig |
| 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:
- Whisper Python Example - Meer gedetailleerde Python-voorbeelden
- Faster-Whisper Guide - 2-4× snellere transcriptie
- Whisper Accuracy Tips - Transcriptiekwaliteit verbeteren
- Whisper Transcript Formatting - Uitvoerformaten opmaken (SRT, VTT, JSON)
- Whisper for Meetings - Vergaderingsspecifieke transcriptie
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.