Inleiding: waarom automatische transcriptie tijdbesparend is
Stel je voor: je hebt net een uurgesprek gehad met een klant. Normaal gesproken moet je daarna zelf een samenvatting typen, actiepunten noteren en die via e-mail versturen. Dat kost je minstens 20 tot 30 minuten extra. Maal 5 gesprekken per week is dat al 2 uur verloren werktijd.
Met OpenAI Whisper hoef je dat niet meer handmatig te doen. Whisper is een open-source speech-to-text model dat audio omzet naar accurate teksttranscripties, ook in het Nederlands. Je kunt het lokaal draaien op je eigen computer (gratis, privacy-vriendelijk) of via de OpenAI API (pay-per-use, geen GPU nodig).
In deze handleiding leer je hoe je Whisper installeert, instelt en koppelt aan een automatische workflow die je vergaderingen transcribeert, samenvat en de actiepunten extraheert, en dat allemaal zonder handmatige tussenkomst.
Stap 1: Whisper lokaal installeren
Whisper draaien op je eigen computer vereist Python 3.8 of hoger en ffmpeg. ffmpeg is een open-source tool voor audio- en videoconversie die Whisper gebruikt om audiobestanden voor te verwerken. Installeer eerst ffmpeg, daarna Whisper.
# Stap 1a: ffmpeg installeren
# macOS (via Homebrew):
brew install ffmpeg
# Ubuntu/Debian:
sudo apt update && sudo apt install ffmpeg
# Windows:
# Download van https://ffmpeg.org/download.html en voeg toe aan PATH
# Controleer installatie:
ffmpeg -version
# Stap 1b: Whisper installeren via pip
pip install openai-whisper
# Of met alle optionele dependencies:
pip install openai-whisper torch torchvision torchaudio
# Controleer installatie:
whisper --help
Let op: het eerste keer laden van een Whisper-model duurt even omdat het model gedownload wordt (van 75 MB voor het tiny-model tot 2.9 GB voor het large-model). Na de eerste download is het model lokaal beschikbaar.
Stap 2: Eerste transcriptie uitvoeren
Zodra Whisper geinstalleerd is, kun je direct een audiobestand transcriberen via de command line. Whisper ondersteunt MP3, MP4, WAV, M4A, FLAC en meer. Geef altijd de taal mee voor betere resultaten.
# Basis gebruik: transcribeer een MP3-bestand in het Nederlands
whisper vergadering.mp3 --language nl
# Met specifiek model (betere kwaliteit, trager):
whisper vergadering.mp3 --language nl --model medium
# Output opslaan als tekstbestand:
whisper vergadering.mp3 --language nl --output_format txt --output_dir ./transcripties
# Meerdere outputformaten tegelijk (txt, srt, vtt, json):
whisper vergadering.mp3 --language nl --output_format all
# Met tijdstempels per zin:
whisper vergadering.mp3 --language nl --output_format srt
Whisper maakt automatisch een bestand met dezelfde naam als je audiobestand, met de extensie .txt (of .srt voor ondertiteling met tijdstempels). De transcriptie bevat interpunctie maar nog geen sprekeridentificatie, dat komt aan bod in de uitbreidingen aan het einde van deze handleiding.
Stap 3: Whisper modellen vergelijken
Whisper heeft vijf modelgroottes met elk een ander evenwicht tussen snelheid en nauwkeurigheid. Kies het model dat past bij je hardware en vereisten.
Tiny (75 MB): ultrasnelle transcriptie, voldoende voor duidelijke audio, ideaal voor tests en snelle verwerking op trage computers.
Base (145 MB): goede balans voor eenvoudige audio. Verwerkt een uur audio in 5 tot 10 minuten op een moderne CPU.
Small (465 MB): aanbevolen voor dagelijks gebruik. Goede nauwkeurigheid voor vergaderingen, acceptabele snelheid zonder GPU.
Medium (1.5 GB): uitstekende nauwkeurigheid voor technisch jargon of meerdere sprekers. Vereist meer RAM en tijd.
Large (2.9 GB): maximale nauwkeurigheid. Aanbevolen voor professionele transcripties of wanneer kwaliteit cruciaal is. Vereist idealiter een GPU.
Praktisch advies: begin met small voor dagelijkse vergaderingen. Upgrade naar medium of large alleen als de kwaliteit onvoldoende is of als je technisch jargon en meerdere sprekers moet verwerken.
Stap 4: Whisper API gebruiken
Geen lokale GPU of te weinig RAM? Gebruik de Whisper API van OpenAI. Je betaalt per minuut audio (circa 0,006 dollar per minuut in 2026), geen installatie van grote modellen nodig, en je krijgt altijd de beste kwaliteit.
# Installeer de OpenAI Python library:
pip install openai
# Transcribeer via de OpenAI Whisper API:
import openai
client = openai.OpenAI(api_key="jouw-openai-api-key")
def transcribeer_audio(bestandspad: str, taal: str = "nl") -> str:
"""Transcribeer een audiobestand via de Whisper API."""
with open(bestandspad, "rb") as audio_bestand:
transcriptie = client.audio.transcriptions.create(
model="whisper-1",
file=audio_bestand,
language=taal,
response_format="text"
)
return transcriptie
# Gebruik:
tekst = transcribeer_audio("vergadering.mp3")
print(tekst)
# Sla op als bestand:
with open("vergadering_transcriptie.txt", "w", encoding="utf-8") as f:
f.write(tekst)
print("Transcriptie opgeslagen.")
Kosten voorbeeld: een vergadering van 60 minuten kost via de API circa 0,36 dollar. Bij 20 vergaderingen per maand is dat zo'n 7,20 dollar, ver onder de kostprijs van handmatig uittypen.
Stap 5: Vergaderingsopname verwerken
Microsoft Teams, Zoom en Google Meet exporteren opnames als MP4-videobestand. Voor Whisper heb je alleen het audiogedeelte nodig. ffmpeg converteert het videobestand snel naar een compact MP3-audiobestand.
#!/bin/bash
# ffmpeg audio extractie script
# Extraheer audio uit MP4 (Teams/Zoom/Meet opname):
ffmpeg -i vergadering.mp4 -vn -acodec mp3 -ab 128k vergadering_audio.mp3
# Verklaring van de opties:
# -i vergadering.mp4 : inputbestand
# -vn : geen video (video negeren)
# -acodec mp3 : audio codec MP3
# -ab 128k : bitrate 128 kbps (voldoende voor spraak)
# Converteer M4A naar MP3 (iPhone/Mac opname):
ffmpeg -i opname.m4a -acodec mp3 opname.mp3
# Converteer WAV naar MP3 (kleinere bestandsgrootte):
ffmpeg -i opname.wav -acodec mp3 opname.mp3
# Snij eerste 5 minuten uit een lange opname (voor test):
ffmpeg -i vergadering.mp4 -t 300 -vn -acodec mp3 test_5min.mp3
Na conversie transcribeer je het MP3-bestand via Whisper lokaal of via de API. Een uur vergadering levert doorgaans een transcriptie van 6.000 tot 10.000 woorden op, afhankelijk van hoeveel er gepraat werd.
Stap 6: Transcriptie samenvatten met Claude API
Een ruwe transcriptie van een uur vergadering is 8.000 woorden lang en nauwelijks leesbaar. Claude AI is uitstekend in het samenvatten van lange teksten en het extraheren van actiepunten. Combineer Whisper en Claude voor een volledig automatische vergaderings-workflow.
import anthropic
client = anthropic.Anthropic(api_key="jouw-claude-api-key")
def maak_vergaderingsamenvatting(transcriptie: str) -> dict:
"""Maak een gestructureerde samenvatting met actiepunten."""
samenvatting_prompt = f"""Je bent een professionele notulist voor een Nederlands MKB-bedrijf.
Analyseer de volgende vergaderingstranscriptie en maak een gestructureerde samenvatting.
TRANSCRIPTIE:
{transcriptie}
Geef je antwoord in dit exacte format:
## Vergaderingsamenvatting
**Datum:** [als vermeld in transcriptie, anders: onbekend]
**Duur:** [schat op basis van inhoud]
**Deelnemers:** [vermeld namen als ze voorkomen]
### Kernpunten besproken:
[3 tot 5 bullets met de hoofdonderwerpen]
### Besluiten genomen:
[bullets met concrete besluiten]
### Actiepunten:
[elke actiepunt op nieuwe regel: - [Wie] doet [wat] voor [wanneer]]
### Opvolgpunten voor volgende vergadering:
[bullets]"""
bericht = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2000,
messages=[{"role": "user", "content": samenvatting_prompt}]
)
return {
"samenvatting": bericht.content[0].text,
"tokens_gebruikt": bericht.usage.input_tokens + bericht.usage.output_tokens
}
# Volledig gebruik:
transcriptie = open("vergadering_transcriptie.txt").read()
resultaat = maak_vergaderingsamenvatting(transcriptie)
print(resultaat["samenvatting"])
Stap 7: Automatisering met n8n
De echte tijdsbesparing zit in volledige automatisering. Met n8n bouw je een workflow die automatisch getriggerd wordt als er een nieuw vergaderingsbestand in Google Drive verschijnt, de transcriptie en samenvatting aanmaakt, en het resultaat naar Notion of Slack stuurt.
{
"name": "Vergadering Transcriptie Workflow",
"nodes": [
{
"name": "Google Drive Trigger",
"type": "n8n-nodes-base.googleDriveTrigger",
"parameters": {
"folderId": "jouw-google-drive-folder-id",
"event": "fileCreated",
"mimeType": "video/mp4"
}
},
{
"name": "Download Bestand",
"type": "n8n-nodes-base.googleDrive",
"parameters": {
"operation": "download",
"fileId": "={{ $json.id }}"
}
},
{
"name": "Whisper Transcriptie",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.openai.com/v1/audio/transcriptions",
"authentication": "headerAuth",
"headers": {
"Authorization": "Bearer jouw-openai-api-key"
},
"sendBody": true,
"bodyContentType": "multipart-form-data",
"bodyParameters": {
"model": "whisper-1",
"language": "nl",
"file": "={{ $binary.data }}"
}
}
},
{
"name": "Claude Samenvatting",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.anthropic.com/v1/messages",
"headers": {
"x-api-key": "jouw-claude-api-key",
"anthropic-version": "2023-06-01"
},
"body": {
"model": "claude-sonnet-4-5",
"max_tokens": 1500,
"messages": [{
"role": "user",
"content": "Maak een samenvatting met actiepunten van: {{ $json.text }}"
}]
}
}
},
{
"name": "Stuur naar Slack",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#vergaderingen",
"text": "Nieuwe vergaderingsamenvatting:\n{{ $json.content[0].text }}"
}
}
]
}
Stel de workflow in als volgt: Google Drive trigger op de map 'Vergaderingen'. Zodra er een MP4-bestand verschijnt, stuurt n8n het naar Whisper, vervolgens naar Claude voor de samenvatting, en stuurt het resultaat als bericht naar Slack of als nieuwe pagina naar Notion.
Stap 8: Whisper lokaal vs API, kosten vergelijking
Lokaal draaien is gratis maar vereist een computer met voldoende RAM en optioneel een GPU. Via de API betaal je per minuut maar heb je geen hardware-vereisten.
Lokaal (small model, moderne laptop zonder GPU): gratis na installatie. Verwerking van 60 minuten audio duurt 15 tot 25 minuten op een CPU. Geschikt voor sporadisch gebruik of wanneer privacy vereist is.
Lokaal (large model, met GPU): gratis na installatie. Verwerking van 60 minuten audio duurt 3 tot 5 minuten. Hoogste kwaliteit, maximale privacy.
Via API (whisper-1): 0,006 dollar per minuut audio. Een uur vergadering kost 0,36 dollar. 20 vergaderingen per maand: 7,20 dollar. Geen hardware-investering, altijd beschikbaar, sneller dan lokale CPU.
Aanbeveling: gebruik de API voor dagelijks gebruik in een MKB-context. De kosten zijn verwaarloosbaar in vergelijking met de tijdsbesparing. Gebruik lokale verwerking alleen als privacy een harde eis is.
Stap 9: Privacy overwegingen
Bij vertrouwelijke vergaderingen, gesprekken met klanten of strategische sessies wil je misschien niet dat audio naar OpenAI-servers gaat. In dat geval is lokale verwerking de juiste keuze.
Whisper lokaal draaien betekent dat je audio nooit de computer verlaat. Het model draait volledig offline, geen internetverbinding vereist na installatie. Dit is de juiste keuze voor medische, juridische of financieel-gevoelige gesprekken.
Wil je toch de API gebruiken maar moet het GDPR-compliant zijn? OpenAI verwijdert API-ingevoerde data na 30 dagen en gebruikt die niet voor model-training. Controleer wel of je bewerkersovereenkomst (DPA) met OpenAI is afgesloten, dit is verplicht onder de AVG voor zakelijk gebruik.
Praktische regel: voor interne teamvergaderingen mag de API. Voor gesprekken met klanten of gesprekken over gevoelige bedrijfsinfo: gebruik lokale verwerking of zorg dat je DPA op orde is.
Stap 10: Batch-verwerking van meerdere bestanden
Heb je een archief van oude vergaderingen of wil je meerdere bestanden in een keer verwerken? Gebruik dit Python script voor batch-verwerking via de Whisper API.
#!/usr/bin/env python3
"""Batch transcriptie van meerdere audiobestanden via Whisper API + Claude samenvatting."""
import os
import openai
import anthropic
from pathlib import Path
OPENAI_KEY = os.environ.get("OPENAI_API_KEY")
CLAUDE_KEY = os.environ.get("ANTHROPIC_API_KEY")
openai_client = openai.OpenAI(api_key=OPENAI_KEY)
claude_client = anthropic.Anthropic(api_key=CLAUDE_KEY)
AUDIO_MAP = [".mp3", ".mp4", ".m4a", ".wav", ".flac", ".ogg", ".webm"]
def transcribeer(pad: Path) -> str:
"""Transcribeer een enkel audiobestand."""
print(f"Transcriberen: {pad.name}")
with open(pad, "rb") as f:
resultaat = openai_client.audio.transcriptions.create(
model="whisper-1",
file=f,
language="nl"
)
return resultaat.text
def samenvat(transcriptie: str, bestandsnaam: str) -> str:
"""Samenvat de transcriptie met Claude."""
bericht = claude_client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1500,
messages=[{
"role": "user",
"content": f"Maak een beknopte samenvatting met actiepunten van deze vergadering ({bestandsnaam}):\n\n{transcriptie[:8000]}"
}]
)
return bericht.content[0].text
def verwerk_map(invoer_map: str, uitvoer_map: str = "transcripties"):
"""Verwerk alle audiobestanden in een map."""
invoer = Path(invoer_map)
uitvoer = Path(uitvoer_map)
uitvoer.mkdir(exist_ok=True)
bestanden = [f for f in invoer.iterdir() if f.suffix.lower() in AUDIO_MAP]
print(f"Gevonden: {len(bestanden)} audiobestanden")
for bestand in bestanden:
uitvoer_pad = uitvoer / f"{bestand.stem}_transcriptie.txt"
if uitvoer_pad.exists():
print(f"Overgeslagen (al verwerkt): {bestand.name}")
continue
try:
transcriptie = transcribeer(bestand)
samenvatting = samenvat(transcriptie, bestand.name)
inhoud = f"# Transcriptie: {bestand.name}\n\n## Samenvatting\n{samenvatting}\n\n## Volledige transcriptie\n{transcriptie}"
uitvoer_pad.write_text(inhoud, encoding="utf-8")
print(f"Klaar: {uitvoer_pad.name}")
except Exception as e:
print(f"Fout bij {bestand.name}: {e}")
print(f"\nBatch verwerking voltooid. Resultaten in: {uitvoer_map}/")
if __name__ == "__main__":
import sys
map_pad = sys.argv[1] if len(sys.argv) > 1 else "."
verwerk_map(map_pad)
Troubleshooting
Probleem 1: 'ffmpeg not found'. Oplossing: ffmpeg is niet geinstalleerd of staat niet in je PATH. Op macOS: brew install ffmpeg. Op Windows: download ffmpeg.exe en voeg de bin-map toe aan je systeem PATH-variabele. Herstart daarna je terminal.
Probleem 2: Taal wordt niet herkend of uitkomst is in het Engels. Oplossing: voeg altijd --language nl toe aan je Whisper-commando. Zonder taalspecificatie detecteert Whisper de taal automatisch, wat bij korte fragmenten minder betrouwbaar is.
Probleem 3: 'CUDA out of memory' of model te groot voor RAM. Oplossing: gebruik een kleiner model. Vervang --model large door --model small of --model base. Alternatief: gebruik de Whisper API in plaats van lokale verwerking.
Probleem 4: API quota overschreden of 429-fout. Oplossing: de Whisper API heeft een limiet op gelijktijdige verzoeken. Voeg een time.sleep(1) toe tussen API-calls in je batch-script, of vraag OpenAI om een hogere ratelimit-tier.
Uitbreidingen en vervolgstappen
Whisper met Diarization (sprekers onderscheiden): combineer Whisper met pyannote-audio voor sprekeridentificatie. De output toont dan 'Spreker A: ...' en 'Spreker B: ...' in plaats van een ongesorteerde tekststroom. Dit is bijzonder nuttig voor klantgesprekken of sales calls.
Real-time transcriptie: voor live vergaderingen kun je Whisper combineren met een streaming-setup via de sounddevice Python library. Je transcribeert dan in chunks van 5 seconden terwijl de vergadering bezig is.
Integratie met CRM: koppel de transcriptie en samenvatting via n8n of Make direct aan je CRM. Na een klantgesprek verschijnt de samenvatting automatisch in het klantdossier in Pipedrive, HubSpot of Salesforce.