Hanzo Huang2026-07-28

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.

reComputer-RKrk3576llmhome-assistantwhisperpiperopenwakewordqwenGithub

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/rknpu et /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 :

bash
git clone https://github.com/Hanzo-Huang/rk3576-home-assistant-voice.git
cd rk3576-home-assistant-voice

Démarrez les services vocaux :

bash
sudo docker compose up -d --pull always

Si Home Assistant doit aussi tourner sur la même carte, utilisez le profil optionnel :

bash
sudo docker compose --profile homeassistant up -d --pull always

Vérifiez les conteneurs en cours d’exécution et les journaux :

bash
sudo docker compose ps
sudo docker compose logs -f

2. 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.

Code
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 :

ServiceFonctionPort
PiperSynthèse vocale10200
WhisperReconnaissance vocale10300
openWakeWordDétection du mot d’activation10400
API RKLLMAPI locale LLM compatible OpenAI8001

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 :

ÉtapeTemps
Transcription Whisper0.626 s
Réponse du LLM2.82 s
Synthèse Piper0.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 :

ServicePort
Whisper STT10300
Piper TTS10200
openWakeWord10400

Créer un pipeline Assist

Ouvrez Paramètres → Assistants vocaux et créez ou modifiez un pipeline Assist. Sélectionnez :

  1. Le service Wyoming Whisper pour la reconnaissance vocale.
  2. Le service Wyoming Piper pour la synthèse vocale.
  3. 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 :

text
Backend: OpenAI Compatible Conversations API
API hostname: RK3576_BOARD_IP
API port: 8001
API path: /v1
API key: sk-local
Model name: rkllm-model

La 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 :

yaml
image: ghcr.io/hanzo-huang/rkllm-docker/qwen2.5-1.5b-instruct:w4a16-rk3576

Pour 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 :

yaml
llm:
  image: <rkllm-docker-model-image>

Puis redémarrez la pile :

bash
sudo docker compose up -d

Les 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 :

yaml
command:
  - --uri
  - tcp://0.0.0.0:10400
  - --preload-model
  - ok_nabu

Changer 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 :

yaml
image: ghcr.io/hanzo-huang/rkllm-docker/qwen2.5-1.5b-instruct:w4a16-rk3576

par une autre image du dépôt rkllm-docker, puis redémarrez la pile :

bash
sudo docker compose up -d

Ajouter 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.