Critique du dev Kazeia juste : la comparaison RTF 0.18 (10s) vs 0.51 (1.6s) prod
était pommes/oranges (encoder fixe amorti sur audio long), et l'encoder +152 %
non investigué cachait un vrai problème de config QNN par défaut.
Investigation : options QNN ExecutionProvider explicites manquaient
- htp_performance_mode = "burst" (au lieu de default = balanced)
- htp_arch = "79" (au lieu de auto-detect)
- enable_htp_fp16_precision = "1" (NPU fp16 natif)
- SetGraphOptimizationLevel(ORT_ENABLE_ALL) + DisableMemPattern()
Impact mesuré (5 runs warm, audio FR continu, 12 tokens / 1.6s) :
- Encoder : 309 ms -> 62 ms (-80 %)
- Decoder/token : 48 ms -> 14 ms (-71 %)
- Total : 962 ms -> 320 ms (-67 %)
- RAM peak : 377 MB inchangée
Cas réel Kazeia (1.6s, extrapolé 22 tokens) :
- Prod Kotlin : 820 ms (mel 189 + enc 125 + 22*23)
- C++ unifié : ~450 ms (mel 80 + enc 62 + 22*14)
- Gain réel : -45 % sur le workload réel (pas amortissement)
Audio long (15s, 71 tokens) : decoder 10 ms/tok, RTF 0.06.
Mode warm bench (KZSTT_RUNS=N) : exerce N transcribes successifs sur le même
engine pour distinguer cold-start (1er run) vs warm path (suivants).
Recommandation prod Kotlin : ajouter les mêmes options QNN (encOpts.addQnn
multimap) pour gagner sans migration. Documenté dans STT_INTEGRATION.md §7bis.
A/B accuracy : 10 utterances FR transcrites sortent du texte FR cohérent
(avec erreurs typiques Whisper-Small sur mots rares : "Vagons" vs "Wagons",
"zéfière" vs "zéphyr"). La comparaison CER/WER vs WhisperHybridEngine sur
les mêmes fichiers reste à faire côté app (checklist §9.2) — non faisable
standalone sans la prod Kotlin en CLI.
Remerciements : critique du dev a permis de trouver une optim qui sert
TANT la version C++ unifiée QUE la prod Kotlin actuelle.