Skip to content

fr LLM Diarization

rcspam edited this page Aug 30, 2026 · 10 revisions

🌐 Langue : English | Français

Analyse LLM de la diarisation

Après une diarisation, dictée peut lancer un LLM configurable (Ollama local, API compatible OpenAI ou Anthropic) sur la transcription diarisée pour produire une synthèse, un sommaire chapitré, des corrections d'erreurs ASR, ou n'importe quel format que tu définis toi-même.

Chaque résultat apparaît dans un nouvel onglet à côté de la transcription brute — l'original n'est jamais modifié.

La sortie est toujours dans ta langue native (DICTEE_LANG_SOURCE de dictee.conf), même si l'enregistrement est dans une autre langue. Tu la règles dans dictee-setupTraductionLangue source — ce combo sert aussi à la dictée, donc tu le changes une fois et ça s'applique partout.

Ouvrir la page LLM Diarization

Dans dictee-setup, sidebar → LLM Diarization :

Page LLM Diarization dans dictee-setup

Deux boutons : Manage providers… et Manage profiles…. Configure les providers d'abord, puis les profils.

Gérer les providers

Les providers sont les endpoints LLM (Ollama, OpenAI, Groq, Anthropic, …). dictée fournit des built-ins ; tu peux aussi ajouter les tiens.

Dialog Manage providers

Ajouter un provider

Clique sur Add… pour ouvrir l'éditeur. Choisis un Preset (Ollama local/cloud, LM Studio, Jan, vLLM, OpenAI, Groq, Google Gemini, Anthropic) — type, URL et schéma d'auth sont remplis automatiquement.

Dialog d'ajout de provider avec presets

Le champ API key est toujours éditable. Test dans la liste pingue le serveur et affiche la liste des modèles disponibles — pratique pour confirmer le nom exact.

Éditer / supprimer

Sélectionne un provider et clique sur Edit… ou Delete. Les built-ins peuvent aussi être édités (URL, clé, override modèle) — leur nom et type restent figés, ce qui garantit qu'une réinstallation restaure la version canonique.

Dialog d'édition de provider

N'oublie pas Save & Close — Cancel jette les modifications.

Fenêtre de contexte — où la régler selon le backend

Les transcriptions diarisées grossissent avec la durée audio : ~10–15 k tokens pour 30 min, plus pour des fichiers longs. Si la fenêtre de contexte du modèle est trop petite, il ne voit que les premières minutes et l'analyse part en silence dans le décor (Gemma 4B est plafonné à 2048 tokens par défaut — le reste de l'audio est simplement ignoré).

Où régler la fenêtre de contexte selon le backend :

Backend Comment augmenter la fenêtre
Ollama (local + Cloud) Champ Context window dans le dialog Edit Provider de dictee. Défaut 16384, à pousser à 32768+ pour des transcripts > 1 h.
LM Studio Au chargement du modèle, dans l'UI LM Studio : Server → My Models → ⚙ → Context Length. Mettre ≥ 16384.
Jan Au chargement du modèle : carte du modèle → Settings → Context Length. Mettre ≥ 16384.
vLLM Flag de boot du serveur : --max-model-len 16384 (ou plus).
OpenAI / Groq / Anthropic / Gemini Fixé par le modèle : gpt-4o = 128 k, Claude = 200 k, Llama-Groq = 8 k–32 k. Le champ dans dictee est masqué pour ces backends — rien à régler côté client.

Le champ Context window dans le dialog Edit Provider n'apparaît que pour Ollama, car c'est le seul backend dont l'API expose un paramètre num_ctx par appel. Pour les autres, la limite est fixée au boot du serveur ou par l'architecture du modèle elle-même.

Désactiver le « thinking » (modèles raisonnants)

Les modèles dits reasoning (qwen3, deepseek-r1, gpt-oss…) produisent par défaut un long bloc <think>…</think> avant leur vraie réponse. Pour une synthèse ou un chapitrage, ce préambule est du bruit qui rallonge le rendu et brouille la sortie.

La case Disable thinking (visible pour Ollama uniquement, juste en dessous de la fenêtre de contexte) coche think: false dans le payload — le modèle saute directement à la réponse. À laisser cochée pour les profils d'analyse classiques ; à décocher si tu veux voir le raisonnement (debug d'un prompt, par exemple).

Gérer les profils

Un profil bundle un prompt + mode + type de transcription + provider/modèle par défaut. Six sont fournis, les mêmes trois analyses en deux versions :

