Créer un assistant vocal Home Assistant privé sur RK3576
Construisez un assistant vocal Home Assistant privé et local sur Rockchip RK3576. La pile combine Whisper pour la reconnaissance vocale, Piper pour la synthèse vocale, openWakeWord pour la détection du mot d’activation et Qwen pour la conversation locale, le tout accéléré par la NPU du RK3576.
Créer un assistant vocal Home Assistant privé sur RK3576
Home Assistant Assist peut faire bien plus qu’une simple interface vocale connectée au cloud. Avec une carte Rockchip RK3576, il est possible d’exécuter l’ensemble de la chaîne de traitement vocal localement : de la reconnaissance vocale à la détection du mot d’activation, en passant par le raisonnement avec un modèle de langage et la synthèse vocale.
Ce projet rassemble toute cette logique dans une pile Docker Compose. Whisper, Piper, openWakeWord et Qwen fonctionnent ensemble, tandis que les tâches principales de l’IA sont accélérées par la NPU du RK3576.
1. Démarrage rapide
Prérequis
- Une carte Rockchip RK3576 exécutant Linux ARM64
- Docker Engine et le plugin Docker Compose
- Un accès aux nœuds de périphériques du RK3576, y compris
/dev/rknpuet/dev/dma_heap - Une instance Home Assistant sur le même réseau, ou suffisamment de ressources pour l’exécuter directement sur la carte
Clonez le projet sur la carte RK3576 :
git clone https://github.com/Hanzo-Huang/rk3576-home-assistant-voice.git
cd rk3576-home-assistant-voiceDémarrez les services vocaux :
sudo docker compose up -d --pull alwaysSi Home Assistant doit aussi tourner sur la même carte, utilisez le profil optionnel :
sudo docker compose --profile homeassistant up -d --pull alwaysVérifiez les conteneurs en cours d’exécution et les journaux :
sudo docker compose ps
sudo docker compose logs -f2. Architecture
La pile sépare chaque étape de l’interaction vocale dans un service distinct. Home Assistant communique avec les services vocaux via le protocole Wyoming, et avec le modèle de langage local via une API compatible OpenAI.
Utilisateur
│ entrée vocale
▼
Home Assistant Assist
│ audio
▼
openWakeWord ── activé ──▶ Whisper STT
│ transcription
▼
LLM local Qwen 2.5
│ texte de réponse
▼
Piper TTS
│ réponse audio
▼
Home Assistant Assist
│
▼
Utilisateur
Whisper STT, Qwen 2.5 et Piper TTS s'exécutent avec l'accélération NPU du RK3576.Les services sont exposés sur ces ports :
| Service | Fonction | Port |
|---|---|---|
| Piper | Synthèse vocale | 10200 |
| Whisper | Reconnaissance vocale | 10300 |
| openWakeWord | Détection du mot d’activation | 10400 |
| API RKLLM | API locale LLM compatible OpenAI | 8001 |
Le modèle de langage par défaut est Qwen2.5-1.5B-Instruct avec quantification W4A16. Le service RKLLM le met à disposition de Home Assistant comme agent de conversation local, ce qui permet de traiter les requêtes vocales sans envoyer les données de conversation à un fournisseur distant.
3. Performance
La configuration testée utilise :
- Whisper pour la reconnaissance vocale
- Qwen2.5-1.5B-Instruct pour la conversation
- Piper Amy Medium pour la synthèse vocale
Avec les modèles accélérés par la NPU du RK3576, la latence mesurée était la suivante :
| Étape | Temps |
|---|---|
| Transcription Whisper | 0.626 s |
| Réponse du LLM | 2.82 s |
| Synthèse Piper | 0.474 s |
Le temps de réponse de bout en bout dépend de la longueur de la requête parlée, de la longueur de la réponse générée et du traitement propre à Home Assistant. Néanmoins, le RK3576 constitue une base pratique pour un assistant vocal privé et réactif à la périphérie du réseau.
Le modèle de 1,5 B consomme environ 1,5 Go de RAM. Un modèle testé de 3 B en W4A16 consomme environ 2,5 Go de RAM, ce qui rend la capacité mémoire un point important lors du choix d’un modèle plus grand.
4. Guide de configuration
Ajouter les services Wyoming
Dans Home Assistant, ouvrez Paramètres → Appareils et services, sélectionnez Ajouter une intégration et recherchez Wyoming Protocol.
Ajoutez ensuite les services suivants en utilisant l’adresse IP de la carte RK3576 comme hôte :
| Service | Port |
|---|---|
| Whisper STT | 10300 |
| Piper TTS | 10200 |
| openWakeWord | 10400 |
Créer un pipeline Assist
Ouvrez Paramètres → Assistants vocaux et créez ou modifiez un pipeline Assist. Sélectionnez :
- Le service Wyoming Whisper pour la reconnaissance vocale.
- Le service Wyoming Piper pour la synthèse vocale.
- Le service Wyoming openWakeWord pour la détection du mot d’activation.
Configurer l’agent de conversation local
Pour utiliser Qwen comme agent de conversation, installez l’intégration Local LLM via HACS. Configurez-la avec les valeurs suivantes :
Backend: OpenAI Compatible Conversations API
API hostname: RK3576_BOARD_IP
API port: 8001
API path: /v1
API key: sk-local
Model name: rkllm-modelLa clé API n’est ici qu’un espace réservé pour ce serveur local. Après avoir ajouté l’intégration, revenez au pipeline Assist et sélectionnez le nouvel agent de conversation local.
Choisir un autre LLM
Le LLM est fourni sous forme d’image Docker, ce qui permet de changer de modèle sans modifier la configuration Home Assistant. L’image par défaut est :
image: ghcr.io/hanzo-huang/rkllm-docker/qwen2.5-1.5b-instruct:w4a16-rk3576Pour utiliser un autre modèle, choisissez une image compatible RK3576 dans le dépôt rkllm-docker et remplacez la valeur de llm.image dans docker-compose.yml :
llm:
image: <rkllm-docker-model-image>Puis redémarrez la pile :
sudo docker compose up -dLes modèles disponibles peuvent avoir des besoins RAM différents, une qualité de réponse différente et des latences différentes. Vérifiez la documentation du modèle avant de choisir un modèle plus gros pour la carte.
Personnaliser le mot d’activation
Le modèle de mot d’activation par défaut est ok_nabu. Modifiez la commande openwakeword dans docker-compose.yml pour précharger un autre modèle pris en charge :
command:
- --uri
- tcp://0.0.0.0:10400
- --preload-model
- ok_nabuChanger la langue de Whisper
L’image Whisper intègre des vocabulaires anglais et chinois. L’anglais est la langue par défaut ; le chinois peut être sélectionné en ajoutant --language zh à la commande du service Whisper dans docker-compose.yml.
5. Améliorations : ajouter davantage de modèles
La configuration actuelle utilise des modèles compacts afin de trouver un bon équilibre entre qualité, usage mémoire et latence. L’étape suivante logique consiste à étendre cette prise en charge à toute la chaîne vocale : modèles de langage, modèles STT et voix TTS.
Ajouter davantage de modèles LLM
L’image du LLM peut être modifiée dans docker-compose.yml. Par exemple, remplacez l’image par défaut :
image: ghcr.io/hanzo-huang/rkllm-docker/qwen2.5-1.5b-instruct:w4a16-rk3576par une autre image du dépôt rkllm-docker, puis redémarrez la pile :
sudo docker compose up -dAjouter davantage de modèles STT
Whisper est actuellement utilisé pour la reconnaissance vocale. Le service Whisper peut être étendu pour prendre en charge d’autres tailles de modèles, d’autres langues et des paires encodeur/décodeur converties en RKNN. Les utilisateurs peuvent ainsi choisir un modèle plus petit pour réduire la latence ou un modèle plus grand pour améliorer la précision de transcription.
La prise en charge STT devrait inclure :
- Des vocabulaires en anglais, en chinois et dans d’autres langues.
- Plusieurs tailles de modèles Whisper.
- Une configuration spécifique au modèle dans
docker-compose.yml. - Des benchmarks de précision de transcription, d’utilisation mémoire et de facteur temps réel.
Ajouter davantage de modèles et de voix TTS
Piper fournit actuellement la voix Amy Medium. D’autres voix Piper peuvent être intégrées dans l’image TTS afin de proposer différentes langues, accents et styles de voix. Des modèles de décodeur compatibles RKNN peuvent aussi être ajoutés pour exploiter la NPU du RK3576 dans davantage de configurations vocales.
La prise en charge TTS pourrait inclure :
- Plusieurs voix et langues Piper.
- La sélection de voix via la configuration Compose ou Home Assistant.
- Des profils de qualité et de vitesse différents.
- Le streaming et des segments audio plus courts pour accélérer la lecture.
Autres améliorations
Les améliorations futures pourraient également inclure :
- Une variable simple de sélection de modèle pour chaque service.
- Des benchmarks de l’ensemble de la pipeline sur différentes combinaisons de modèles.
- Des réponses LLM en streaming pour réduire le temps de réponse perçu.
- La prise en charge de modèles de mot d’activation personnalisés.
- Une documentation des combinaisons de modèles recommandées selon la capacité RAM.
Des modèles plus grands peuvent améliorer la qualité de la conversation, mais ils demandent aussi plus de RAM et peuvent augmenter la latence. Le meilleur modèle reste donc un compromis entre les capacités de la carte et l’expérience souhaitée à la maison.
Conclusion
Ce projet montre qu’un assistant vocal Home Assistant moderne n’a pas besoin de dépendre du cloud. En combinant des modèles vocaux open source, Docker, le protocole Wyoming et l’accélération NPU du RK3576, l’ensemble de l’interaction peut s’exécuter localement sur un petit appareil en périphérie.
Le résultat est une interface vocale privée, personnalisable et étroitement intégrée à Home Assistant, tout en laissant la place à l’expérimentation avec des modèles plus rapides, plus grands et plus performants à l’avenir.