-
Notifications
You must be signed in to change notification settings - Fork 3
fr dev Diarization
π Langue : English | FranΓ§ais
Intro utilisateur : fr-Diarization.
Sortformer de NVIDIA (ONNX), diarisation neuronale end-to-end mono-transformer. Streame nativement par chunks de 10 s avec overlap. PlafonnΓ© dur Γ 4 locuteurs (propriΓ©tΓ© du modΓ¨le, pas un paramΓ¨tre). Agnostique Γ la langue. ImplΓ©mentation Rust dans src/sortformer.rs via ONNX Runtime ; backend CUDA avec fallback CPU silencieux (diarize_only.rs:122-128) β 5β10Γ plus lent en CPU.
Pipeline maison sans plafond de nombre de locuteurs, inspirΓ© de speakrs (Apache-2.0, crΓ©ditΓ© dans NOTICE) : pyannote segmentation-3.0 (ONNX) β dΓ©codage powerset β embeddings WeSpeaker ResNet34 (ONNX) β clustering AHC + PLDA + VBx β tours de parole. AlgΓ¨bre linΓ©aire en Rust pur (src/diar/linalg.rs, nalgebra) β dΓ©libΓ©rΓ©ment aucun BLAS/LAPACK dans l'arbre de dΓ©pendances. BenchΓ© Γ paritΓ© DER exacte avec le pipeline Python pyannote community-1 (7,9 / 13,2 DIHARD sur les sous-ensembles AISHELL-4 / VoxConverse, contre 27,4 / 26,5 pour Sortformer).
-
Binaire :
diarize-multi [--num-speakers N] [--threshold 0.0-2.0] [--models-dir DIR] [--rttm ID] <audio>β mΓͺme contrat stdout quediarize-only(start end speaker_idpar ligne), donc remplaΓ§ant direct dans les pipelines two-phase. NΓ©cessite la feature cargodiar. -
Modèles : ~57 Mo, téléchargés depuis
dictee-setup(Β« Diarisation multi-locuteurs Β»), installΓ©s dans~/.local/share/dictee/diarou/usr/share/dictee/diar(sentinelle :segmentation-3.0.onnx). -
Routage : quand binaire + modèles sont présents,
dictee-transcribeprΓ©fΓ¨rediarize-multiΓdiarize-onlypour la diarisation de fichiers (phase 2 du chunked et two-phase). Le mode Meeting en direct garde Sortformer (streaming ; ce moteur est offline par nature). Le slider Seuil de l'UI correspond au seuil de distance AHC (slider/100 Γ 1,2, 50 % β 0,6). - Performances : RTF GPU ~0,075 (262 s diarisΓ©es en ~20 s sur une RTX 4070 laptop) ; RTF CPU ~0,9. Sur les fichiers longs, c'est le clustering (CPU) qui domine.
-
--num-speakersimpose le nombre exact de locuteurs (coupe du dendrogramme AHC par comptage). Le mode auto est le dΓ©faut et fait gΓ©nΓ©ralement mieux qu'un nombre imposΓ©.
| DurΓ©e audio | Pic VRAM |
|---|---|
| 1 min β¦ 10 h | ~1,2 GB (constant) |
Pas de limite de durΓ©e effective ; la mΓ©moire est bornΓ©e par la taille du chunk.
Le transcribe-diarize mono-coup fait tourner Parakeet sur le mel complet en une passe β Parakeet seul heurte un plafond dur ~5:20 min sur tout GPU Γ cause d'un attention-mask Γ shape fixe dans l'export ONNX du Parakeet-TDT v3 (indΓ©pendant de la VRAM). Le pipeline chunked transcribe-diarize-batch garde chaque chunk sous 320 s et lΓ¨ve le plafond. Depuis v1.3.4, l'interface dictee-transcribe route automatiquement tout fichier plus long qu'un chunk par lui, quel que soit le paquet GPU ou l'Γ©tat du toggle diarize.
Pipeline :
- Sortformer une fois sur l'audio complet (streaming, sans cap)
- Chunk l'audio en segments de 10 min avec overlap, via
ffmpeg - Parakeet-TDT par chunk (
transcribe-diarize-batch --no-diarize) - Fusion des labels via les timestamps globaux Sortformer (argmax overlap)
Validations terrain :
- Keynote 29 min, CUDA 8 GB β 04:56
- Keynote 54 min, 3 locuteurs, RTX 4070 (8 GB) β 122 s, 94 % de prΓ©cision vs ground truth
Edge cases :
- 4 GB VRAM, ou 8 GB avec Ollama dΓ©jΓ chargΓ© β Parakeet OOM (pas encore de garde min-VRAM)
- Token tombant dans un silence entre deux segments globaux Sortformer β taguΓ©
UNKNOWN: <texte>(prΓ©visible, non bloquant)
| Binaire | Usage | Backend ASR | Streaming | DurΓ©e max |
|---|---|---|---|---|
transcribe-diarize |
Fichier, mono-coup | Parakeet-TDT | β | ~5:20 min (bug attention-mask ONNX, tout GPU) |
transcribe-stream-diarize |
Fichier, streaming | Nemotron (EN) | β | illimitΓ© |
transcribe-diarize-batch |
Fichier, chunked | Parakeet-TDT | β chunked | illimitΓ© |
transcribe-diarize meeting.wav \
--sortformer-model /usr/share/dictee/sortformer/ \
--parakeet-model /usr/share/dictee/tdt/ \
--lang frSortie sur stdout.
Format texte par dΓ©faut, ligne par locuteur :
Speaker 1: Bonjour Γ tous, on commence la revue trimestrielle.
Speaker 2: Merci, on attaque par les chiffres ?
Speaker 3: Question rapide β l'appel est enregistrΓ© ?
Flags CLI :
-
--format=rttmβ IDs locuteurs frame-level (format diarisation standard) -
--format=jsonβ timestamps + IDs + confidence -
--format=srtβ sous-titres avec timestamps
UtilisΓ© par transcribe-diarize-batch :
- Sortformer une fois sur l'audio complet β timestamps globaux
- Chunk l'audio (10 min, 10 s d'overlap)
- Parakeet-TDT par chunk β timestamps token-level
- Pour chaque mot transcrit, lookup son locuteur global via la sortie Sortformer (argmax overlap)
- Emit avec labels
Speaker NcohΓ©rents
Source : src/bin/transcribe_diarize_batch.rs.
Le mode Meeting saute entièrement le pipeline en 12 étapes :
| Γtape | Pourquoi Γ§a casserait la diarisation |
|---|---|
| 5/7. Règles regex | Commandes vocales insérées dans le mauvais tour |
| 6. Correction LLM | Reflow du texte, fusion des tours en monologue |
| 8/9. Keepcaps | Gestion d'acronymes par phrase, pas par locuteur |
| 10. Capitalisation | Conflit dΓ©but-de-phrase / dΓ©but-de-tour |
| 11. Traduction | Traduction multi-locuteurs rarement cohΓ©rente |
Seuls le nettoyage d'espaces, l'insertion du prΓ©fixe locuteur et le \n final sont conservΓ©s.
Pour une sortie polie, voir Analyse LLM de la diarisation β conΓ§ue spΓ©cifiquement pour ce cas.
flowchart TB
A["π Audio (N locuteurs)"] --> B["Sortformer<br/>(streaming, chunks 10s)"]
B --> C1["Timestamps locuteur 1"]
B --> C2["Timestamps locuteur 2"]
B --> C3["Timestamps locuteur 3"]
B --> C4["Timestamps locuteur 4"]
C1 --> D["Parakeet-TDT<br/>(transcription)"]
C2 --> D
C3 --> D
C4 --> D
D --> E["Fusion par timestamps<br/>(argmax overlap)"]
E --> F["Speaker 1: texte<br/>Speaker 2: texte<br/>Speaker 3: texte"]
- fr-Parakeet-TDT-Deep-Dive#vram-usage--duration-limits β contexte VRAM
- fr-Post-Processing-Overview#diarization-bypass β rationale complet du bypass
- fr-CLI-Reference#transcribe-diarize β flags exhaustifs
- fr-Troubleshooting β soucis spΓ©cifiques diarisation
π¬π§ Home Β· π«π· Accueil
Getting started / Premiers pas
- Installation Β· π¬π§ Β· π«π·
- Setup-Wizard Β· π¬π§ Β· π«π·
- Configuration Β· π¬π§ Β· π«π·
- Plasmoid-Widget Β· π¬π§ Β· π«π·
- Tray-Icon Β· π¬π§ Β· π«π·
- Keyboard-Shortcuts Β· π¬π§ Β· π«π·
- Voice-Commands Β· π¬π§ Β· π«π·
- GPU-Setup Β· π¬π§ Β· π«π·
- Diarization Β· π¬π§ Β· π«π·
- LLM-Diarization Β· π¬π§ Β· π«π·
Speech recognition / ASR
- ASR-Backends Β· π¬π§ Β· π«π·
- Parakeet-TDT-Deep-Dive Β· π¬π§ Β· π«π·
- Canary-1B-Deep-Dive Β· π¬π§ Β· π«π·
Translation / Traduction
Post-processing / Post-traitement
- Overview Β· π¬π§ Β· π«π·
- Rules-and-Dictionary Β· π¬π§ Β· π«π·
- LLM-Correction Β· π¬π§ Β· π«π·
- Numbers-Dates-Continuation Β· π¬π§ Β· π«π·
CLI
Reference / RΓ©fΓ©rence
- Troubleshooting Β· π¬π§ Β· π«π·
- FAQ Β· π¬π§ Β· π«π·
- Developer-Guide Β· π¬π§ Β· π«π·
- Changelog Β· π¬π§ Β· π«π·
π Repo Β· π¦ Releases Β· π Issues