Канал телефонии позволяет 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 Aura | ElevenLabs |
Каталог голосов каждого поставщика 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: ему известен только отображаемый номер.