Skip to content

fr Post Processing Overview

rcspam edited this page Apr 24, 2026 · 6 revisions

🌐 Langue : English | Français

Vue d'ensemble du post-traitement

La sortie ASR brute est rarement parfaite. dictée exécute un pipeline configurable qui corrige les erreurs de reconnaissance courantes, applique les règles utilisateur, convertit les nombres et dates, invoque optionnellement un LLM pour un polissage de fluidité, et finalement saisit le résultat dans l'application active.

Chaque Γ©tape est configurable via l'onglet Post-traitement de l'assistant de configuration, et peut Γͺtre testΓ©e en direct via le panneau de test intΓ©grΓ© sans lancer de dictΓ©e rΓ©elle. Cette page donne une vue Γ  vol d'oiseau ; des pages dΓ©diΓ©es couvrent chaque sous-systΓ¨me majeur (Rules-and-Dictionary, LLM-Correction, Numbers-Dates-Continuation).

Parcours des pages Post-traitement de dictee-setup

Table des matières


Diagramme du pipeline

micro Β β†’Β  ASR Β β†’Β  traduction (optionnelle) Β β†’Β  texte final

Signification : πŸŽ™ micro (entrΓ©e audio) β†’ ASR (transcription) β†’ πŸ”€ traduction optionnelle β†’ ✏️ texte final saisi dans l'application active. Les Γ©tapes de post-traitement (dΓ©taillΓ©es plus bas) s'intercalent entre l'ASR et le texte final. C'est exactement le mΓͺme jeu d'icΓ΄nes que la visualisation en haut de l'onglet Post-traitement dans dictee-setup.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Sortie ASR (texte brut + lang)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│ 1. Règles regex (rules.conf)     │
β”‚    β€’ variantes ASR               β”‚
β”‚    β€’ annotations non-parole      β”‚
β”‚    β€’ hΓ©sitations (euh, um…)      β”‚
β”‚    β€’ commandes vocales           β”‚
β”‚    β€’ dedup, ponctuation, cleanup β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2. Rejet langue incorrecte       β”‚
β”‚    (abort si script β‰  langue)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3. Continuation (fusion tampon)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ LLM on ?      β”‚ ← positions : first / hybrid / last
        β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│ 4. Règles linguistiques          │
β”‚    Γ©lisions fr/it, allemand,     β”‚
β”‚    portugais, nΓ©erlandais,       β”‚
β”‚    roumain, typographie fr       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 5. Nombres & dates β†’ chiffres    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 6. Dictionnaire (match exact)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 7. Capitalisation                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 8. Short-text keepcaps           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ Traduire ?    β”‚
        β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”˜
          oui       non
           ↓         ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 9. Traduction + TRPP     β”‚
β”‚    (mΓͺmes Γ©tapes 1-8 sur β”‚
β”‚     le texte traduit)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 10. Saisie dans l'application    β”‚
β”‚     (dotool type par dΓ©faut)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Les Γ©tapes en dΓ©tail

1. Règles regex (rules.conf)

