/es/articulos/twilio-conversation-relay-ya-aguanta-un-redeploy-sin-tirar-la-llamada-reconexion-configuracion
Twilio Conversation Relay ya aguanta un redeploy sin tirar la llamada: reconexión, configuración en vivo y ElevenLabs v4
Twilio pasó a GA cuatro funciones de Conversation Relay para bots de voz con IA: cambiar idioma y voz a media llamada, reconectar el WebSocket tras un redeploy sin perder la llamada, filtrar el eco del propio agente y usar ElevenLabs v3 y v4 Turbo.

Twilio publicó el 28 de octubre de 2026 en su changelog que Conversation Relay, su servicio para conectar llamadas telefónicas con agentes de IA por WebSocket, suma cuatro capacidades en disponibilidad general (GA): configuración dinámica a media llamada, reconexión automática de tu aplicación, filtrado del eco del agente y soporte para los modelos de voz v3 Conversational y v4 Turbo de ElevenLabs. Ojo con el matiz: lo que pasa a GA son estas funciones, no el producto completo. Si ya tienes un bot de voz montado sobre <ConversationRelay>, esto toca tres dolores de cabeza clásicos: el agente que no puede cambiar de idioma sin colgar, la llamada que se muere cuando redespliegas tu contenedor y el bot que se interrumpe solo porque escucha su propia voz por la bocina del cliente.
Aviso honesto antes de seguir: no lo probé. Todo lo que sigue sale del changelog y de la documentación oficial de Twilio, enlazada al final.
Qué es Conversation Relay, en dos líneas
Según Twilio, <ConversationRelay> es un sustantivo de TwiML que va dentro de <Connect> y manda la llamada a un servicio que se encarga de la parte fea de la voz en tiempo real: reconocimiento de voz (STT), síntesis (TTS), manejo de sesión y comunicación de baja latencia con tu aplicación. Tu servidor recibe por WebSocket lo que dijo la persona ya transcrito y contesta con texto, que Twilio convierte en voz. Tú pones el cerebro (tu LLM, tu lógica de negocio) y Twilio pone el teléfono.
1. Cambiar la configuración sin colgar
Hasta ahora, lo que definías en el TwiML al arrancar la llamada era básicamente lo que tenías hasta el final. Con la configuración dinámica, tu aplicación manda un mensaje config por el mismo WebSocket y cambia casi todo en caliente. La guía de Twilio enumera lo que se puede tocar:
- Por idioma: modelo de reconocimiento,
hints, proveedor de transcripción, voz, proveedor de TTS y normalización de texto. - De la sesión:
interruptible,preemptible,dtmfDetection,reportInputDuringAgentSpeech,partialPrompts,speechTimeout,echoPromptFiltering,interruptSensitivity,ignoreBackchannel,profanityFilteryeotThreshold. - El idioma activo: puedes cambiar el idioma de la voz y el de la transcripción por separado, e incluso agregar un idioma que el TwiML no declaraba, siempre que mandes su configuración completa (
ttsProvideryvoice;transcriptionProvideryspeechModel). Twilio aclara que en ese caso no rellena valores por defecto.
También hay atajos: un mensaje hints para actualizar las pistas de reconocimiento y un mensaje language para cambiar de idioma. Y si solo quieres que una respuesta salga en otro idioma (un nombre propio, una frase para alguien que cambió de idioma un momento), marcas los tokens de texto con lang en lugar de cambiar el idioma de toda la sesión.
Lo que no se puede cambiar a media llamada: la URL del WebSocket, el saludo de bienvenida, la suscripción a eventos, los enlaces con Conversation Intelligence y Conversation Orchestrator, y los atributos applicationReconnect y partialPromptOnHangup. Para eso hay que abrir otra sesión.
Hay tres detalles operativos que conviene saber antes de programar:
- Las actualizaciones son atómicas. Si un solo valor del mensaje es inválido, Twilio rechaza todo el mensaje y la llamada sigue con la configuración anterior.
- No todo entra al mismo tiempo.
partialPromptsyreportInputDuringAgentSpeechaplican de inmediato. Los ajustes de reconocimiento esperan a que la persona termine su turno. Los de voz aplican al siguiente texto que mandes, así que un cambio a media respuesta parte la frase en dos voces. Twilio recomienda mandarlos entre respuestas. - Confirmación opcional. Si te suscribes al evento
config-updated, Twilio te manda un mensajeconfigUpdatedcuando el cambio realmente entra en vigor. Diez mensajes inválidos seguidos cierran la conexión, y hay límite de frecuencia, así que nada de reenviar configuración en un loop.
Mi lectura: esto es lo que hace posible un agente de voz que se comporte como uno de chat. Por ejemplo, detectar que la persona habla en inglés y cambiar, meter hints con vocabulario de facturación cuando la conversación llega a pagos, o encender la detección de tonos DTMF solo en el paso donde piden el número de cliente. Antes, eso se resolvía declarando todo de antemano o con malabares.
2. Reconexión automática: que un redeploy no tire la llamada
Esta es la que más le va a gustar a quien opera en producción. Twilio lo dice sin rodeos: los WebSockets entre tu app y Conversation Relay se caen por autoescalado, redespliegues de contenedores o reciclaje del balanceador. Antes, eso era llamada perdida. Ahora, con applicationReconnect="true" en el TwiML, el servicio aguanta la caída y vuelve a conectarse.

