Whisper Python-voorbeeld: complete gids voor spraak-naar-teksttranscriptie

Whisper Python-voorbeeld: complete gids voor spraak-naar-teksttranscriptie

Eric King

Eric King

Author


Whisper Python-voorbeeld: complete gids voor spraak-naar-teksttranscriptie

OpenAI Whisper behoort tot de krachtigste open-source spraakherkenningsmodellen die er vandaag zijn. In deze uitgebreide gids leert u hoe u Whisper met Python gebruikt om audiobestanden met hoge nauwkeurigheid naar tekst te transcriberen.
Deze tutorial is geschikt voor:
  • Ontwikkelaars die spraak-naar-tekstfuncties bouwen
  • Data scientists die met audio werken
  • Iedereen die een volledig Whisper Python-voorbeeld zoekt

Wat is OpenAI Whisper?

Whisper is een automatisch spraakherkenningssysteem (ASR) getraind op 680.000 uur meertalige audio. Het kan:
  • Spraak transcriberen in 99+ talen
  • Automatisch taal detecteren
  • Spraak naar het Engels vertalen
  • Ruis en accenten verwerken
  • Lange audiobestanden verwerken

Vereisten

Voordat u begint, zorg dat u het volgende hebt:
  • Python 3.8+ geïnstalleerd
  • de pakketbeheerder pip
  • FFmpeg geïnstalleerd (voor audiobewerking)
  • (Optioneel) NVIDIA-GPU voor snellere verwerking

Stap 1: Whisper installeren

Installeer het OpenAI Whisper-pakket met pip:
pip install openai-whisper

FFmpeg installeren

macOS (met Homebrew):
brew install ffmpeg
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
Windows: Download FFmpeg van ffmpeg.org en voeg het toe aan uw PATH.

Stap 2: Basis Whisper Python-voorbeeld

Hier is een eenvoudig Python-script om een audiobestand te transcriberen:
import whisper

# Load the Whisper model
model = whisper.load_model("base")

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

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

Stap 3: Volledig Python-voorbeeld met foutafhandeling

Hier is een robuuster voorbeeld met goede 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)
        
        return result
    
    except Exception as e:
        print(f"Error during transcription: {str(e)}")
        return None

# Example usage
if __name__ == "__main__":
    audio_file = "sample_audio.mp3"
    result = transcribe_audio(audio_file, model_size="base")
    
    if result:
        print("\nTranscription:")
        print(result["text"])

Stap 4: Geavanceerd voorbeeld met taaldetectie

Whisper kan de taal automatisch detecteren, maar u kunt deze ook opgeven:
import whisper

model = whisper.load_model("base")

# Auto-detect language
result = model.transcribe("audio.mp3")
print(f"Detected language: {result['language']}")
print(f"Transcription: {result['text']}")

# Specify language explicitly
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")

Stap 5: Tijdstempels en segmenten ophalen

Whisper levert gedetailleerde segmentinformatie met tijdstempels:
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("\nSegments with Timestamps:")
for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.2f}s - {end:.2f}s] {text}")
Uitvoer:
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.

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

Stap 6: Audio naar het Engels vertalen

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

model = whisper.load_model("base")

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

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

Stap 7: Meerdere audiobestanden verwerken

Zo transcribeert u meerdere bestanden in batch:
import whisper
import os
from pathlib import Path

def batch_transcribe(audio_directory, model_size="base", output_dir="transcriptions"):
    """
    Transcribe all audio files in a directory.
    
    Args:
        audio_directory (str): Directory containing audio files
        model_size (str): Whisper model size
        output_dir (str): Directory to save transcriptions
    """
    # Create output directory
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model once
    model = whisper.load_model(model_size)
    
    # Supported audio formats
    audio_extensions = ['.mp3', '.wav', '.m4a', '.flac', '.ogg']
    
    # Process each audio file
    audio_files = [
        f for f in os.listdir(audio_directory)
        if any(f.lower().endswith(ext) for ext in audio_extensions)
    ]
    
    for audio_file in audio_files:
        audio_path = os.path.join(audio_directory, audio_file)
        print(f"\nProcessing: {audio_file}")
        
        try:
            result = model.transcribe(audio_path)
            
            # Save transcription to file
            output_file = os.path.join(
                output_dir,
                Path(audio_file).stem + ".txt"
            )
            
            with open(output_file, "w", encoding="utf-8") as f:
                f.write(result["text"])
            
            print(f"✓ Saved: {output_file}")
            
        except Exception as e:
            print(f"✗ Error processing {audio_file}: {str(e)}")

