Introducción: ¿Por qué construir un asistente de casa controlado por voz?

El control de voz ya no es un concepto futurista, es una forma práctica de interactuar con su entorno de hogar. Mientras que las soluciones comerciales como Amazon Echo o Google Nest ofrecen comodidad, la construcción de su propio asistente de voz con microcontroladores le da control completo sobre funcionalidad, privacidad y costo. Este proyecto le enseña cómo combinar las placas de microcontroladores de bajo costo, los módulos de micrófono, los altavoces y el reconocimiento de voz en dispositivos para crear un sistema que se vuelva a responder.

Esta guía ampliada cubre la selección de componentes, la arquitectura del sistema, la configuración de hardware paso a paso, detalles de programación, métodos de prueba y características avanzadas. Al final, tendrá una base sólida para construir un asistente de voz confiable que se ajuste a su ecosistema inteligente hogareño.

Elegir el microcontrolador derecho

El microcontrolador es el cerebro de tu asistente. Debe manejar la captura de audio, la comunicación de red y el control de dispositivos. Tres opciones populares son el ESP32, Arduino Uno con el escudo Wi-Fi, y Raspberry Pico W.

ESP32

El ESP32 es la opción más recomendable porque tiene Wi-Fi incorporado y Bluetooth, RAM suficiente (520 KB), y un procesador de doble núcleo que puede manejar streaming de audio en tiempo real y las llamadas API simultáneamente. También es compatible con el Arduino IDE y MicroPython, haciendo programación directa. Su bajo costo (unos $5-$10) y el amplio soporte comunitario lo hacen ideal para este proyecto.

Arduino Uno con Wi-Fi Shield

Un Arduino Uno emparejado con un escudo ESP8266 Wi-Fi es una alternativa viable si ya posees un Uno. Sin embargo, la RAM limitada (2 KB) y la velocidad del reloj más lenta hacen que sea más difícil gestionar los amortiguadores de audio. Es probable que necesite descargar el procesamiento pesado a la nube, que puede introducir latencia.

Raspberry Pico W

Anunciado en 2022, el Raspberry Pico W incluye Wi-Fi y funciona en 133 MHz con 264 KB SRAM. Es menos poderoso que el ESP32 pero funciona bien para conjuntos de comandos más simples. Su soporte MicroPython es excelente para el prototipado rápido.

Para esta guía, suponemos que está utilizando un ESP32. Puede encontrar documentación oficial y hojas de datos en el Espressif ESP32 Referencia.

Módulos de micrófono y altavoz

Para el micrófono, necesita un módulo que emite una señal analógica limpia. El amplificador de micrófono de la opción MAX4466 es una opción popular porque es sensible, de baja ruido y funciona con la lógica 3.3V. Para una mejor calidad de sonido, considere el micrófono MEMS INMP441, que utiliza I2S para el audio digital y elimina los problemas de ruido analógico.

Para el altavoz, un simple altavoz de 8-ohm, 0.5W conectado a través de un resistor (para limitar la corriente) puede producir una retroalimentación audible. Para mayor volumen y salida más clara, utilice el amplificador MAX98357 I2S con un pequeño altavoz. Este módulo puede conducir un altavoz de 3W y es fácil de interactuar con el ESP32.

Siempre prueba cada componente de audio individualmente antes de integrarlos en el sistema. Un boceto rápido puede grabar audio en el monitor de serie o reproducir un tono de prueba para verificar la cableación y configuración.

Comprensión de las opciones de reconocimiento de voz

Reconocimiento de voz basado en la nube

Los servicios como Google Speech-to-Text, Amazon Transcribe, o Azure Speech-to-Text ofrecen alta precisión y soporte múltiples idiomas. Usted envía datos de audio sobre HTTP o WebSocket

Reconocimiento de voz en dispositivo

Para la privacidad y el funcionamiento fuera de línea, puede utilizar bibliotecas ligeras como Porcupine (de Picovoice) o TensorFlow Lite Micro con un modelo de detección de palabras clave personalizadas. Porcupine ofrece palabras de vela pre-entrenadas (por ejemplo, "Computer", "AlLTtraincons") y funciona

Un enfoque híbrido también es popular: use una palabra de vela en el dispositivo para activar el reconocimiento basado en la nube para los comandos completos. Esto reduce el uso de la nube y mejora el tiempo de respuesta.

Resumen de la arquitectura de sistema

