Documentation

Téléphonie temps réel

Voix entrante et sortante via LiveKit + SIP — transcription et synthèse en streaming, barge-in, transfert, appels sortants lancés par un pipeline.

Téléphonie temps réel

Le canal téléphonie permet à un pipeline betool de prendre des appels et d'en passer. Audio temps réel, transcription streaming, synthèse vocale streaming, interruption (barge-in) supportée.

Architecture

Sous le capot :

  • LiveKit assure le transport audio temps réel.
  • LiveKit-SIP relie LiveKit à votre trunk opérateur (SIP).
  • Un worker dédié orchestre l'appel : transcription (STT), LLM, synthèse vocale (TTS).

Ce stack tourne en process séparé du backend principal. Vous ne le configurez pas directement : c'est l'opérateur de votre instance qui pose le pont SIP.

Fournisseurs voix

RôleFournisseursDéfaut
Transcription (STT)Deepgram, faster-whisper (exécuté localement)Deepgram
Synthèse (TTS)ElevenLabs, Cartesia, OpenAI, Deepgram AuraElevenLabs

Le catalogue de voix de chaque fournisseur TTS est consultable dans l'admin, avec écoute d'un échantillon avant de choisir. Le LLM est celui de votre choix (modèle managé, BYOK ou modèle privé — voir Brancher une clé LLM).

Prérequis

  • Un trunk SIP auprès d'un opérateur.
  • Un numéro entrant et / ou la capacité d'émettre des appels sortants.
  • Un accès aux fournisseurs STT / TTS retenus.

En offre managée, betool peut provisionner le trunk SIP et les fournisseurs voix pour vous.

Concevoir un pipeline voix (appel entrant)

Un pipeline voix démarre par un nœud Start portant le récepteur phone_gateway. À chaque tour de parole transcrit, le pipeline reçoit notamment :

  • user_message et phone.transcript — le tour de parole transcrit
  • phone.call — l'appel : identifiant, numéros appelant / appelé, sens (inbound / outbound), ligne
  • phone.from — le numéro de l'appelant
  • phone.caller_timezone — le fuseau horaire déduit de l'indicatif (vide quand l'indicatif couvre plusieurs fuseaux)

Le texte que produit le pipeline est lu à voix haute par le TTS.

Réglages du récepteur

Le récepteur phone_gateway règle le comportement de l'appel, sans code :

  • Accueil — plusieurs variantes de message d'accueil (une est tirée au hasard), un accueil distinct pour les appels sortants, un délai avant l'accueil.
  • Silence — relance après un silence prolongé, puis message d'au revoir et raccroché si le silence persiste ; durée maximale d'appel.
  • Interruption (barge-in) — activée par défaut : l'appelant peut couper l'agent. Durée et nombre de mots minimum pour qu'une interruption compte.
  • Détection de fin de tour — mode de détection et délais de fin de parole.
  • Fillers — phrases d'attente prononcées quand la réponse tarde, phrases dédiées pendant l'exécution d'un tool, ou fond sonore d'attente (clavier, bureau, musique d'attente). Désactivés par défaut.
  • Voix — fournisseur, modèle, langue et voix STT / TTS, avec les réglages fins de la voix (stabilité, vitesse…).
  • Qualifications d'appel — une liste fermée de codes de résultat que l'agent peut poser sur l'appel.

Ce que l'agent peut faire pendant l'appel

Les tools téléphoniques sont disponibles aux agents d'un pipeline qui a phone_gateway en amont :

  • phone_gateway.transfer_call — transférer l'appel vers un autre numéro (SIP REFER). Le numéro est validé au format E.164 ; le transfert a lieu après que la réponse en cours a été prononcée.
  • phone_gateway.hangup_call — raccrocher, après le message d'au revoir.
  • phone_gateway.set_call_disposition — qualifier l'appel avec un des codes configurés.

Un agent peut aussi envoyer un SMS pendant l'appel (tool allmysms.send_sms, voir SMS) : sur ce canal, le destinataire est verrouillé sur l'interlocuteur de l'appel. Si le numéro est masqué, l'envoi est refusé.

Proposer des créneaux

Le calcul de disponibilités (opération free_slots du nœud compute) produit des créneaux prêts à être prononcés, dans le fuseau de l'appelant. Combiné à la lecture d'agenda (Google ou Microsoft), un agent vocal peut énoncer quelques créneaux libres puis poser le rendez-vous.

Appels sortants

Un pipeline peut passer un appel avec le nœud phone_call : par exemple rappeler un lead dès qu'il arrive, ou relancer une liste.

ChampRôle
trunk_idLigne utilisée pour appeler
voice_modelLe modèle qui mène la conversation (son Start doit porter le récepteur phone_gateway)
to_numberNuméro à appeler (templatable), normalisé au format E.164
call_varsVariables transmises à la conversation (phone.outbound.vars) — par exemple le prénom, utilisable dans l'accueil sortant
allowed_days / allowed_hours / timezoneFenêtre horaire autorisée : hors fenêtre, l'appel n'est pas passé
max_in_flight / max_per_dayPlafonds d'appels simultanés (3 par défaut) et quotidiens (100 par défaut)
output_keyClé de sortie (défaut phone.call_result)

Garde-fous :

  • Exactly-once — un rejeu ne recompose jamais un numéro déjà appelé.
  • Refus avant numérotation si l'organisation n'a plus de crédits.
  • Pas d'appel en simulation — le nœud est ignoré lors d'une exécution d'essai (dry-run).

Le nœud rend la main dès que l'appel sonne : ok signifie « appel lancé », pas « décroché ». Pour connaître l'issue, ajoutez au Start du modèle le récepteur phone_call_outcome : il déclenche le pipeline une fois l'appel terminé, avec phone.outcome — décroché ou non (answered, no_answer, rejected, unknown), durée, nombre de tours, qualification posée par l'agent.

Bonnes pratiques

  • Garder les missions courtes. Le temps de réflexion compte : un agent qui hésite 4 secondes paraît figé au téléphone. Préférez des modèles rapides sauf pour les tours décisifs.
  • Laisser le barge-in actif. L'appelant doit pouvoir couper l'agent. C'est le réglage par défaut.
  • Configurer des fillers pour les tours qui appellent des tools : un silence long inquiète l'appelant.

Coûts

Voir Tarifs. Un appel n'a pas de prix à la minute en soi : il est facturé par ses composantes — transcription (à la durée audio), synthèse vocale (au nombre de caractères) et LLM (aux tokens, sauf en BYOK).

Limites connues

  • Le canal téléphonique est audio uniquement. La vidéo passe par d'autres briques (génération et doublage vidéo avec HeyGen), pas par l'appel.
  • Le transfert vers un humain nécessite un trunk SIP supportant le REFER.
  • L'agent ne peut pas deviner l'identité de l'appelant sans intégration CRM : il ne connaît que le numéro présenté.