# Example usage
batch_transcribe("audio_files/", model_size="base")

Stap 8: Exporteren naar SRT-ondertitelindeling

Maak SRT-ondertitelbestanden op basis van transcripties:
import whisper

def transcribe_to_srt(audio_path, output_path, model_size="base"):
    """
    Transcribe audio and save as SRT subtitle file.
    
    Args:
        audio_path (str): Path to audio file
        output_path (str): Path to save SRT file
        model_size (str): Whisper model size
    """
    model = whisper.load_model(model_size)
    result = model.transcribe(audio_path)
    
    # Generate SRT content
    srt_content = ""
    for i, segment in enumerate(result["segments"], start=1):
        start_time = format_timestamp(segment["start"])
        end_time = format_timestamp(segment["end"])
        text = segment["text"].strip()
        
        srt_content += f"{i}\n"
        srt_content += f"{start_time} --> {end_time}\n"
        srt_content += f"{text}\n\n"
    
    # Save SRT file
    with open(output_path, "w", encoding="utf-8") as f:
        f.write(srt_content)
    
    print(f"SRT file saved: {output_path}")

def format_timestamp(seconds):
    """Convert seconds to SRT timestamp format (HH:MM:SS,mmm)."""
    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}"

# Example usage
transcribe_to_srt("video.mp4", "subtitles.srt", model_size="base")

Vergelijking van Whisper-modelgroottes

Kies de juiste modelgrootte op basis van uw behoeften:
ModelParametersSnelheidNauwkeurigheidGeheugenGebruiksscenario
tiny39M⭐⭐⭐⭐⭐⭐⭐~1GBSnel testen, eenvoudige audio
base74M⭐⭐⭐⭐⭐⭐⭐~1GBAlgemeen gebruik
small244M⭐⭐⭐⭐⭐⭐⭐~2GBGebalanceerd
medium769M⭐⭐⭐⭐⭐⭐⭐~5GBHoge nauwkeurigheid nodig
large1550M⭐⭐⭐⭐⭐⭐~10GBBeste nauwkeurigheid, ruis

Best practices voor Whisper met Python

1. De juiste modelgrootte kiezen

# Fast and lightweight
model = whisper.load_model("tiny")  # Good for testing

# Balanced
model = whisper.load_model("base")  # Good for most cases

# High accuracy
model = whisper.load_model("medium")  # For important transcriptions

2. Lange audiobestanden verwerken

Voor zeer lange audiobestanden kunt u segmenten (chunks) gebruiken:
import whisper
from pydub import AudioSegment

def transcribe_long_audio(audio_path, chunk_length_ms=60000):
    """
    Transcribe long audio by splitting into chunks.
    
    Args:
        audio_path: Path to audio file
        chunk_length_ms: Length of each chunk in milliseconds
    """
    model = whisper.load_model("base")
    
    # Load audio
    audio = AudioSegment.from_file(audio_path)
    
    # Split into chunks
    chunks = []
    for i in range(0, len(audio), chunk_length_ms):
        chunks.append(audio[i:i + chunk_length_ms])
    
    # Transcribe each chunk
    full_text = []
    for i, chunk in enumerate(chunks):
        chunk_path = f"chunk_{i}.wav"
        chunk.export(chunk_path, format="wav")
        
        result = model.transcribe(chunk_path)
        full_text.append(result["text"])
        
        # Clean up chunk file
        os.remove(chunk_path)
    
    return " ".join(full_text)

