Перейти к основному содержимому

Телефония: нумерация и маршрутизация

Актуально для: SimpleTwo 0.9.x · Проверено: 23.10.2026

Связь с телефонной сетью обслуживает PSTN-шлюз — отдельная роль pstn с SIP-транками к оператору связи (разделы 7 и 8): входящие номера ведут во встречи, к сотрудникам и в голосовое меню с донабором внутреннего номера, исходящие идут по правилам плана нумерации. Клиенты предлагают набор номера сами, как только сервер разрешает его учётной записи, — отдельной сборки не нужно (см. «Порядок включения» ниже). Роль mcu — это не PSTN-шлюз: она подключает к встречам терминалы переговорок, которые уже есть у вас, и не работает ни с транками, ни с городскими номерами — см. Переговорки и SIP-терминалы. Здесь — про документ, которым вы будете управлять звонками наружу: план нумерации. Внутренние номера выдаёт тот же план, и принадлежат они только ему: у людей свой диапазон (по умолчанию 2000–7999), а у переговорных, ботов и гостей может быть свой — без него переговорные получают номера из диапазона людей, боты и гости номера не получают. Два вида учёток не делят номер. План и выдачу номеров хранит каталог.

1. Как это устроено​

План — один версионированный документ на организацию. Администратор правит его в консоли, координатор сохраняет новую ревизию и отправляет снимок в плоскость коммуникаций.

Координатор не участвует в звонке

Снимок отправляется при изменении, а не запрашивается на каждый вызов. Это сделано намеренно: плоскость управления в пути телефонного вызова означает, что доступность координатора становится доступностью телефона. Пока координатор недоступен, телефония работает по последнему полученному снимку; кнопка «отправить снимок» существует как подстраховка.

Документ состоит из:

ЧастьЧто задаёт
Площадкиединый реестр мест: офис (административная принадлежность сотрудника и переговорной — страна нумерации, часовой пояс, свои транки, главный номер) или ЦОД (где стоят серверы)
Транкиоператор на проводе: откуда приходят его вызовы, куда уходят наши, digest и REGISTER; формат цифр, префикс выхода, номера (DID и реестр для представления)
Правилакакой номер через какой транк уходит и каким номером представляется
Экстренныеотдельный план для экстренных номеров
Направлениякакие коды стран вообще разрешены
Квотыпределы одновременности, частоты и расходов

2. Порядок — это часть плана​

Правила обходятся сверху вниз, первое совпавшее выигрывает. Транки внутри правила пробуются в том порядке, в котором записаны. Второе — не мелочь: именно так выражается «основной транк и резервный». Если нужно разложить нагрузку на два транка, это пишется двумя правилами, а не перемешиванием внутри одного.

3. Номер приводит к единому виду сервер​

Клиент отправляет ровно то, что набрал человек. E.164 вычисляется на сервере — по стране площадки звонящего, а не по локали устройства: одни и те же семь цифр с телефона с немецким регионом и с российским — это два разных звонка, и ни один из пользователей ничего не сделал неправильно.

Площадка — офис или ЦОД; ГЕО — страна

С 20.10.2026 таблица площадок — единый реестр мест. У площадки есть вид: офис — где находятся люди, переговорные и их аппараты; ЦОД — где стоят серверы. ГЕО площадки — её страна. Телефония читает только офисы: у ЦОД нет главного номера, транк и правило на него не ссылаются, а учётная запись, которой указан ЦОД, считается с неизвестной площадкой (и консоль не даёт так сделать). Сервер помещается в ЦОД в своих настройках («Серверы и развёртывание»); хост без такой настройки стоит в ЦОД, созданном из его записи ГЕО Secure Access (dc-ru для записи RU). По ГЕО строятся SRV-домены MCU для аппаратов переговорных — см. «Переговорные».

Площадка «неизвестна» — это отказ, а не «как в головном офисе»

Третье состояние здесь запрещает, в отличие от большинства других мест продукта. Причина простая: цена неверной догадки в остальных случаях — пустое поле, а тут — счёт и обращение по поводу мошенничества.

4. Экстренные номера​

Экстренные — отдельная плоскость, а не правило. Они сопоставляются первыми, по сырым цифрам, до приведения номера к единому виду и до всех прочих проверок, никогда не маршрутизируются по резервному транку и не считаются в квоты.

