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

105 lines
4.9 KiB
Markdown

# 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
4. **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
5. **Frontend Next.js** (`apps/frontend`) — Dashboard web pour gérer ses robots, voir les conversations, configurer les préférences
6. **Multi-robot / Multi-home** — Le backend supporte déjà le concept de `home`, mais le flow complet n'est pas testé
7. **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
8. **Personnalité configurable** — Chaque robot peut avoir un system prompt custom via l'app/dashboard
9. **Mémoire contextuelle** — Le robot se souvient des conversations passées (pgvector déjà dans le stack)
10. **Animations servo** — Synchroniser les mouvements du robot avec le TTS (lipsync, expressions)
11. **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
```bash
# 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/
```