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
🛒 ¿Aún no tienes el satélite? El hardware decide si el asistente se usa o se abandona, y la diferencia está en el micrófono. Tengo las opciones comparadas en mejores satélites de voz para Home Assistant, de 24,51 a 95,66 EUR.
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".

