Capstone 03 Asistente de voz en tiempo real (ASR a LLM a TTS)
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
El problema
La voz ha sido la categoría de UX de IA de más rápido movimiento de 2025-2026. El techo técnico cayó cada cuarto. OpenAI Realtime API, Gemini 2.5 Live, Cartesia Sonic-2, ElevenLabs Flash v3, LiveKit Agents 1.0, y Pipecat 0.0.70 todos pusieron al alcance el primer audio de sub-800ms. El bar no es sólo la latencia. Es la sensación de interacción: no cortar al usuario, no cortarse, recuperarse de una interrupción a mitad de la oración, llamar a una herramienta a mitad de la conversación sin detener el audio, sobrevivir a las redes móviles nerviosas.
No se puede llegar a él coser tres llamadas REST. La arquitectura es pipelineado de transmisión de extremo a extremo. Construirlo y los modos de falla se vuelven visibles: un VAD sintonizado para la grabación de audio del teléfono en TV de fondo, un detector de turno esperando por puntuación que nunca viene, un TTS que amortiza 400ms antes de emitir.
Concepto
El oleoducto tiene cinco etapas de transmisión: audio in(WebRTC desde el navegador o PSTN), ASR(transcripciones parciales de Deepgram Nova-3 o más rápido-susurro), turn detection(VAD más un pequeño modelo de detector de vueltas que lee transcripciones parciales para señales de finalización), LLM(transmitir tokens tan pronto como se juzgue que el turno está completo), TTS(transmitir audio en ~ 200 ms del primer token LLM).
Tres preocupaciones transversales.Barge-inCuando el usuario comienza a hablar mientras el agente habla, el TTS se cancela y el ASR se pone a hablar inmediatamente. Tool use: las llamadas de la función de conversación (temporario, calendario) deben ejecutarse en un canal lateral sin detener el audio; el agente pre-rellenar un token de reconocimiento ("un segundo...") si la latencia supera los 300 ms. Backpressure: bajo pérdida de paquetes, se mantienen transcripciones parciales, el VAD eleva el umbral de la puerta de habla y el agente evita hablar sobre un mensaje no reconocido.
La barra de medición es cuantitativa. WER inferior al 8% en el Hamming VAD benchmark a 15 dB SNR. Primera salida de audio p50 inferior a 800 ms en 100 llamadas medidas. tasa de corte falso inferior a 3%. MOS superior a 4.2 en TTS. 50 llamadas simultáneas en un solo g5.xlarge. Estos números son los entregables.
Arquitectura
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 -> LangfuseEl establo
- Transporte: LiveKit Agents 1.0 (WebRTC) más Twilio PSTN gateway; Pipecat 0.0.70 como el marco alternativo
- ASR: Deepgram Nova-3 (streaming, sub-300ms primero parcial) o más rápido susurro Whisper-v3-turbo auto-hosted
- VAD: Silero VAD v5 más el detector de giras LiveKit (pequeño transformador que lee transcripciones parciales)
- LLM: OpenAI GPT-4o en tiempo real para integración estrecha, Gemini 2.5 Flash Live, o Claude Haiku 4.5 en cascada (completos de transmisión, ruta de audio separada)
- TTS: Cartesia Sonic-2 (bajo primer byte), ElevenLabs Flash v3, o Orpheus de código abierto para auto-host
- Herramientas: canal lateral FastMCP para el clima/calendario/reserva; relleno de emisores preliminares de agentes si la herramienta tarda más de 300 ms
- Observabilidad: OpenTelemetry, rastros de voz de Langfuse con reproducción de audio
- Despliegue: single g5.xlarge (24GB VRAM) para Whisper + Orpheus alojado en sí mismo; API alojadas para la menor latencia
Construye el mismo
- WebRTC session.Coloque una sala de LiveKit y un cliente web que transmita audio del micrófono. En el servidor, adjunta un agente que trabaje que se une a la sala.
- ASR streaming.Envía los fotogramas de 20 ms a Deepgram Nova-3 (o susurra más rápido en GPU). Suscribirse a las transcripciones parciales y finales.
- VAD and turn detector.ejecuta Silero VAD v5 en la transmisión de fotogramas. En el evento de final de voz, dispara el detector de giras de LiveKit contra la última transcripción parcial. Sólo compromete a "turn complete" cuando el VAD diga silencio durante 500 ms y el detector de giras obtiene puntuaciones de completamiento > 0.6.
- LLM stream.Al final, comience la llamada de LLM con la conversación en ejecución más la transcripción final.
- TTS stream.Cartesia Sonic-2 transmite los fragmentos de audio de vuelta. La primera pieza debe salir del servidor dentro de 200 ms del primer token LLM. Emite los fragmentos a la sala LiveKit; el cliente juega a través del tampón de jitter WebRTC.
- Barge-in.Cuando VAD detecta un nuevo discurso de usuario mientras TTS está tocando, cancele la corriente TTS inmediatamente, deje de usar el resultado restante de LLM y rearme el ASR.
tts_canceled- ¿Qué?
- Tool side channel.Registre el tiempo y el calendario como herramientas de llamada de función. Cuando se invoque, dispara la llamada simultáneamente; si no se resuelve dentro de 300 ms, haga que el LLM emita "un segundo, déjame comprobar" como un relleno; retoma una vez que la herramienta regrese.
- Eval harness.Grabar 100 llamadas: calcular WER (en contra de una transcripción prolongada), tasa de interrupción falsa (TTS cancelado mientras el usuario estaba a mitad de la oración), primera salida de audio p50, TTS MOS (humano o NISQA) y una prueba de pérdida de nerviosismo (tirar 3% de los paquetes).
- Load test.Realice 50 llamadas simultáneas en una sola g5.xlarge con una llamada sintética.
Usalo
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-outEnvío
outputs/skill-voice-agent.mdSe trata de un servicio de entregable. Dado un dominio (suporte al cliente, programación o quiosco), se encuentra un agente de LiveKit con el pipeline ASR/VAD/LLM/TTS sintonizado con la barra de medición.
| Weight | Criterion | How it is measured |
|---|---|---|
| 25 | End-to-end latency | p50 first-audio-out under 800ms across 100 recorded calls |
| 20 | Turn-taking quality | False-cutoff rate under 3% on the Hamming VAD benchmark |
| 20 | Tool-use correctness | Mid-conversation tool calls that return the right data without stalling audio |
| 20 | Reliability under packet loss | WER and turn-taking stability with 3% packet drop injected |
| 15 | Eval harness completeness | Reproducible measurements with public config |
| 100 |
Los ejercicios
- Cambiar Deepgram Nova-3 para un turbo de v3 de susurro más rápido en un g5.xlarge. Medir la latencia y la brecha WER. Identificar dónde las decisiones CPU-vs-GPU importan.
- Añadir una política de interrupción-arbitro: ¿qué hace el agente cuando el usuario entra durante una llamada de herramienta? Compare tres políticas (cancelar duro, terminar herramienta-entonces-stop, hacer cola a la siguiente vuelta).
- Realice una prueba de detección de vueltas adversaria: dé al usuario largas pausas a mediados de la oración.
- Despliegue el mismo agente en la PSTN a través de Twilio. Compara la primera salida de audio de la PSTN con WebRTC. Explica las diferencias entre el buffer de nerviosismo y el códec.
- Añadir detección de actividad de voz para idiomas no ingleses (japoneses, españoles). Mide la tasa de desencadenamiento falso de Silero VAD v5 frente a las melodías finas específicas del idioma.
Términos clave
| Term | What people say | What it actually means |
|---|---|---|
| Turn detection | "End of utterance" | Classifier that, given VAD silence and a partial transcript, decides the user is done speaking |
| Barge-in | "Interruption handling" | Canceling TTS mid-playback when VAD detects new user speech |
| First-audio-out | "Latency" | Time from user stops speaking to the first audio packet leaving the server |
| VAD | "Speech gate" | Model classifying audio frames as speech vs silence; Silero VAD v5 is the 2026 default |
| Jitter buffer | "Audio smoothing" | Client-side buffer that holds packets briefly to absorb network variance |
| Filler | "Acknowledgment token" | Short phrase the agent emits to avoid silence when a tool is slow |
| MOS | "Mean opinion score" | Perceptual speech quality rating; NISQA is the automated proxy |
Leer más
- LiveKit Agents 1.0 marco de referencia de agentes WebRTC
- Pipecat marco de agente de transmisión de Python-first alternativo
- OpenAI Realtime API referencia para modelos integrados de habla
- Deepgram Nova-3 documentation Referencia de ASR en streaming
- Silero VAD v5 Modelo de referencia del VAD
- Cartesia Sonic-2 Referencia de TTS de baja latencia
- Retell AI architecture arquitectura de agentes de voz de producción
- Vapi.ai production stack Referencia de producción alternativa
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.