Documentación

Telefonía en tiempo real

Voz entrante y saliente vía LiveKit + SIP — transcripción y síntesis en streaming, barge-in, transferencia, llamadas salientes lanzadas por un pipeline.

El canal de telefonía permite que un pipeline de betool responda llamadas y las realice. Se admiten audio en tiempo real, transcripción en streaming, síntesis de voz en streaming e interrupción (barge-in).

Arquitectura

Internamente:

  • LiveKit gestiona el transporte de audio en tiempo real.
  • LiveKit-SIP conecta LiveKit con el trunk SIP de tu operador.
  • Un worker dedicado orquesta la llamada: transcripción (STT), LLM, síntesis de voz (TTS).

Este stack se ejecuta como un proceso separado del backend principal. No lo configuras directamente — el operador de tu instancia configura el puente SIP.

Proveedores de voz

FunciónProveedoresPor defecto
Transcripción (STT)Deepgram, faster-whisper (ejecutado localmente)Deepgram
Síntesis (TTS)ElevenLabs, Cartesia, OpenAI, Deepgram AuraElevenLabs

El catálogo de voces de cada proveedor de TTS se puede consultar en el panel de administración, con escucha de una muestra antes de elegir. El LLM es el que tú elijas (modelo gestionado, BYOK o modelo privado — consulta Conectar una clave LLM).

Requisitos previos

  • Un trunk SIP de un operador.
  • Un número entrante y / o la capacidad de realizar llamadas salientes.
  • Acceso a los proveedores de STT / TTS elegidos.

En la oferta gestionada, betool puede aprovisionar el trunk SIP y los proveedores de voz por ti.

Diseñar un pipeline de voz (llamada entrante)

Un pipeline de voz empieza con un nodo Start que lleva el receptor phone_gateway. En cada turno de habla transcrito, el pipeline recibe en particular:

  • user_message y phone.transcript — el turno de habla transcrito
  • phone.call — la llamada: identificador, números llamante / llamado, sentido (inbound / outbound), línea
  • phone.from — el número de quien llama
  • phone.caller_timezone — la zona horaria deducida del prefijo (vacía cuando el prefijo abarca varias zonas horarias)

El texto que produce el pipeline lo lee en voz alta el TTS.

Ajustes del receptor

El receptor phone_gateway regula el comportamiento de la llamada, sin código:

  • Bienvenida — varias variantes del mensaje de bienvenida (se elige una al azar), una bienvenida distinta para las llamadas salientes, un retardo antes de la bienvenida.
  • Silencio — recordatorio tras un silencio prolongado, luego mensaje de despedida y colgado si el silencio persiste; duración máxima de la llamada.
  • Interrupción (barge-in) — activada por defecto: quien llama puede interrumpir al agente. Duración y número mínimo de palabras para que una interrupción cuente.
  • Detección de fin de turno — modo de detección y retardos de fin de habla.
  • Fillers — frases de espera pronunciadas cuando la respuesta tarda, frases específicas durante la ejecución de un tool, o sonido de fondo de espera (teclado, oficina, música de espera). Desactivados por defecto.
  • Voz — proveedor, modelo, idioma y voz de STT / TTS, con los ajustes finos de la voz (estabilidad, velocidad…).
  • Calificaciones de llamada — una lista cerrada de códigos de resultado que el agente puede asignar a la llamada.

Lo que el agente puede hacer durante la llamada

Los tools telefónicos están disponibles para los agentes de un pipeline que tiene phone_gateway aguas arriba:

  • phone_gateway.transfer_call — transferir la llamada a otro número (SIP REFER). El número se valida en formato E.164; la transferencia tiene lugar después de pronunciar la respuesta en curso.
  • phone_gateway.hangup_call — colgar, después del mensaje de despedida.
  • phone_gateway.set_call_disposition — calificar la llamada con uno de los códigos configurados.

Un agente también puede enviar un SMS durante la llamada (tool allmysms.send_sms, consulta SMS): en este canal, el destinatario queda bloqueado en el interlocutor de la llamada. Si el número está oculto, el envío se rechaza.

Proponer franjas horarias

El cálculo de disponibilidades (operación free_slots del nodo compute) produce franjas listas para ser pronunciadas, en la zona horaria de quien llama. Combinado con la lectura del calendario (Google o Microsoft), un agente de voz puede enunciar algunas franjas libres y después fijar la cita.

Llamadas salientes

Un pipeline puede realizar una llamada con el nodo phone_call: por ejemplo, llamar a un lead en cuanto llega, o hacer seguimiento de una lista.

CampoFunción
trunk_idLínea utilizada para llamar
voice_modelEl modelo que lleva la conversación (su Start debe llevar el receptor phone_gateway)
to_numberNúmero al que llamar (con plantilla), normalizado al formato E.164
call_varsVariables transmitidas a la conversación (phone.outbound.vars) — por ejemplo el nombre, utilizable en la bienvenida saliente
allowed_days / allowed_hours / timezoneVentana horaria autorizada: fuera de la ventana, la llamada no se realiza
max_in_flight / max_per_dayLímites de llamadas simultáneas (3 por defecto) y diarias (100 por defecto)
output_keyClave de salida (por defecto phone.call_result)

Salvaguardas:

  • Exactly-once — una repetición nunca vuelve a marcar un número ya llamado.
  • Rechazo antes de marcar si la organización no tiene créditos.
  • Sin llamada en simulación — el nodo se omite durante una ejecución de prueba (dry-run).

El nodo devuelve el control en cuanto la llamada suena: ok significa «llamada lanzada», no «descolgada». Para conocer el resultado, añade al Start del modelo el receptor phone_call_outcome: dispara el pipeline una vez terminada la llamada, con phone.outcome — descolgada o no (answered, no_answer, rejected, unknown), duración, número de turnos, calificación asignada por el agente.

Buenas prácticas

  • Mantén las misiones concisas. La latencia de respuesta importa: un agente que duda durante 4 segundos suena congelado en una llamada. Prefiere modelos rápidos salvo para los turnos críticos de decisión.
  • Deja el barge-in activo. Quienes llaman deben poder interrumpir al agente. Es el ajuste por defecto.
  • Configura fillers para los turnos que llaman a tools: un silencio largo inquieta a quien llama.

Costes

Consulta Precios. Una llamada no tiene precio por minuto en sí: se factura por sus componentes — transcripción (según la duración del audio), síntesis de voz (según el número de caracteres) y LLM (según los tokens, salvo en BYOK).

Limitaciones conocidas

  • El canal telefónico es solo audio. El vídeo pasa por otros bloques (generación y doblaje de vídeo con HeyGen), no por la llamada.
  • La transferencia a un humano requiere un trunk SIP que admita REFER.
  • El agente no puede adivinar la identidad de quien llama sin una integración con un CRM: solo conoce el número presentado.