Introduzione: Perché costruire un assistente domestico controllato dalla voce?

Il controllo vocale non è più un concetto futuristico: è un modo pratico per interagire con il tuo ambiente domestico. Mentre le soluzioni commerciali come Amazon Echo o Google Nest offrono convenienza, costruendo il proprio assistente domestico controllato dalla voce con microcontrollori ti dà il controllo completo sulla funzionalità, sulla privacy e sui costi. Questo progetto ti insegna come combinare schede microcontrollori a basso costo, moduli microfono, altoparlanti, cloud o riconoscimento vocale on-device per creare un sistema di controllo che risponda.

Questa guida ampliata copre la selezione dei componenti, l'architettura del sistema, la configurazione dell'hardware passo dopo passo, i dettagli di programmazione, i metodi di prova e le funzionalità avanzate.

Scegliere il Microcontroller destro

Il microcontrollore è il cervello del vostro assistente. Deve gestire la cattura audio, la comunicazione di rete e il controllo del dispositivo. Tre scelte popolari sono l'ESP32, Arduino Uno con lo scudo Wi-Fi, e Raspberry Pico W.

ESP32

L'ESP32 è l'opzione più consigliata perché ha Wi-Fi integrato e Bluetooth, RAM sufficiente (520 KB) e un processore dual-core che può gestire simultaneamente lo streaming audio in tempo reale e le chiamate API. Supporta anche l'Arduino IDE e MicroPython, rendendo la programmazione semplice.

Arduino Uno con Wi-Fi Shield

Un Arduino Uno abbinato ad uno schermo Wi-Fi ESP8266 è un'alternativa valida se già possiedi uno Uno. Tuttavia, la limitata RAM (2 KB) e la velocità dell'orologio più lento rendono più difficile gestire buffer audio. Probabilmente è necessario scaricare l'elaborazione pesante al cloud, che può introdurre latenza.

Pico di lampone W

Annunciato nel 2022, il Raspberry Pico W include Wi-Fi e funziona a 133 MHz con 264 KB SRAM. È meno potente dell'ESP32 ma funziona bene per i set di comandi più semplici. Il suo supporto MicroPython è eccellente per la prototipazione rapida.

