Ir al contenido principal
Javadex

Cómo Crear un Asistente de Voz con Home Assistant [Tutorial 2026]

35 min

Aprende a crear un asistente de voz inteligente y privado con Home Assistant. Guía paso a paso con Whisper, Piper y Wyoming en 2026.

Índice del artículo14 secciones

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

code
1Wyoming es un protocolo ligero para comunicación entre:
2- Microfonos/dispositivos de entrada
3- Servicios de reconocimiento de voz (STT)
4- Procesadores de intent
5- Servicios de síntesis de voz (TTS)
6- Dispositivos de salida (altavoces)
7 
8Características:
9- Comunicación en tiempo real
10- Bajo latencia
11- Arquitectura desacoplada
12- Fácil de extender

Ventajas de Wyoming#

code
1✅ Modular: Cambiar un componente sin afectar otros
2✅ Independiente: Cada servicio corre en su propio proceso
3✅ Escalable: Múltiples dispositivos sin conflictos
4✅ Robusto: Recuperación automática de fallos
5✅ 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#

code
1Flujo de Conversación:
2┌─────────────┐
3│ Micrófono │
4└──────┬──────┘
5 │ Audio WAV
6
7┌─────────────────────────────┐
8│ Wyoming STT (Whisper) │ (Speech-To-Text)
9│ Convierte voz a texto │
10└──────┬──────────────────────┘
11 │ Texto transcrito
12
13┌─────────────────────────────┐
14│ Procesador de Intent │ Intent Recognition
15│ Identifica acción a tomar │
16└──────┬──────────────────────┘
17 │ Acción identificada
18
19┌─────────────────────────────┐
20│ Conversation Agent │ Genera respuesta
21│ (LLM local o remoto) │
22└──────┬──────────────────────┘
23 │ Texto de respuesta
24
25┌─────────────────────────────┐
26│ Wyoming TTS (Piper) │ (Text-To-Speech)
27│ Convierte texto a voz │
28└──────┬──────────────────────┘
29 │ Audio WAV
30
31┌─────────────┐
32│ Altavoz │
33└─────────────┘

Instalación: Requisitos Previos#

Hardware Mínimo#

code
1Home Assistant Host:
2- Raspberry Pi 4B (8GB RAM recomendado)
3- Orange Pi 5 (mejor performance)
4- Mini PC con Debian/Ubuntu
5- Cualquier Linux con Docker
6 
7Microficios Recomendados:
8- Raspberry Pi Pico
9- ESP32 o ESP32-S3
10- M5Stack Atom Echo ($15 USD)

Software Requerido#

bash
1# Home Assistant instalado
2Version: 2024.1.0 o superior
3 
4# Addons de Home Assistant
5- Whisper (STT)
6- Piper (TTS)
7- Open Wake Word (detección de activación)
8 
9# Servicios del sistema
10- 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#

bash
1# En Home Assistant:
21. Settings → Add-ons → Add-on Store
32. Busca "Whisper"
43. Instala el addon oficial de Home Assistant
54. Configura puerto (típicamente 10200)
65. Inicia el servicio

Configuración de Whisper#

En configuration.yaml:

yaml
1stt:
2 - platform: whisper
3 api_type: local
4 language: es # Español
5 
6# Opcional: Fine-tuning
7whisper:
8 language: es_ES
9 model: base # tiny, base, small, medium, large
10 device: cpu # o 'cuda' si tienes GPU
11 energy_threshold: 4000

Modelos Disponibles#

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

