2026-03-28

Objectif
Construire un système capable de :
- écouter en permanence
- détecter un mot d’éveil (wake word)
- enregistrer une commande vocale
- comprendre l’intention
- déclencher une action
- répondre avec du son ou de la voix
Le tout localement, sans dépendance cloud.
Architecture globale
Le système se décompose en plusieurs briques :
Micro
→ Wake word
→ Enregistrement
→ Speech-to-Text (Whisper)
→ Interprétation (LLM)
→ Action
→ Réponse (sons / TTS / LEDs)
Chaque brique va être explorée et validée séparément.
1. Audio et matériel
Le projet s’appuie sur :
- Raspberry Pi (Debian Bookworm)
- Adafruit Voice Bonnet (micros + LEDs + haut-parleurs)
- sortie audio testée via bruit rose
Points importants :
- bien identifier le bon device audio
- gérer correctement l’entrée/sortie simultanée
- prévoir une gestion propre des LEDs (cleanup)
2. Wake word : le premier défi
❌ Picovoice (Porcupine)
Initialement envisagé, mais abandonné :
- demande désormais un compte pro
- dépendance externe
- moins adapté à un projet perso long terme
✅ openWakeWord
Choix retenu :
- open source
- fonctionne en local
- basé sur des modèles TFLite
Difficultés rencontrées :
- modèles manquants →
download_models() - conflits NumPy / SciPy → downgrade et alignement versions
- faux positifs → nécessité de filtrage
Solutions mises en place :
- seuil élevé (
~0.95) - plusieurs frames consécutives
- période réfractaire (10s)
- arrêt du stream pendant l’action
👉 Le point clé : un wake word n’est pas fiable “brut” — il faut le cadrer
3. Problème classique : le robot s’auto-déclenche
Robie détectait son propre son (feedback audio).
Solution :
- couper l’écoute pendant :
- enregistrement
- réponse sonore
- ajouter un délai de grâce
4. STT ≠ compréhension
On essaye faster-whisper
5. Introduction d’un LLM local
Test avec Ollama + Qwen2.5 (1.5B)
Résultat :
- latence ~2 secondes
- fonctionnement stable
- viable pour un usage embarqué
👉 Conclusion : un petit LLM local sur Pi est exploitable
La métrique clé : la latence
Ce qui compte n’est pas la vitesse globale, mais le temps avant que la réponse commence.
< 3 secondes: bon3–6: acceptable> 6: frustrant
Astuce UX :
- LED jaune = “réflexion”
- son intermédiaire
👉 transforme un lag en comportement naturel
6. Rôle du LLM dans Robie
Le LLM ne peut pas être utilisé pour “discuter”.
Il servira à :
- transformer une phrase en intention
- structurer la commande
Exemple :
Entrée :
“Robie, note que Thomas doit prendre son manteau demain”
Sortie :
{
"intent": "take_note",
"content": "Thomas doit prendre son manteau demain",
"answer": "C’est noté."
}
Le code Python exécute ensuite l’action.
7. Support du français
Contrainte importante : enfants francophones.
Solutions :
- Whisper multilingue (pas
.en) - langue forcée en
fr - LLM multilingue (Qwen OK)
- prompts en français
- intents en français
⚠️ Attention : la reconnaissance des voix d’enfants est plus difficile → prévoir tolérance.
8. Et ma Coral TPU ?
Non utilisable pour les LLM.
Pourquoi :
- Coral = modèles TFLite quantifiés
- LLM = architecture incompatible
Usage futur pertinent :
- vision (caméra)
- détection d’objets
- perception environnement
Conclusion
Cette première session montre qu’il est probablement possible de construire un assistant embarqué local. Pour la suite, je dois finir de tester chaque brique, et commencer à envisager l’architecture globale de ma v2.
V1
Test des briques et stabilité des performances
V2
Construction du pipeline et premiers tests en conditions réelles