Hoy vamos a ver cómo puedes crear un asistente local con MicroWakeWord, totalmente personalizado y utilizarlo con cualquier altavoz.
🥑 Si estás empezando con ESPHome, te recomiendo que veas el taller de la academia para sacarle el máximo partido!
Índice
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.
- 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, Sí, 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.
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.
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’. Si no ves alguno de estos puentes, es que ya viene hecho internamente.
Al final la placa y los componentes deben haber quedado así.
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:
- Conecta la placa a tu ordenador a través del puerto USB-C.
- 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»).
- 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.
- Pulsa en «Skip» y haz clic en el enlace «Edit» del bloque correspondiente al dispositivo que acabas de crear.
- 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% models: 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
- 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).
- Cuando termine, selecciona la opción «Modern format» para descargar el fichero ‘.bin’ correspondiente.
- Ahora ve a la página de ESPHome y pulsa en «Connect». En la ventana emergente selecciona tu placa y pulsa en «Conectar».
- 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.
- 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’.
- 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!
- 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.
🥑 Si estás configurando Assist, te recomiendo que veas el taller de la academia para sacarle el máximo partido!
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! 🙂