3. GPU gebruiken voor snellere verwerking

Als u een NVIDIA-GPU hebt:
import whisper

# Whisper will automatically use GPU if available
model = whisper.load_model("base", device="cuda")

4. Taal opgeven voor betere nauwkeurigheid

# If you know the language, specify it
result = model.transcribe("audio.mp3", language="en")

Veelvoorkomende use cases

Podcasttranscriptie

import whisper

model = whisper.load_model("medium")
result = model.transcribe("podcast_episode.mp3")

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

Vergadernotities

import whisper
from datetime import datetime

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

# Create formatted meeting notes
notes = f"""
Meeting Notes - {datetime.now().strftime('%Y-%m-%d')}
========================================

{result["text"]}
"""

with open("meeting_notes.txt", "w") as f:
    f.write(notes)

Video-ondertitels

import whisper

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

# Generate VTT subtitle file
vtt_content = "WEBVTT\n\n"
for segment in result["segments"]:
    start = format_vtt_timestamp(segment["start"])
    end = format_vtt_timestamp(segment["end"])
    text = segment["text"].strip()
    vtt_content += f"{start} --> {end}\n{text}\n\n"

with open("subtitles.vtt", "w") as f:
    f.write(vtt_content)

Probleemoplossing bij veelvoorkomende issues

Probleem 1: FFmpeg niet gevonden

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

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
# Download from ffmpeg.org and add to PATH

Probleem 2: onvoldoende geheugen

Fout: RuntimeError: CUDA out of memory
Oplossing:
# Use a smaller model
model = whisper.load_model("tiny")  # Instead of "large"

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

Probleem 3: trage verwerking

Oplossingen:
  • Gebruik een kleiner model (tiny of base)
  • Schakel GPU-acceleratie in
  • Verwerk audio in segmenten
  • Gebruik multiprocessing voor batchtaken

Prestatietips

  1. Gebruik een GPU indien beschikbaar — 10-50× sneller dan CPU
  2. Kies een passende modelgrootte — gebruik "large" niet voor eenvoudige taken
  3. Preprocess audio — stilte verwijderen, volume normaliseren
  4. Batchverwerking — model één keer laden, meerdere bestanden verwerken
  5. Threading — voor I/O-gebonden bewerkingen

Whisper Python versus andere oplossingen

KenmerkWhisper PythonGoogle Speech-to-TextAssemblyAI
KostenGratis (lokaal)Betaald per minuutBetaald per minuut
Offline
NauwkeurigheidHoogHoogHoog
InstallatieGemiddeldEenvoudigEenvoudig
Lange audio
Meertalig

Volledig voorbeeld: productieklaar script

Hier is een volledig, productieklaar voorbeeld:
#!/usr/bin/env python3
"""
Production-ready Whisper transcription script.
"""

import whisper
import argparse
import os
import json
from pathlib import Path
from datetime import datetime

