105 lines
4.9 KiB
Markdown
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/
|
|
```
|