Cómo Crear un Asistente de Voz con Home Assistant: Tutorial Completo 2026
Home Assistant se ha convertido en la plataforma dominante para crear asistentes de voz privados y personalizados. A diferencia de Alexa o Google Home, tu asistente de voz corre completamente en tu red local, sin enviar datos a servidores externos. En este tutorial completo, aprenderás cómo crear un asistente de voz inteligente desde cero.
Entendiendo el Protocolo Wyoming
Wyoming es el corazón de la arquitectura de voz en Home Assistant 2024+. Es un protocolo de comunicación simplificado entre componentes de audio.
¿Qué Es Wyoming?
1Wyoming es un protocolo ligero para comunicación entre:2- Microfonos/dispositivos de entrada3- Servicios de reconocimiento de voz (STT)4- Procesadores de intent5- Servicios de síntesis de voz (TTS)6- Dispositivos de salida (altavoces)7 8Características:9- Comunicación en tiempo real10- Bajo latencia11- Arquitectura desacoplada12- Fácil de extender
Ventajas de Wyoming
1✅ Modular: Cambiar un componente sin afectar otros2✅ Independiente: Cada servicio corre en su propio proceso3✅ Escalable: Múltiples dispositivos sin conflictos4✅ Robusto: Recuperación automática de fallos5✅ Privado: Todo local, sin datos en la nube
Componentes de un Asistente de Voz
1Flujo de Conversación:2┌─────────────┐3│ Micrófono │4└──────┬──────┘5 │ Audio WAV6 ▼7┌─────────────────────────────┐8│ Wyoming STT (Whisper) │ (Speech-To-Text)9│ Convierte voz a texto │10└──────┬──────────────────────┘11 │ Texto transcrito12 ▼13┌─────────────────────────────┐14│ Procesador de Intent │ Intent Recognition15│ Identifica acción a tomar │16└──────┬──────────────────────┘17 │ Acción identificada18 ▼19┌─────────────────────────────┐20│ Conversation Agent │ Genera respuesta21│ (LLM local o remoto) │22└──────┬──────────────────────┘23 │ Texto de respuesta24 ▼25┌─────────────────────────────┐26│ Wyoming TTS (Piper) │ (Text-To-Speech)27│ Convierte texto a voz │28└──────┬──────────────────────┘29 │ Audio WAV30 ▼31┌─────────────┐32│ Altavoz │33└─────────────┘
Instalación: Requisitos Previos
Hardware Mínimo
1Home Assistant Host:2- Raspberry Pi 4B (8GB RAM recomendado)3- Orange Pi 5 (mejor performance)4- Mini PC con Debian/Ubuntu5- Cualquier Linux con Docker6 7Microficios Recomendados:8- Raspberry Pi Pico9- ESP32 o ESP32-S310- M5Stack Atom Echo ($15 USD)
Software Requerido
1# Home Assistant instalado2Version: 2024.1.0 o superior3 4# Addons de Home Assistant5- Whisper (STT)6- Piper (TTS)7- Open Wake Word (detección de activación)8 9# Servicios del sistema10- ALSA (manejo de audio)11- PulseAudio o PipeWire (mixer de audio)
Paso 1: Instalar Whisper (Speech-to-Text)
Whisper es el motor de reconocimiento de voz de OpenAI, altamente preciso y multilingual.
Instalación vía Add-on
1# En Home Assistant:21. Settings → Add-ons → Add-on Store32. Busca "Whisper"43. Instala el addon oficial de Home Assistant54. Configura puerto (típicamente 10200)65. Inicia el servicio
Configuración de Whisper
En configuration.yaml:
1stt:2 - platform: whisper3 api_type: local4 language: es # Español5 6# Opcional: Fine-tuning7whisper:8 language: es_ES9 model: base # tiny, base, small, medium, large10 device: cpu # o 'cuda' si tienes GPU11 energy_threshold: 4000
Modelos Disponibles
1tiny: 75 MB (rápido, menos preciso)2base: 140 MB (recomendado balanceado)3small: 466 MB (mejor precision)4medium: 1.5 GB (muy bueno, pero lento)5large: 2.9 GB (máxima precisión)6 7Para español: "base" es suficiente
Pruebas Básicas
1# Test vía API REST2curl -X POST "http://localhost:10200/process" \3 -H "Content-Type: audio/wav" \4 --data-binary @audio.wav5 6# Respuesta esperada:7{8 "result": {9 "text": "enciende la luz del salón",10 "confidence": 0.9511 }12}
Paso 2: Instalar Piper (Text-to-Speech)
Piper es un motor TTS de alta calidad que corre localmente, completamente privado.
Instalación del Add-on
1# En Home Assistant:21. Settings → Add-ons → Add-on Store32. Busca "Piper"43. Instala el addon oficial54. Configura puerto (típicamente 10201)65. Inicia el servicio
Configuración de Piper
1tts:2 - platform: piper3 language: es4 voice: es_MX-cpu # Varias opciones disponibles5 6# Voces disponibles en español:7# - es_MX-cpu (mexicano, natural)8# - es_ES-cpu (español castellano)9# - es_AR-cpu (argentino)
Voces Recomendadas
1Mexicano (es_MX-cpu):2- Excelente pronunciación3- Velocidad natural4- Mejor para neutralidad5 6Castellano (es_ES-cpu):7- Acento español8- Muy clara9- Ideal para España10 11Argentino (es_AR-cpu):12- Acento particular13- Buena calidad14- Específico para región
Pruebas de Piper
1# Test de síntesis de voz2curl -X GET "http://localhost:10201/process?text=Hola%20mundo&speaker=es_ES-cpu" \3 -o respuesta.wav4 5# Reproduciir audio:6aplay respuesta.wav
Paso 3: Configurar Pipeline de Voz
El pipeline une todos los componentes.
Configuración Completa
1# configuration.yaml2 3voice_assistant:4 - id: "default_voice"5 name: "Mi Asistente"6 language: "es"7 speech_recognition_engine: whisper8 text_to_speech_engine: piper9 10# Configuración de Whisper11stt:12 - platform: whisper13 language: es14 15# Configuración de Piper16tts:17 - platform: piper18 language: es19 voice: es_ES-cpu20 21# Intent Recognition (intent del usuario)22intent:23 - platform: home_assistant24 language: es
Archivo Avanzado: voice_assistant_init.yaml
1voice_assistant:2 - id: casa_principal3 name: "Asistente Casa Principal"4 language: es5 6 # STT Config7 stt_engine: whisper8 stt_config:9 language: es_ES10 model: base11 12 # TTS Config13 tts_engine: piper14 tts_config:15 language: es16 voice: es_ES-cpu17 18 # Intent Recognition19 conversation_engine: home_assistant20 conversation_language: es21 22 # Wake word detection23 wake_word_detection: openWakeWord24 wake_word: "hola asistente"25 26 # Audio settings27 input_device: default28 output_device: default29 sample_rate: 1600030 channels: 1
Paso 4: Detección de Wake Word
El wake word es la frase de activación ("Hola Asistente", "Hey Siri", etc).
OpenWakeWord (Recomendado)
OpenWakeWord es un detector basado en machine learning, muy preciso y privado.
1# Instalación vía add-on:21. Add-on Store → Buscar "OpenWakeWord"32. Instalar43. Configurar puerto (tipicamente 10203)
1# configuration.yaml2wake_word_detection:3 - platform: openWakeWord4 models:5 - "alexa" # Usa modelo pre-entrenado6 - "picovoice"7 threshold: 0.5 # Sensibilidad (0.0-1.0)
MicroWakeWord (Para Dispositivos Edge)
Para ESP32 y Raspberry Pi Pico:
1# Firmware para ESP32-S32# Usa TensorFlow Lite para detección local3 4# En microcontrolador:5#include <tensorflow/lite/micro/all_ops_resolver.h>6 7// Detecta "Hola Asistente" con 99.2% precisión8void detect_wake_word(audio_buffer *buf) {9 interpreter.Invoke();10 float *output = interpreter.typed_output_tensor<float>(0);11 12 if (output[0] > 0.85) {13 // Wake word detectado14 send_signal_to_home_assistant();15 }16}
Palabras de Activación Personalizadas
1# Entrenar wake word personalizado2wake_word_training:3 name: "Mi Palabra"4 language: es5 samples: 50 # Grabar 50 ejemplos6 7# Una vez entrenado:8wake_word_detection:9 - platform: openWakeWord10 custom_model: /config/wake_words/mi_palabra.tflite
Paso 5: Intent Recognition y Oraciones Personalizadas
Los intents son las acciones que el asistente puede realizar.
Sistema Estándar de Intents
1# Home Assistant tiene intents pre-built:2- turn_on # Enciende dispositivos3- turn_off # Apaga dispositivos4- toggle # Alterna estado5- set_temperature # Ajusta temperatura6- set_brightness # Ajusta brillo7- play_media # Reproduce contenido
Definir Oraciones Personalizadas
En custom_sentences/es.yaml:
1language: es2version: 23 4intents:5 EncenderTodo:6 data:7 domains:8 - light9 - switch10 sentences:11 - "enciende {name}"12 - "enciende todas las luces"13 - "activa {name}"14 - "prende {name}"15 - "pon {name}"16 17 ApagarTodo:18 data:19 domains:20 - light21 - switch22 sentences:23 - "apaga {name}"24 - "apaga todo"25 - "desactiva {name}"26 - "quita {name}"27 28 PreguntarTemperatura:29 data:30 domains:31 - climate32 - sensor33 sentences:34 - "cuál es la temperatura"35 - "qué temperatura hace"36 - "dame la temperatura de {name}"37 - "cuántos grados hay"38 39 AbrirCortinas:40 data:41 domains:42 - cover43 sentences:44 - "abre las cortinas"45 - "abre {name}"46 - "levanta {name}"47 - "sube {name}"
Respuestas Personalizadas
1# Respuestas para cada intent2conversation:3 custom_responses:4 EncenderTodo:5 - "Encendiendo {name}"6 - "Vale, prendo {name}"7 - "Listo, {name} está activado"8 9 ApagarTodo:10 - "Apagando {name}"11 - "De acuerdo, {name} apagado"12 - "Listo, {name} está off"13 14 PreguntarTemperatura:15 - "La temperatura es {temp}°C"16 - "En {name} hay {temp} grados"
Paso 6: Agentes de Conversación
Los agentes generan respuestas inteligentes, no solo ejecutan comandos.
Opción 1: Agente Local con Ollama
1# Instalar Ollama en tu Red2# Download: ollama.ai3 4# Home Assistant Integration5conversation:6 engine: home_assistant7 agent_type: ollama8 model: neural-chat:7b-v3.1 # Modelo ligero en español9 10 # Configuración11 ollama:12 host: http://localhost:1143413 temperature: 0.714 max_tokens: 256
Opción 2: Agente OpenAI (Cloud)
1conversation:2 engine: openai3 api_key: !secret openai_key4 model: gpt-4o-mini5 6 # Es mucho más inteligente pero requiere internet7 # y cuesta dinero
Creando un Agente Personalizado
1# custom_components/mi_agente/agent.py2 3from homeassistant.const import Platform4from homeassistant.core import HomeAssistant5 6async def async_process_conversation(7 hass: HomeAssistant,8 text: str,9 user_id: str10) -> str:11 """Procesa la conversación y devuelve respuesta."""12 13 # Analizar entrada14 lower_text = text.lower()15 16 # Lógica personalizada17 if "luz" in lower_text and "encend" in lower_text:18 # Enciende luces inteligentes19 await hass.services.async_call(20 "light",21 "turn_on",22 {"entity_id": "light.salon"}23 )24 return "Encendiendo la luz del salón"25 26 elif "temperatura" in lower_text:27 # Obtiene temperatura actual28 temp = hass.states.get("sensor.temperatura_salon")29 return f"La temperatura actual es {temp.state}°C"30 31 # Fallback a LLM genérico32 return "No entiendo, intenta de nuevo"
Dispositivos Satélite: Múltiples Micrófonos
M5Stack Atom Echo
El Atom Echo es un dispositivo edge perfecto para asistentes de voz.
1// Firmware M5Stack Atom Echo2#include <M5Atom.h>3#include <WiFi.h>4 5void setup() {6 M5.begin();7 8 // Configurar micrófono9 esp_err_t err = esp_codec_dev_set_in_gain(10 CODEC_ADC_GAIN_INT_VOL_DB_611 );12 13 // Conectar a WiFi14 WiFi.mode(WIFI_STA);15 WiFi.begin(SSID, PASSWORD);16 17 // Transmitir audio a Home Assistant via Wyoming18 init_wyoming_client("192.168.1.100:10200");19}20 21void loop() {22 // Capturar audio del micrófono23 uint8_t audio_buffer[4096];24 size_t bytes_read = read_microphone(audio_buffer, 4096);25 26 if (bytes_read > 0) {27 // Enviar a Whisper para transcripción28 send_to_wyoming(audio_buffer, bytes_read);29 }30 31 M5.update();32 delay(10);33}
ESP32-S3 Con Micrófono INMP441
1// Configuración de micrófono INMP441 en ESP32-S32 3#define I2S_SCK 174#define I2S_WS 165#define I2S_SD 156 7void init_i2s_microphone() {8 i2s_config_t i2s_config = {9 .mode = I2S_MODE_MASTER | I2S_MODE_RX,10 .sample_rate = 16000, // Whisper requiere 16kHz11 .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,12 .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,13 .communication_format = I2S_COMM_FORMAT_I2S,14 .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,15 };16 17 i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);18 19 // Pin config20 i2s_set_pin(I2S_NUM_0, &pin_config);21}
Automatizaciones Basadas en Voz
Automación 1: Saludo Matutino
1automation:2 - alias: "Saludo Matutino"3 trigger:4 - platform: time5 at: "07:00:00"6 weekday:7 - mon8 - tue9 - wed10 - thu11 - fri12 action:13 - service: tts.piper_say14 data:15 entity_id: media_player.speaker_dormitorio16 message: "Buenos días, son las 7 de la mañana. La temperatura exterior es 18 grados."17 - service: light.turn_on18 target:19 entity_id: light.dormitorio20 data:21 brightness: 100
Automación 2: Escena Después del Trabajo
1automation:2 - alias: "Escena Llegada a Casa"3 trigger:4 - platform: voice_assistant5 intent: "weather_request"6 action:7 - service: scene.turn_on8 target:9 entity_id: scene.bienvenida_casa10 11 - parallel:12 - service: tts.piper_say13 data:14 message: >15 Bienvenido a casa.16 Hay {{state_attr('weather.casa', 'temperature')}} grados17 y {{states('weather.casa')}}18 19 - service: light.turn_on20 target:21 entity_id: light.salon
Automación 3: Control por Voz Avanzado
1automation:2 - alias: "Reproducir Música por Voz"3 trigger:4 - platform: voice_assistant5 intent: "play_media"6 action:7 - service: media_player.play_media8 target:9 entity_id: media_player.sonos_salon10 data:11 media_content_id: "spotify:playlist:{{ trigger.intent.slots.playlist }}"12 media_content_type: playlist
Mejores Prácticas y Optimizaciones
1. Latencia Mínima
1# Configuración para minimizar latencia2wake_word_detection:3 threshold: 0.6 # Más sensible = detección más rápida4 5stt:6 platform: whisper7 vad_threshold: 3000 # Voice Activity Detection8 9# Usar CPU en lugar de GPU si tienes GPU débil10whisper:11 device: cpu12 model: tiny # Más rápido pero menos preciso
2. Precisión en Español
1# Configuración optimizada para español2stt:3 platform: whisper4 language: es5 temperature: 0 # Determinístico, sin aleatoriedad6 7tts:8 platform: piper9 language: es10 voice: es_ES-cpu11 length_scale: 1.0 # Normal speed
3. Gestión de Recursos
1# Para Raspberry Pi con recursos limitados2whisper:3 model: tiny # 75MB vs 2.9GB (large)4 device: cpu5 energy_threshold: 40006 7piper:8 voice: es_ES-cpu # Versión CPU, no ONNX9 10wake_word_detection:11 model: microWakeWord # Más ligero que OpenWakeWord
4. Logging y Debugging
1logger:2 logs:3 homeassistant.components.wyoming: debug4 homeassistant.components.voice_assistant: debug5 homeassistant.components.intent: debug6 7# Ver logs en tiempo real:8# /config/logs/home-assistant.log
Casos de Uso Completos
Caso 1: Casa Inteligente Total
1# Automaciones de ejemplo2automation:3 - alias: "Escena Noche"4 trigger:5 - platform: voice_assistant6 intent: "turn_off_all"7 action:8 - service: light.turn_off9 target:10 entity_id:11 - light.sala12 - light.dormitorio13 - light.cocina14 15 - service: lock.lock16 target:17 entity_id: lock.puerta_principal18 19 - service: media_player.media_pause20 target:21 entity_id: media_player.todos_los_tv22 23 - service: tts.piper_say24 data:25 message: "Buenas noches, estoy en modo sueño"
Caso 2: Asistente Educativo
1# Responder preguntas educativas2automation:3 - alias: "Preguntas sobre el Clima"4 trigger:5 - platform: voice_assistant6 intent: "weather_request"7 action:8 - service: conversation.process9 data:10 text: "{{ trigger.intent.query }}"11 12 # Usa agente Ollama con modelo educativo13 conversation:14 engine: ollama15 model: mistral:7b-instruct
FAQ: Preguntas Sobre Asistentes de Voz
¿Necesito internet para que funcione el asistente de voz?
No. Whisper, Piper y OpenWakeWord corren completamente locales. Lo único que necesita internet es si usas un agente LLM en la nube (como GPT-4). Si usas Ollama con un modelo local, todo es 100% privado sin internet requerido.
¿Qué tan preciso es Whisper con acento español?
Whisper es muy preciso con español, aproximadamente 95-98% de accuracy con modelo "base". Funciona bien con acentos españoles, mexicanos, argentinos y de otras regiones. Si necesitas máxima precisión, usa el modelo "small" o "medium" aunque son más lentos.
¿Puedo usar múltiples idiomas al mismo tiempo?
Sí. Puedes tener varios pipelines de voz configurados con diferentes idiomas. Ej: Pipeline en español en el salón y otro en inglés en el despacho. El problema es que Whisper reconoce el idioma automáticamente, así que a veces mezcla idiomas si hablas spanglish.
¿Cuánta RAM necesito para ejecutar un asistente de voz?
Depende: Raspberry Pi 4 con 4GB es suficiente si usas modelos "tiny" y no ejecutas muchas automatizaciones. Para mejor experiencia, 8GB. Si ejecutas Ollama con modelo 7B, recomiendo 16GB. ESP32 necesita solo 8MB para firmware y wake word.
¿Cómo configuro wake word personalizado para mi nombre?
Necesitas grabar ~50 ejemplos diciendo tu nombre/palabra en diferentes tonos y acentos. Luego usas la herramienta de entrenamiento de OpenWakeWord que genera un archivo .tflite. Es un proceso de 30 minutos. Alternativamente, puedes usar frases estándar como "Hola Casa" o "Hey Asistente".