bash
1# Test vía API REST
2curl -X POST "http://localhost:10200/process" \
3 -H "Content-Type: audio/wav" \
4 --data-binary @audio.wav
5 
6# Respuesta esperada:
7{
8 "result": {
9 "text": "enciende la luz del salón",
10 "confidence": 0.95
11 }
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#

bash
1# En Home Assistant:
21. Settings → Add-ons → Add-on Store
32. Busca "Piper"
43. Instala el addon oficial
54. Configura puerto (típicamente 10201)
65. Inicia el servicio

Configuración de Piper#

yaml
1tts:
2 - platform: piper
3 language: es
4 voice: es_MX-cpu # Varias opciones disponibles
5 
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#

code
1Mexicano (es_MX-cpu):
2- Excelente pronunciación
3- Velocidad natural
4- Mejor para neutralidad
5 
6Castellano (es_ES-cpu):
7- Acento español
8- Muy clara
9- Ideal para España
10 
11Argentino (es_AR-cpu):
12- Acento particular
13- Buena calidad
14- Específico para región

Pruebas de Piper#

bash
1# Test de síntesis de voz
2curl -X GET "http://localhost:10201/process?text=Hola%20mundo&speaker=es_ES-cpu" \
3 -o respuesta.wav
4 
5# Reproduciir audio:
6aplay respuesta.wav

Paso 3: Configurar Pipeline de Voz#

El pipeline une todos los componentes.

Configuración Completa#

yaml
1# configuration.yaml
2 
3voice_assistant:
4 - id: "default_voice"
5 name: "Mi Asistente"
6 language: "es"
7 speech_recognition_engine: whisper
8 text_to_speech_engine: piper
9 
10# Configuración de Whisper
11stt:
12 - platform: whisper
13 language: es
14 
15# Configuración de Piper
16tts:
17 - platform: piper
18 language: es
19 voice: es_ES-cpu
20 
21# Intent Recognition (intent del usuario)
22intent:
23 - platform: home_assistant
24 language: es

Archivo Avanzado: voice_assistant_init.yaml#

yaml
1voice_assistant:
2 - id: casa_principal
3 name: "Asistente Casa Principal"
4 language: es
5 
6 # STT Config
7 stt_engine: whisper
8 stt_config:
9 language: es_ES
10 model: base
11 
12 # TTS Config
13 tts_engine: piper
14 tts_config:
15 language: es
16 voice: es_ES-cpu
17 
18 # Intent Recognition
19 conversation_engine: home_assistant
20 conversation_language: es
21 
22 # Wake word detection
23 wake_word_detection: openWakeWord
24 wake_word: "hola asistente"
25 
26 # Audio settings
27 input_device: default
28 output_device: default
29 sample_rate: 16000
30 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.

bash
1# Instalación vía add-on:
21. Add-on Store → Buscar "OpenWakeWord"
32. Instalar
43. Configurar puerto (tipicamente 10203)

yaml
1# configuration.yaml
2wake_word_detection:
3 - platform: openWakeWord
4 models:
5 - "alexa" # Usa modelo pre-entrenado
6 - "picovoice"
7 threshold: 0.5 # Sensibilidad (0.0-1.0)

MicroWakeWord (Para Dispositivos Edge)#

Para ESP32 y Raspberry Pi Pico:

python
1# Firmware para ESP32-S3
2# Usa TensorFlow Lite para detección local
3 
4# En microcontrolador:
5#include <tensorflow/lite/micro/all_ops_resolver.h>
6 
7// Detecta "Hola Asistente" con 99.2% precisión
8void 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 detectado
14 send_signal_to_home_assistant();
15 }
16}

Palabras de Activación Personalizadas#

yaml
1# Entrenar wake word personalizado
2wake_word_training:
3 name: "Mi Palabra"
4 language: es
5 samples: 50 # Grabar 50 ejemplos
6 
7# Una vez entrenado:
8wake_word_detection:
9 - platform: openWakeWord
10 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#

yaml
1# Home Assistant tiene intents pre-built:
2- turn_on # Enciende dispositivos
3- turn_off # Apaga dispositivos
4- toggle # Alterna estado
5- set_temperature # Ajusta temperatura
6- set_brightness # Ajusta brillo
7- play_media # Reproduce contenido

Definir Oraciones Personalizadas#

En custom_sentences/es.yaml:

