Documentazione

Telefonia in tempo reale

Voce in entrata e in uscita tramite LiveKit + SIP — trascrizione e sintesi in streaming, barge-in, trasferimento, chiamate in uscita avviate da una pipeline.

Il canale telefonia permette a una pipeline betool di rispondere alle chiamate e di effettuarne. Sono supportati audio in tempo reale, trascrizione in streaming, sintesi vocale in streaming e interruzione (barge-in).

Architettura

Dietro le quinte:

  • LiveKit gestisce il trasporto audio in tempo reale.
  • LiveKit-SIP collega LiveKit al trunk SIP del tuo operatore.
  • Un worker dedicato orchestra la chiamata: trascrizione (STT), LLM, sintesi vocale (TTS).

Questo stack viene eseguito come processo separato rispetto al backend principale. Non lo configuri direttamente — l'operatore della tua istanza imposta il bridge SIP.

Fornitori vocali

RuoloFornitoriPredefinito
Trascrizione (STT)Deepgram, faster-whisper (eseguito localmente)Deepgram
Sintesi (TTS)ElevenLabs, Cartesia, OpenAI, Deepgram AuraElevenLabs

Il catalogo delle voci di ciascun fornitore TTS è consultabile nell'admin, con ascolto di un campione prima di scegliere. L'LLM è quello che preferisci (modello gestito, BYOK o modello privato — vedi Collegare una chiave LLM).

Prerequisiti

  • Un trunk SIP presso un operatore.
  • Un numero in entrata e / o la possibilità di effettuare chiamate in uscita.
  • Un accesso ai fornitori STT / TTS scelti.

Nell'offerta gestita, betool può fornire il trunk SIP e i fornitori vocali per te.

Progettare una pipeline vocale (chiamata in entrata)

Una pipeline vocale inizia con un nodo Start che porta il ricevitore phone_gateway. A ogni turno di parola trascritto, la pipeline riceve in particolare:

  • user_message e phone.transcript — il turno di parola trascritto
  • phone.call — la chiamata: identificativo, numeri chiamante / chiamato, direzione (inbound / outbound), linea
  • phone.from — il numero del chiamante
  • phone.caller_timezone — il fuso orario dedotto dal prefisso (vuoto quando il prefisso copre più fusi)

Il testo prodotto dalla pipeline viene letto ad alta voce dal TTS.

Impostazioni del ricevitore

Il ricevitore phone_gateway regola il comportamento della chiamata, senza codice:

  • Accoglienza — più varianti del messaggio di benvenuto (una viene estratta a caso), un'accoglienza distinta per le chiamate in uscita, un ritardo prima dell'accoglienza.
  • Silenzio — sollecito dopo un silenzio prolungato, poi messaggio di congedo e riaggancio se il silenzio persiste; durata massima della chiamata.
  • Interruzione (barge-in) — attiva per impostazione predefinita: il chiamante può interrompere l'agente. Durata e numero minimo di parole perché un'interruzione venga considerata.
  • Rilevamento di fine turno — modalità di rilevamento e tempi di fine parlato.
  • Filler — frasi di attesa pronunciate quando la risposta tarda, frasi dedicate durante l'esecuzione di un tool, oppure sottofondo di attesa (tastiera, ufficio, musica di attesa). Disattivati per impostazione predefinita.
  • Voce — fornitore, modello, lingua e voce STT / TTS, con le regolazioni fini della voce (stabilità, velocità…).
  • Qualificazioni della chiamata — un elenco chiuso di codici di esito che l'agente può applicare alla chiamata.

Cosa può fare l'agente durante la chiamata

I tool telefonici sono disponibili per gli agenti di una pipeline che ha phone_gateway a monte:

  • phone_gateway.transfer_call — trasferire la chiamata a un altro numero (SIP REFER). Il numero viene validato nel formato E.164; il trasferimento avviene dopo che la risposta in corso è stata pronunciata.
  • phone_gateway.hangup_call — riagganciare, dopo il messaggio di congedo.
  • phone_gateway.set_call_disposition — qualificare la chiamata con uno dei codici configurati.

Un agente può anche inviare un SMS durante la chiamata (tool allmysms.send_sms, vedi SMS): su questo canale, il destinatario è bloccato sull'interlocutore della chiamata. Se il numero è nascosto, l'invio viene rifiutato.

Proporre fasce orarie

Il calcolo delle disponibilità (operazione free_slots del nodo compute) produce fasce orarie pronte per essere pronunciate, nel fuso orario del chiamante. Combinato con la lettura del calendario (Google o Microsoft), un agente vocale può enunciare alcune fasce libere e poi fissare l'appuntamento.

Chiamate in uscita

Una pipeline può effettuare una chiamata con il nodo phone_call: ad esempio richiamare un lead appena arriva, oppure ricontattare un elenco.

CampoRuolo
trunk_idLinea usata per chiamare
voice_modelIl modello che conduce la conversazione (il suo Start deve portare il ricevitore phone_gateway)
to_numberNumero da chiamare (templatable), normalizzato nel formato E.164
call_varsVariabili trasmesse alla conversazione (phone.outbound.vars) — ad esempio il nome, utilizzabile nell'accoglienza in uscita
allowed_days / allowed_hours / timezoneFinestra oraria autorizzata: fuori finestra, la chiamata non viene effettuata
max_in_flight / max_per_dayLimiti di chiamate simultanee (3 per impostazione predefinita) e giornaliere (100 per impostazione predefinita)
output_keyChiave di uscita (predefinita phone.call_result)

Garanzie:

  • Exactly-once — una riesecuzione non ricompone mai un numero già chiamato.
  • Rifiuto prima della composizione se l'organizzazione non ha più crediti.
  • Nessuna chiamata in simulazione — il nodo viene ignorato durante un'esecuzione di prova (dry-run).

Il nodo restituisce il controllo non appena la chiamata squilla: ok significa « chiamata avviata », non « risposta ». Per conoscerne l'esito, aggiungi allo Start del modello il ricevitore phone_call_outcome: innesca la pipeline una volta terminata la chiamata, con phone.outcome — risposta o meno (answered, no_answer, rejected, unknown), durata, numero di turni, qualificazione applicata dall'agente.

Buone pratiche

  • Mantieni le missioni concise. Il tempo di riflessione conta: un agente che esita per 4 secondi sembra bloccato al telefono. Preferisci modelli veloci tranne che per i turni decisivi.
  • Lascia attivo il barge-in. Il chiamante deve poter interrompere l'agente. È l'impostazione predefinita.
  • Configura dei filler per i turni che chiamano dei tool: un silenzio lungo inquieta il chiamante.

Costi

Consulta Prezzi. Una chiamata non ha di per sé un prezzo al minuto: viene fatturata in base alle sue componenti — trascrizione (in base alla durata audio), sintesi vocale (in base al numero di caratteri) e LLM (in base ai token, tranne in BYOK).

Limitazioni note

  • Il canale telefonico è solo audio. Il video passa da altri componenti (generazione e doppiaggio video con HeyGen), non dalla chiamata.
  • Il trasferimento a un operatore umano richiede un trunk SIP che supporti REFER.
  • L'agente non può indovinare l'identità del chiamante senza un'integrazione CRM: conosce solo il numero presentato.