HA TTS

Crear un asistente local con MicroWakeWord

Hoy vamos a ver cómo puedes crear un asistente local con MicroWakeWord, totalmente personalizado y utilizarlo con cualquier altavoz.

Requisitos previos

Para crear un asistente local con MicroWakeWord vamos a utilizar lo siguiente:

  • Una placa ESP32 S3 N16R8. Esta placa es una variación de las placas ESP32 que permiten usar MicroWakeWord, algo de lo que te hablaré en detalle en el siguiente apartado.
  • Un micro INMP441, para dar las órdenes a nuestro asistente.
  • Opcionalmente, un anillo de 35 LEDs WS2812B, que nos va a dar ‘feedback’ visual del estado del asistente.

*Algún precio puede haber cambiado desde la última revisión
  • Un altavoz integrado en Home Assistant para reproducir las respuestas del asistente (bien sea un altavoz local o uno de tus altavoces inteligentes).
💡 Si te lo estás preguntando, , es posible conectar el altavoz directamente a la placa para tener un altavoz "todo en uno". Sin embargo, a día de hoy el 'framework' que requiere este proyecto ('esp-idf') no permite crear una entidad 'Media Player'. Esto significa que si unificas todos los componentes en la misma placa, podrás obtener las respuestas del asistente por el altavoz, pero no podrás utilizarlo para reproducir otras notificaciones o contenidos multimedia.

Ante esta disyuntiva, personalmente he preferido aislar el micrófono del asistente del altavoz, para no perder ninguna funcionalidad. No obstante, si te interesa integrar todos los componentes bajo la misma placa te recomiendo que veas este video de Smart Home Circle, que por cierto ha servido de base para este proyecto. 
  • Haber instalado ESPHome en Home Assistant.
  • Haber configurado Assist en Home Assistant. Puedes usar los complementos “oficiales” de Piper (‘Text to speech’) y Whisper (‘Speech to text’) tal y como se explica en la guía enlazada. No obstante, también puedes utilizar otros complementos como el de Microsoft, para mejorar el reconocimiento de voz, o el de Eleven Labs, para escuchar voces más naturales y fluidas.

MicroWakeWord

En otras ocasiones ya hemos hablado de las ‘wake word’ o palabras de activación, que no es más que una palabra o combinación de ellas que sirven para activar al asistente de voz e indicarle que está a punto de recibir un comando (por ejemplo, “Ok Google”, “Alexa” o “Siri”).

A la hora de crear nuestro propio asistente las ‘wake word’ siempre han sido un tema delicado, ya que para que nuestro asistente reconozca este comando debe estar entrenado para ello. Además, ten en cuenta que tiene que procesar continuamente el audio que capta, para reconocer cuándo le estás llamando. Todo este proceso se realiza en servidores externos (como en el caso de los altavoces inteligentes que compramos) o en nuestro servidor local (si has configurado el asistente de voz de Home Assistant). En el primer caso siempre viviremos con la sospecha de que nos están escuchando, y en el segundo dependeremos de los recursos de nuestra instalación y de lo bien entrenado que esté el modelo.

Pues bien, MicroWakeWord es un componente de ESPHome que ha sido desarrollado para que el reconocimiento de la palabra de activación se realice en el propio dispositivo, lo cual hace que sea más rápido y que no consuma recursos de nuestro servidor local. Para crear un asistente local con MicroWakeWord lo único que necesitamos es una placa con PSRAM, como la ESP32 S3 N16R8 que vamos a utilizar.

Cableado de los componentes

Lo primero que vamos a hacer es conectar los componentes que necesitamos para crear un asistente local con MicroWakeWord. Vamos a divirlo en dos partes, pero como siempre lo primero que te recomiendo es que consultes el ‘pinout’ (o distribución de pines) de la placa. En este caso, usaremos la ESP32 S3 N16R8 cuyo ‘pinout’ es el siguiente.

pinout

Conexión del micro

Empezaremos por soldar directamente el micro a nuestra placa, con el siguiente esquema de conexión.

  • SCK (verde) irá conectado al pin GPIO2 de la placa.
  • WS (naranja) irá conectado al pin GPIO3 de la placa.
  • SD (amarillo) irá conectado al pin GPIO4 de la placa.
  • L/R (blanco) y GND (negro) irán conectados al pin GND (‘ground’ o tierra) de la placa.
  • VDD (rojo) irá conectado al pin de alimentación 3v3 de la placa
💪 Por cierto, ya habrás notado que vas a necesitar soldar (no dejes que te intimide! en esta entrada te explico cómo aprender a soldar). Básicamente necesitas un soldador y un poco de estaño.
micro

Conexión del Anillo LED