В версии 0.9.x экстренный вызов отклоняется

Он не маршрутизируется в экстренные службы. Это осознанное поведение первой версии: отказ, который видно, лучше молчаливой маршрутизации «куда-нибудь». Предупредите пользователей, что звонить 112 нужно с мобильного телефона.

5. Разрешённые направления и квоты​

Направления — список разрешённых кодов стран; выигрывает самое длинное совпадение (+7 — это и Россия, и Казахстан, и организация может хотеть одно без другого).

Квоты считаются там же, где идут звонки, на общей шине:

КвотаЧто ограничивает
одновременные на организацию / на транк / на учётную записьпиковую нагрузку; на транке считаются и входящие звонки, а его собственный «Макс.» действует вместе с квотой плана — меньший из двух
звонков в минуту на учётную записьвсплеск с одной учётки
новых направлений в частипичный признак подобранного пароля
потолок расходов за окно (месяц — по умолчанию — или сутки, UTC) — на организацию и на учётную записьденьги — блокирует, а не уведомляет
самый долгий звонок, минутплечо, которое никто не заметил и которое тарифицируется всю ночь
рабочие часымеждународные звонки вне окна

Потолок расходов именно блокирует: уведомление в 03:00 — это сообщение, которое прочитают в девять утра. Расход — это сумма оценок стоимости из журнала звонков, каждая по тарифу своего транка; звонок через транк без тарифа посчитать нельзя, поэтому, пока потолок задан, такой звонок отклоняется.

Счётчики одновременных звонков, звонков в минуту и новых направлений живут в общем redis (той же шине, что у пула SFU), когда он настроен у messaging: счётчик в памяти одного экземпляра — не лимит. Без redis messaging работает одним экземпляром, и счётчики — его память (/healthz messaging: pstn_dialout.counters).

6. Проверка и стоп-кран​

  • Проверить номер — введите номер и увидите, что с ним сделает план: к какому виду он будет приведён, какое правило совпадёт, через какой транк уйдёт и каким номером представится. Быстрее, чем звонить и разбираться по журналам.
  • Остановить телефонию — стоп-кран: исходящие прекращаются, в документе остаётся, кто и когда его дёрнул. Нужен ровно в тот момент, когда счёт растёт, а причина ещё не найдена.
  • Отправить снимок — принудительная синхронизация плоскости коммуникаций с текущей ревизией.

Каждая правка плана пишется в аудит, как и любое действие администратора.

7. Транки: оператор на проводе​

Под каждым транком в таблице — вторая строка, описание оператора на проводе:

ПолеЧто вписать
Адреса оператораIP или CIDR, откуда приходят его INVITE. Вызов принимается только с этих адресов; всё остальное шлюз отбрасывает без ответа. 0.0.0.0/0 и всё шире /8 не сохраняется
Проверять входящиедля оператора, адреса которого нельзя перечислить: шлюз требует от его INVITE digest транка
Адрес для исходящих, транспорт, порткуда уходят наши вызовы — имя или IP без sip: и без порта; TLS везде, где оператор его поддерживает (порт по умолчанию 5060, для TLS — 5061)
SIP-домендомен оператора, если он не совпадает с адресом: хост в From исходящего и в регистрации
Имя и пароль digestвыданные оператором. Пароль только записывается: хранится зашифрованным (тем же мастер-ключом, что DKIM и сертификаты), больше не показывается; пустое поле оставляет прежний, «стереть пароль» удаляет
REGISTER у оператора и срокдля оператора, который требует регистрацию: шлюз держит её сам, обновляет на 4/5 срока и снимает при остановке
Тарифстрока на префикс: префикс цена-минуты [шаг-с [за-соединение]], цены — в копейках валюты квот (7 300 60, 7495 100 1); выигрывает самый длинный префикс. По нему журнал оценивает стоимость звонка, и им держится потолок расходов: пока потолок задан, транк без тарифа звонков не несёт

Номера транка — одновременно его DID: когда два транка приходят с одного адреса, вызов относится к тому, чей номер набран. Если номера не совпали ни у одного — вызов отклоняется.

Куда уходит пароль

Пароль не входит в план. Координатор хранит его отдельно и передаёт только в messaging, отдельной отправкой рядом со снимком плана; шлюз спрашивает у messaging на каждый вызов, чей это транк и с каким digest звонить. При заблокированном шифровании (мастер-ключ не загружен) новый пароль не сохраняется, а транки не отправляются — messaging работает по прежней копии.