Según la guía de buenas prácticas, así funciona:
- Cuándo reconecta: si el WebSocket se cierra con código 1001, 1006, 1011, 1012 o 1013, o si tu aplicación deja de contestar los pings durante 45 segundos. Cualquier otro código de cierre termina la llamada.
- Qué guarda: hasta 500 eventos entrantes (o hasta 10 segundos de historial) mientras tu servidor regresa.
- Cómo reintenta: hasta 3 intentos por caída, esperando 500 ms y luego 1 segundo entre ellos, con 3 segundos para cada handshake. Se detiene de inmediato si tu servidor responde un 4xx que no sea 408 o 429, o si el certificado TLS es inválido.
- Cuántas veces: máximo 5 reconexiones por llamada. Si falla, la llamada termina con estado
failed. - Qué recibe tu app: un mensaje
setupconconnectionTypeen"reconnect"y, justo después, los eventos guardados en orden.
La trampa: la reconexión no restaura tu estado. Twilio sugiere guardar el contexto de la conversación en un caché compartido como Redis, con el sessionId como llave, y recuperarlo cuando llegue el setup de reconexión. Si tu bot guarda el historial en la memoria del proceso, el usuario va a sentir que habla con alguien que acaba de despertar. Además, la reconexión cubre caídas de red y reinicios del servidor, no cierres que tú provoques. Si tu app cierra el socket a propósito, la llamada termina. Para colgar bien hay que mandar el mensaje end.
Y un detalle de la referencia de TwiML: el valor por defecto de applicationReconnect es false. No se enciende solo. Si quieres el beneficio, tienes que activarlo.
3. Filtrado del eco: que el bot no se interrumpa solo
Cualquiera que haya probado un bot de voz con alguien en altavoz conoce el problema: la voz del agente se cuela en el micrófono, el reconocimiento la transcribe y el agente se interrumpe o le contesta a su propia frase. El nuevo atributo echoPromptFiltering="true" quita de la transcripción las palabras que coinciden con lo que el agente acaba de decir. Según la referencia, el proveedor de STT sigue recibiendo todo el audio; el filtro trabaja con los tiempos por palabra que entrega el proveedor de TTS. Por eso Twilio recomienda ElevenLabs si lo vas a usar: da tiempos por palabra y mejora la precisión. Viene apagado por defecto y se puede encender en el TwiML o con un mensaje config a media llamada.
4. ElevenLabs v3 y v4 Turbo: adiós SSML
La cuarta novedad es el soporte para ElevenLabs v3 Conversational y v4 Turbo. La documentación de voces recomienda v4 y le atribuye una latencia mediana de inferencia de alrededor de 100 ms y más de 90 idiomas con acentos nativos. Se activa agregando el modelo al ID de voz: <VOICE_ID>-v4 o <VOICE_ID>-v4_turbo.
El cambio que puede romper cosas si migras sin leer:
- v3 y v4 no soportan SSML. En vez de
<break>y compañía, usan etiquetas de audio en lenguaje natural entre corchetes, como[whispering],[sighs]o[fast], dentro del texto que mandas. - No hay control numérico de velocidad. Si tu cadena de voz trae un
speeddistinto de1.0, Conversation Relay la rechaza. Hay que quitarlo o dejarlo en1.0y controlar el ritmo con etiquetas como[fast]o[briskly]. - Twilio advierte que no hay una lista fija de etiquetas: el modelo interpreta lo que pongas y, si no lo entiende, lo ignora sin devolver error. Y pide no cerrar respuestas con algo como
[neutral], porque el modelo puede leerlo en voz alta.
Qué haría yo con un bot de voz en producción
Mi lectura, en orden de prioridad:
- Activar
applicationReconnecty mover el estado de la conversación a Redis o similar, con elsessionIdcomo llave. Es la que más llamadas salva y la que menos código pide. - Revisar cómo cierras el socket. Si hoy cuelgas cerrando la conexión, cambia a mensajes
end, porque con la reconexión activa la diferencia importa. - Probar
echoPromptFilteringsi tus usuarios hablan desde el carro o en altavoz. - Migrar a ElevenLabs v4 con calma: busca SSML y
speeden tus prompts y en tu código antes de cambiar el sufijo de la voz. - Usar la configuración dinámica donde hoy tienes TwiML gigantes con todos los idiomas y casos declarados de antemano.
Lo que todavía no sé: el changelog no menciona cambios de precio por usar estas funciones, y la documentación tampoco detalla el límite de frecuencia de los mensajes config. Antes de diseñar algo que mande configuración muy seguido, toca preguntarle a Twilio.
Fuentes
- Twilio Changelog: Conversation Relay: Dynamic Configuration, Application Reconnect, Echo Filtering, and ElevenLabs v4 Support (28 de octubre de 2026)
- Twilio Docs: Update configuration during a call
- Twilio Docs: TwiML noun
- Twilio Docs: Best practices for Conversation Relay
- Twilio Docs: Picking a voice