
Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!
di Vincenzo Caputo
26 Febbraio 2025
Home Assistant

Home Assistant è sempre più votato hai comandi vocali, come avrete intuito anche dai diversi contenuti che abbiamo pubblicato di recente.
Proprio qualche settimana fa mi sono occupato di effettuare una prima prova del dispositivo ufficiale che il team di Open Home Foundation, la fondazione che ha creato appunto Home Assistant, ha realizzato in versione preview.
Potete leggere l'articolo dedicato al seguente link:
Home Assistant Voice - installazione e prima prova di funzionamento
Prima ancora Luigi Duchi aveva proposto, sul nostro canale YouTube MissingTech, un interessantissimo contenuto sempre incentrato sui comandi vocali in ambiente Home Assistant.
Qui di seguito il link a quel video:
In quel caso Luigi Duchi aveva usato un ATOM Echo programmato con ESPHome.
![]() |
MicroMaker Strumenti di Sviluppo Ci Audio Atom Echo è Un Altoparlante Intelligente programmabile basato sul Design M5ATOM
Prezzo intero: 35,90€ | Prezzo scontato: 35,90€ |
Tutte e due i contenuti proposti si basavano su Hardware bello e pronto.
Oggi invece vorrei proporre una soluzione completamente home made e soprattutto super economica, con un tocco di personalizzazione che credo interessi a molti.
Vi mostrerò infatti come ottenere un assistente vocale che invia risposte vocali ad altoparlanti esterni tramite Home Assistant.
Per realizzare questo progetto ho usato un semplice micro-controllore ESP32
![]() |
diymore 1 Pezzo ESP32 WROOM 32 Scheda di Sviluppo ESP32 NodeMCU Moduli 2.4GHz Dual Core WLAN WiFi Bluetooth CP2102 Chip ESP32 WROOM
Prezzo intero: 8,99€ | Prezzo scontato: 8,99€ |
Un microfono digitale panoramico INMP441 con Interfaccia I2S MEMS ed alta precisione.
![]() |
Youmile INMP441 Modulo microfono omnidirezionale Interfaccia I2S MEMS Alta precisione Bassa potenza Volume ultra piccolo per ESP32 Fai da te con cavo Dupont
Prezzo intero: 9,69€ | Prezzo scontato: 9,69€ |
Saranno necessari anche dei cavetti jumper per i collegamenti:
![]() |
ELEGOO 120pcs 3 in 1 Kit Cavetti Jumper Filo Dupont Multicolore Wire 28AWG Cavi 40 pezzi 40 pezzi da Maschio a Maschio, 40 pezzi da Femmina a Femmina per Arduino Raspberry Pi
Prezzo intero: 9,98€ | Prezzo scontato: 9,98€ |
Potrete naturalmente acquistare tutti questi componenti anche su Aliexpress ad una frazione del prezzo Amazon.
A voi la scelta!
Per quanto riguarda i collegamenti potrete far riferimento allo schema che riporto qui di seguito, ignorando naturalmente la parte che riguarda lo speaker che, come ho detto, non collegheremo all'esp32 usandone uno esterno.

Nella fattispecie io ho collegato come di seguito riportato:
- L/R e GND (del mic) su GND (dell'esp32)
- VDD (del mic) su 3V3 (dell'esp32)
- SCK (del mic) su GPIO25 (dell'esp32)
- SD (del mic) su GPIO32 (dell'esp32)
- WS (del mic) su GPIO26 (dell'esp32)
Occhio perché, dove sull'immagine è indicato il pin33, io ho usato il pin32.
A questo punto non vi resterà altro da fare che caricare in Home Assistant, alla sezione ESPHome Builder, il codice che trovate incollato qui di seguito.
i2s_audio:
- id: i2s_in
i2s_lrclk_pin: GPIO26 #WS / LRC
i2s_bclk_pin: GPIO25 #SCK /BCLK
microphone:
- platform: i2s_audio
adc_type: external
pdm: false
id: mic_i2s
channel: right
bits_per_sample: 32bit
i2s_audio_id: i2s_in
i2s_din_pin: GPIO32
speaker:
- platform: i2s_audio
id: my_speaker
dac_type: external
i2s_dout_pin: GPIO27 #DIN
i2s_mode: primary
i2s_audio_id: i2s_in
voice_assistant:
microphone: mic_i2s
id: va
noise_suppression_level: 2
auto_gain: 31dBFS
volume_multiplier: 4.0
use_wake_word: false
speaker: my_speaker
on_tts_start:
- homeassistant.service:
service: tts.cloud_say
data:
entity_id: media_player.casa
data_template:
message: "{{ my_stt }}"
variables:
my_stt: return x;
on_error:
- if:
condition:
switch.is_on: use_wake_word
then:
- switch.turn_off: use_wake_word
- switch.turn_on: use_wake_word
on_client_connected:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
on_client_disconnected:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.stop:
binary_sensor:
- platform: status
name: API Connection
id: api_connection
filters:
- delayed_on: 1s
on_press:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
on_release:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.stop:
switch:
- platform: template
name: Use wake word
id: use_wake_word
optimistic: true
restore_mode: RESTORE_DEFAULT_ON
entity_category: config
on_turn_on:
- lambda: id(va).set_use_wake_word(true);
- if:
condition:
not:
- voice_assistant.is_running
then:
- voice_assistant.start_continuous
on_turn_off:
- voice_assistant.stop
- lambda: id(va).set_use_wake_word(false);
Il codice lo dovrete incollare dopo la riga captive_portal:
Nella parte precedente infatti ci sono le informazioni di base del vostro esp32 come i dati della rete WiFi a cui vi collegate, ecc...
Per le istruzioni di caricamento del codice fate riferimento alla guida precedente dove ho spiegato tutto nel dettaglio sia nel caso in cui siate al primo flash di ESPHome su un nuovo dispositivo, sia che siate ad aggiornare come in questo mio caso.
4 Canali a contatto pulito a meno di 5 euro con ESPHome!
Se avete usato gli stessi pin che ho usato io per collegare il microfono all'esp32, non dovrete fare modifiche al codice, tranne una:
dovrete sostituire la voce che riguarda il media player con quella vostra. Nel mio caso è media_player.casa
Nel vostro caso dovrete verificare il nome dell'entità che vi interessa e sostituirla con quella che trovare nel codice.
Io nel video, che trovate in coda all'articolo, ho usato un Google Home, ma in casa ho diverse schede Arylic collegate a degli altoparlanti di qualità e farò eseguire la sintesi vocale proprio li.
Abbiamo proposto un video a riguardo al seguente link:
Dopo aver caricato il firmware dovreste ottenere un funzionamento di questo tipo:
Vi ricordo che i dispositivi programmati con ESPHome vengono direttamente integrati in Home Assistant che li supporta nativamente.
A questo punto potrete già impartire comandi vocali, ma non otterrete ancora nessuna risposta sull'altoparlante esterno (nel mio caso il Google Home).
Dovrete abilitare prima l'ESP32 ad eseguire comandi in Home Assistant.
Accedete all'integrazione ESPHome e cliccate su configura come proposto nella seguente immagine e successivamente abilitate la check-box indicata.

A questo punto dovreste ottenere sintesi vocale sull'altoparlante esterno che avete configurato nel codice.
Un esempio di funzionamento nel video qui in coda direttamente dal nostro canale YouTube MissingTech.
Produrre e aggiornare contenuti su vincenzocaputo.com richiede molto tempo e lavoro. Se il contenuto che hai appena letto è di tuo gradimento e vuoi supportarmi, clicca uno dei link qui sotto per fare una donazione.