fix(stt): détecte « Asa » même découpé par l'ASR (« a so »/« à ça ») + log diagnostic

Test sur poste : Parakeet FR ne transcrit pas « Asa » comme un mot mais comme « a so » /
« à ça » / « ah ça » (deux tokens) → la détection mot-entier ne matchait jamais (« rien ne
se passe »).

- _detect_wake : glisse une fenêtre de 1-2 mots, joint (sans espace) + déaccentue, compare
  en égalité exacte à des alias COMPACTS (asa, aso, aca, ahca…). L'exact évite les faux
  positifs (« à cause » → « acause » ≠ alias). Extrait la commande après le wake.
- wake_aliases (engine + config) : formes compactes reflétant les rendus ASR réels.
- Log diagnostic [stt.voice] sur stderr/journalctl (transcription + décision), coupable via
  STT_VOICE_LOG=0 — précieux pour ajuster les alias selon l'ASR.
- .gitignore : build/ + *.egg-info (artefacts d'install locale du client).

Validé en live (poste) : « Asa » réveille, « Asa stop » endort, partiels en direct.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
alkatrazz 2026-06-22 00:37:17 +02:00
parent 4ef579405f
commit 2842446c15
5 changed files with 58 additions and 13 deletions

View file

@ -188,8 +188,12 @@ Machine à états du moteur vocal (`stt/client/stt/voice/engine.py`) :
- **Veille (`asleep`)** — état par défaut. Asa transcrit chaque énoncé **uniquement** pour y
repérer le wake word ; elle ne répond à rien d'autre (HUD : portrait atténué, « SOMMEIL »).
- **Réveil** — dire **« Asa »** (mot entier) la passe en éveil. « Asa, <question> » exécute
directement la question. Variantes ASR tolérées via `[voice].wake_aliases`.
- **Réveil** — dire **« Asa »** la passe en éveil. « Asa, <question> » exécute directement la
question. ⚠️ L'ASR (Parakeet FR) ne transcrit **pas** « Asa » comme un mot : il l'entend
« a so » / « à ça » / « ah ça »… La détection **joint les 1-2 premiers mots** (déaccentués,
sans espace) et compare en égalité exacte à `[voice].wake_aliases` (formes compactes :
`asa`, `aso`, `aca`, `ahca`…). Ajuster cette liste si l'ASR rend encore autrement — le log
`[stt.voice] (veille) entendu: '…'` (journalctl, cf. `STT_VOICE_LOG`) montre la transcription réelle.
- **Éveil (`listening`)** — elle répond à tout. **« Asa stop »** (ou « stop », « au revoir »,
« dors »… — `[voice].sleep_words`) la **remet en veille** ; un timeout d'inactivité
(`chat_timeout_sec`) aussi.