yaml
1language: es
2version: 2
3 
4intents:
5 EncenderTodo:
6 data:
7 domains:
8 - light
9 - switch
10 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 - light
21 - switch
22 sentences:
23 - "apaga {name}"
24 - "apaga todo"
25 - "desactiva {name}"
26 - "quita {name}"
27 
28 PreguntarTemperatura:
29 data:
30 domains:
31 - climate
32 - sensor
33 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 - cover
43 sentences:
44 - "abre las cortinas"
45 - "abre {name}"
46 - "levanta {name}"
47 - "sube {name}"

Respuestas Personalizadas#

yaml
1# Respuestas para cada intent
2conversation:
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#

yaml
1# Instalar Ollama en tu Red
2# Download: ollama.ai
3 
4# Home Assistant Integration
5conversation:
6 engine: home_assistant
7 agent_type: ollama
8 model: neural-chat:7b-v3.1 # Modelo ligero en español
9 
10 # Configuración
11 ollama:
12 host: http://localhost:11434
13 temperature: 0.7
14 max_tokens: 256

Opción 2: Agente OpenAI (Cloud)#

yaml
1conversation:
2 engine: openai
3 api_key: !secret openai_key
4 model: gpt-4o-mini
5 
6 # Es mucho más inteligente pero requiere internet
7 # y cuesta dinero

Creando un Agente Personalizado#

python
1# custom_components/mi_agente/agent.py
2 
3from homeassistant.const import Platform
4from homeassistant.core import HomeAssistant
5 
6async def async_process_conversation(
7 hass: HomeAssistant,
8 text: str,
9 user_id: str
10) -> str:
11 """Procesa la conversación y devuelve respuesta."""
12 
13 # Analizar entrada
14 lower_text = text.lower()
15 
16 # Lógica personalizada
17 if "luz" in lower_text and "encend" in lower_text:
18 # Enciende luces inteligentes
19 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 actual
28 temp = hass.states.get("sensor.temperatura_salon")
29 return f"La temperatura actual es {temp.state}°C"
30 
31 # Fallback a LLM genérico
32 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.

cpp
1// Firmware M5Stack Atom Echo
2#include <M5Atom.h>
3#include <WiFi.h>
4 
5void setup() {
6 M5.begin();
7 
8 // Configurar micrófono
9 esp_err_t err = esp_codec_dev_set_in_gain(
10 CODEC_ADC_GAIN_INT_VOL_DB_6
11 );
12 
13 // Conectar a WiFi
14 WiFi.mode(WIFI_STA);
15 WiFi.begin(SSID, PASSWORD);
16 
17 // Transmitir audio a Home Assistant via Wyoming
18 init_wyoming_client("192.168.1.100:10200");
19}
20 
21void loop() {
22 // Capturar audio del micrófono
23 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ón
28 send_to_wyoming(audio_buffer, bytes_read);
29 }
30 
31 M5.update();
32 delay(10);
33}

ESP32-S3 Con Micrófono INMP441#

