-
Notifications
You must be signed in to change notification settings - Fork 2
fr Canary 1B Deep Dive
🌐 Langue : English | Français
NVIDIA Canary-1B v2 est un modèle d'attention encoder-decoder (AED) qui transcrit ET traduit en un seul forward pass. C'est le choix recommandé quand votre machine a au moins 6 Go de VRAM et que vous voulez une qualité supérieure (WER plus bas qu'avec Parakeet) ainsi qu'une traduction intégrée sans passer par Ollama, Google ou LibreTranslate.
Le port Rust dans dictée (fichiers src/canary.rs, src/model_canary.rs, src/decoder_canary.rs) a été initialement adapté depuis onnx-asr par Ivan Stupakov et est désormais entièrement autonome — les graphes ONNX sont chargés directement via ort, la tokenisation utilise tokenizers (crate officiel HuggingFace), et la construction du prompt du décodeur est maison.
- Architecture
- Langues supportées (7 dans le port Rust)
- Traduction native — le point différenciant
- Pipeline audio
- VRAM & limites de durée
- Ponctuation & capitalisation natives
- GPU obligatoire en pratique
- La langue source doit matcher l'audio
- Arborescence des fichiers
- Benchmarks
Canary utilise une architecture encoder-decoder (type Whisper, mais optimisée NVIDIA) :
Audio (16 kHz mono)
↓
Mel-spectrogramme (128 bins, n_fft=512, hop 10 ms, Hann)
↓
┌──────────────────────────────────┐
│ Encodeur FastConformer │
│ - Sous-échantillonnage conv │
│ - Blocs Conformer (multi-head) │
│ - Sortie : embeddings acoust. │
└──────────────────────────────────┘
↓
┌──────────────────────────────────┐
│ Décodeur Transformer │
│ - Cross-attention sur encoder │
│ - Génération autoregressive │
│ - Prompt tokens : SOT + source │
│ + target + PNC + NOITN + … │
└──────────────────────────────────┘
↓
Vocabulaire SentencePiece
↓
Texte avec ponctuation et capitalisation natives
Différence clé avec Parakeet : Canary est un encoder-decoder, pas un transducer. Il génère les tokens de sortie de manière autoregressive en croisant l'attention sur les embeddings de l'encodeur, contrairement à Parakeet-TDT qui émet des paires (token, durée) en un seul pass. Conséquences pratiques :
- Canary est plus précis (WER plus bas sur toutes les langues partagées)
- Canary est plus lent (génération autoregressive vs TDT parallèle)
- Canary supporte la traduction native via le prompt du décodeur
Trois graphes ONNX sont chargés à l'exécution :
-
encoder.onnx— encodeur FastConformer (~1 Go) -
decoder.onnx— decoder Transformer (~3 Go) -
tokenizer.json+vocab.txt— SentencePiece
Le modèle upstream NVIDIA Canary-1B v2 annonce 25 langues. Le port Rust dans dictée en expose 7 (verifiés dans src/canary.rs:33-47) :
| ISO | Langue | Token ID Canary |
|---|---|---|
en |
Anglais | 64 |
fr |
Français | 71 |
de |
Allemand | 78 |
es |
Espagnol | 171 |
it |
Italien | 87 |
pt |
Portugais | 138 |
uk |
Ukrainien | 182 |
Les autres langues que le modèle peut théoriquement gérer ne sont pas exposées côté dictée — si vous en avez besoin, ouvrez une issue ou utilisez faster-whisper (99 langues).
Contrairement à Parakeet (qui ne fait que transcrire et délègue la traduction à Ollama / Google / LibreTranslate), Canary fait les deux dans le même forward pass grâce au prompt du décodeur :
<|startoftranscript|><|emo:undefined|><source_lang><target_lang><|pnc|><|noitn|><|notimestamp|><|nodiarize|>
Les tokens <source_lang> et <target_lang> indiquent au décodeur :
- Si égaux → transcription simple
- Si différents → traduction (audio en
source_lang, sortie textuelle entarget_lang)
Paires de traduction supportées : chacune des 7 langues ↔ EN (12 paires dans les deux sens, soit 14 combinaisons non-identité). Les paires non-English-centric (FR → DE par exemple) ne sont pas testées officiellement — le modèle peut produire quelque chose mais la qualité n'est pas garantie.
Exemple CLI :
# Transcription FR
dictee-switch-backend asr canary
DICTEE_LANG_SOURCE=fr dictee
# Transcription FR → traduction EN (tout en un)
DICTEE_LANG_SOURCE=fr DICTEE_LANG_TARGET=en dictee --translate
# Transcription EN → traduction FR
DICTEE_LANG_SOURCE=en DICTEE_LANG_TARGET=fr dictee --translatePas besoin qu'Ollama/LibreTranslate tourne, pas besoin d'accès réseau : Canary fait tout localement.
Canary attend du 16 kHz mono en entrée. dictée gère le rééchantillonnage automatiquement.
Paramètres du préprocesseur (verifiés dans src/canary.rs:171-183) :
| Paramètre | Valeur |
|---|---|
| Feature size (mel bins) | 128 |
| n_fft | 512 |
| hop_length | 160 (10 ms à 16 kHz) |
| win_length | 400 (25 ms à 16 kHz) |
| Préemphasis | 0,97 |
| Fenêtre | Hann |
| Padding side | right |
| Padding value | 0,0 |
Le mel-spectrogramme complet est chargé d'un bloc dans l'encodeur — pas de chunking interne. C'est ce qui impose les limites de durée pratiques (voir section suivante).
Sur RTX 4070 Laptop (8 Go) — mesures réelles via nvidia-smi :
- Daemon démarré, modèle chargé : ~5,3 Go VRAM
- Pic pendant inférence sur utterance 5 s : ~5,3 Go (stable)
- Pic pendant inférence sur utterance 60 s : ~6,3 Go (+1 Go pour les matrices d'attention)
L'attention de l'encodeur FastConformer est quadratique en longueur de séquence — la VRAM nécessaire au pic grandit avec la durée. Sur une 4070 Laptop de 8 Go, les limites pratiques dépendent de la VRAM libre au moment de l'appel :
| Durée audio | Pic VRAM estimé | Besoin de VRAM libre (min) | Résultat |
|---|---|---|---|
| 3-10 s | ~5,3 Go | ~200 Mo | Propre |
| 30 s | ~5,3 Go | ~300 Mo | Propre (voir benchs) |
| 60 s | ~6,3 Go | ~1 Go | Sortie tronquée (~780 chars) |
| 300 s (5 min) | OOM silencieux | — | Sortie vide (~340 chars) |
Cas piégeux : si d'autres processus GPU tournent (Ollama, jeu, navigateur avec accélération, etc.) et mordent sur la VRAM disponible, Canary peut partir en boucle d'hallucination sur une durée qui passerait normalement. Observé sur un bench 30 s avec seulement ~4,2 Go libres au départ : latence 30,4 s et sortie répétée jusqu'au plafond de tokens (~2 432 chars). Le même bench avec ~2,5 Go libres au départ (Ollama arrêté) : latence 1,55 s, sortie propre.
Recommandations :
- Sur 8 Go VRAM : Canary est fiable jusqu'à 30 s si rien d'autre ne tape sur le GPU
- Au-delà : passer sur Parakeet (chunking interne, pas de plafond tangible) ou Whisper
- Pour transcrire de longs fichiers audio (réunion, podcast), toujours utiliser Parakeet — Canary n'est pas conçu pour ça
Canary produit nativement la ponctuation (., ,, ?, !) et la capitalisation des débuts de phrase + noms propres. Le token <|pnc|> est inclus dans le prompt par défaut — pour les désactiver il faudrait modifier le prompt (pas exposé côté config utilisateur).
Conséquence : l'étape Capitalisation du post-traitement n'a quasiment rien à faire sur la sortie Canary, contrairement à Vosk qui demande un cleanup massif.
Canary fonctionne sur CPU (providers ONNX Runtime : CPUExecutionProvider en fallback), mais la latence est impraticable :
| Durée audio | GPU (RTX 4070) | CPU (i7-13700H) |
|---|---|---|
| 5 s | 0,18 s | ~4,5 s |
| 10 s | 0,36 s | ~9 s |
Le décodeur Transformer multicouche avec génération autoregressive 3× plus lente que le décodeur TDT de Parakeet sur CPU. Pour une utilisation interactive, GPU NVIDIA 6+ Go VRAM requis.
Différence importante avec Parakeet : Canary n'auto-détecte pas la langue. Vous devez fixer DICTEE_LANG_SOURCE=<code> avant de parler (via dictee-setup ou la combo langue du plasmoid). Si vous parlez français avec DICTEE_LANG_SOURCE=en, Canary va traduire vers l'anglais au lieu de transcrire en français — comportement conforme au modèle mais déroutant.
Exemple mesuré (bench WER 20 clips LibriSpeech anglais) :
-
DICTEE_LANG_SOURCE=fr: WER = 101 % (Canary retourne du français parce que source=fr + audio EN → traduction EN→FR) -
DICTEE_LANG_SOURCE=en: WER = 1,8 %
Si vous basculez fréquemment entre langues, utilisez plutôt Parakeet qui gère l'auto-détection.
Après téléchargement via dictee-setup ou la commande CLI dictee-setup --download-canary :
/usr/share/dictee/canary/
├── encoder.onnx (~1 Go)
├── decoder.onnx (~3 Go)
├── vocab.txt (~50 Ko — tokens SentencePiece)
└── tokenizer.json (~3 Mo — config HuggingFace tokenizer)
Ou en mode user-space :
~/.local/share/dictee/canary/
└── (même structure)
Le daemon dictee-canary.service pointe automatiquement vers le bon chemin via résolution dynamique.
Mesurés sur TUXEDO InfinityBook Pro Gen8 (MK2) — Intel Core i7-13700H, RTX 4070 Laptop 8 Go, TUXEDO OS (kernel 6.17, NVIDIA 590.48.01), ONNX Runtime CUDA.
5 runs par durée + 1 warm-up discardé, clips générés par concaténation LibriSpeech dev-clean. Canary chargé seul (Parakeet stoppé) pour maximiser la VRAM libre au moment de l'appel.
| Longueur audio | Canary (RTX 4070) | Parakeet (RTX 4070) | Observation Canary |
|---|---|---|---|
| 3 s | 0,203 s (min 0,200 · max 0,213) | 0,039 s | Propre |
| 5 s | 0,219 s (min 0,219 · max 0,237) | 0,045 s | Propre |
| 10 s | 0,401 s (min 0,396 · max 0,431) | 0,081 s | Propre |
| 30 s | 1,554 s (min 1,538 · max 1,566) | 0,414 s | Propre (721 chars) |
| 60 s | 4,05 s | 0,711 s | Tronqué (~780 chars) |
| 300 s (5 min) | 0,26 s | 5,58 s | Vide (~340 chars, OOM silencieux) |
Parakeet reste linéaire sur toute la plage grâce à son chunking interne (RTF ~54× temps-réel même sur 5 min). Canary reste fiable jusqu'à 30 s puis décroche — l'encodeur a besoin de plus de VRAM que disponible pour faire rentrer toute l'attention.
Note sur la sensibilité à la VRAM : un premier bench avec seulement ~4,2 Go libres au départ (Ollama + Chrome actifs) donnait 30,4 s sur le clip 30 s (hallucination loop, 2 432 chars répétés). Avec Ollama arrêté (~2,5 Go libres au minimum pendant l'inférence), le même clip est traité proprement en 1,55 s. Sur une machine chargée, Canary peut basculer en mode dégradé bien avant d'atteindre sa « vraie » limite.
Sortie brute, sans post-traitement :
| Langue | Dataset | WER Canary | CER Canary | WER Parakeet | CER Parakeet |
|---|---|---|---|---|---|
| FR | MultiLingual LibriSpeech | 5,4 % | 2,1 % | 7,4 % | 4,0 % |
| EN | LibriSpeech clean | 1,8 % | 0,5 % | 2,0 % | 0,6 % |
Distribution de qualité (20 clips FR chacun) :
| Canary FR | Parakeet FR | |
|---|---|---|
| Parfait (WER = 0 %) | 8/20 | 4/20 |
| Bon (WER < 10 %) | 18/20 | 15/20 |
| Acceptable (< 30 %) | 20/20 | 19/20 |
| Mauvais (≥ 30 %) | 0/20 | 1/20 |
Verdict : Canary gagne en qualité sur les deux langues testées, à un coût latence 3-5× supérieur sur utterances courtes. Pour de la dictée courte (< 10 s), Canary est le choix idéal si vous avez la VRAM.
- ASR-Backends — comparer Canary avec Parakeet, Whisper, Vosk
- Translation — comparer Canary (traduction intégrée) avec Ollama, Google, LibreTranslate
- Parakeet-TDT-Deep-Dive — l'autre backend NeMo, auto-detect de langue et chunking
- Troubleshooting — récupération VRAM OOM
Getting started / Premiers pas
- Installation · 🇬🇧 · 🇫🇷
- Setup-Wizard · 🇬🇧 · 🇫🇷
- Configuration · 🇬🇧 · 🇫🇷
- Plasmoid-Widget · 🇬🇧 · 🇫🇷
- Tray-Icon · 🇬🇧 · 🇫🇷
- Keyboard-Shortcuts · 🇬🇧 · 🇫🇷
- Voice-Commands · 🇬🇧 · 🇫🇷
- GPU-Setup · 🇬🇧 · 🇫🇷
- Diarization · 🇬🇧 · 🇫🇷
- LLM-Diarization · 🇬🇧 · 🇫🇷
Speech recognition / ASR
Translation / Traduction
Post-processing / Post-traitement
- Overview · 🇬🇧 · 🇫🇷
- Rules-and-Dictionary · 🇬🇧 · 🇫🇷
- LLM-Correction · 🇬🇧 · 🇫🇷
- Numbers-Dates-Continuation · 🇬🇧 · 🇫🇷
CLI
Reference / Référence
🏠 Repo · 📦 Releases · 🐛 Issues