Возможно, вы слышали или читали про функцию Call Screening, которую Google выкатил для своих телефонов Pixel в США. Идея отличная – когда вам поступает входящий звонок, то виртуальный ассистент начинает общаться, в то время как вы видите этот разговор в виде чата и в любой момент можете начать говорить вместо ассистента. Это очень полезно в наши дни, когда почти половина звонков – это спам, но при этом вы не хотите пропускать важные звонки от кого-то не из вашего списка контактов. Единственная загвоздка – эта функциональность доступна только на телефоне Pixel и только в США. Что ж, препятствия существуют, чтобы их преодолевать, верно? Поэтому мы решили рассказать, как сделать подобное решение, используя Voximplant и Dialogflow. Прошу под кат.
Архитектура
Предлагаю не тратить время на объяснения, как работают Voximplant и Dialogflow, при желании вы легко найдете информацию в интернете. Так что давайте познакомимся с самой концепцией нашего Call Screening.
Предположим, что у вас уже есть некий номер телефона, которым вы пользуетесь ежедневно и на который вы получаете важные звонки. В таком случае нам понадобится второй номер, который будет указан везде – в почте, на визитке, когда вы заполняете онлайн-формы и т.д. Этот номер будет подключен к системе обработки естественного языка (в нашем случае это Dialogflow) и переадресовывать звонки на ваш главный номер, только если вы этого захотите. В виде схемы это выглядит так (картинка кликабельна):
Понимая архитектуру, мы можем взяться за реализацию, но с одной оговоркой: мы не будем делать мобильное приложение, чтобы показать диалог между Dialogflow и входящим абонентом, мы создадим простое веб-приложение с рендером диалога, чтобы наглядно показать принцип работы Call Screening. В этом приложении будет кнопка Intervene, по нажатию которой Voximplant будет соединять входящего абонента с набираемым абонентом, если последний решил поговорить сам.
Реализация
Войдите в свой аккаунт Voximplant и создайте новое приложение, например, screening:
Откройте раздел «Номера» и купите номер, который будет работать в качестве посредника:
Далее зайдите в приложение screening, в раздел «Номера», вкладка «Доступные». Здесь вы увидите только что купленный номер. Привяжите его к приложению с помощью кнопки «Прикрепить» – в появившемся окне оставьте все значения по умолчанию и нажмите «Прикрепить».
Находясь внутри приложения, перейдите на вкладку «Сценарии» и создайте сценарий myscreening – в нем мы используем код из статьи How to use Dialogflow Connector. При этом код будет немного изменен, потому что нам нужно «видеть» диалог между звонящим и ассистентом; весь код можно взять тут.
ВНИМАНИЕ: вам нужно будет изменить значение переменной server на имя вашего ngrok-сервера (подробности про ngrok будут чуть ниже). Также подставьте свои значения на 31 строке, где your phone number – это ваш главный номер (например, личный мобильный), а voximplant number – номер, который вы недавно купили.
outbound_call = VoxEngine.callPSTN(“YOUR PHONE NUMBER”, “VOXIMPLANT NUMBER”)
Вызов callPSTN произойдет в тот момент, когда вы решите ворваться в разговор и лично побеседовать со входящим абонентом.
После того, как вы сохраните сценарий, вам нужно привязать его к купленному номеру. Для этого, все еще находясь внутри вашего приложения, перейдите на вкладку «Роутинг», чтобы создать новое правило – кнопка «Новое правило» в правом верхнем углу. Укажите имя (например, allcalls), оставьте маску по умолчанию (.* – что означает, что все входящие звонки будут обрабатываться сценариями, выбранными для этого правила) и укажите сценарий myscreening.
Сохраните правило.
Отныне номер телефона привязан к сценарию. Последнее, что необходимо сделать – привязать бота к приложению. Для этого перейдите на вкладку «Dialogflow-коннектор», нажмите кнопку «Добавить Dialogflow агент» в правом верхнем углу и загрузите JSON-файл вашего агента Dialogflow.
Если вам нужен агент для примера/тестирования, то можете взять нашего по этой ссылке: github.com/aylarov/callscreening/tree/master/dialogflow. Только не требуйте от него многого, это всего лишь пример, который вы вольны переделывать как вам захочется и смело делиться результатами :)
Простой бэкенд на NodeJS
Давайте развернем простенький бэкенд на ноде, например, такой:
github.com/aylarov/callscreening/tree/master/nodejs
Это обычное приложение, которое требует всего двух команд для запуска:
npm install
node index.js
Сервер запустится на 3000 порте вашей машины, поэтому чтобы соединить его с облаком Voximplant, мы используем утилиту ngrok. Когда вы установите ngrok, запустите его командой:
ngrok http 3000
Вы увидите доменное имя, которое ngrok сгенерировал для вашего локального сервера – скопируйте его и подставьте в переменную server.
Клиент
Клиентское приложение выглядит как простой чат, который вы можете забрать отсюда.
Просто скопируйте все файлы в какую-нибудь директорию на вашем веб-сервере и оно будет работать. В файле script.js замените значение переменной server на доменное имя ngrok, а значение переменной callee – на номер, который вы купили. Сохраните файл и запустите приложение в браузере. Если все в порядке, то вы увидите WebSocket-соединение в панели разработчика.
Демо
Увидеть приложение в действии можно на этом видео:
P. S. Если нажать на кнопку Intervene, то позвонивший будет направлен на мой номер телефона, а если нажать на Disconnect – то будет...? Верно, звонок будет разъединен.
cjmaxik
Одна из киллер-фич Call Screening — показ ответов в режиме реального времени. А здесь текст появляется только после полного распознавания.
aylarov Автор
Здесь можно сделать точно так же, называется interim results, прилетает от Dialogflow в режиме реального времени