cpp
1// Configuración de micrófono INMP441 en ESP32-S3
2 
3#define I2S_SCK 17
4#define I2S_WS 16
5#define I2S_SD 15
6 
7void init_i2s_microphone() {
8 i2s_config_t i2s_config = {
9 .mode = I2S_MODE_MASTER | I2S_MODE_RX,
10 .sample_rate = 16000, // Whisper requiere 16kHz
11 .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 config
20 i2s_set_pin(I2S_NUM_0, &pin_config);
21}

Automatizaciones Basadas en Voz#

Automación 1: Saludo Matutino#

yaml
1automation:
2 - alias: "Saludo Matutino"
3 trigger:
4 - platform: time
5 at: "07:00:00"
6 weekday:
7 - mon
8 - tue
9 - wed
10 - thu
11 - fri
12 action:
13 - service: tts.piper_say
14 data:
15 entity_id: media_player.speaker_dormitorio
16 message: "Buenos días, son las 7 de la mañana. La temperatura exterior es 18 grados."
17 - service: light.turn_on
18 target:
19 entity_id: light.dormitorio
20 data:
21 brightness: 100

Automación 2: Escena Después del Trabajo#

yaml
1automation:
2 - alias: "Escena Llegada a Casa"
3 trigger:
4 - platform: voice_assistant
5 intent: "weather_request"
6 action:
7 - service: scene.turn_on
8 target:
9 entity_id: scene.bienvenida_casa
10 
11 - parallel:
12 - service: tts.piper_say
13 data:
14 message: >
15 Bienvenido a casa.
16 Hay {{state_attr('weather.casa', 'temperature')}} grados
17 y {{states('weather.casa')}}
18 
19 - service: light.turn_on
20 target:
21 entity_id: light.salon

Automación 3: Control por Voz Avanzado#

yaml
1automation:
2 - alias: "Reproducir Música por Voz"
3 trigger:
4 - platform: voice_assistant
5 intent: "play_media"
6 action:
7 - service: media_player.play_media
8 target:
9 entity_id: media_player.sonos_salon
10 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#

yaml
1# Configuración para minimizar latencia
2wake_word_detection:
3 threshold: 0.6 # Más sensible = detección más rápida
4 
5stt:
6 platform: whisper
7 vad_threshold: 3000 # Voice Activity Detection
8 
9# Usar CPU en lugar de GPU si tienes GPU débil
10whisper:
11 device: cpu
12 model: tiny # Más rápido pero menos preciso

2. Precisión en Español#

yaml
1# Configuración optimizada para español
2stt:
3 platform: whisper
4 language: es
5 temperature: 0 # Determinístico, sin aleatoriedad
6 
7tts:
8 platform: piper
9 language: es
10 voice: es_ES-cpu
11 length_scale: 1.0 # Normal speed

3. Gestión de Recursos#

yaml
1# Para Raspberry Pi con recursos limitados
2whisper:
3 model: tiny # 75MB vs 2.9GB (large)
4 device: cpu
5 energy_threshold: 4000
6 
7piper:
8 voice: es_ES-cpu # Versión CPU, no ONNX
9 
10wake_word_detection:
11 model: microWakeWord # Más ligero que OpenWakeWord

4. Logging y Debugging#

yaml
1logger:
2 logs:
3 homeassistant.components.wyoming: debug
4 homeassistant.components.voice_assistant: debug
5 homeassistant.components.intent: debug
6 
7# Ver logs en tiempo real:
8# /config/logs/home-assistant.log

Casos de Uso Completos#

Caso 1: Casa Inteligente Total#

yaml
1# Automaciones de ejemplo
2automation:
3 - alias: "Escena Noche"
4 trigger:
5 - platform: voice_assistant
6 intent: "turn_off_all"
7 action:
8 - service: light.turn_off
9 target:
10 entity_id:
11 - light.sala
12 - light.dormitorio
13 - light.cocina
14 
15 - service: lock.lock
16 target:
17 entity_id: lock.puerta_principal
18 
19 - service: media_player.media_pause
20 target:
21 entity_id: media_player.todos_los_tv
22 
23 - service: tts.piper_say
24 data:
25 message: "Buenas noches, estoy en modo sueño"

Caso 2: Asistente Educativo#

yaml
1# Responder preguntas educativas
2automation:
3 - alias: "Preguntas sobre el Clima"
4 trigger:
5 - platform: voice_assistant
6 intent: "weather_request"
7 action:
8 - service: conversation.process
9 data:
10 text: "{{ trigger.intent.query }}"
11 
12 # Usa agente Ollama con modelo educativo
13 conversation:
14 engine: ollama
15 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".

¿Te ha resultado útil este artículo?

Cada semana publico análisis prácticos sobre IA, modelos y herramientas. Si quieres seguir leyendo, en el blog tienes más de 400 artículos como este.

Ver más artículosjavi@javadex.es
Javier Santos - Especialista en IA & Machine Learning

Javier Santos

Consultor de IA para empresas. Comparto contenido sobre inteligencia artificial, automatización y desarrollo cada semana.