Per questa guida, presumiamo che si stia utilizzando un ESP32. È possibile trovare documentazione ufficiale e schede di dati al [Espressif ESP32 Reference[.

Moduli per microfono e altoparlante

Per il microfono è necessario un modulo che emette un segnale analogico pulito. L'amplificatore microfono elettretico MAX4466 è una scelta popolare perché è sensibile, a basso rumore e funziona con logica 3.3V. Per una migliore qualità del suono, prendere in considerazione il microfono INMP441 MEMS, che utilizza I2S per l'audio digitale e elimina problemi di rumore analogico.

Per l'altoparlante, un semplice altoparlante da 8 ohm, da 0,5W collegato tramite un resistore (per limitare la corrente) può produrre feedback udibili. Per un volume più elevato e un'uscita più chiara, utilizzare l'amplificatore MAX98357 I2S con un piccolo altoparlante. Questo modulo può guidare un altoparlante 3W ed è facile da interfacciarsi con l'ESP32.

Testare sempre ogni componente audio individualmente prima di integrarli nel sistema. Un rapido schizzo può registrare l'audio al monitor seriale o giocare un tono di prova per verificare il cablaggio e la configurazione.

Comprendere le opzioni di riconoscimento vocale

Riconoscimento vocale basato su cloud

Servizi come Google Speech-to-Text, []Amazon Transcribe[, o ]Azure Speech-to-Text offrono alta precisione e supporto più lingue.

Riconoscimento vocale on-Device

Per la privacy e l'operazione offline, è possibile utilizzare librerie leggere come Porcupine (da Picovoice) o [TensorFlow Lite Micro] con un modello di rilevamento delle parole chiave personalizzato.

Un approccio ibrido è anche popolare: usare una parola di sveglia on-device per attivare il riconoscimento basato su cloud per i comandi completi, riducendo l'utilizzo del cloud e migliorando il tempo di risposta.

Panoramica sull'architettura di sistema

Un'architettura tipica consiste di tre strati:

  1. Input Layer[[]: Microfono cattura il suono. Un convertitore analogico-digitale (ADC) o interfaccia I2S converte il segnale ai dati digitali.
  2. Processing Layer[[]: Il microcontroller buffer audio, rileva una parola sveglia o una pressione del pulsante, quindi invia l'audio chunk a una API cloud o lo elabora localmente.
  3. Layer di uscita[[]: Il microcontroller attiva i relè, invia i segnali infrarossi, pubblica i messaggi MQTT, o utilizza GPIO per controllare i dispositivi.

Il seguente diagramma (concettivo) mostra il flusso di dati: Microfono → ESP32 → Wi-Fi → Cloud API → JSON risposta → ESP32 → Relay/LED/Speaker. Per l'elaborazione locale, il passo cloud è sostituito da una libreria locale.

Guida alla costruzione passo-passo

Passo 1: Raccogliere componenti

Ti serviranno:

  • ESP32 development board (ad esempio, NodeMCU-32S)
  • Modulo microfono MAX4466 o INMP441
  • MAX98357 amplificatore I2S + altoparlante (3W, 4-8 ohm)
  • Filo di trampolino e saltatore
  • Modulo di relè (per il controllo degli apparecchi AC)
  • Facoltativo: LED, resistore, pulsante, display OLED
  • Alimentazione USB (5V, 2A)

Fase 2: Wiring

Collegare il modulo microfono:

  • MAX4466[: VCC a 3.3V, GND a GND, OUT to GPIO34 (ADC).
  • INMP441 (I2S)[]: VCC a 3.3V, GND a GND, L/R a GND (canale sinistro), DOUT a GPIO25, BCLK a GPIO26, WS a GPIO27.

Collegare l'amplificatore dell'altoparlante:

  • MAX98357[[: VIN a 5V (o potenza USB), GND a GND, BCLK a GPIO26, LRC a GPIO27, DIN a GPIO25. (Nota: BCLK e WS pin possono essere condivisi con microfono I2S se configurato correttamente, ma è più facile assegnare perni separati per evitare conflitti.)
  • Altoparlante positivo all'uscita dell'amplificatore positivo, negativo all'uscita negativa.

Collegare il modulo relè:

  • VCC a 5V, GND a GND, IN a GPIO32 (o qualsiasi pin digitale).
  • Relè contatti al vostro elettrodomestici (utilizzando un circuito ad alta tensione separato – prendere precauzioni di sicurezza).

Passo 3: Installare dipendenze software

Installare il Arduino IDE[[]] e aggiungere il pacchetto di schede ESP32.

  • WiFi.h (integrato)
  • HTTPClient.h
  • ArduinoJson.h (per le risposte API di parsing)
  • driver/i2s.h (per audio I2S)
  • WebServer.h[] (se necessario per la configurazione locale)

Per il riconoscimento del cloud, avrete anche bisogno della libreria client Google Speech-to-Text API[ (o utilizzare chiamate dirette REST). Per la parola di sveglia on-device, installare Porcupine libreria da Picovoice.

Passo 4: Programmazione del Microcontroller

Scrivere codice che esegue il seguente loop:

  1. Inizializza[]: Impostare Wi-Fi, microfono I2S, altoparlante e GPIO.
  2. Ascolta per la parola di veglia[[]: continuamente l'audio e si alimenta a Porcupine. Quando viene rilevata una parola di sveglia, imposta una bandiera e gioca un segnale acustico.
  3. Comando della registrazione[: Cattura 3–5 secondi di audio (o fino al rilevamento del silenzio).
  4. Invia al cloud[[]: Converti l'audio in formato richiesto (WAV PCM 16-bit, 16 kHz mono). POST a Google Speech-to-Text endpoint.
  5. Comando ruvido[]: Usare l'abbinamento delle stringhe o un semplice paraser intento. Ad esempio, se trascrizione contiene "tornare sulla luce", impostare GPIO32 HIGH.
  6. Rispond[]: Gioca un tono di conferma o parla il risultato tramite TTS (opzionale).
  7. Ritorna allo stato d'ascolto.

Di seguito è riportato un snippet di codice semplificato (non destinato ad essere verbatim copiato) che illustra la struttura:

#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
 }
}

Utilizzare la classe WiClientSecure[[[]] per le richieste HTTPS.

Test e debug del tuo assistente

Testare prima ogni componente in isolamento:

  • Microfono[[]: Carica uno schizzo che legge l'ADC o I2S e stampa l'ampiezza al plotter seriale. Parla nel microfono e verifica i cambiamenti della forma d'onda.
  • Speaker[]: Usa la funzione tono() o il lettore I2S per produrre una semplice melodia.
  • Wi-Fi[]: Ping google.com dal monitor seriale.
  • Relay]: Toggle the pin manualmente and listen for the click.

Inizia con un semplice comando hardcoded (ad esempio, premi un pulsante per inviare un file audio di prova) per garantire le funzioni della chiamata API.

Questioni comuni:

  • Nessun audio rilevato[: Controllare i perni I2S cablaggio, tasso di campionamento, bit profondità errore. Su ESP32, ADC canali 0–7 non sono tutti disponibili; utilizzare GPIO34-39 per ADC1.
  • API restituisce "vuoto"[[]: Assicurare che l'audio sia nel formato corretto (PCM a 16 bit, 16kHz, mono). Google si aspetta WAV codificato a 64-encoded o byte grezze con una frequenza di campionamento corrispondente.
  • Risposta bassa[]: La latenza della rete è inevitabile. Utilizzare un modulo Ethernet cablato se possibile, o ridurre la durata dell'audio.

Ampliamento della funzionalità

Una volta che il tuo assistente di base funziona, consideri l'aggiunta di queste caratteristiche:

Controllo di dispositivi multipli

Usate un broker MQTT[[] (come Mosquitto) per pubblicare comandi ad altri nodi ESP32 intorno alla casa. La vostra unità principale può inviare "cucina/luce/on" ad un nodo secondario che controlla quella luce specifica.

Feedback testuale (TTS)

Invece di un semplice segnale acustico, utilizzare Google Cloud Text-to-Speech API[[]] o una libreria offline come [espeak[] (portato a ESP32) per parlare messaggi di conferma.

Parole di sveglia personalizzate

Usa Picovoice Console per formare una parola di sveglia personalizzata (ad esempio, "Jarvis") e usarla sull'ESP32. La libreria è gratuita per uso non commerciale.

Controllo vocale per i media

Integrare con ]Spotify API[] o Kodi[] (via JSON-RPC) in modo da poter dire "Play jazz" e iniziare a trasmettere musica.

Integrazione dei sensori

Attaccare un sensore di temperatura/umidità DHT22. Quando l'utente chiede "Qual è la temperatura?", leggere il sensore e rispondere con il valore.

Autunno locale

Se il Wi-Fi è in calo, torna a un limitato insieme di comandi offline (ad esempio, il relè di attivazione basato su una semplice parola chiave come "on" o "off" rilevata tramite l'accoppiamento di parole chiave di Porcupine).

Considerazioni sulla sicurezza e sulla privacy

Costruire un assistente vocale che ascolta continuamente solleva preoccupazioni valide.

  • Utilizza HTTPS[] per tutte le chiamate API. Il WiFiClientSecure di ESP32 supporta TLS, ma è necessario includere l'impronta digitale del certificato CA o un certificato root affidabile.
  • Minimizzare la dipendenza dal cloud[[]: Usare la parola di sveglia su dispositivo per evitare di inviare tutti gli audio su Internet.
  • Trattamento locale[]: Per le attività sensibili, tenere offline l'intero canale vocale. Modelli standalone come [TensorFlow Lite Micro possono riconoscere una manciata di comandi senza alcuna connessione internet.
  • Interruttore di mute physical[[: Fili un commutatore di commutazione tra l'alimentazione del microfono e VCC. Quando spento, il microfono è completamente disattivato.
  • Gestione di rete[[]]: Posizionare dispositivi IoT su una rete VLAN o guest separata per limitare l'esposizione se compromessa.

Nota anche i termini di servizio per qualsiasi API cloud che utilizzi, alcuni proibiscono lo streaming continuo o richiedono un consenso esplicito dell'utente.

Conclusioni

Con un ESP32, un microfono MEMS e un'API cloud, puoi creare un assistente funzionale in un weekend. L'esperienza che ottieni in audio analogico, comunicazione I2S, rete Wi-Fi e integrazione API ti servirà bene in innumerevoli altri progetti IoT.

Mentre si sviluppano comodi, spingere i confini: aggiungere il riconoscimento vocale locale, il controllo su MQTT, o anche un cruscotto web per formare i comandi personalizzati. La bellezza di un assistente fai da te è che si evolve con voi. Non c'è un ecosistema chiuso - ogni caratteristica che si aggiunge è completamente sotto il vostro controllo.

Per ulteriori informazioni, controllare il ESP IoT Solution] repository per esempi di assistenti vocali pronti, e il Porcupine wake word documentazione del motore[[] per aggiungere trigger personalizzati.