Profil Type de transcription Mode Ce qu'il fait
Synthèse / compte-rendu diarisé global Markdown : Résumé / Décisions / Actions / Questions ouvertes
Chapitrage diarisé global Liste [HH:MM:SS] Titre, ~1 toutes les 2-5 min
Correction ASR contextuelle diarisé per-segment Transcription diarisée nettoyée (un appel LLM par tour de parole)
Synthèse / compte-rendu (texte brut) texte brut global Même synthèse, pour une transcription sans locuteurs
Chapitrage (texte brut) texte brut global Mêmes chapitres, sans timestamps pour les ancrer
Correction ASR (texte brut) texte brut global Nettoie tout le texte en un seul appel

Dialog d'édition de profil

La liste des modèles est auto-peuplée à l'ouverture du dialog (plus besoin de cliquer Refresh).

Les profils built-in sont partiellement figés : le nom, le mode et le prompt ne sont pas éditables, mais tu peux changer leur provider et modèle par défaut. Ces deux réglages sont enregistrés en builtin_overrides dans llm-profiles.json et survivent à une réinstallation. Pour changer autre chose, clique sur Duplicate et édite la copie.

Diarisé ou texte brut

Chaque profil déclare un type de transcription, et dictee-transcribe ne propose que les profils correspondant à l'onglet où tu te trouves :

Type de transcription Visible sur Ce que reçoit le prompt dans {TRANSCRIPT}
Diarisé onglets produits avec diarisation [Speaker 1] (00:01:23 → 00:01:25): texte, un bloc par tour de parole
Texte brut onglets produits sans diarisation le texte brut, sans labels ni timestamps

Le filtre marche dans les deux sens : un profil diarisé n'apparaît jamais sur un onglet en texte brut, et inversement. Si un profil que tu viens de créer manque dans la liste déroulante, c'est presque toujours ça.

Deux conséquences pratiques :

  • Un prompt écrit pour du diarisé devrait préciser que les préfixes [Speaker N] sont de la mise en forme, sinon certains modèles les recopient dans leur réponse.
  • Une analyse que tu veux sur les deux types de transcription demande deux profils, un de chaque type. C'est pour ça que les built-in vont par paires.

À noter, Correction ASR (texte brut) est en mode global et non per-segment : sans tours de parole, il n'y a rien sur quoi découper, donc tout le texte part en un seul appel.

Import et export

Le dialog des profils a des boutons Import et Export, pour déplacer un profil d'une machine à l'autre ou le partager.

  • Export écrit le profil sélectionné dans un .json. Le flag builtin est retiré, donc un built-in exporté revient sous forme de copie éditable. Un profil ne contient jamais de clé API, elles vivent dans llm-providers.json.
  • Import accepte un objet unique, une liste, ou un wrapper {"profiles": [...]}. Tout ce qui n'a pas de clé prompt est ignoré. Un id en collision est suffixé (-2, -3), un import n'écrase donc jamais un profil existant. Clique sur Save pour enregistrer.

Le dépôt dictee fournit des exemples importables dans docs/llm-profiles/, avec un README qui décrit le format JSON. Ce sont des exemples, rien n'est installé automatiquement.

Écrire ton propre prompt

Un profil n'est rien d'autre qu'un template de prompt envoyé au LLM. dictée y substitue quelques variables avant l'envoi — c'est comme ça que le modèle voit la transcription diarisée.

Variable Remplacée par Quand l'utiliser
{TRANSCRIPT} La transcription diarisée complète (ou un segment en mode per-segment) Obligatoire — c'est le texte que le LLM analyse
{PREVIOUS_SEGMENT} Le tour de parole précédent per-segment uniquement — donne le contexte au LLM pour la correction ASR
{DICTIONARY} Ton dictionnaire utilisateur (fourni via CLI --dictionary) Optionnel — utile pour des noms / jargon spécifiques au projet

Deux modes — choisis-en un dans le dropdown Mode :

  • global — un seul appel LLM avec toute la transcription dans {TRANSCRIPT}. Bien pour synthèses, chapitrages, listes d'actions.
  • per-segment — un appel LLM par tour de parole. {TRANSCRIPT} contient alors le texte d'un seul segment ; {PREVIOUS_SEGMENT} te donne le tour précédent pour le contexte. Bien pour corriger les erreurs ASR sans fusionner les locuteurs.

Template squelette (ce que tu obtiens en cliquant Add…) :

<role>
Tu es un assistant expert qui…
</role>
<instructions>
- point 1
- point 2
</instructions>
<input>
{TRANSCRIPT}
</input>

