Ga naar hoofdinhoud

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)

  1. Kies bron, device en taal.
  2. Klik Start om op te nemen.
  3. Tijdens opname verschijnen transcriptieregels live.
  4. Klik Stop om opname af te sluiten; sessie wordt opgeslagen en titel automatisch gegenereerd.
  5. 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.json
  • GovChat-NL-LibreChat/n8n/bootstrap/workflows/transcriptie-title-litellm.json

Opbouw:

  1. Webhook Transcriptie ontvangt JSON
  2. Body To Binary Audio zet audio_base64 om naar binary
  3. Call Transcriptions API doet multipart upload naar LiteLLM

Titelworkflow:

  1. Webhook Transcriptie Titel ontvangt tekst + taal + model
  2. Prompting naar compacte, leesbare sessietitel
  3. 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 error veld
  • niet-lege transcriptietekst