Como cualquier tira LED WS2812B nuestro anillo tiene los siguientes pines, que también vamos a soldar directamene a la placa (por lo que tendrás que cortar el adaptador que trae en el extremo de los cables de entrada, a la izquierda).

  • El cable rojo proporciona la alimentación a 5 voltios, por lo que irá al pin correspondiente (5V)
  • El cable blanco es el de la conexión de tierra o ‘ground’, e irá conectado a dicho pin (GND)
  • El cable verde proporciona los datos e irá conectado al GPIO9.
  • El resto de cables los dejaremos sueltos, pero no los quitaremos (ya que nos pueden ser de utilidad en el futuro).
  • Adicionalmente, en la placa tendrás que aplicar una pequeña soldadura para unir los circuitos indicados como ‘RGB(para mandar la información al anillo LED) y ‘IN-OUT(para habilitar la salida de 5V). Si te fijas de cerca, tienen una pequeña endidura que impide el contacto del circuito. Te he marcado la situación de ambos con un círculo rojo en la imagen anterior del ‘pinout’.

Al final la placa y los componentes deben haber quedado así.

componentes

Configuración de ESPHome

Ya tenemos listos los componentes que necesitamos para crear un asistente local con MicroWakeWord. Ahora tenemos que ‘flashear’ la placa con ESPHome y la configuración correspondiente. Para ello sigue estos pasos:

  1. Conecta la placa a tu ordenador a través del puerto USB-C.
  2. En Home Assistant, accede al complemento de ESPHome desde el menú lateral y pulsa en “New device”. Pulsa en “Continue” y dale un nombre (por ejemplo, “Aguacatec Assistant”).
  3. Pulsa en “Next” y a continuación selecciona la opción “ESP32-S3” como tipo de dispositivo. Verás que en el fondo se ha creado un nuevo dispositivo.
  4. Pulsa en “Skip” y haz clic en el enlace “Edit” del bloque correspondiente al dispositivo que acabas de crear.
  5. Reemplaza el código por defecto con el siguiente, haciendo los siguientes cambios:
    • Ajusta el ‘name’ y ‘friendly-name’ como el nombre que le quieras dar a tu asistente.
    • Añade la información que te había generado el complemento en el apartado ‘api’ (‘encryption key’). Haz lo mismo para el campo ‘password’ bajo el apartado ‘ota’, y para los campos ‘ssid’ y ‘password’ bajo el apartado ‘ap’.
    • Si por algún motivo hubieras utilizado pines diferentes en el cableado de los componentes, ajusta la distribución de los pines el código. En caso contrario no debes preocuparte por ello.
    • En la parte final del código, indica la entidad ‘media_player’ correspondiente al altavoz por el que quieras que te hable el asistente (si quieres utilizar Alexa como reproductor, utiliza el servicio ‘notify.alexa_media’ que te proporciona la integración Alexa Media Player).
    • Un par de líneas más abajo, indica la entidad del servicio ‘text-to-speech’ (o ‘tts’) que quieres utilizar en las respuestas del asistente. En mi caso voy a utilizar la integración de ElevenLabs, ya que me gusta las voces naturales y fluidas que tiene.
esphome:
  name: aguacatec-assistant
  friendly_name: Aguacatec Assistant
  platformio_options:
    board_build.flash_mode: dio

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
      CONFIG_AUDIO_BOARD_CUSTOM: "y"
   
psram:
  mode: octal # Please change this to quad for N8R2 and octal for N16R8
  speed: 80MHz

# Enable Home Assistant API
api:
  encryption:
    key: "z213MSI7n7dn4a9ndnf984747npP3zDXj/F8vvoDx4o="
  on_client_connected:
        then:
          - delay: 50ms
          - micro_wake_word.start:
  on_client_disconnected:
        then:
          - voice_assistant.stop: 

logger:

ota:
  - platform: esphome
    password: "369asdas82734bdshds97ba37acfb41345fd1"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Aguacatec-Assistant"
    password: "7kdsfsdg86UNb"

captive_portal:

light:
  - platform: esp32_rmt_led_strip
    id: led_ring
    rgb_order: GRB
    pin: GPIO09
    num_leds: 35
    rmt_channel: 1
    chipset: ws2812
    name: "Led Ring"
    effects:
      - pulse:


# Audio and Voice Assistant Config          
i2s_audio:
  - id: i2s_in # For microphone
    i2s_lrclk_pin: GPIO3  #WS 
    i2s_bclk_pin: GPIO2 #SCK

microphone:
  - platform: i2s_audio
    id: va_mic
    adc_type: external
    i2s_din_pin: GPIO4 #SD
    channel: left
    pdm: false
    i2s_audio_id: i2s_in
    bits_per_sample: 32bit
    
micro_wake_word:
  on_wake_word_detected:    
    - voice_assistant.start:
        wake_word: !lambda return wake_word;
        silence_detection: true
    - light.turn_on:
        id: led_ring
        effect: "Pulse"
        brightness: 80%
  model: hey_jarvis
    
