Live transcriptie
De Live transcriptie mini-app zet gesproken audio in bijna realtime om naar tekst via n8n en LiteLLM.
Functionaliteit
- Bronkeuze: Microfoon of Systeemgeluid (tab/scherm)
- Microfoonselectie + knop Ververs voor device-lijst
- Taalkeuze (NL/EN/FR/DE/NL-BE/IT/ES/PT/PL/TR/AR + custom default)
- Slimme chunking met stilte-detectie (VAD) + overlap
- Live transcriptieregels tijdens opname + audio-wave visualisatie
- Timestamps aan/uit
- Acties: Start, Stop, Kopieer, Nieuwe sessie
- Sessiehistorie met opslaan, openen, hernoemen, opnieuw titel genereren, verwijderen, sorteren
- Automatische titelgeneratie na stoppen via aparte LLM webhook
- Duidelijke statusweergave: opname actief, opname gestopt, titel wordt (opnieuw) gegenereerd
Bedieningsflow (UI)
- Kies bron, device en taal.
- Klik Start om op te nemen.
- Tijdens opname verschijnen transcriptieregels live.
- Klik Stop om opname af te sluiten; sessie wordt opgeslagen en titel automatisch gegenereerd.
- Gebruik in de historie:
- Open om sessie terug te laden,
- Hernoem voor handmatige titel,
- Genereer titel opnieuw voor nieuwe LLM-titel,
- Verwijder om sessie te verwijderen.
De tijdelijke melding “titel wordt … gegenereerd” staat alleen als subtitel/status, niet als definitieve sessietitel.
API-route
De app stuurt chunks naar:
POST /n8n/webhook/transcriptie-litellm
Request payload
{
"audio_base64": "<base64-audio>",
"mime_type": "audio/webm",
"chunk_index": 0,
"session_id": "tr-123",
"model": "whisper",
"language": "nl"
}
Sessiehistorie (productie)
De mini-app gebruikt een trusted backend-route voor historie:
GET/POST/PATCH/DELETE /govchat-api/transcript-sessions
Eigenschappen:
- gekoppeld aan ingelogde LibreChat-gebruiker (server-side validatie),
- multi-device consistent,
- metadata per sessie (duur, woorden, bron, taal),
- sorteerbaar en bewerkbaar in de UI.
Ondersteunde sorteermodi in de UI
- Nieuw → oud
- Oud → nieuw
- Langste duur
- Meeste woorden
- Titel (A-Z)
Titelgeneratie (LLM)
Na Stop wordt de sessietitel asynchroon gegenereerd via:
POST /n8n/webhook/transcriptie-title-litellm
Voorbeeld payload:
{
"text": "<volledige transcriptietekst>",
"language": "nl",
"model": "govchat-default",
"max_chars": 72
}
Voorbeeld response:
{
"title": "Korte, duidelijke vergadertitel"
}
Fallback-gedrag:
- Bij timeout/fout valt de app terug op een afgeleide titel uit transcriptietekst.
- Handmatige hernoeming wordt niet overschreven wanneer gebruiker intussen zelf een titel zet.
n8n workflow (huidige implementatie)
De bootstrap-workflow staat in:
GovChat-NL-LibreChat/n8n/bootstrap/workflows/transcriptie-litellm.jsonGovChat-NL-LibreChat/n8n/bootstrap/workflows/transcriptie-title-litellm.json
Opbouw:
- Webhook Transcriptie ontvangt JSON
- Body To Binary Audio zet
audio_base64om naar binary - Call Transcriptions API doet multipart upload naar LiteLLM
Titelworkflow:
- Webhook Transcriptie Titel ontvangt tekst + taal + model
- Prompting naar compacte, leesbare sessietitel
- Response met
title
LiteLLM call
- Endpoint:
POST /v1/audio/transcriptions - Multipart velden:
file,model,language
De workflow gebruikt native n8n nodes voor deze route, zonder Code-node afhankelijkheid in de transcriptieketen.
Voorbeeld app-configuratie
{
"id": "transcriptie",
"name": "Live transcriptie",
"icon": "🎙️",
"description": "Live spraak-naar-tekst met slimme chunking en sessiehistorie",
"url": "/n8n/webhook/transcriptie-litellm",
"target": "transcriptie",
"config": {
"webhook_token": "local_n8n_webhook_token_change_me",
"chunk_ms": 5000,
"chunk_min_ms": 2200,
"chunk_max_ms": 20000,
"vad_silence_ms": 900,
"silence_threshold": 0.012,
"overlap_ms": 650,
"litellm_model": "whisper",
"language": "nl",
"include_timestamps": true,
"max_duration_minutes": 120,
"transcript_sessions_api": "/govchat-api/transcript-sessions",
"title_webhook": "/n8n/webhook/transcriptie-title-litellm",
"title_webhook_token": "local_n8n_webhook_token_change_me",
"title_model": "govchat-default",
"title_max_chars": 72,
"title_timeout_ms": 6000
}
}
Validatie
De functionele validatie kan worden uitgevoerd met:
GovChat-NL-LibreChat/tests/transcript/run-validation.js
Pass-criteria:
- HTTP success
- geen
errorveld - niet-lege transcriptietekst