← Todas las recetasReceta · 15 de septiembre de 2025

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.

Dificultadavanzada
Tiempo1-2 horas
IngredientesWhisper · Ollama · Kokoro TTS · Python

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

  1. 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)
  2. 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)
  3. 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.)

  4. 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 webrtcvad o silero-vad para 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, openwakeword te 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”.