Phase 19 - Lesson 03
Capstone 03 — Real-Time Voice Assistant (ASR to LLM to TTS)
Un agente de voz que se siente natural debe tener una latencia de extremo a extremo inferior a 800ms, saber cuándo has dejado de hablar, manejar interrupciones (barge-in) y poder llamar a una herramienta sin detener el audio. Retell, Vapi, LiveKit Agents y Pipecat alcanzan este nivel de rendimiento en 2026. Lo hacen con la misma estructura: un ASR en streaming, un detector de turnos, un LLM en streaming y un TTS en streaming, todos conectados a través de WebRTC con presupuestos de latencia agresivos en cada salto. Construye uno, mide WER, MOS y la tasa de falsos cortes, y ejecútalo bajo pérdida de paquetes de red.
Type: Capstone Languages: Python (agent + pipeline), TypeScript (web client) Prerequisites: Phase 6 (speech and audio), Phase 7 (transformers), Phase 11 (LLM engineering), Phase 13 (tools), Phase 14 (agents), Phase 17 (infrastructure) Phases exercised: P6 · P7 · P11 · P13 · P14 · P17 Time: 30 hours
Problem
La tecnología de voz ha sido la categoría de UX de IA de más rápido movimiento en 2025-2026. El techo técnico de latencia disminuyó cada trimestre. OpenAI Realtime API, Gemini 2.5 Live, Cartesia Sonic-2, ElevenLabs Flash v3, LiveKit Agents 1.0 y Pipecat 0.0.70 pusieron el tiempo de respuesta de audio inicial (first-audio-out) por debajo de 800ms a nuestro alcance. La meta no es la latencia sola. Es la sensación de interacción: no cortar al usuario, no ser cortado por error, recuperarse de una interrupción a mitad de la frase, llamar a una herramienta a mitad de la conversación sin congelar el flujo de audio y tolerar redes móviles inestables.
No lograrás llegar allí hilvanando tres llamadas REST comunes. La arquitectura es de streaming canalizado de extremo a extremo. Constrúyelo y los modos de fallo se harán visibles: un VAD calibrado para telefonía que se activa con el ruido de fondo de una TV, un detector de turnos que espera por signos de puntuación que nunca llegan o un TTS que consume un buffer de 400ms antes de comenzar a transmitir. El reto de este capstone es resolver estos fallos uno a uno bajo carga y publicar un informe de latencia y calidad.
Concept
La pipeline tiene cinco etapas de streaming: audio in (WebRTC desde el navegador o PSTN), ASR (transmisión de transcripciones parciales en tiempo real a través de Deepgram Nova-3 o de faster-whisper local), turn detection (VAD combinada con un pequeño modelo detector de turnos que analiza transcripciones parciales buscando pistas de finalización), LLM (transmisión de tokens tan pronto como el turno se juzga completo) y TTS (transmisión de audio sintetizado dentro de ~200ms a partir del primer token emitido por el LLM).
Tres desafíos transversales esenciales. Barge-in: cuando el usuario empieza a hablar mientras el agente está hablando, el TTS se cancela de inmediato y el ASR prioriza la nueva captación. Tool use: las llamadas a funciones a mitad de la conversación (clima, calendario) deben ejecutarse en un canal lateral sin detener el flujo de audio; el agente emite un token de relleno de confirmación ("un segundo...") si la latencia de la herramienta supera los 300ms. Backpressure: bajo pérdida de paquetes, las transcripciones parciales se retienen, el VAD eleva la tolerancia de ruido y el agente evita hablar sobre un mensaje no confirmado.
La meta de calidad es cuantitativa. WER inferior al 8% en el benchmark Hamming VAD a 15 dB SNR. First-audio-out p50 inferior a 800ms en 100 llamadas de prueba. Tasa de falsos cortes inferior al 3%. MOS del TTS por encima de 4.2. Capacidad de soportar hasta 50 llamadas concurrentes en una sola instancia g5.xlarge. Estos números constituyen la entrega obligatoria.
Architecture
browser / Twilio PSTN
|
v
WebRTC / SIP edge
|
v
LiveKit Agents 1.0 (or Pipecat 0.0.70)
|
+----+--------------+--------------+-----------------+
| | | |
v v v v
ASR VAD v5 turn-detector side-channel
(Deepgram (Silero) (LiveKit) tools
Nova-3 / speech-gate completion score (weather,
Whisper-v3) per 20ms on partials calendar)
| | |
+--------+----------+--------------+
v
LLM (streaming)
GPT-4o-realtime / Gemini 2.5 Flash /
cascaded Claude Haiku 4.5
|
v
TTS streaming
Cartesia Sonic-2 / ElevenLabs Flash v3
|
v
audio back to caller
|
v
OpenTelemetry voice traces -> Langfuse
Stack
- Transporte: LiveKit Agents 1.0 (WebRTC) integrado con Twilio PSTN gateway; Pipecat 0.0.70 como framework alternativo
- ASR: Deepgram Nova-3 (streaming, primer parcial sub-300ms) o Whisper-v3-turbo de faster-whisper autohospedado
- VAD: Silero VAD v5 emparejado con el turn-detector de LiveKit (pequeño transformer que analiza transcripciones parciales)
- LLM: OpenAI GPT-4o-realtime para integración estrecha, Gemini 2.5 Flash Live, o Claude Haiku 4.5 en cascada (streaming de respuestas, canal de audio separado)
- TTS: Cartesia Sonic-2 (latencia más baja al primer byte de audio), ElevenLabs Flash v3, o el proyecto de código abierto Orpheus para autohospedar
- Herramientas: FastMCP por canal lateral para clima/calendario/reservas; el agente emite audios de relleno si la herramienta demora más de 300ms
- Observabilidad: spans de voz de OpenTelemetry, rastreos de voz de Langfuse con reproducción de audio
- Despliegue: una máquina g5.xlarge (24GB de VRAM) para autohospedar Whisper + Orpheus; APIs administradas para la menor latencia
Build It
Sesión WebRTC. Establece una sala LiveKit y un cliente web que transmita audio desde el micrófono. En el servidor, conecta un agente que se una a la sala.
ASR en streaming. Envía fragmentos PCM de 20ms a Deepgram Nova-3 (o faster-whisper en GPU). Suscríbete a transcripciones parciales y finales. Registre la latencia de cada resultado parcial.
VAD y detector de turnos. Ejecuta Silero VAD v5 en la transmisión de audio. En el evento de fin de habla (speech-end), ejecuta el detector de turnos contra la última transcripción parcial. Solo considera el turno completo si el VAD indica silencio de 500ms y el turn-detector arroja una puntuación de finalización > 0.6.
Transmisión de LLM. Al completar el turno, inicia la llamada del LLM con la conversación acumulada más la última transcripción final. Transmite tokens. Al recibir el primer token, inicia el TTS.
Transmisión de TTS. Cartesia Sonic-2 transmite los fragmentos de audio de vuelta. El primer paquete de áudio debe dejar el servidor en menos de 200ms tras el primer token del LLM. Envía los fragmentos a la sala de LiveKit para reproducción mediante el buffer de jitter de WebRTC en el cliente.
Barge-in (Interrupción). Si el VAD detecta nueva voz del usuario mientras el TTS se está reproduciendo, cancela la transmisión de TTS inmediatamente, descarta la salida de tokens de LLM restante y prepara nuevamente el ASR. Publica un span
tts_canceled.Canal lateral de herramientas. Registra herramientas de calendario y clima. Al invocarse, ejecuta la llamada en paralelo; si no se resuelve dentro de 300ms, haz que el LLM emita un sonido de relleno ("un segundo, déjame revisar...") para evitar el silencio; continúa una vez que la herramienta responda.
Arnés de evaluación. Registra 100 llamadas. Calcula WER (contra una transcripción patrón), la tasa de falsos cortes (TTS cancelado mientras el usuario hablaba a mitad de una frase), la latencia p50 del first-audio-out, el MOS del TTS (evaluación humana o NISQA) y estabilidad bajo pérdida de paquetes (prueba con inyección de 3% de pérdida).
Prueba de carga. Simula 50 llamadas simultáneas en una única máquina g5.xlarge con un llamador automático. Mide la latencia p95 sostenida del first-audio-out.
Use It
caller: "what is the weather in tokyo tomorrow"
[asr ] partial @280ms: "what is the"
[asr ] partial @540ms: "what is the weather"
[turn ] completion score 0.82 at @820ms; commit
[llm ] first token @960ms
[tool ] weather.tokyo tomorrow -> 68/52 partly cloudy @1140ms
[tts ] first audio-out @1040ms: "Tokyo tomorrow will be partly cloudy..."
turn latency: 1040ms user-stop -> audio-out
Ship It
El producto entregable es el documento outputs/skill-voice-agent.md. Detalla la configuración de un agente LiveKit con la pipeline ASR/VAD/LLM/TTS calibrada para cumplir con los requisitos. Rúbrica:
| Weight | Criterion | How it is measured |
|---|---|---|
| 25 | End-to-end latency | Latencia p50 de first-audio-out bajo 800ms en 100 llamadas grabadas |
| 20 | Turn-taking quality | Tasa de falsos cortes inferior al 3% en el benchmark Hamming VAD |
| 20 | Tool-use correctness | Ejecución correcta de herramientas a mitad de la conversación sin retrasar o congelar el flujo de audio |
| 20 | Reliability under packet loss | Estabilidad del WER y alternancia de turnos con inyección de 3% de pérdida de paquetes |
| 15 | Eval harness completeness | Mediciones reproducibles con scripts y configuraciones públicas |
Exercises
Reemplaza Deepgram Nova-3 por Whisper v3 turbo de faster-whisper en una g5.xlarge. Mide la diferencia de latencia y WER. Analiza dónde importan las decisiones de procesamiento en CPU vs GPU.
Diseña una política avanzada para el manejo de interrupciones: ¿qué debe hacer el agente si el usuario lo interrumpe en medio de una llamada de herramienta? Compara tres políticas (cancelación total de la acción, completar la acción en silencio y luego parar, encolar el siguiente turno).
Realiza una prueba adversaria del detector de turnos: introduce pausas largas a mitad de frase. Calibra el silencio de VAD y la puntuación de turnos para minimizar falsos cortes sin superar el límite de 900ms para respuestas válidas.
Despliega el agente en telefonía convencional (PSTN) vía Twilio. Compara la latencia de first-audio-out de PSTN con WebRTC. Explica las diferencias de buffers de jitter y códecs.
Implementa soporte multilíngue para la detección de voz (español y japonés). Evalúa la tasa de falsos positivos del Silero VAD v5 estándar en comparación con clasificadores calibrados localmente para cada idioma.
Key Terms
| Term | What people say | What it actually means |
|---|---|---|
| Turn detection | "Fin de intervención" | Clasificador que, dado el silencio de VAD y una transcripción parcial, determina que el usuario ha terminado de hablar |
| Barge-in | "Manejo de interrupciones" | Detener el audio de TTS a mitad de reproducción cuando el VAD detecta nueva voz del usuario |
| First-audio-out | "Latencia inicial de respuesta" | Tiempo desde que el usuario deja de hablar hasta que el primer paquete de audio sintetizado sale del servidor |
| VAD | "Detector de actividad de voz" | Modelo que clasifica paquetes de audio como habla o silencio; Silero VAD v5 es el estándar en 2026 |
| Jitter buffer | "Amortiguador de audio" | Mecanismo del cliente que retiene brevemente paquetes de audio para absorber variaciones en la red de transmisión |
| Filler | "Audio de relleno" | Pequeñas frases que emite el agente (ej: "Un segundo...", "Déjame ver...") para enmascarar silencios de procesamiento lento |
| MOS | "Puntuación de opinión media" | Calidad perceptual del audio sintetizado; NISQA es el estimador automático de referencia |
Further Reading
- LiveKit Agents 1.0 — framework de referencia para agentes WebRTC de voz
- Pipecat — framework alternativo en Python enfocado en streaming de audio
- OpenAI Realtime API — guía de integración de modelos de voz integrados
- Deepgram Nova-3 documentation — API de ASR en streaming
- Silero VAD v5 — repositorio oficial de VAD
- Cartesia Sonic-2 — API de TTS de baja latencia
- Retell AI architecture — arquitectura de referencia comercial de agentes de voz
- Vapi.ai production stack — arquitectura de referencia de telefonía basada en IA