8. PSTN-шлюз: развёртывание и что уже работает​

Это отдельная роль pstn, не mcu. Терминалы переговорок и транки оператора обслуживают разные хосты: у них разные собеседники (ваши аппараты и чужой SBC), разная модель угроз (мошенничество со счётом возможно только на транке) и одинаковые порты по умолчанию — поэтому на одном хосте они не живут.

Перед развёртыванием​

  1. messaging — шлюз получает от него исходящие звонки своих транков, узнаёт, чей транк у входящего, и спрашивает пропуск в каждую комнату. Ключа SFU на хосте шлюза нет и не будет. Шлюз ходит к messaging по его публичному адресу (HTTPS): шины redis и приватной сети шлюзу не нужно, поэтому его можно поставить рядом с оператором в другой стране.
  2. SFU — шлюз входит в комнату как участник, по публичному имени SFU.
  3. Хост: 4 vCPU / 4 ГБ — ориентировочно ~80 одновременных звонков (каждый перекодируется, ~0,05 ядра; ~320 кбит/с на звонок на узле). Маршрутизируемый IPv4 на интерфейсе или NAT 1:1 с проброшенными 5060 и диапазоном RTP; симметричный NAT не работает, SIP-сторона — только IPv4.

Без связи с messaging шлюз звонков не принимает и не совершает: каждое решение о звонке принимает messaging.

Развёртывание​

Серверы → Добавить хост → роль «PSTN-шлюз (транки оператора)»:

ПолеЧто вписать
Приватный адреснеобязателен: шлюзу не нужна приватная сеть
Публичное DNS-имянеобязательно; с ним координатор заказывает сертификат и открывается SIP-TLS на 5061
Адрес в сторону транковIPv4 на этом хосте, на который шлют SBC операторов (пусто — все интерфейсы)
Анонсируемый IPпубличный IPv4 для SDP, Via и Contact за NAT 1:1 (пусто — определяется сам)
Диапазон RTPпо умолчанию 10000-20000; два порта на звонок

Выполните команду на хосте. Агент поставит simpletwo-pstn, библиотеки, с которыми он собран (libopus, libopusfile, libsoxr), откроет 5060/udp+tcp и диапазон RTP, а 5061/tcp — только когда сертификат уже на диске. Строка в «Серверах» показывает, слушает ли 5060.

Пока бинарь не опубликован

Если координатор говорит «this coordinator has no simpletwo-pstn binary», значит, в этом выпуске ещё не задан PSTN_VERSION — первый выпуск шлюза публикуется отдельным тегом. Хост ждёт и сам встанет, когда координатор обновится.

Несколько шлюзов​

Шлюзов может быть сколько угодно — например, по одному рядом с оператором каждой страны. У каждого транка ровно один шлюз: в карточке транка («Телефония → Нумерация и маршрутизация», поле «Шлюз ТфОП») выберите тот, на адрес которого шлёт оператор. Пока шлюз один, его выбирать не нужно: все транки идут через него. Когда шлюзов становится больше, транк без выбранного шлюза не принимает и не отправляет звонков — консоль предупреждает об этом под таблицами.

Каждый шлюз видит только свои транки: принимает входящие только от их операторов, держит REGISTER только с ними и получает от messaging только их исходящие звонки. Если шлюз транка не подключён к messaging или перегружен, звонок через этот транк сразу получает отказ «шлюз недоступен», и пробуется следующий транк правила, если правило это разрешает.

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

