Asistente de voz local en español con Home Assistant, Whisper y una wake word
Última revisión: 29/09/2026
Montar un asistente de voz que responda en español sin que el audio salga de casa se reduce a encadenar tres piezas: OpenWakeWord detecta la palabra, Whisper transcribe lo que dices y Piper convierte la respuesta en voz. Las tres corren en local y se conectan a Home Assistant por el protocolo Wyoming. Aquí está el montaje completo, con los comandos Docker y lo que no te cuentan cuando la placa se queda corta.
El pipeline, en un esquema
El flujo completo de una frase tiene seis pasos y ningún servidor externo: el micrófono capta, la wake word despierta el sistema, Whisper transcribe, Home Assistant decide la intención, Piper sintetiza la respuesta y el altavoz la reproduce.
La vía rápida: Home Assistant OS y tres add-ons
Si usas Home Assistant OS (o un Home Assistant Green/Yellow), la forma más corta es instalar desde la tienda de add-ons tres piezas: Whisper, Piper y openWakeWord. Al arrancar, se registran solas mediante la integración Wyoming — Home Assistant las detecta en Ajustes > Dispositivos y servicios. Después el asistente se deja listo en Ajustes > Voz > Asistentes, eligiendo el STT Whisper y el TTS Piper del pipeline. El matiz: el add-on de Whisper descarga el modelo de transcripción en el primer arranque y puede tardar minutos.
La vía manual: contenedores Docker
En una máquina Linux cualquiera —un NAS, un mini PC o una Raspberry Pi con Docker— cada pieza es un contenedor independiente que publica su servicio Wyoming en un puerto. Los comandos usan las imágenes oficiales de rhasspy, las mismas que hay detrás de los add-ons.
Servidor STT con Whisper (anotando --language es):
docker run -d \
--name wyoming-faster-whisper \
-p 10300:10300 \
-v /data/whisper:/data \
rhasspy/wyoming-faster-whisper \
--model medium \
--language es
Servidor TTS con Piper (con la voz inglesa de ejemplo; para español, mira la sección siguiente):
docker run -d \
--name wyoming-piper \
-p 10200:10200 \
-v /data/piper:/data \
rhasspy/wyoming-piper \
--voice en_US-lessac-medium
Motor de wake word con OpenWakeWord:
docker run -d \
--name wyoming-openwakeword \
-p 10400:10400 \
rhasspy/wyoming-openwakeword \
--preload-model ok_nabu
Después añades la integración Wyoming Protocol una vez por servicio y le das la IP, el puerto y la función (STT, TTS o wake word) de cada contenedor. Los tres puertos se pueden comprobar con curl http://IP:10300 y similares: cada servicio Wyoming responde una descripción propia.
Qué cambia para que todo funcione en español
- Whisper: usa siempre un modelo multilingüe (sin el sufijo
.en) y fija--language es. Los modelostiny.en,base.eny similares solo entienden inglés, no sirven aquí. - Piper: la voz es la que define el idioma de salida. Necesitas una voz española; el comando de arriba es solo el ejemplo inglés. El listado de voces disponibles está en el repositorio rhasspy/piper. La parte de anuncios y
tts.speaksin pisar la música ya la tengo explicada en la guía de TTS local en español con Pipper. - Wake word: los modelos principales como
ok_nabuestán grabados para inglés. Para una expresión en español hay que comprobar la lista de modelos de openWakeWord y, si no existe la tuya, entrenarla o usar una corta en inglés (ok_nabuohey_jarvis) dejando el resto de la conversación en español. Hablarlo cada mañana funciona sin problema; no es un fallo de diseño, es el límite actual de las wake words libres.
No verificado a fecha de 29/09: los nombres exactos de las voces Piper en español y de los modelos de openWakeWord con soporte real de español. Lo dejo apuntado en la sección que viene; confirma contra el listado de voces de Piper y el catálogo de openWakeWord antes de copiar esos valores.
El fallo habitual: latencia en placas pequeñas
El error más común al montar esto es elegir un modelo Whisper demasiado grande para la placa. Una Raspberry Pi 3 con medium transcribe cada frase con una espera que hace inutilizable el asistente. En la práctica las horas se van en descubrir que el cuello de botella no es la red ni Home Assistant, sino la CPU resolviendo el modelo. No lo trates como un problema "del código": es hardware.
| Modelo | RAM aproximada | Latencia percibida en RPi 4 | Nota |
|---|---|---|---|
| tiny | < 1 GB | baja | comete más errores con acentos |
| base | ~1 GB | baja-media | mínimo viable en español |
| small | 1-2 GB | media | el punto de partida recomendado |
| medium | 3-4 GB | alta | mejor precisión, solo con RAM holgada |
| large | > 6 GB | muy alta en CPU | no apto para una Raspberry Pi |
La regla que yo me aplico: en una Raspberry Pi 4 de 4 GB empieza en small y no subas hasta que midas el impacto real. Las licencias no cuestan nada — el gasto es el hardware que elijas para mover los modelos.
Qué no he podido verificar hoy
- Los nombres concretos de las voces Piper en español del listado actual. Consulta el archivo de voces y busca entradas con prefijo
es_ES. - Qué modelos de openWakeWord tienen soporte demostrado para palabras en español. Depende del catálogo de modelos del proyecto; si no existe el tuyo, la salida es entrenarlo.
- Las cifras de latencia de la tabla son estimaciones propias, no mediciones de un banco de pruebas.
Si lo que te interesa de este montaje es la mitad de la salida —avisos y notificaciones habladas—, la guía de Piper y tts.speak en español deja esa parte lista con anuncios que no pisan la música.