Una arquitectura típica consiste en tres capas:

  1. Layer de entrada: El micrófono captura el sonido. Un convertidor analógico a digital (ADC) o la interfaz I2S convierte la señal a los datos digitales.
  2. ]Procesamiento de capa: El microcontrolador amortigua el audio, detecta una palabra de vela o pulsador, luego envía el sonido a una API de nube o lo procesa localmente. Después del reconocimiento, se analiza el texto de comando y lo mapea a una acción.
  3. ] Layer de salida: El microcontrolador activa relés, envía señales infrarrojas, publica mensajes MQTT o usa GPIO para controlar dispositivos. También puede reproducir una confirmación de audio a través del altavoz.

El siguiente diagrama (conceptual) muestra el flujo de datos: Micrófono → ESP32 → Wi-Fi → Cloud API → JSON response → ESP32 → Relay/LED/Speaker. Para el procesamiento local, el paso de la nube es reemplazado por una biblioteca local.

Guía de construcción paso a paso

Paso 1: Recopilar componentes

Necesitarás:

  • ESP32 (por ejemplo, NodeMCU-32S)
  • Módulo de micrófono MAX4466 o INMP441
  • Amplificador I2S MAX98357 + altavoz (3W, 4-8 ohm)
  • Cables de pan y saltador
  • Módulo de relé (para controlar electrodomésticos AC)
  • Opcional: LED, resistor, botón de empuje, pantalla OLED
  • Fuente de alimentación USB (5V, 2A)

Paso 2: Cableado

Conecta el módulo de micrófono:

  • 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 (canal izquierdo), DOUT a GPIO25, BCLK a GPIO26, WS a GPIO27.

Conecta el amplificador de altavoz:

  • ]MAX98357: VIN a 5V (o potencia USB), GND a GND, BCLK a GPIO26, LRC a GPIO27, DIN a GPIO25. (Nota: BCLK y WS pines pueden compartirse con el micrófono I2S si se configuran correctamente, pero es más fácil asignar pins separados para evitar conflictos.
  • Altavoz positivo para el rendimiento amplificador positivo, negativo para el resultado negativo.

Conectar el módulo de relé:

  • VCC a 5V, GND a GND, IN a GPIO32 (o cualquier pin digital).
  • Relé contactos a su aparato (utilizando un circuito de alta tensión separado – tome precauciones de seguridad).

Paso 3: Instalar dependencias de software

Instala el Arduino IDE y añade el paquete de la tabla ESP32. Usa el Administrador de Juntas para instalar "esp32" por Espressif Systems.

  • WiFi.h (construido-en)
  • HTTPClient.h
  • ArduinoJson.h (para la parización de las respuestas de la API)
  • driver/i2s.h (para audio I2S)
  • WebServer.h (para la configuración local si es necesario)

Para el reconocimiento de la nube, también necesitará la API de Google Speech-to-Text biblioteca de clientes (o utiliza llamadas REST directas). Para palabra de despertador de dispositivos, instale Porcupine]] biblioteca de Picovoice.

Paso 4: Programación del microcontrolador

Escriba código que ejecuta el siguiente bucle:

  1. Initializar: Configurar Wi-Fi, micrófono I2S, altavoz y GPIO.
  2. Escucha por palabra despertada: Muestra continuamente audio y alimentación a Porcupine. Cuando se detecta una palabra de vela, establece una bandera y toca una abeja.
  3. Record command: Captura de 3 a 5 segundos de audio (o hasta la detección del silencio). Guardar a un búfer.
  4. Enviar a la nube: Convertir audio en formato requerido (WAV PCM 16-bit, 16 kHz mono). POST a Google Speech-to-Text endpoint. Recibir JSON con transcripción.
  5. Mando grueso: Usar la cuerda que coincida o un simple parser de intención. Por ejemplo, si la transcripción contiene "volver sobre la luz", establece GPIO32 ALTO.
  6. Respond: Toque un tono de confirmación o hable el resultado a través de TTS (opcional).
  7. Regresa al estado de escucha.

A continuación se muestra un fragmento de código simplificado (no destinado a ser literales pasados por copia) que ilustra la estructura:

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

Implementar el manejo de errores para la desconexión Wi-Fi, los plazos de API y los comandos inválidos. Utilice la clase WiFiClientSecure para las solicitudes HTTPS.

Pruebas y depuración de su asistente

Prueba cada componente en el aislamiento primero:

  • Microphone: Sube un boceto que lee el ADC o el I2S e imprime amplitud al plotter de serie. Habla en el micrófono y verifica los cambios de forma de onda.
  • Speaker: Usar la función tono() o el reproductor I2S para producir una melodía simple.
  • Wi-Fi: Ping google.com del monitor de serie.
  • Relay: Toggle the pin manually and listen for the click.

