Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

di Vincenzo Caputo

26 Febbraio 2025

Home Assistant

Vincenzo Caputo

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:

https://youtu.be/sAwnQGCCAO8

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.

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker 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

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

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:

https://youtu.be/nJE4LcLLWxY

Dopo aver caricato il firmware dovreste ottenere un funzionamento di questo tipo:

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

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.

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

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.

Vincenzo Caputo

Vincenzo Caputo

Nato a Matera, il 1° novembre 1977. Sono da sempre appassionato di tecnologia e ho un'esperienza lavorativa ventennale nel settore IT. Mi piace sperimentare e cercare sempre nuove soluzioni e soprattutto mi piace comunicare le mie esperienze agli altri.

Disqus loading...