Quoi : un bloc monolithique de regex qui couvre plusieurs transformations :

  • Variantes ASR β€” mappe les variantes textuelles produites par diffΓ©rents backends vers une forme canonique ((?i)\b(cant|can not|can't)\b β†’ can't).
  • Annotations non-parole β€” nettoie les marqueurs Whisper/Parakeet ((rires), [musique], <unk>).
  • HΓ©sitations β€” supprime les tics (franΓ§ais euh, anglais uh/um, allemand Γ€h, etc.).
  • Commandes vocales β€” convertit les Γ©noncΓ©s en symboles (Β« Γ  la ligne Β» β†’ \n, Β« virgule Β» β†’ ,).
  • Dedup / ponctuation / cleanup β€” espaces multiples, ponctuation orpheline en tΓͺte de phrase.

Config : rules.conf (système) et ~/.config/dictee/rules.conf (utilisateur). Voir Rules-and-Dictionary. 7 langues × ~50 règles chacune livrées par défaut.

2. Rejet langue incorrecte

Quoi : si la langue dΓ©clarΓ©e est latine (fr/en/de/es…) mais que le texte contient plus de 50 % de Cyrillique, ou l'inverse, la transcription est rejetΓ©e silencieusement. EmpΓͺche une mauvaise dΓ©tection de langue (frΓ©quente sur dictΓ©e trΓ¨s courte avec Parakeet) de coller un texte non-sens.

Pourquoi : plutôt qu'injecter du Cyrillique à la place d'un « oui » français, on préfère ne rien coller et laisser l'utilisateur recommencer.

3. Continuation (fusion tampon)

Quoi : si la dictΓ©e commence par le mot dΓ©clencheur de continuation (franΓ§ais minuscule, anglais continue, etc.), fusionne avec le tampon de dernier-mot de la dictΓ©e prΓ©cΓ©dente pour continuer la phrase sans capitalisation intempestive.

Pourquoi : les modèles ASR ne voient pas le contexte entre enregistrements séparés. La continuation permet de faire une pause en milieu de phrase et de reprendre naturellement.

Config : mot dΓ©clencheur par langue dans rules.conf. Tampon persistΓ© dans /dev/shm/.dictee_last_word.

DΓ©tails : Numbers-Dates-Continuation#tampon-de-continuation.

4. Règles linguistiques

Quoi : transformations spΓ©cifiques Γ  la langue qui ne tiennent pas dans des regex simples :

  • FranΓ§ais : Γ©lisions (de le β†’ du, je ai β†’ j'ai), typographie (espace insΓ©cable avant : ; ? !)
  • Italien : Γ©lisions (lo amico β†’ l'amico)
  • Espagnol : ¿…? ‘…! en dΓ©but de question/exclamation
  • Portugais / allemand / nΓ©erlandais / roumain : contractions et rΓ¨gles propres Γ  chaque langue

Config : toggles individuels dans l'onglet Post-traitement β†’ Language rules.

5. Nombres & dates β†’ chiffres

Quoi : nombres parlΓ©s β†’ chiffres. Β« vingt-trois Β» β†’ 23, Β« one point three Β» β†’ 1.3, Β« quatorze heures trente Β» β†’ 14 h 30.

Pourquoi : la plupart des applications attendent des chiffres dans les champs. La conversion est consciente de la langue (virgule dΓ©cimale en franΓ§ais, point en anglais).

Config : toggle via wizard. ImplΓ©mentation dans dictee-postprocess (utilise text2num).

DΓ©tails : Numbers-Dates-Continuation.

6. Dictionnaire (match exact)

Quoi : substitutions littérales mot-à-mot, match exact sur les frontières de mot, préserve la casse. Exemple : api → API, chat gpt → ChatGPT.

Pourquoi : les modèles ASR se trompent sur les termes spécifiques au domaine (noms de collègues, noms de code produits, acronymes GPT/SDK/API). Le dictionnaire corrige mot par mot ce que les regex ne couvrent pas.

Config : dictionary.conf. Voir Rules-and-Dictionary.

7. Capitalisation

Quoi : capitalise la première lettre de la sortie. Optionnel : capitalise après . ! ? de fin de phrase.

Pourquoi : Parakeet-TDT produit la capitalisation native, mais les autres backends (Vosk surtout) ne le font pas. Cette Γ©tape normalise.

Config : toggle wizard.

8. Short-text keepcaps

Quoi : sur les dictΓ©es de moins de 3 mots (configurable), deux choses :

  • Retire la ponctuation finale automatique (pas de point sur Β« oui Β» isolΓ©)
  • Conserve la casse utilisateur β€” permet de dicter une correction sans que la capitalisation finale la transforme

Une liste d'exceptions keepcaps (configurable par langue) empΓͺche aussi la mise en minuscules de termes comme GPT-4 ou SDK quelle que soit la longueur de la phrase.

Config : toggle wizard + seuil de mots + dialogue Β« Exceptions keepcaps Β» par langue.

9. Traduction (optionnelle) + TRPP

Quoi : si --translate a été utilisé, envoie le texte entièrement post-traité au backend de traduction choisi, puis relance les étapes 1 à 8 (avec les règles pp_translate_* dédiées) sur le texte traduit — ce sous-pipeline s'appelle TRPP.

Pourquoi : aprΓ¨s post-traitement, le texte source est plus propre β†’ la qualitΓ© de traduction est meilleure. Et le texte traduit bΓ©nΓ©ficie des mΓͺmes corrections (dictionnaire, capitalisation, keepcaps) dans la langue cible.

Config : flag dictee --translate + choix du backend de traduction + bloc TRPP sΓ©parΓ© dans l'onglet Post-traitement.

10. Saisie dans l'application

Quoi : simule l'entrΓ©e clavier via dotool pour taper le texte final dans l'application active.

Pourquoi : fonctionne avec n'importe quelle application, n'importe quel WM, n'importe quel champ de saisie β€” pas besoin de copier/coller via presse-papiers (bien que le paste clipboard soit une route alternative).

Config : rΓ©glage Β« MΓ©thode de collage Β» du wizard. DΓ©faut : dotool type.


Correction LLM β€” position variable (optionnelle)

La correction LLM (Ollama) peut s'insΓ©rer Γ  trois positions au choix dans le pipeline :

  • first β€” juste aprΓ¨s la sortie ASR brute, avant toutes les rΓ¨gles dΓ©terministes
  • hybrid β€” aprΓ¨s les Γ©tapes 1-3 (rΓ¨gles + continuation), avant les rΓ¨gles linguistiques
  • last β€” tout Γ  la fin, aprΓ¨s short-text keepcaps

Le LLM polit l'orthographe, la ponctuation, la grammaire et la fluidité sans changer le sens. Il rattrape des erreurs que les règles regex ne peuvent pas exprimer (accord sujet-verbe, accents manquants, homophones contextuels).

Config : toggle wizard + sΓ©lecteur de position. DΓ©tails : LLM-Correction.


Panneau de test en direct

L'onglet Post-traitement de l'assistant de configuration inclut un panneau de test oΓΉ vous pouvez :

  1. Coller n'importe quel texte ASR brut
  2. Voir comment il se transforme Γ  chaque Γ©tape
  3. Surligner la règle qui a matché (index de règle cliquable)
  4. Tweaker les règles et voir l'effet instantanément (pas de dictée nécessaire)

Le panneau supporte 3 modes :

  • Texte unique : tapez une ligne, voir la sortie
  • Live config : Γ©ditez des rΓ¨gles dans un onglet, voyez l'effet dans un autre
  • Fichier WAV : chargez un vrai fichier audio, voyez le pipeline complet (ASR β†’ post-traitement β†’ sortie)

Captures d'Γ©cran dans le README du projet.


Activer / dΓ©sactiver les Γ©tapes

Toutes les Γ©tapes sont individuellement basculables depuis l'assistant de configuration. Cas utiles :

  • Mode diarisation : le pipeline est entiΓ¨rement contournΓ© (voir ci-dessous)
  • DΓ©boguer une Γ©tape spΓ©cifique : dΓ©sactivez tout le reste pour isoler
  • Mode faible latence : dΓ©sactivez la correction LLM (Γ©conomise 2–3 s sur chaque dictΓ©e)

L'Γ©tat runtime est stockΓ© dans ~/.config/dictee/dictee.conf. Chaque Γ©tape a une variable d'env DICTEE_PP_* correspondante que vous pouvez override pour tester :

DICTEE_PP_LLM=0 dictee   # dictΓ©e one-shot sans LLM

Jeux de règles par langue

Les règles et le dictionnaire sont séparés par langue :

/usr/share/dictee/rules/
β”œβ”€β”€ rules-en.conf
β”œβ”€β”€ rules-fr.conf        # install par dΓ©faut inclut un ensemble curΓ©
β”œβ”€β”€ rules-de.conf
β”œβ”€β”€ rules-es.conf
β”œβ”€β”€ rules-it.conf
β”œβ”€β”€ rules-pt.conf
└── rules-uk.conf

Les personnalisations utilisateur vivent dans :

~/.config/dictee/
β”œβ”€β”€ rules.conf           # overrides (fusionnΓ©s au-dessus des rΓ¨gles systΓ¨me)
└── dictionary.conf

Voir Rules-and-Dictionary.


Bypass diarisation

Quand la diarisation est activΓ©e (mode Meeting), tout le pipeline de post-traitement est contournΓ© par design :

  • Les labels de locuteurs (Speaker 1 :, Speaker 2 :) doivent Γͺtre prΓ©servΓ©s tels quels
  • Les frontiΓ¨res inter-locuteurs seraient cassΓ©es par les rΓ¨gles regex ou le reflow LLM
  • La traduction d'une transcription multi-locuteurs produit une sortie incohΓ©rente

Seul un formatage minimal est appliqué (nettoyage d'espaces, préfixe de locuteur). Pour une transcription de réunion nécessitant des corrections, faites-la passer dans le panneau de test manuellement après coup.


OΓΉ tourne le post-traitement

Le pipeline est implΓ©mentΓ© dans pkg/dictee/usr/bin/dictee-postprocess (Python, indΓ©pendant de PyQt6). Il est invoquΓ© par :

  • Le script shell principal dictee (Γ©tape 3 de main())
  • Le panneau de test de dictee-setup
  • CLI directe : echo "texte brut" | dictee-postprocess --lang fr --llm-position first

L'exΓ©cution du pipeline est sΓ©quentielle, pas parallΓ¨le. Le pipeline tourne en ~50–80 ms sans LLM, 2–3 s avec LLM.


Budget performance

RΓ©partition typique de latence pour une dictΓ©e franΓ§aise de 5 secondes avec post-traitement complet + LLM + traduction :

Γ‰tape Temps
1–4. Variantes + dict + nombres + continuation ~15 ms
5. Règles regex (pré-LLM) ~5 ms
6. Correction LLM (Ollama Gemma 3 4B, GPU) ~2,5 s
7. Règles regex (post-LLM) ~5 ms
8. Short-text keepcaps ~2 ms
9. Correspondance Γ©tendue ~5 ms
10. Capitalisation finale ~1 ms
11. Traduction (Google) ~0,5 s
12. Collage via dotool ~50 ms
Total post-traitement ~3,1 s

Sans LLM + traduction : ~80 ms. Le LLM est de loin l'Γ©tape la plus coΓ»teuse.


Γ‰tapes suivantes

πŸ“– 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