Ir al contenido principal
Desarrollo & IA

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

8 de febrero de 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.

Javier Santos

Especialista en IA & Machine Learning

📧¿Te gusta este contenido?

Únete a 547+ profesionales que reciben tips de IA cada semana. Sin spam, cancela cuando quieras.

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

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 gustado? Hay más cada semana

Únete a "IA Sin Humo" — la newsletter donde comparto lo que realmente funciona en inteligencia artificial. Sin teoría innecesaria, sin postureo.

📚

1 Tutorial

Paso a paso, práctico

🛠️

3 Herramientas

Probadas y útiles

💡

0 Bullshit

Solo lo que importa

+547 suscriptores • Cada martes • Cancela cuando quieras