Dale voz (y oídos) a tu IA: pipeline de voz completo en local
Habla con tu IA por voz: Whisper para escuchar, tu LLM para pensar, y TTS open source para responder. Un asistente estilo Siri pero 100% tuyo.

El proyecto “wow” definitivo para tu casa: un asistente de voz que no manda ni un byte a la nube. Whisper escucha → tu LLM piensa → Kokoro habla. Todo en tu hardware.
La arquitectura (simple de verdad)
🎙️ Micrófono → [Whisper STT] → texto
↓
[Tu LLM local] → respuesta texto
↓
🔊 [TTS] → voz sintética
Son 3 piezas independientes unidas por texto. Cada una la puedes mejorar por separado.
Ingredientes
- Ollama + un modelo (receta 1)
pip install faster-whisper sounddevice kokoro- Micrófono y altavoces :)
Pasos
-
Captura de audio en tiempo real:
import sounddevice as sd import soundfile as sf import numpy as np SAMPLE_RATE = 16000 grabacion = [] def callback(indata, frames, time, status): grabacion.append(indata.copy()) # grabar mientras se mantenga pulsada una tecla o detecte voz (VAD) with sd.InputStream(samplerate=SAMPLE_RATE, channels=1, callback=callback): input("Pulsa ENTER para dejar de grabar...") audio = np.concatenate(grabacion) sf.write("consulta.wav", audio, SAMPLE_RATE) -
Whisper transcribe (con
language="es"):from faster_whisper import WhisperModel stt = WhisperModel("small", device="cpu", compute_type="int8") segments, _ = stt.transcribe("consulta.wav", language="es") pregunta = " ".join(s.text for s in segments) -
Tu LLM responde:
import ollama respuesta = ollama.chat(model="qwen2.5:7b", messages=[ {"role": "system", "content": "Eres un asistente de voz. Responde en 2-3 frases, natural."}, {"role": "user", "content": pregunta}, ])["message"]["content"](El system prompt de “responde corto” es CLAVE en voz: nadie quiere escuchar un ensayo.)
-
Kokoro habla:
from kokoro import KPipeline tts = KPipeline(lang_code="es") # español for chunk in tts(respuesta): sd.play(chunk.audio, samplerate=24000) sd.wait()
Resultado esperado
Latencia total de 2-5 segundos pregunta-respuesta en un PC decente. Suficiente para una conversación natural si tienes el modelo bien elegido.
Trucos de la experiencia
- Latencia es todo: usa modelos SLM (3-7B) para voz. Nadie espera respuestas de genio hablando; espera fluidez.
- VAD (Voice Activity Detection): usa
webrtcvadosilero-vadpara que empiece a escuchar solo cuando hablas. Es la diferencia entre “cutre” y “casi Alexa”. - Streaming: haz que el TTS empiece a hablar en cuanto llegue la primera frase del LLM, no al final. La latencia percibida cae a la mitad.
- Palabra de activación: en modo kiosko,
openwakewordte da un “Oye, En Local” casero.
A dónde llevarlo
Nuestra evolución natural: correrlo en la Spark 24/7 conectado a n8n, y que el asistente también pueda ejecutar acciones (encender la calefacción, anotar en la lista de la compra). El futuro post: “asistente con manos”.