Table of Contents
Introduction : Pourquoi construire un assistant à domicile contrôlé par la voix?
Alors que les solutions commerciales comme Amazon Echo ou Google Nest offrent des solutions pratiques, la construction de votre propre assistant à domicile contrôlé par la voix avec microcontrôleurs vous permet de contrôler complètement la fonctionnalité, la confidentialité et le coût. Ce projet vous apprend à combiner des cartes microcontrôleurs à faible coût, des modules de microphone, des haut-parleurs et une reconnaissance vocale cloud ou sur le dispositif pour créer un système qui répond à vos commandes parlées. Que vous souhaitiez allumer des lumières, vérifier la météo ou contrôler un thermostat, une approche DIY vous permet d'adapter tous les aspects à vos besoins.
Ce guide élargi couvre la sélection des composants, l'architecture du système, la configuration du matériel étape par étape, les détails de programmation, les méthodes de test et les fonctionnalités avancées.
Choisir le microcontrôleur droit
Le microcontrôleur est le cerveau de votre assistant. Il doit gérer la capture audio, la communication réseau et le contrôle des appareils. Trois choix populaires sont l'ESP32, Arduino Uno avec un bouclier Wi-Fi, et Raspberry Pi Pico W.
ESP32
L'ESP32 est l'option la plus recommandée car il dispose d'un Wi-Fi intégré et Bluetooth, d'une RAM suffisante (520 KB) et d'un processeur double cœur qui peut gérer simultanément le streaming audio en temps réel et les appels API. Il prend également en charge l'IDE Arduino et MicroPython, rendant la programmation simple.
Arduino Uno avec le bouclier Wi-Fi
Un Arduino Uno associé à un bouclier ESP8266 Wi-Fi est une alternative viable si vous possédez déjà un Uno. Cependant, la RAM limitée (2 KB) et la vitesse d'horloge plus lente rendent la gestion des tampons audio plus difficile. Vous devrez probablement décharger le traitement lourd vers le cloud, qui peut introduire la latence.
Pico de la framboise Pi W
Annoncé en 2022, le Raspberry Pi Pico W comprend le Wi-Fi et fonctionne à 133 MHz avec 264 KB SRAM. Il est moins puissant que l'ESP32 mais fonctionne bien pour des ensembles de commandes plus simples.
Pour ce guide, nous supposons que vous utilisez un ESP32. Vous pouvez trouver la documentation officielle et les fiches techniques à Espressif ESP32 Référence.
Modules Microphone et Haut-parleur
Pour le microphone, vous avez besoin d'un module qui émet un signal analogique propre. L'amplificateur micro MAX4466 électret est un choix populaire car il est sensible, faible bruit et fonctionne avec la logique 3.3V. Pour une meilleure qualité sonore, considérez le microphone INMP441 MEMS, qui utilise I2S pour l'audio numérique et élimine les problèmes sonores analogiques.
Pour le haut-parleur, un simple haut-parleur 8 ohm, 0.5W connecté via une résistance (pour limiter le courant) peut produire des retours audibles. Pour un volume plus élevé et une sortie plus claire, utilisez l'amplificateur MAX98357 I2S avec un petit haut-parleur. Ce module peut piloter un haut-parleur 3W et est facile à interfacer avec le ESP32.
Toujours tester chaque composant audio individuellement avant de les intégrer dans le système. Un croquis rapide peut enregistrer l'audio sur le moniteur série ou jouer un ton de test pour vérifier le câblage et la configuration.
Comprendre les options de reconnaissance vocale
Reconnaissance vocale basée sur le cloud
Des services comme Google Speech-to-Text[, Amazon Transcribe[, ou Azure Speech-to-Text[ offrent une haute précision et supportent plusieurs langues. Vous envoyez des données audio sur HTTP ou WebSocket et recevez du texte reconnu. L'inconvénient est de compter sur la connectivité Internet et la latence potentielle (200 à 500 ms).
Reconnaissance vocale sur le réseau
Pour la confidentialité et l'utilisation hors ligne, vous pouvez utiliser des bibliothèques légères comme Porcupine (de Picovoice) ou TensorFlow Lite Micro avec un modèle personnalisé de repérage de mots clés. Porcupine offre des mots de réveil pré-entraînement (par exemple, "Computer", "Alexa") et fonctionne sur des appareils à ressources limitées. Il utilise environ 100 KB RAM et 200 KB flash. Pour la reconnaissance continue de la parole sur un appareil, considérez Whisper en cours d'exécution sur un accélérateur AI bord, mais cela ajoute complexité et coût.
Une approche hybride est également populaire : utilisez un mot de réveil sur le périphérique pour déclencher la reconnaissance en nuage pour les commandes complètes. Cela réduit l'utilisation du cloud et améliore le temps de réponse.
Architecture du système Aperçu
Une architecture typique se compose de trois couches:
- Input Layer[: Microphone capture le son. Un convertisseur analogique-numérique (ADC) ou une interface I2S convertit le signal en données numériques.
- Processing Layer: Le microcontrôleur tampons audio, détecte un mot de sillage ou un bouton, envoie ensuite le morceau audio à une API Cloud ou le traite localement. Après reconnaissance, il analyse le texte de la commande et le map à une action.
- Output Layer[: Le microcontrôleur déclenche des relais, envoie des signaux infrarouges, publie des messages MQTT ou utilise GPIO pour contrôler les appareils. Il peut également lire une confirmation audio par l'enceinte.
Le diagramme suivant (conceptuel) montre le flux de données : Microphone → ESP32 → Wi-Fi → API Cloud → Réponse JSON → ESP32 → Relay/LED/Speaker. Pour le traitement local, l'étape du cloud est remplacée par une bibliothèque locale.
Guide de construction étape par étape
Étape 1: Rassembler les composants
Vous aurez besoin :
- Conseil de développement ESP32 (par exemple NodeMCU-32S)
- Module microphone MAX4466 ou INMP441
- MAX98357 Amplificateur I2S + haut-parleur (3W, 4-8 ohm)
- Fils de pain et de saut
- Module relais (pour la commande des appareils à courant alternatif)
- Optionnel: LED, résistance, bouton poussoir, écran OLED
- Alimentation USB (5V, 2A)
Étape 2: Câblage
Connectez le module microphone:
- MAX4466: VCC à 3.3V, GND à GND, OUT à GPIO34 (ADC).
- INMP441 (I2S): VCC à 3.3V, GND à GND, L/R à GND (canal de gauche), DOUT à GPIO25, BCLK à GPIO26, WS à GPIO27.
Connectez l'amplificateur de haut-parleur :
- MAX98357: VIN à 5V (ou puissance USB), GND à GND, BCLK à GPIO26, LRC à GPIO27, DIN à GPIO25. (Note: Les broches BCLK et WS peuvent être partagées avec le microphone I2S si elles sont configurées correctement, mais il est plus facile d'attribuer des broches séparées pour éviter les conflits.)
- Haut-parleur positif à l'amplificateur sortie positive, négatif à sortie négative.
Connectez le module relais :
- VCC à 5V, GND à GND, IN à GPIO32 (ou toute broche numérique).
- Reposer les contacts sur votre appareil (en utilisant un circuit à haute tension séparé – prenez des précautions de sécurité).
Étape 3: Installer les dépendances du logiciel
Installez le Arduino IDE et ajoutez le paquet ESP32. Utilisez le Gestionnaire de tableaux pour installer "esp32" par Espressif Systems. Installez ensuite les bibliothèques :
- WiFi.h (construit)
- HTTPClient.h
- ArduinoJson.h (pour analyser les réponses de l'API)
- conducteur/i2s.h (pour l'audio I2S)
- WebServer.h (pour configuration locale si nécessaire)
Pour la reconnaissance du cloud, vous aurez également besoin de la bibliothèque cliente Google Speech-to-Text API[ (ou utilisez des appels REST directs).Pour le sake word sur l'appareil, installez Porcupine bibliothèque de Picovoice.
Étape 4: Programmation du microcontrôleur
Écrivez le code qui effectue la boucle suivante :
- Initialiser: Mettre en place Wi-Fi, microphone I2S, haut-parleur et GPIO.
- Écouter le mot de réveil: Échantillonner en continu l'audio et le flux vers Porcupine. Lorsqu'un mot de réveil est détecté, définir un drapeau et jouer un bip.
- Commande d'enregistrement[: Capturez 3-5 secondes d'audio (ou jusqu'à détection de silence).
- Envoyer au cloud[: Convertir l'audio au format requis (WAV PCM 16-bit, 16 kHz mono). POST à Google Speech-to-Text. Recevez JSON avec transcription.
- Commande de parse[: Utilisez une chaîne de caractères ou un analyseur d'intention simple. Par exemple, si la transcription contient "turn on the light", définissez GPIO32 HAUT.
- Répond: Jouer un ton de confirmation ou de parler le résultat via TTS (facultatif).
- Retour à l'état d'écoute.
Voici un extrait de code simplifié (non destiné à être copié et collé en texte intégral) illustrant la structure :
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <driver/i2s.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
// Initialize I2S, GPIO etc.
}
void loop() {
// Check wake word – omitted for brevity
if (wake_word_detected) {
record_audio();
String transcript = send_to_google(audio_buffer);
if (transcript.indexOf("light") != -1) {
digitalWrite(RELAY_PIN, HIGH);
play_beep();
}
delay(1000); // debounce
}
}
Implémenter la gestion des erreurs pour la déconnexion Wi-Fi, les timeouts API et les commandes non valides. Utilisez la classe WiFiClientSecure pour les requêtes HTTPS.
Test et débogage de votre assistant
Essaie d'abord chaque composant isolément:
- Microphone: Téléchargez un croquis qui lit l'ADC ou I2S et imprime l'amplitude au traceur série. Parlez dans le micro et vérifiez les changements de forme d'onde.
- Speaker: Utilisez la fonction ton() ou le lecteur I2S pour afficher une mélodie simple.
- Wi-Fi: Ping google.com de l'écran série.
- Relay : Basculez la broche manuellement et écoutez le clic.
Ensuite, intégrer la reconnaissance vocale. Commencez par une simple commande codée en dur (p. ex., appuyez sur un bouton pour envoyer un fichier audio de test) pour assurer le fonctionnement de l'appel API. Déplacez-vous progressivement vers l'entrée du microphone en direct. Utilisez les journaux série pour voir la transcription et le timing.
Questions communes:
- Aucune détection audio: Vérifiez le câblage des broches I2S, la vitesse d'échantillonnage, la profondeur de bit. Sur ESP32, les canaux ADC 0–7 ne sont pas tous disponibles; utilisez GPIO34-39 pour ADC1.
- API retourne "vide"[: Assurez-vous que l'audio est dans le bon format (16 bits PCM, 16kHz, mono). Google s'attend à ce que le WAV ou les octets bruts encodés base64 avec un taux d'échantillonnage correspondant.
- Réponse faible: Latence réseau est inévitable. Utilisez un module Ethernet filaire si possible, ou réduisez la durée audio.
Élargissement de la fonctionnalité
Une fois que votre assistant de base fonctionne, envisagez d'ajouter ces fonctionnalités :
Commande de périphériques multiples
Utilisez un MQTT broker (comme Mosquitto) pour publier des commandes vers d'autres nœuds ESP32 autour de la maison. Votre unité principale peut envoyer «kitchen/light/on» à un noeud secondaire qui contrôle cette lumière spécifique.
Réactions de texte à texte (TST)
Au lieu d'un simple bip, utilisez l'API Google Cloud Text-to-Speech[ ou une bibliothèque hors ligne comme espeak (porté à ESP32) pour parler des messages de confirmation.
Mots de réveil personnalisés
Utilisez la console Picovoice pour former un mot de réveil personnalisé (par exemple, « Jarvis ») et le déployer sur la ESP32. La bibliothèque est gratuite pour un usage non commercial.
Contrôle de la voix pour les médias
Intégrez-vous avec Spotify API[ ou Kodi (via JSON-RPC) pour que vous puissiez dire "Jouer du jazz" et commencer à diffuser de la musique.
Intégration des capteurs
Attachez un capteur de température/humidité DHT22. Lorsque l'utilisateur demande « Quelle est la température ? », lisez le capteur et répondez avec la valeur.
Défaut local
Si le Wi-Fi est en panne, revenez à un ensemble limité de commandes hors ligne (p. ex., basculez le relais basé sur un mot clé simple comme "on" ou "off" détecté via Porcupine , correspondance de mots clés).
Considérations relatives à la sécurité et à la protection des renseignements personnels
La construction d'un assistant vocal qui écoute continuellement suscite des préoccupations valables.
- Utilisez HTTPS pour tous les appels d'API. Le système ESP32=S WiFiClientSecure prend en charge TLS, mais vous devez inclure l'empreinte du certificat CA ou un certificat racine de confiance.
- Minimiser la dépendance au cloud[: Utilisez un mot de réveil sur le périphérique pour éviter d'envoyer tout l'audio sur Internet.
- Processus local[: Pour les tâches sensibles, gardez le pipeline de parole hors ligne. Des modèles autonomes comme TensorFlow Lite Micro peuvent reconnaître une poignée de commandes sans connexion Internet.
- Interrupteur de mute physique[: Filez un basculeur entre la puissance du microphone et VCC. Lorsque le micro est éteint, il est complètement désactivé.
- Segmentation réseau[: Placez les appareils IoT sur un réseau VLAN ou invité séparé pour limiter l'exposition si compromis.
Notez également les conditions de service pour toute API cloud que vous utilisez. Certains interdisent la diffusion continue ou exigent le consentement explicite de l'utilisateur. Toujours respecter les règles de confidentialité locales.
Conclusion
Bâtir un assistant à domicile avec microcontrôleurs est un projet enrichissant qui fusionne matériel, logiciel et traitement de langage naturel. En commençant par un ESP32, un microphone MEMS et une API cloud, vous pouvez créer un assistant fonctionnel en un week-end. L'expérience que vous gagnez en audio analogique, communication I2S, réseau Wi-Fi et intégration API vous servira bien dans d'innombrables autres projets IoT.
À mesure que vous vous adoucissez, poussez les limites : ajoutez une reconnaissance locale de la parole, contrôlez MQTT, ou même un tableau de bord web pour former des commandes personnalisées. La beauté d'un assistant bricolage est qu'il évolue avec vous. Il n'y a pas d'écosystème verrouillé – chaque fonction ajoutée est entièrement sous votre contrôle.
Pour plus de détails, consultez le dépôt ESP IoT Solution pour des exemples d'assistants vocaux prêts à être utilisés, et la documentation Porcupine wake word engine [ pour ajouter des déclencheurs personnalisés.