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 respuesta 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). Esa respuesta visual
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
de producción: 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.