guides
whisperfaster-whispersttvoice-agentpython 8 min de lectura

Pipeline de voz local con Whisper y faster-whisper: de audio a texto en tiempo real

Monta un pipeline STT completo en tu máquina o SBC: captura de audio, transcripción con faster-whisper, y salida de texto lista para conectar a tu agente.


Whisper de OpenAI es el mejor modelo STT open source disponible en 2026. Con faster-whisper, la versión optimizada con CTranslate2, puedes correrlo en tiempo real en hardware doméstico sin GPU dedicada.

Por qué faster-whisper

El Whisper original en PyTorch consume mucha más memoria y es considerablemente más lento que faster-whisper en CPU. La diferencia:

  • Whisper original (large-v3): ~4GB VRAM/RAM, ~0.5 RTF en CPU moderna
  • faster-whisper (large-v3 int8): ~1.5GB RAM, ~0.15 RTF en CPU moderna

RTF (Real Time Factor) < 1 significa que transcribes más rápido de lo que dura el audio — necesario para tiempo real.

Instalación

pip install faster-whisper sounddevice numpy

Pipeline básico de transcripción

from faster_whisper import WhisperModel
import sounddevice as sd
import numpy as np

# Cargar modelo — int8 es el mejor balance calidad/velocidad en CPU
model = WhisperModel("large-v3", device="cpu", compute_type="int8")

def transcribe_chunk(audio_chunk: np.ndarray, sample_rate: int = 16000) -> str:
    """Transcribe un chunk de audio y devuelve el texto."""
    segments, info = model.transcribe(
        audio_chunk,
        language="es",         # Fuerza español — mejora velocidad y precisión
        beam_size=1,           # Beam size 1 = más rápido, algo menos preciso
        vad_filter=True,       # Filtra silencios automáticamente
        vad_parameters=dict(min_silence_duration_ms=500)
    )
    return " ".join(s.text for s in segments).strip()

# Captura de micrófono en chunks de 5 segundos
SAMPLE_RATE = 16000
CHUNK_DURATION = 5  # segundos

print("Escuchando... (Ctrl+C para salir)")
while True:
    audio = sd.rec(
        int(CHUNK_DURATION * SAMPLE_RATE),
        samplerate=SAMPLE_RATE,
        channels=1,
        dtype='float32'
    )
    sd.wait()
    
    text = transcribe_chunk(audio.flatten())
    if text:
        print(f"→ {text}")

Conectar la salida a un agente

Una vez tienes texto, conectarlo a Claude API es directo:

import anthropic

client = anthropic.Anthropic()

def process_voice_command(text: str) -> str:
    """Envía el texto transcrito a Claude y devuelve la respuesta."""
    message = client.messages.create(
        model="claude-haiku-4-5-20251001",  # Haiku para baja latencia
        max_tokens=512,
        messages=[{"role": "user", "content": text}]
    )
    return message.content[0].text

Optimizaciones para hardware limitado

Si corres esto en una Raspberry Pi o SBC similar:

  • Usa medium o small en lugar de large-v3 si la latencia es crítica
  • Reduce CHUNK_DURATION a 3 segundos para respuestas más inmediatas
  • Añade num_workers=1 al inicializar WhisperModel para controlar el uso de RAM

Siguientes pasos

Para un pipeline de voz completo necesitas también TTS (text-to-speech) para la respuesta. Coqui TTS o Piper son las mejores opciones open source para instalación local.