Skip to content

fr dev Diarization

rcspam edited this page May 12, 2026 · 2 revisions

🌐 Langue : English | Français

Diarisation — référence développeur

Intro utilisateur : fr-Diarization.

Modèle Sortformer

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.

VRAM & limites de durée

Mode streaming (transcribe-stream-diarize, EN seul via Nemotron)

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.

Mode batch chunked (transcribe-diarize-batch, défaut UI)

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 :

  1. Sortformer une fois sur l'audio complet (streaming, sans cap)
  2. Chunk l'audio en segments de 10 min avec overlap, via ffmpeg
  3. Parakeet-TDT par chunk (transcribe-diarize-batch --no-diarize)
  4. 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)

Binaires CLI

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 fr

Sortie sur stdout.

Formats de sortie

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

Fusion des locuteurs entre chunks

Utilisé par transcribe-diarize-batch :

  1. Sortformer une fois sur l'audio complet → timestamps globaux
  2. Chunk l'audio (10 min, 10 s d'overlap)
  3. Parakeet-TDT par chunk → timestamps token-level
  4. Pour chaque mot transcrit, lookup son locuteur global via la sortie Sortformer (argmax overlap)
  5. Emit avec labels Speaker N cohérents

Source : src/bin/transcribe_diarize_batch.rs.

Pourquoi le post-traitement est contourné

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.

Pipeline (Mermaid)

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"]
Loading

Voir aussi

📖 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