Мы регулярно пишем про голосовых ботов и автоматику входящих-исходящих звонков. Подтверждение доставки, заказов, угадывание и автоответ клиенту пока соединяемся с компанией — вся вот эта история. В комментариях мне резонно заметили, что про ботов я говорю много, а показываю мало. Это легко исправить! Хакатон S7 в Парке Горького в самом разгаре, 50 команд фигачат прототипы разного интересного — а у меня есть возможность попробовать уложиться в как можно меньшее количество строк кода. Минимализм в примерах — это круто.
Как все будет работать
Для демонстрации я сделаю самый простой кейс: общение о погоде с помощью известного движка работы с речью api.ai, недавно купленного google. В ответ на произвольный запрос этот сервис возвращает json с результатом «понимания» этого запроса. Если там что-то, похожее на запрос погоды, с помощью openweathermap можно получить текстовое описание, например «облачно». Как сейчас за окнами коворкинга. Но, надеюсь, к середине дня распогодится!
А платформа Voximplant обеспечит аренду телефонного номера, прием звонка, распознавание речи пользователя и синтез ответа. Одна из наших ключевых фишек — это JavaScript, который выполняется в нашем облаке параллельно со звонком. И не просто выполняется, а в реальном времени. Плюс из этого JavaScript можно делать HTTP запросы к другим сервисами, так что Backend как таковой нам не понадобится: все будем делать в том же облаке, которое обрабатывает звонок. Чтобы у пользователя было как можно меньше задержек между его речью и ответом. У нас же бот, а не пошаговая стратегия с asterisk?
Шаг 1: получаем телефонный номер и отвечаем на входящий звонок
У меня есть хорошее введение в Voximplant, но оно на английском. Хорошо для наших клиентов по всему миру, но не очень хорошо для обучающей статьи на Хабре, поэтому позволю себе краткий пересказ. После регистрации в админке нужно перейти в раздел сценариев и создать новый сценарий: тот самый JavaScript код, который будет выполняться в облаке. Самый простой сценарий ответит на звонок, синтезирует «привет, хабрапользователь» и повесит трубку. Вот его код:
Для организации кода и инструктирования когда и что выполнять у нас есть «приложения» и «правила». Переходим в раздел приложений, создаем новое, добавляем правило с маской по умолчанию точка-звездочка (что значит «для звонков на любые номера». В нашем примере мы будем использовать арендованный номер и звонки очевидно будут приходить «на этот номер». Но в общем случае звонок может прийти и от другой телефонии, и из web sdk — для таких случаев правила помогают распределять их, не делая лишних if в сценариях) и назначаем этому правило созданный JavaScript сценарий.
Что еще нужно, чтобы позвонить на номер? Правильно, номер. Они арендуются в разделе номера, купить. Важно: «реальные номера» — это переключатель. Если кликнуть на него, то интерфейс переключается в технический режим виртуальных номеров для отладки. Номер в Готам-Сити можно прикупить за 1 цент. Звонки на такие номера идут через единый номер доступа и добавочные.
Арендовав номер, из верхнего меню переходим в раздел «мои номера телефонов» и подключаем к номеру созданное приложение. Все, можно звонить и проверять. Кстати, если во время тестов закончился стартовый баланс, то можно написать мне в личку и я пополню. Хабр — это в первую очередь сообщество, своих надо поддерживать.
Шаг второй: пытаемся понять звонящего
Чуть позже я покажу, как из JavaScript Voximplant начать распознавание и получить текст вместо голоса. Но пока представим, что это уже есть и нам нужно «понять», что сказал пользователь. Для этого регистрируемся в api.ai, подключаем гугловый аккаунт, заходим в раздел «prebuild agents» и добавляем в проект
В ответ вы получите немаленький json, спрятанный под спойлером. Самое ценное в ключе result, где в action можно проверить тему, а в address и city — где погодой интересуются. Обратите внимание, что это очень простая демка, и на вопрос «какая погода за окном» вы получите адрес «за окном».
Шаг третий: узнаем погоду на Марсе
Получив город, для которого звонящий хочет узнать погода (или информацию о том, что звонящий говорит совсем не о погоде), можно узнать саму погоду. Апишек для этого миллион, для демонстрации я воспользуюсь первой попавшейся openweathermap.org, на которой можно зарегистрироваться и получить ключик api. Обратите внимание, что ключ начинает работать не сразу. Пример запроса, который вернет погоду в Москве:
В ответ мы точно так же получаем json, в котором есть готовое к проговариванию поле description. В Москве сейчас пасмурно:
Шаг последний: собираем все вместе
Все что осталось — это включить потоковое распознавание в JavaScript сценарии Voximplant (мы про него уже писали), дождаться вопроса от пользователя, сделать запрос к NLP, получить название города, затем сделать запрос к сервису погоды, получить описание погоды и синтезировать его в звонок. Для пользователя пройдет меньше секунды, и все это обеспечит вот такой код:
Автор: eyeofhell