Что уже работает (0.9.x)​

  • Роль разворачивается, обновляется и видна в «Серверах»; порты и сертификат 5061 — как выше.

  • Шлюз не держит ключа SFU: каждый пропуск в комнату подписывает messaging, у двери которой у шлюза свой ключ (не ключ MCU).

  • Транки: шлюз узнаёт у messaging, с какого транка пришёл INVITE (по адресу, затем по номеру), куда и с каким digest уходит исходящее плечо, и сам держит REGISTER у операторов, которые его требуют.

  • Площадки, транки и правила групп — объекты каталога. Офис и ЦОД плана — сайты каталога; транк — атрибут учётки службы своего шлюза ТфОП, а его пароль — секрет этой учётки, который читает только messaging. Группе или отделу можно дать свои правила набора — карточка «Правила для групп и отделов» рядом с планом: человек, до которого дотягиваются несколько политик, получает политику с меньшим порядком целиком (её правила заменяют правила организации, а не добавляются к ним), остальные звонят по правилам организации. Поле проверки номера учитывает политику учётки. Входящие номера тоже хранит каталог, и messaging читает их сам; внутренний номер коллеги, набранный из меню главного номера, он находит по адресам учёток в каталоге.

  • План нумерации хранит каталог: консоль сохраняет его там, а messaging сам читает его оттуда раз в 10 секунд, держит у себя и переживает перезапуск. Пока каталог плана не хранит (до первого сохранения или переноса утилитой upgrade1), план по-прежнему доставляется из консоли (кнопка «отправить снимок» и автоматическая сверка раз в 15 минут). Стоп-кран уже действует: при остановленной телефонии messaging отказывает шлюзу ещё до того, как тот наберёт оператора.

  • Исходящие (на стороне сервера): messaging принимает просьбу позвонить на номер из беседы или встречи, проверяет право учётной записи (разрешение calls:pstn — его нет ни в одной встроенной роли, выдаётся явно) и право комнаты (ведущий беседы или встречи; в беседе со сквозным шифрованием — никогда), исполняет план нумерации, квоты и потолок расходов и только потом передаёт плечо шлюзу, который обслуживает выбранный транк. Ход звонка — «набираем», «звоним», «разговор» и исход — виден в комнате и в беседе.

  • Журнал звонков (CDR): каждое плечо и каждый отказ записываются в базу messaging — кто, из какой беседы, какой номер и какие цифры ушли в транк, через какой транк, время попытки, ответа и конца, длительность, исход и оценка стоимости по тарифу транка (пусто, если тарифа нет). Хранятся 395 дней (MSG_PSTN_CDR_RETENTION_DAYS). В консоли — «Телефония → Журнал телефонных звонков» (нужно право audit:read): доля отвеченных, средняя длительность и расход.

  • Точный исход звонка: шлюз сам сообщает messaging о каждом плече — «звоним», «оператор проигрывает сообщение», «ответили», «подтверждает», конец — с SIP-кодом и причиной Q.850, если оператор её прислал. Поэтому исходы различаются: «занято», «отклонил», «не отвечает», «номер недоступен», «оператор отклонил вызов», «линия недоступна», «не подтвердил». Время ответа и конца в журнале — шлюза, а не опроса. Если шлюз молчит дольше 5 секунд, messaging, как раньше, опрашивает SFU (/healthz → pstn_call_state).

  • Ранние сигналы оператора (183 с SDP: «абонент недоступен», гудки сети) слышны в комнате до ответа; в личном звонке без беседы, пока оператор молчит, шлюз сам играет гудки.

  • «Нажмите 1» — по правилу плана нумерации, колонка «Нажать 1»: «никогда» (по умолчанию), «в групповых» (не в разговоре один на один) или «всегда». Ответивший слышит английскую подсказку «To join, press 1» и попадает в звонок только после «1»; 30 секунд без нажатия — отбой с исходом «не подтвердил». Пока он не нажал, комната его не слышит, а он — её.

  • Клиенты (iOS, macOS, Android, Windows, веб): набор наружу — линия организации в выборе способа звонка, «Позвать телефон» в звонке, «Перезвонить» на пропущенном — появляется, когда координатор отвечает учётной записи, что ей можно звонить наружу: страна её офиса разрешает исходящие, телефония не остановлена, и у учётной записи есть право calls:pstn. Всё, что только показывает телефон в звонке, — входящий звонок с номера, строка телефона в списке участников и её состояние, клавиатура, записанное имя в лобби, сообщение о пропущенном, номера дозвона в деталях встречи — видно всегда, когда телефон есть. Номер показывается маскированным (+7916•••••67).

Чего ещё нет​

  • Калибровка транка: сопоставление кодов оператора с исходами пока общее для всех транков («по транку» не сделано); подсказка «нажмите 1» — только по-английски.
  • Транки: SRTP по транку ещё не настраивается; REGISTER поверх TCP/TLS через NAT (RFC 5626) не поддерживается.

Порядок включения​

