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
mediumosmallen lugar delarge-v3si la latencia es crítica - Reduce
CHUNK_DURATIONa 3 segundos para respuestas más inmediatas - Añade
num_workers=1al inicializarWhisperModelpara 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.