def transcribe_file(
    audio_path,
    model_size="base",
    language=None,
    output_format="txt",
    output_dir=None
):
    """
    Transcribe an audio file with comprehensive output options.
    
    Args:
        audio_path: Path to audio file
        model_size: Whisper model size
        language: Language code (optional, auto-detected if None)
        output_format: Output format (txt, json, srt, vtt)
        output_dir: Output directory (default: same as audio file)
    """
    # Validate input file
    if not os.path.exists(audio_path):
        raise FileNotFoundError(f"Audio file not found: {audio_path}")
    
    # Set output directory
    if output_dir is None:
        output_dir = os.path.dirname(audio_path)
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model
    print(f"Loading Whisper model: {model_size}")
    model = whisper.load_model(model_size)
    
    # Transcribe
    print(f"Transcribing: {audio_path}")
    transcribe_kwargs = {}
    if language:
        transcribe_kwargs["language"] = language
    
    result = model.transcribe(audio_path, **transcribe_kwargs)
    
    # Generate output filename
    base_name = Path(audio_path).stem
    output_path = os.path.join(output_dir, base_name)
    
    # Save based on format
    if output_format == "txt":
        with open(f"{output_path}.txt", "w", encoding="utf-8") as f:
            f.write(result["text"])
    
    elif output_format == "json":
        with open(f"{output_path}.json", "w", encoding="utf-8") as f:
            json.dump(result, f, indent=2, ensure_ascii=False)
    
    elif output_format == "srt":
        srt_content = generate_srt(result["segments"])
        with open(f"{output_path}.srt", "w", encoding="utf-8") as f:
            f.write(srt_content)
    
    elif output_format == "vtt":
        vtt_content = generate_vtt(result["segments"])
        with open(f"{output_path}.vtt", "w", encoding="utf-8") as f:
            f.write(vtt_content)
    
    print(f"✓ Transcription saved: {output_path}.{output_format}")
    print(f"  Language: {result['language']}")
    print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
    
    return result

def generate_srt(segments):
    """Generate SRT subtitle content."""
    srt = ""
    for i, segment in enumerate(segments, start=1):
        start = format_timestamp(segment["start"])
        end = format_timestamp(segment["end"])
        text = segment["text"].strip()
        srt += f"{i}\n{start} --> {end}\n{text}\n\n"
    return srt

def generate_vtt(segments):
    """Generate VTT subtitle content."""
    vtt = "WEBVTT\n\n"
    for segment in segments:
        start = format_vtt_timestamp(segment["start"])
        end = format_vtt_timestamp(segment["end"])
        text = segment["text"].strip()
        vtt += f"{start} --> {end}\n{text}\n\n"
    return vtt

def format_timestamp(seconds):
    """Format timestamp 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_timestamp(seconds):
    """Format timestamp 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}"

def main():
    parser = argparse.ArgumentParser(
        description="Transcribe audio files using OpenAI Whisper"
    )
    parser.add_argument("audio", help="Path to audio file")
    parser.add_argument(
        "--model",
        default="base",
        choices=["tiny", "base", "small", "medium", "large"],
        help="Whisper model size"
    )
    parser.add_argument(
        "--language",
        default=None,
        help="Language code (e.g., 'en', 'zh', 'es')"
    )
    parser.add_argument(
        "--output-format",
        default="txt",
        choices=["txt", "json", "srt", "vtt"],
        help="Output format"
    )
    parser.add_argument(
        "--output-dir",
        default=None,
        help="Output directory"
    )
    
    args = parser.parse_args()
    
    transcribe_file(
        args.audio,
        model_size=args.model,
        language=args.language,
        output_format=args.output_format,
        output_dir=args.output_dir
    )

if __name__ == "__main__":
    main()
Gebruik:
# Basic usage
python transcribe.py audio.mp3

# With options
python transcribe.py audio.mp3 --model medium --language en --output-format srt

# Save to specific directory
python transcribe.py audio.mp3 --output-dir ./transcriptions

Conclusie

Deze uitgebreide gids met Whisper Python-voorbeelden bevat alles wat u nodig hebt om te starten met spraak-naar-teksttranscriptie met OpenAI Whisper. Of u nu podcasts, vergaderingen transcribeert of ondertitels maakt: Whisper biedt een krachtige, gratis oplossing om audio naar tekst te zetten.
Belangrijkste punten:
  • Whisper is gratis en open source
  • Ondersteunt 99+ talen
  • Werkt offline (geen API-aanroepen nodig)
  • Hoge nauwkeurigheid voor de meeste use cases
  • Eenvoudig te integreren in Python-projecten
Voor productieomgevingen waarin realtime transcriptie of API-toegang nodig is, kunt u cloudoplossingen zoals SayToWords overwegen, met Whisper-gestuurde transcriptie via API.

Klaar om te beginnen? Installeer Whisper en transcribeer vandaag nog uw eerste audiobestand.

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!