Телефония появляется у пользователей, когда пройдены все шаги, — порядок важен: клиенты предлагают набор, как только сервер его разрешил.

  1. Договор с оператором связи: SIP-транк, адреса его SBC, логин и пароль digest (если он их требует), номера (DID) и тарифы.
  2. Хост под роль pstn — отдельная ВМ (на узле MCU нельзя: оба слушают 5060/5061), с публичным IPv4 или NAT 1:1. Разверните роль, как описано выше, и дождитесь в «Серверах» отметки, что 5060 слушается.
  3. Страны: строка страны (для России — RU, код 7, префикс 8, международный 810, 00, длина 10), галочка «Набор» и «Письменный ответ» — кто разрешил исходящие и когда (раздел 4: экстренные номера не обслуживаются, вызов на них отклоняется).
  4. Площадки: офисы со страной; у сотрудников и переговорных — их офис.
  5. Транки: транк оператора (раздел 7) с его номерами и тарифом.
  6. Правила: какие номера через какой транк уходят и каким номером представляются.
  7. Направления и квоты (раздел 5): разрешённые коды стран, пределы и потолок расходов.
  8. Проверка номера (раздел 6): несколько номеров — городской, мобильный, международный, 112 — должны дать ожидаемый транк или отказ.
  9. Входящие номера (раздел 8): главный номер (меню) и номера встреч; язык подсказок.
  10. Право calls:pstn — тем, кому можно звонить наружу: его нет ни в одной встроенной роли.

8. Входящие номера​

Телефония → Входящие номера (PSTN-шлюз). Каждому номеру (DID), который оператор отдал организации, назначается, куда он ведёт:

КудаЧто слышит звонящий
встреча — комната встречи (meet-…) или ссылка на неёпопадает на эту встречу, пока она идёт, без PIN; вне её времени — отказ
запрос PIN — номер конференции«введите PIN» и «#»; три попытки, затем отказ
человек — логин сотрудникагудки, пока у человека звонят приложения — так же, как звонок коллеги; через «Звонить человеку, секунд» (по умолчанию 30) — отбой

Документ хранится в координаторе и отправляется в messaging (при сохранении, кнопкой и раз в 15 минут, пока шлюз развёрнут); на каждый звонок координатор не спрашивают.

PIN встречи — девять цифр, свой у каждой встречи. Его никто не выбирает, и он открывает встречу, только пока она идёт: PIN из прошлогоднего приглашения никуда не ведёт. Узнать номера и PIN встречи — блок «Дозвон на встречу» в той же карточке: вставьте комнату или ссылку. Неверные PIN считаются: три на звонок, а номер, с которого их набирают слишком часто (или весь транк), на 15 минут перестаёт приниматься.

Звонящий с телефона анонимен. Номер, с которого он звонит, подписывает его строку во встрече (по умолчанию скрыто: +7916•••••67) и ничего не решает — не впускает и не сопоставляется с коллегой. По умолчанию звонящий ждёт у двери встречи — в том же списке ожидающих, что и гость, — пока ведущий его не впустит («Звонящие с телефона во встрече: всегда ждут»). Вариант «как настроено лобби встречи» пускает сразу во встречу без лобби, но только когда внутри уже есть ведущий: телефон не начинает встречу в одиночку. Пока звонящий ждёт, он слышит гудки (номер встречи) или короткий двойной сигнал каждые 6 секунд (после PIN); не дождался за «Ждать у двери, секунд» (по умолчанию 600) — отбой.

Человек в режиме «Не беспокоить» телефоном не вызывается — звонящий получает отказ.

Что слышит оператор при отказе — свой SIP-код на каждую причину (раньше на всё был 404):

ПричинаSIP
номер никому не назначен404 Not Found
встреча сейчас не идёт; человек не может принять звонок или в «Не беспокоить»480 Temporarily Unavailable
человеку уже звонят с другого телефона; человек нажал «занят»486 Busy Here
человек отклонил звонок603 Decline
никто не ответил за время звонка480 Temporarily Unavailable
занят последний канал транка (квота)503 + Retry-After: 30
телефония остановлена стоп-краном503 + Retry-After: 300
документ входящих номеров ещё не пришёл503 + Retry-After: 60
нет SFU / ошибка хранилища503 + Retry-After: 10
запрещено; PIN заблокирован или неверен403 Forbidden

