Голосовой секретарь на вебхуках

zn6araq_noheex-gr0naytimfhe.png

Один из последних трендов — онлайн чат-боты. Но, что делать с теми клиентами, которые находятся оффлайн? Большой процент людей предпочитает звонить по телефону. Для них нужен или большой штат операторов, или решение по автоматизации работы с голосом. Предлагаем решение для уменьшения работы и затрат (и даже почти не нагрузит вашего программиста).
Как быстро и легко программировать любое голосовое меню, автоинформатор, робота-секретаря с привязкой к своей базе клиентов?

Спойлер: Все реализовано на webhooks и приведен пример на PHP.

Обсуждаем под катом.

Что и зачем?

Например, у вас служба доставки либо интернет-магазин со своей службой логистики. Часть клиентов звонит чтобы узнать, как дела с их посылкой/товаром и это можно легко автоматизировать. Аналогично — гео-локация такси, сбор данных со счетчиков, вообще любая индивидуальная онлайн информация, которую вы можете дать клиенту и не тратить на «справку» время живых операторов.
Автоматизировать это очень просто, ниже опишем пример. И, ах, все это можно сделать абсолютно бесплатно.

Почему не свой asterisk?


Конечно, все можно сделать и на Asterisk, но тут кроме разработчика потребуется и администратор, причем со знаниями в части безопасности голосовых сетей (так как их особенно любят взламывать).
Рассматриваем самую простую реализацию решения поставленной задачи — на вебхуках.

Список методов


Для работы нам понадобится всего 2 новых метода, но каждый из них дает много возможностей, а главное — неограниченные циклы. Благодаря циклам можно получить голосовое меню любой глубины и информатор на любую тему.

Основные методы:

  • NOTIFY_START — начало входящего звонка в АТС
  • NOTIFY_IVR — ответ абонента на заданное действие

Подробное описание методов для копипаста доступно в описании API.
Для запросов NOTIFY_START и NOTIFY_IVR можно «на лету» изменять сценарий работы по текущему звонку, отправив в ответ один из следующих вариантов:

nprrdtln0cz1bpidnmrewzvrdzs.png
as62oduq5-v06eiap0b04hgfk1i.png
auvrrvm_akqeccmo2guvywtko7c.png
lgm8hqcns4wlps-trnja2in7eds.png
wsfmd_4iirv_pvn3wkpcun6ebam.png

По факту, клиент звонит и слушает приветствие, потом донабирает определенный номер (например, номер заказа), мы отправляем уведомление с цифрами которые он набрал, скрипт абонента проверяет по базе и отправляет ответ на уведомление к нам. В ответе, может содержаться id голосового файла или вариант стандартного голосового сообщения.
У нас есть стандартная система воспроизведения чисел, поэтому не нужно записывать предварительное голосовое сообщение, то есть из базы берется нужное уведомление и оно воспроизводится роботом как число. Либо же можете создать до 100 вариантов шаблонных голосовых уведомлений и отправлять их в ответ на запрос клиента (Ваш товар находится на складе, Вы можете получить ваш товар с 9 утра до 10 вечера ежедневно кроме воскресенья, Ваша посылка находится в пункте выдачи — метро Белорусская).

Минимум для реализации:


Чтобы секретарь смог ответить, нужен как минимум номер телефона и АТС. Также стоит заранее загрузить либо автоматически начитать ответы секретаря.

Настраиваем:


7339b91bfdc2cf7dc5d06e7b4e3b9cc7.png

  1. Бесплатная АТС для нашей задачи настраивается в три клика (выбираете нужное количество сотрудников, голосовое меню можно настроить позже).
  2. Телефонные номера для АТС можно подключить в любом крупном городе РФ либо в 90 странах мира. Номер включается мгновенно после проверки документов (если нужны документы для этого региона). Также можно бесплатно подключить один свой номер.
  3. Для начитки голосовых приветствий нужно зайти в раздел «Входящие звонки и голосовое меню» и выбрать вариант, который больше подойдет. Можно либо загрузить свои файлы, либо просто напечатать текст и робот его начитает автоматически. В начитке доступно 16 языков и несколько голосов для каждого языка (для английского языка 14 голосов). В личном кабинете можно сохранить до 100 голосовых приветствий.

wb-gbta2o2ciwmei9iu8taynd14.png

Пример на PHP:


Чтобы показать разные возможности мы создали 4 примера работы с IVR на PHP.

  1. Система диктует 3 последних цифры из CallerID (пример работы с данными о номере и произнесение цифр)
  2. Пользователь вводит по DTMF дату своего рождения и система говорит сколько дней до его ДР. (Работы с DTMF и произнесение цифр)
  3. Бесконечное многоуровневое меню: пользователь может нажимать цифры и попадать в следующее или прошлое меню (пример как простым циклом можно делать любое количество голосовых меню).
  4. Пример авторизации для получения баланса (полезно для многих примеров из жизни).


Первые три примера доступны на Github. В примере прописаны все необходимые элементы, нужно подставить только файлы с начиткой (которые предварительно загрузить или начитать в АТС).

Задача 4: пользователю произносится голосовое приветствие и просят ввести свой идентификационный номер, после ввода номера система произносит баланс, прощается, используя фразу из списка популярных, и завершает звонок.

Приводим пример кода под описанную задачу.

Код на PHP:

$request = new Request();
$notify = self::getEvent([AbstractNotify::EVENT_START, AbstractNotify::EVENT_IVR]);
if (!$notify) {
    return;
}
switch ($notify->event){
    case AbstractNotify::EVENT_START:
        $request
            ->setIvrPlay(self::INFO_FILE_ID)
            ->setWaitDtmf(TIMEOUT , ATTEMPTS, MAXDIGITS, DTMF_NAME, DEFAULT_BEHAVIOUR);
        break;
       
    case AbstractNotify::EVENT_IVR:
        if (!empty($notify->wait_dtmf->digits)) {
            $balance = getBalance($notify->wait_dtmf->digits);
            $request->setIvrSayNumber($balance, 'en');
        } elseif (!empty($notify->ivr_saynumber)) {
            $request->setIvrSayPopular(POPULAR_PHRASE_NUM, 'en');
        } else {
            $request->setHangup();
        }
}
$request->send();

Исследуем необходимость дальнейшего расширения функционала методов и собираем обратную связь, пожелания в комментариях приветствуются. Кроме этого доступно множество других методов вебхуков и api. Полный список есть на сайте.

© Habrahabr.ru