Interfaces de voz que se sienten instantáneas
Cómo funciona el presupuesto de latencia en pipelines de voz con IA, por qué WebRTC cambia las reglas y cómo construí un agente de voz en celestino.ai que responde en menos de un segundo.
Interfaces de voz que se sienten instantáneas
Un retraso de dos segundos en una interfaz de voz no se siente lento. Se siente roto. El usuario no piensa "esto está cargando." Piensa "esto no funciona." Y se va.
Cuando construí la primera versión del agente de voz para celestino.ai, el pipeline tardaba 1.8 segundos de extremo a extremo. En papel, razonable. En práctica, cada usuario de prueba pausaba, se repetía o hablaba encima de la respuesta. Técnicamente funcional, experiencialmente muerto.
Este artículo explica lo que aprendí al arreglarlo: la ingeniería y el pensamiento sistémico detrás de por qué la latencia en voz es un problema fundamentalmente distinto al tiempo de carga de una página.
El presupuesto de latencia: cada milisegundo cuenta
La conversación humana opera con tiempos estrictos. La brecha promedio entre turnos es de aproximadamente 200 milisegundos. Pausas de 300ms ya se sienten artificiales. Más de 1.5 segundos y la experiencia se degrada rápidamente.
Un pipeline tradicional de voz con IA debe completar tres etapas en esa ventana:
- Speech-to-Text (STT): Capturar audio, ejecutar reconocimiento automático. Presupuesto: 100-500ms.
- Inferencia LLM: Enviar la transcripción al modelo, generar respuesta. Presupuesto: 350ms-1s+.
- Text-to-Speech (TTS): Convertir el texto en audio. Presupuesto: 75-200ms.
Sumados: 525ms a 1.7 segundos en el mejor caso. Sin contar saltos de red, colas ni detección de silencio. En la práctica, un pipeline cascada ingenuo aterriza entre 2 y 4 segundos. Eso no es una interfaz de voz. Es un walkie-talkie.
La solución no es hacer cada componente más rápido por separado. Es rediseñar el pipeline para que las etapas se solapen, las predicciones corran antes de la certeza y el usuario nunca perciba una brecha.
La revolución WebRTC
Durante años, voz con IA significaba procesamiento en servidor. Audio sube, se transcribe, se procesa, se sintetiza y baja. Cada paso suma un salto de red y cada salto suma latencia.
WebRTC cambia el juego. Diseñado originalmente para videollamadas peer-to- peer, provee transporte sobre UDP con control de congestión, ocultamiento de pérdida de paquetes y bitrate adaptativo. Cuando OpenAI lanzó soporte WebRTC para su Realtime API a finales de 2025, eliminó el intermediario arquitectónico.
Arquitectura tradicional con WebSocket:
Cliente -> Tu Backend -> OpenAI -> Tu Backend -> Cliente
Con WebRTC, conexión directa al media edge de OpenAI:
Cliente -> OpenAI Media Edge -> Cliente
Primeras respuestas parciales de texto en 150-250ms. Primeros fonemas sintetizados audibles en 220-400ms. Velocidad de conversación.
Más allá del transporte, la Realtime API de OpenAI es un modelo speech-to- speech: opera sobre audio nativo sin descomponer voz en texto. La reducción de latencia no es incremental, es estructural. El trade-off: costo (~10x más que un pipeline cascada) y opacidad en debugging. Para agentes en producción que necesitan observabilidad y control de costos, el pipeline cascada sigue siendo la arquitectura a vencer. Solo hay que hacerlo rápido.
LiveKit Voice Pipelines: arquitectura de producción
Para reconstruir el agente de celestino.ai elegí el SDK de Agentes de LiveKit: pipeline cascada con las ventajas de transporte de WebRTC más abstracciones para detección de turno, manejo de interrupciones y orquestación de streaming.
const stt = new inference.STT({
model: "elevenlabs/scribe_v2_realtime",
language: "en",
});
const llmModel = new inference.LLM({
model: "google/gemini-2.5-flash",
});
const tts = new inference.TTS({
model: "elevenlabs/eleven_flash_v2_5",
voice: "cjVigY5qzO86Huf0OWal",
language: "en",
});
Cada componente elegido por velocidad en su etapa. No ganas en latencia eligiendo el modelo más preciso en cada punto. Ganas eligiendo el más rápido que supere tu umbral de calidad.
Detección de turno: el problema más difícil
La decisión más sensible a la latencia no es la velocidad de inferencia. Es saber cuándo el usuario terminó de hablar. VAD puro (detección de actividad de voz) no distingue entre "terminé" y "estoy pensando." En celestino.ai combino Silero VAD para señales crudas con el detector de turno multilingüe de LiveKit, un modelo transformer que evalúa si un fragmento de transcripción representa un pensamiento completo en ~50ms.
Manejo de interrupciones
Si el usuario habla mientras el agente responde, el agente debe detenerse de inmediato:
voiceOptions: {
minEndpointingDelay: 1000,
maxEndpointingDelay: 5000,
minInterruptionDuration: 800,
minInterruptionWords: 2,
preemptiveGeneration: true,
}
minInterruptionDuration de 800ms y minInterruptionWords de 2 evitan
falsos positivos por ruido o muletillas. Pero ante una interrupción genuina,
el agente cede de inmediato. El sistema nunca debe hablar por encima del
usuario.
Técnicas de optimización que importan
Streaming de extremo a extremo
La optimización más grande: nunca esperar un resultado completo antes de iniciar la siguiente etapa. ASR alimenta transcripciones parciales al LLM. El LLM transmite tokens al TTS. El TTS transmite chunks de audio al cliente. Cambiar cualquier componente a procesamiento por lotes puede duplicar la latencia total.
Generación especulativa (preemptive generation)
Con preemptiveGeneration: true, el agente inicia inferencia LLM y TTS
apenas llega la transcripción, antes de confirmar que el usuario terminó. Si
terminó, ahorraste cientos de milisegundos. Si sigue hablando, el resultado
especulativo se descarta. El mismo principio detrás de la ejecución
especulativa en CPUs.
Despliegue regional y warmup de conexión
La física no negocia. Un round trip Miami a us-east-1 toma ~30ms. A eu- west-1, ~120ms. En celestino.ai, la conexión LiveKit se establece al hacer clic en el botón de voz, no al empezar a hablar. Cuando el usuario concede permisos de micrófono, WebRTC ya está activo y el agente ya corre.
La capa UX: lo que hace que la voz se sienta bien
Un agente que responde en 400ms pero no da feedback visual en esos 400ms sigue sintiéndose roto.
En celestino.ai, un orbe animado reacciona al audio en tiempo real y
comunica estados (listening, thinking, speaking, idle). Ese feedback
transforma el silencio de "aire muerto" a "pausa conversacional natural."
La interfaz también soporta chat de texto junto a la voz, con mensajes sincronizados via canales de datos LiveKit. La voz es una mejora, no un requisito. Y la cancelación de ruido de fondo garantiza que el agente funcione en cafeterías, no solo en cuartos silenciosos. Eso es IA endurecida: sistemas que funcionan en las condiciones reales de los usuarios.
Métricas clave
- Time-to-First-Byte (TTFB): Del fin del habla del usuario al primer byte de audio. Objetivo: menos de 500ms.
- Latencia de extremo a extremo: Round trip completo. Objetivo: menos de 1.5 segundos.
- Tasa de éxito de interrupción: Tiempo para que el agente se detenga. Objetivo: menos de 300ms.
- Precisión de detección de turno: Falsos positivos (cortar al usuario) vs. falsos negativos (silencio innecesario).
- Tasa de fallback: Usuarios que cambian de voz a texto. Tasa alta indica problemas de UX o confiabilidad.
Mide en producción, no en pruebas controladas. La brecha entre laboratorio y entornos acústicos reales es donde las interfaces de voz fallan.
Conclusión
Construir interfaces de voz instantáneas es un problema de sistemas. Se necesita el transporte correcto (WebRTC), la arquitectura adecuada (streaming cascada o speech-to-speech), detección de turno semántica, especulación agresiva y una capa UX que convierta latencia medida en respuesta percibida.
El agente de voz en celestino.ai demuestra que esto es alcanzable hoy, con herramientas open source de producción, sin equipo de investigación ni hardware especializado. La voz es la interfaz más natural del ser humano. Cuando funciona, desaparece. Cuando no, nada más de tu producto importa. Constrúyelo bien o no lo construyas.