Документация

Телефония в реальном времени

Входящий и исходящий голос через LiveKit + SIP — потоковая транскрипция и синтез речи, barge-in, перевод звонка, исходящие звонки, запускаемые pipeline.

Канал телефонии позволяет pipeline betool принимать звонки и совершать их. Поддерживаются аудио в реальном времени, потоковая транскрипция, потоковый синтез речи и прерывание (barge-in).

Архитектура

Под капотом:

  • LiveKit обеспечивает транспорт аудио в реальном времени.
  • LiveKit-SIP соединяет LiveKit с транком вашего оператора связи (SIP).
  • Выделенный worker оркестрирует звонок: транскрипция (STT), LLM, синтез речи (TTS).

Этот стек работает как отдельный процесс, независимый от основного backend. Вы не настраиваете его напрямую — оператор вашего экземпляра настраивает мост SIP.

Голосовые поставщики

РольПоставщикиПо умолчанию
Транскрипция (STT)Deepgram, faster-whisper (выполняется локально)Deepgram
Синтез (TTS)ElevenLabs, Cartesia, OpenAI, Deepgram AuraElevenLabs

Каталог голосов каждого поставщика TTS доступен в панели администрирования, с возможностью прослушать образец перед выбором. LLM — на ваш выбор (управляемая модель, BYOK или приватная модель — см. Подключение ключа LLM).

Предварительные требования

  • SIP-транк от оператора связи.
  • Входящий номер и / или возможность совершать исходящие звонки.
  • Доступ к выбранным поставщикам STT / TTS.

В управляемом предложении betool может подготовить SIP-транк и голосовых поставщиков за вас.

Проектирование голосового pipeline (входящий звонок)

Голосовой pipeline начинается с узла Start, несущего приёмник phone_gateway. На каждом транскрибированном речевом ходе pipeline получает, в частности:

  • user_message и phone.transcript — транскрибированный речевой ход
  • phone.call — звонок: идентификатор, номера вызывающего / вызываемого, направление (inbound / outbound), линия
  • phone.from — номер вызывающего абонента
  • phone.caller_timezone — часовой пояс, определённый по коду номера (пусто, если код охватывает несколько часовых поясов)

Текст, который выдаёт pipeline, озвучивается через TTS.

Настройки приёмника

Приёмник phone_gateway задаёт поведение звонка без кода:

  • Приветствие — несколько вариантов приветственного сообщения (один выбирается случайно), отдельное приветствие для исходящих звонков, задержка перед приветствием.
  • Тишина — напоминание после продолжительной тишины, затем прощальное сообщение и завершение звонка, если тишина сохраняется; максимальная длительность звонка.
  • Прерывание (barge-in) — включено по умолчанию: абонент может перебить агента. Минимальная длительность и минимальное число слов, чтобы прерывание засчитывалось.
  • Определение конца хода — режим определения и задержки окончания речи.
  • Fillers — фразы ожидания, произносимые, когда ответ задерживается, отдельные фразы во время выполнения tool, или фоновый звук ожидания (клавиатура, офис, музыка на удержании). По умолчанию отключены.
  • Голос — поставщик, модель, язык и голос STT / TTS, с тонкими настройками голоса (стабильность, скорость…).
  • Квалификации звонка — закрытый список кодов результата, которые агент может присвоить звонку.

Что агент может делать во время звонка

Телефонные tools доступны агентам pipeline, в котором выше по цепочке присутствует phone_gateway:

  • phone_gateway.transfer_call — перевести звонок на другой номер (SIP REFER). Номер проверяется на соответствие формату E.164; перевод выполняется после того, как текущий ответ будет произнесён.
  • phone_gateway.hangup_call — завершить звонок после прощального сообщения.
  • phone_gateway.set_call_disposition — квалифицировать звонок одним из настроенных кодов.

Агент также может отправить SMS во время звонка (tool allmysms.send_sms, см. SMS): на этом канале получатель зафиксирован на собеседнике по звонку. Если номер скрыт, отправка отклоняется.

Предложение временных слотов

Расчёт доступности (операция free_slots узла compute) выдаёт временные слоты, готовые к произнесению, в часовом поясе абонента. В сочетании с чтением календаря (Google или Microsoft) голосовой агент может назвать несколько свободных слотов, а затем назначить встречу.

Исходящие звонки

Pipeline может совершить звонок с помощью узла phone_call: например, перезвонить лиду сразу после его поступления или обзвонить список.

ПолеРоль
trunk_idЛиния, используемая для звонка
voice_modelМодель, ведущая разговор (её Start должен нести приёмник phone_gateway)
to_numberНомер для звонка (поддерживает шаблоны), нормализуется в формат E.164
call_varsПеременные, передаваемые в разговор (phone.outbound.vars) — например, имя, которое можно использовать в исходящем приветствии
allowed_days / allowed_hours / timezoneРазрешённое временное окно: вне окна звонок не совершается
max_in_flight / max_per_dayОграничения одновременных (3 по умолчанию) и ежедневных (100 по умолчанию) звонков
output_keyВыходной ключ (по умолчанию phone.call_result)

Защитные механизмы:

  • Exactly-once — повторный запуск никогда не набирает уже набранный номер.
  • Отказ до набора номера, если у организации закончились кредиты.
  • Никаких звонков в симуляции — узел пропускается при пробном выполнении (dry-run).

Узел возвращает управление, как только звонок начинает звонить: ok означает «звонок запущен», а не «трубку сняли». Чтобы узнать итог, добавьте в Start модели приёмник phone_call_outcome: он запускает pipeline после завершения звонка с phone.outcome — ответили или нет (answered, no_answer, rejected, unknown), длительность, число ходов, квалификация, присвоенная агентом.

Рекомендуемые практики

  • Держите миссии краткими. Задержка ответа имеет значение: агент, который колеблется 4 секунды, звучит на звонке как зависший. Предпочитайте быстрые модели, за исключением ходов, критичных для принятия решений.
  • Оставляйте barge-in включённым. Абоненты должны иметь возможность прервать агента. Это настройка по умолчанию.
  • Настройте fillers для ходов, вызывающих tools: долгая тишина тревожит абонента.

Стоимость

См. Тарифы. У звонка как такового нет поминутной цены: он тарифицируется по своим составляющим — транскрипция (по длительности аудио), синтез речи (по числу символов) и LLM (по токенам, кроме BYOK).

Известные ограничения

  • Телефонный канал только аудио. Видео проходит через другие компоненты (генерация и дубляж видео с HeyGen), а не через звонок.
  • Перевод на человека требует SIP-транка с поддержкой REFER.
  • Агент не может идентифицировать абонента без интеграции с CRM: ему известен только отображаемый номер.