Звонок человеку (или группе операторов главного номера) звонит на всех их устройствах, ответ — один. Кто ответил первым, тот и разговаривает; у остальных — и на других устройствах ответившего — звонок гаснет. «Отклонить» отклоняет звонок для того, кто нажал; когда отклонили все, кому звонили, звонящий слышит 603 (486 при «занят»), а каждому остаётся сообщение о пропущенном звонке.

Входящие звонки — в том же журнале, что исходящие («Журнал телефонных звонков», отметка «вх.»): номер звонящего (как его передал оператор — записывается, но ничего не решает), набранный номер, транк, по которому пришёл вызов, куда он привёл, когда его впустили или ответили и сколько он длился. Входящий звонок занимает канал своего транка: когда занято «Макс.» транка, следующий вызов получает отказ «занято» (SIP 503), а исходящему через этот транк откажет квота.

Главный номер и добавочные​

Цель «главный номер»: звонящий слышит приветствие и набирает внутренний номер коллеги (добавочный из карточки пользователя, 2000–7999), внутренний номер переговорной или идентификатор встречи (её PIN) и «#»; пауза в 4 секунды после цифры тоже считается «#». «0» или молчание — звонок операторам номера: логины в третьей колонке через запятую — один человек или до десяти сразу, разговор достаётся первому ответившему, остальным звонок снимается. Неверный номер — переспрос, три попытки, те же ограничения от перебора, что у PIN. Добавочные координатор отправляет в messaging вместе с номерами при каждой отправке (сохранение, кнопка, сверка раз в 15 минут).

Номер переговорной ведёт во встречу, которая идёт в ней сейчас по расписанию, — через дверь этой встречи, как любой дозвон: лобби, запись имени, ведущий впускает. Если в переговорной сейчас нет встречи, звонящий слышит об этом и может набрать другой номер — неверной попыткой это не считается.

PIN организатора и команды с клавиатуры​

У каждой встречи кроме PIN есть PIN организатора — блок «Дозвон на встречу» показывает оба; сообщайте его только тому, кто ведёт встречу. Набранный вместо PIN при входе, он впускает организатора сразу, без лобби, и с ним встреча может начаться. Уже во встрече: *8, PIN организатора, # — телефон становится ведущим (и сам себя впускает, если ждал у двери); три неверных — и команды ведущего на этом звонке больше не предлагаются. Номер звонящего организатором никого не делает.

КомандаКтоЧто делает
*6любойвыключить / включить свой микрофон (включить нельзя, если ведущий запретил микрофоны)
*1любойсколько человек во встрече
*0любойподсказка по командам
*7ведущийзакрыть / открыть лобби: пока закрыто, все, кроме ведущих, ждут у двери — и с телефона, и из приложения
*9ведущийвпустить всех ожидающих
*5ведущийвыключить микрофоны всем, кроме себя

Та же клавиатура — у аппаратов переговорных на MCU (см. «Клавиатура и голосовые подсказки» на странице переговорных).

Запись имени​

Галочка «Запись имени» у номера: перед ожиданием у двери встречи звонящий слышит «после сигнала назовите себя» и говорит до 3 секунд. Ведущие видят в списке ожидающих, что имя записано, и могут его прослушать. Запись хранится только пока звонящий ждёт (не дольше «Ждать у двери» + 2 минуты), в базу не попадает и удаляется, как только его впустили. В списке участников строка остаётся номером (скрытым), с пометкой «(name recorded)». Организатора имя не спрашивают.

Пропущенные звонки​

Если звонок человеку не взяли, его отклонили или человек в «Не беспокоить», он получает сообщение: в чате с ботом, указанным в «О пропущенных пишет бот», а если бот не задан — уведомление в приложении. В сообщении — номер (скрытый, или полностью, если выбрано «скрыт; полностью в сообщениях о пропущенных»), время и кнопка «перезвонить»: она проходит те же проверки, что обычный набор (право calls:pstn, план, квоты), а скрытый номер ею не раскрывается.

Голосовые подсказки​

Подсказки шлюза — на английском или на русском, по выбору у номера («Голосовые подсказки»). Голоса синтезированы заранее (английский — Piper, русский — Yandex SpeechKit; лицензии записаны в репозитории), в продукт входят только записи — шлюз никуда не обращается во время звонка.

Чего во входящих пока нет:

  • фраз во время ожидания у двери — там сигнал;
  • голосовой почты;

Дальше​