ti-pote/docs/STATUS.md
2026-04-08 18:37:08 +02:00

4.9 KiB

Ti-Pote — État du projet & prochaines missions

Dernière mise à jour : 2 avril 2026


Ce qui fonctionne

Voice conversation (end-to-end)

  • Wake word ("Hey Jarvis") → capture audio (arecord) → STT Deepgram → LLM → TTS ElevenLabs → playback aplay
  • Conversation continue : après chaque réponse, le robot réécoute automatiquement sans re-trigger
  • Grace period 3s + silence detection (RMS 200, timeout 2s) pour savoir quand l'utilisateur a fini de parler
  • Audio buffering : les chunks sont bufferisés côté robot-client jusqu'à ce que le backend confirme que le stream STT est prêt (évite de couper le premier mot)

Wake word (OpenWakeWord)

  • Script Python long-lived avec PAUSE/RESUME/QUIT via stdin
  • Modèle chargé une seule fois au démarrage (pas de reload 8s à chaque cycle)
  • PAUSE ferme le stream PyAudio (libère le device pour arecord), RESUME le rouvre
  • stdin lu via sys.stdin.readline() (pas for line in sys.stdin qui bufferise)

Auto-pairing

  • Robot-client : si pas de credentials → appelle POST /api/pairing/request → affiche code 6 chiffres en ASCII art sur HDMI → poll GET /api/pairing/status/:requestId toutes les 3s
  • Backend : Redis TTL 10min, POST /api/pairing/confirm (JWT required) associe le robot au home de l'utilisateur
  • Credentials persistées dans ~/.tipote/config.json via LocalStore (path dynamique via os.homedir())
  • App desktop Tauri v2 créée dans apps/desktop/ (login → code 6 chiffres → succès)

Infrastructure

  • Backend NestJS avec archi hexagonale (ports & adapters)
  • WebSocket socket.io entre robot-client et backend
  • Docker Compose (PostgreSQL + Redis) en dev
  • Robot-client TypeScript sur Raspberry Pi

Bugs connus à fixer

1. Wake word crash en boucle (PRIORITÉ HAUTE)

Symptôme : Le modèle charge OK, puis le process Python exit avec code 1 ~2s après. Boucle de restart infinie. Cause probable : Erreur à l'ouverture du stream audio PyAudio (device busy, mauvais index, ou erreur ALSA). Les messages d'erreur stderr étaient loggés en debug donc invisibles. Fix appliqué : Les messages stderr inconnus sont maintenant loggés en warn. Relancer et lire les logs pour voir l'erreur exacte. Fichiers :

  • apps/robot-client/scripts/wake_word.py
  • apps/robot-client/src/services/wake-word.service.ts (ligne ~113)

2. .env vs .env.dev loading

Symptôme : ROBOT_MODE n'est pas set avant que dotenv charge, donc .env est toujours chargé au lieu de .env.dev. Workaround : Préfixer la commande avec ROBOT_MODE=dev ou éditer .env directement sur le Pi.


Prochaines missions

Court terme (sprint en cours)

  1. Fixer le crash wake word — Lire les logs stderr (maintenant en warn), identifier l'erreur PyAudio, corriger
  2. Tester le pairing end-to-end avec l'app Tauri — L'app est créée mais pas encore testée avec un vrai pairing flow
  3. Tester la persistence des credentials — Vérifier qu'après reboot du Pi, le robot-client retrouve ses credentials dans ~/.tipote/config.json et skip le pairing

Moyen terme

  1. ESP32 + wake word embarqué — Déléguer l'audio à l'ESP32 (I2S mic + speaker). Le wake word pourrait tourner sur l'ESP32 via un modèle TFLite léger ou rester sur le Pi
  2. Frontend Next.js (apps/frontend) — Dashboard web pour gérer ses robots, voir les conversations, configurer les préférences
  3. Multi-robot / Multi-home — Le backend supporte déjà le concept de home, mais le flow complet n'est pas testé
  4. OTA updates — Mécanisme de mise à jour du robot-client sur le Pi (rsync pour le dev, mais il faudra un vrai système pour la prod)

Long terme

  1. Personnalité configurable — Chaque robot peut avoir un system prompt custom via l'app/dashboard
  2. Mémoire contextuelle — Le robot se souvient des conversations passées (pgvector déjà dans le stack)
  3. Animations servo — Synchroniser les mouvements du robot avec le TTS (lipsync, expressions)
  4. Mode offline — Wake word + réponses basiques sans connexion cloud

Structure du repo

apps/
├── backend/          # NestJS — API REST + WebSocket + LLM/STT/TTS orchestration
├── robot-client/     # TypeScript — tourne sur le Raspberry Pi
├── desktop/          # Tauri v2 — app native de pairing (NEW)
├── frontend/         # Next.js — dashboard web (à venir)
└── simulator/        # Simulateur (existant)
docs/                 # Architecture, features, data model, roadmap

Commandes utiles

# Backend (sur le Mac)
cd apps/backend && pnpm dev
docker compose up -d  # PostgreSQL + Redis

# Robot-client (sur le Pi)
cd ~/robot-client && npx tsx src/main.ts
# ou avec mode dev explicite :
ROBOT_MODE=dev npx tsx src/main.ts

# Desktop app (sur le Mac)
cd apps/desktop && pnpm install && pnpm dev

# Rsync vers le Pi
rsync -avz --exclude node_modules --exclude .git apps/robot-client/ pi@192.168.1.XX:~/robot-client/