Funk-lab/stt/client/stt/hud
ALI YESILKAYA 7025d7ae70
feat(stt): entrée texte HUD + finitions client + doc incident LLM/GPU (#19)
Regroupe le travail postérieur à la PR #18 (squash-mergée), rebasé proprement
sur main :

- HUD : composer texte (chat clavier sans micro) — {"type":"text"} →
  VoiceEngine.respond_text (hors boucle audio), lock _respond (voix ⟂ texte)
- App autonome : fenêtre app/kiosk via profil + WM class dédiés (hors Brave)
- Auto-update non destructif : `stt --update` = pipx upgrade (ne laisse plus
  l'install cassée en cas d'échec réseau)
- Terminal propre : --log-level=3 + sortie navigateur vers DEVNULL
- Docs : admin/incidents-llm-gpu.md (journal d'inférence dédié) — incident
  2026-06-19 llama-server gelé (/health OK mais génération bloquée → 502),
  + HUD README / stt.md (composer), bump 0.4.x → 0.5.1

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:56:36 +02:00
..
avatars feat(stt): HUD avancé (phase 4) — design Claude Design câblé au backend (#17) 2026-06-18 22:03:39 +02:00
icon.svg feat(stt): lancement & cycle de vie du client — auto-start, app de bureau, auto-update (#18) 2026-06-19 00:05:02 +02:00
index.html feat(stt): entrée texte HUD + finitions client + doc incident LLM/GPU (#19) 2026-06-19 14:56:36 +02:00
README.md feat(stt): entrée texte HUD + finitions client + doc incident LLM/GPU (#19) 2026-06-19 14:56:36 +02:00

stt/hud — interface HUD web (implémentée)

Front statique HTML/CSS/JS sans dépendance externe (tout inline, SVG natifs), servi localement par le backend (stt/ui/app.pySimpleHTTPRequestHandler sur ui.http_port), ouvert en kiosk si ui.kiosk = true. Se connecte au serveur websocket du backend (ui.ws_port, défaut 9300) pour recevoir les états et renvoyer les réglages.

Ce qu'affiche le HUD

  • Avatar portrait réactif (disque) — 3 images crossfadées selon l'état (idle/listening → -idle, thinking → -think, speaking → -speak), avec anneau fin, « ping » d'écoute et spinner de réflexion. Repli sur l'initiale du personnage si aucune image (voir avatars/README.md).
  • Label d'état : veille / écoute / réflexion / réponse.
  • Transcript : bulles utilisateur / assistant (+ tag du modèle) / erreur.
  • Composer texte (sous le transcript) : champ + bouton « Envoyer » pour dialoguer au clavier sans micro — Entrée envoie, Maj+Entrée saute une ligne. Le texte passe par le même cerveau que le vocal (modèle local / avancé).
  • Indicateur de connexion websocket (point + libellé), reconnexion auto.
  • Drawer Réglages (engrenage) : intensité de l'accent (thème), avatar, voix, mot de réveil, mode cerveau (local/avancé), no-think, reset conversation.

Protocole websocket

Reçus du backend (diffusés à tous les HUD connectés) :

Événement Effet
{"type":"state","state":"idle|listening|thinking|speaking"} animation + label
{"type":"user","text":…} bulle utilisateur
{"type":"assistant","text":…,"mode":…} bulle assistant (+ tag modèle)
{"type":"error","text":…} bulle d'erreur

Envoyés au backend :

{"type":"settings","data":{"brainMode":"local","wakeword":"…","action":"reset"}}
{"type":"text","text":"quelle heure est-il ?"}

Le serveur applique action:reset, brainMode (→ modèle LiteLLM) et wakeword à chaud (_apply_settings dans stt/ui/app.py). Un message text est traité comme un tour de conversation (VoiceEngine.respond_text, hors boucle audio) : le backend renvoie alors les événements user puis assistant — le HUD n'ajoute donc pas la bulle utilisateur lui-même quand il est connecté. Les réglages purement visuels (intensité d'accent, avatar) sont persistés côté navigateur (localStorage).

Prévisualiser sans backend

Le HUD embarque un mode démo : passer const DEMO = false à true en tête du <script> rejoue une boucle d'événements simulés — pratique pour itérer le design sans lancer le serveur. Défaut livré : false (branché sur le backend).

Design & personnalisation

Esthétique douce (blanc + accent rose → rouge), origine Claude Design. Les variables CSS en tête du <style> pilotent le rendu (--accent-rest, --accent-active, --avatar, --ring-gap…) ; le slider « intensité » interpole l'accent au repos. Portraits dans avatars/ (jeux asa / mira / kai, swappables à chaud depuis les Réglages).