A continuación, integre el reconocimiento de voz. Comience con un comando simple codificado (por ejemplo, presione un botón para enviar un archivo de audio de prueba) para asegurar que la llamada API funciona. Movido gradualmente a la entrada de micrófono en vivo. Utilice los registros de serie para ver la transcripción y el momento.

Cuestiones comunes:

  • No se detecta ningún audio: Revisar el cableado de pins I2S, frecuencia de muestra, desajuste de profundidad de bits. En ESP32, los canales ADC 0–7 no están disponibles; use GPIO34-39 para ADC1.
  • API devuelve "vacío": Asegurar que el audio está en el formato correcto (16-bit PCM, 16kHz, mono). Google espera que el WAV de base64-encoded o bytes crudos con una tasa de muestra coincidente.
  • Respuesta lenta: Latencia de red es inevitable. Utilice un módulo Ethernet cableado si es posible, o reduzca la duración del audio.

Ampliación de la funcionalidad

Una vez que su asistente básico trabaja, considere agregar estas características:

Control de dispositivos múltiples

Usa un broker MQTT (como Mosquitto) para publicar comandos a otros nodos ESP32 alrededor de la casa. Su unidad principal puede enviar "kitchen/light/on" a un nodo secundario que controla esa luz específica.

Comentarios de texto a voz (TTS)

En lugar de una simple señal, utilice la Google Cloud Text-to-Speech API o una biblioteca offline como espeak] (portada a ESP32) para hablar mensajes de confirmación. Esto hace que el asistente sea más interactivo.

Palabras de Despierta personalizadas

Use Picovoice Console para entrenar una palabra de vela personalizada (por ejemplo, "Jarvis") y desplegarla en el ESP32. La biblioteca es gratuita para uso no comercial.

Control de voz para los medios

Integrar con Spotify API o Kodi] (via JSON-RPC) para que puedas decir "Play jazz" y empezar a streaming de música.

Integración de sensores

Adjunte un sensor de temperatura/humedad DHT22. Cuando el usuario pregunta "¿Cuál es la temperatura?", lea el sensor y responde con el valor.

Local Fallback

Si el Wi-Fi está bajado, vuelva a un conjunto limitado de comandos offline (por ejemplo, relé de rebote basado en una simple palabra clave como "on" o "off" detectado a través de la palabra clave de Porcupine.

Consideraciones de seguridad y privacidad

Construir un asistente de voz que escucha continuamente plantea preocupaciones válidas. Tome estos pasos para protegerse:

  • ]Use HTTPS] para todas las llamadas API. El WiFiClientSecure de ESP32 admite TLS, pero debe incluir la huella de certificado CA o un certificado de raíz de confianza.
  • Minimizar dependencia de la nube: Usar palabra de despertador de dispositivos para evitar enviar todo el audio a Internet. Sólo se envía audio de comando corto.
  • Procesamiento local: Para tareas sensibles, mantenga todo el sistema de discurso fuera de línea. Modelos independientes como TensorFlow Lite Micro pueden reconocer un puñado de comandos sin conexión a Internet.
  • Interruptor de muda histérica: Anillo de conmutación entre la potencia del micrófono y la VCC. Cuando se apaga, el micrófono está completamente deshabilitado.
  • Segmento de red: Colocar dispositivos IoT en una red VLAN o huésped separada para limitar la exposición si se comprometió.

También tenga en cuenta los términos de servicio para cualquier API de nube que utilice. Algunos prohíben la transmisión continua o requieren un consentimiento explícito del usuario.

Conclusión

Construir un asistente de hogar controlado por voz con microcontroladores es un proyecto de recompensa que fusiona hardware, software y procesamiento de lenguaje natural. Al comenzar con un ESP32, un micrófono MEMS, y una API de nube, puede crear un asistente funcional en un fin de semana. La experiencia que usted gana en audio analógico, comunicación I2S, redes Wi-Fi y la integración API le servirá bien en innumerables otros proyectos de IoT.

A medida que creces cómoda, empuja los límites: agrega reconocimiento de discurso local, control sobre MQTT, o incluso un panel web para entrenar comandos personalizados. La belleza de un asistente de bricolaje es que evoluciona con usted. No hay ningún ecosistema bloqueado—toda característica que agregas está completamente bajo su control.

Para más lectura, compruebe el repositorio ESP IoT Solution para ejemplos de asistentes de voz listos, y el Porcupine wake word engine documentation] para añadir desencadenantes personalizados. ¡Feliz edificio!