Les balises <role> / <instructions> / <input> ne sont pas interprétées — c'est juste une structure propre qui aide le LLM à parser ton intention.

Exemple concret — actions de réunion, mode global :

<role>
Tu es un assistant qui extrait les actions à faire d'une transcription diarisée de réunion.
</role>
<instructions>
- Pour chaque locuteur, liste les actions qu'IL s'est engagé à faire (« je vais… », « on fera… »).
- Groupe par locuteur. Une puce par action.
- Si un locuteur n'a pris aucune action, écris « _Aucune_ ».
- Conserve les dates et les chiffres verbatim.
</instructions>
<input>
{TRANSCRIPT}
</input>

Exemple concret — nettoyage ASR, mode per-segment :

<role>
Tu es un assistant de correction ASR. Tu reçois un tour de parole à la fois.
</role>
<instructions>
- Corrige les erreurs évidentes de transcription (homophones, accents manquants, ponctuation).
- NE reformule PAS, NE réordonne PAS. N'ajoute aucun mot.
- Donne UNIQUEMENT le texte corrigé, sans préambule ni guillemets.
- Si le segment paraît correct, sors-le tel quel.
</instructions>
<context>
Tour précédent (à ne pas inclure dans ta sortie) : {PREVIOUS_SEGMENT}
</context>
<input>
{TRANSCRIPT}
</input>

La langue de sortie est forcée sur ton DICTEE_LANG_SOURCE quoi que dise le prompt — même un prompt entièrement en anglais produira une réponse dans ta langue native. Tu peux donc écrire <role> / <instructions> dans la langue que tu préfères.

Conseils :

  • Mentionne explicitement le format de sortie attendu (markdown ? liste à puces ? titres par locuteur ?). Les LLM suivent les exemples ; montre, ne te contente pas de dire.
  • Pour les usages sensibles, ajoute Ne rien inventer. ou Si tu hésites, écris "_à clarifier_".
  • Clique sur Duplicate sur un built-in pour partir d'un prompt qui marche déjà au lieu du squelette vide.

Lancer une analyse

Une fois providers et profils configurés, ouvre dictee-transcribe, charge un audio, lance une diarisation, puis clique sur LLM analysis… à côté des boutons Export.

  1. Choisis un Profil — le dialog auto-sélectionne son Provider + Modèle préférés.
  2. Modifie Provider ou Modèle si tu veux ; le bouton 🔄 Refresh retire la liste des modèles avec retour explicite.
  3. Clique sur Generate. Un nouvel onglet LLM: <profil> apparaît tout de suite avec un spinner braille (⠋⠙⠹⠸…) ; il s'arrête quand le résultat tombe.
  4. Tu peux lancer plusieurs analyses sur la même transcription — chacune dans son onglet.

Si tu as renommé Speaker 1 → Alice dans l'accordéon de renommage, le LLM reçoit [Alice] à la place — pratique pour les prompts du type « qui a dit quoi ».

Annulation : ferme l'onglet de résultat (ou clique sur la croix) pendant que le LLM génère sa réponse, et le streaming HTTP est aussitôt coupé. Pas de tokens cloud (OpenAI / Anthropic / Groq) brûlés en arrière-plan, et la GPU est libérée immédiatement côté Ollama.

Exporter le résultat

Sur n'importe quel onglet LLM, clique sur Export… pour sauver en Markdown (.md) ou PDF avec nom de fichier et dossier éditables. Le PDF est rendu via QTextDocument.setMarkdown() + QPrinter — même rendu que l'onglet à l'écran.

Conseils & limites

  • La langue de sortie est forcée sur DICTEE_LANG_SOURCE (ta langue native). Si tu transcris du contenu anglais mais veux une synthèse française, ça marche tel quel.
  • LLM local + diarisation sur la même GPU : lance la diarisation d'abord, puis le LLM — le pipeline diarisation/transcription libère sa VRAM avant l'appel LLM, ils ne se disputent donc pas la mémoire.
  • Endpoints derrière Groq / Cloudflare : dictée envoie User-Agent: dictee/1.3 … pour éviter les 403.

Et après

  • fr-dev-LLM-Diarization — internals : chemins de stockage, schéma JSON, variables de prompt, CLI, dépannage complet.

📖 dictee Wiki

🇬🇧 Home · 🇫🇷 Accueil


Getting started / Premiers pas

Speech recognition / ASR

Translation / Traduction

Post-processing / Post-traitement

CLI

Reference / Référence


🏠 Repo · 📦 Releases · 🐛 Issues

Clone this wiki locally