voice_assistant:
  id: va
  microphone: va_mic
  auto_gain: 31dBFS
  noise_suppression_level: 2
  volume_multiplier: 4.0
  on_stt_end:
       then: 
         - light.turn_off: led_ring
  on_error:
          - micro_wake_word.start:  
  on_end:
        then:
          - light.turn_off: led_ring
          - wait_until:
              not:
                voice_assistant.is_running:
          - micro_wake_word.start:  
  on_tts_start:                                    
    - homeassistant.service:
        service: tts.speak
        data:
          media_player_entity_id: media_player.aguacatec_player
          message: !lambda 'return x;'
          entity_id: tts.elevenlabs_tts
  1. Cuando hayas terminado de editar el código pulsa en “Save” e “Install”. Selecciona la opción “Manual download” y espera a que el código se compile (ten paciencia, que tarda un ratillo).
  2. Cuando termine, selecciona la opción “Modern format” para descargar el fichero ‘.bin’ correspondiente.
  3. Ahora ve a la página de ESPHome y pulsa en “Connect”. En la ventana emergente selecciona tu placa y pulsa en “Conectar”.
  4. Ahora pulsa en “Install” y selecciona el fichero ‘.bin’ obtenido en el paso 7. De nuevo, pulsa en “Install”.
⚠️ Si se genera un error en la instalación, inténtalo de nuevo mientras pulsas un pequeño botón que hay en la placa que indica 'boot' hasta que comience la instalación. Como alternativa, desconecta el cable USB-C y conéctalo al otro puerto de la placa. Si aun así el error permanece es probable que necesites instalar los 'drivers' para placas ESP.
  1. Vuelve a Home Assistant y ve a Ajustes > Dispositivos y servicios. Lo normal es que tu dispositivo haya sido descubierto y aparezca en la parte superior, esperando únicamente a que pulses el botón de “Configurar”. De lo contrario pulsa en el botón de “Añadir integración”, busca “ESPHome” e introduce la IP de tu placa en el campo ‘Host’.
  2. Al añadir tu dispositivo ya aparecerá dentro del bloque de “ESPHome” entre tus integraciones. Accede al dispositivo y selecciona las siguientes opciones:
    • Detección de fin de habla. Selecciona la opción “agresivo”.
    • Tubería de Assist. Selecciona el ‘pipeline’ que hayas configurado para tu asistente. Por cierto, también tienes que acceder a Ajustes > Asistentes de voz, pulsar sobre tu ‘pipeline’ y bajar hasta el apartado de “Palabra de activación” para dejarlo vacío (ya que, como hemos visto, vamos a utilizar el componente MicroWakeWord desde el propio dispositivo).
🥑 Como te decía en la introducción, mis opciones favoritas son la de Microsoft para el componente STT y ElevenLabs para el componente TTS. Con esta combinación, junto a la MicroWakeWord he conseguido un rendimiento muy bueno! 
  1. Para terminar ve a Ajustes > Dispositivos y servicios > ESPHome. Pulsa sobre el enlace “Configurar” correspondiente al dispositivo de tu asistente. En la ventana emergente marca la casilla “Permitir que el dispositivo realice llamadas de servicio de Home Assistant” y pulsa en “Enviar”. Esto va a permitir que el asistente emita el audio por otros altavoces.

Montaje

Ahora que tenemos todos nuestro componentes conectados y funcionando, sólo nos queda meterlos en un envoltorio elegante. Para facilitarte la vida he diseñado esta carcasa que puedes descargar de forma gratuita.

Como puedes observar el montaje es muy intuitivo, simplemente tienes que colocar el micrófono en el semicírculo que lo sostiene, introducir el cable usb por el orificio y acomodar el resto de componentes. Para terminar coloca la tapa encima y pruébalo! Por cierto, ya te habrás dado cuenta de que es la base perfecta para cualquier altavoz.

Personalización de tu altavoz

Una de las ventajas de crear un asistente local con MicroWakeWord es la capacidad que tienes para personalizarlo. Esto ya es cuestión de gustos, pero aquí te dejo algunas ideas:

  • Cambia la voz. Para cambiar la voz de tu asistente sólo tienes que cambiar el servicio TTS que utilizas. Si como yo utilizas la integración de ElevenLabs tendrás un montón de voces a tu disposición. Sólo tienes que ir a Ajustes > Dispositivos y servicios > ElevenLabs TTS > Configurar e indicar la voz que quieres utilizar por defecto en el campo “Name of voice to use”.
  • Cambia los colores de la base. Aunque el prototipo es de color negro, no pongas límites a tu imaginación. Puedes imprimirlo con el filamento que más te guste!
  • Cambia el color de los LEDs. En el código está parametrizado el efecto de “parpadeo”, pero puedes seleccionar el color con el que lo hace desde Ajustes > Dispositivos y servicios > ESPHome, pulsando sobre el dispositivo de tu asistente y haciendo clic sobre “Led Ring” para seleccionar la tonalidad que más te guste en la paleta de colores.
  • Cambia el nombre. Con MicroWakeWord puedes entrenar tu propio modelo de palabra de activación (esto ya no es tan sencillo, pero todo llegará!).

¿Dudas?¿necesitas ayuda? entra aquí
Y si te ha gustado, compártelo! 🙂
quieres mas
Send this to a friend