Как собрать голосового бота: распознавание речи, синтез речи и NLP в несколько строк кода

в 11:34, , рубрики: api.ai, javascript, voip, voximplant, Блог компании Voximplant, Программирование, Разработка веб-сайтов, разработка мобильных приложений

Мы регулярно пишем про голосовых ботов и автоматику входящих-исходящих звонков. Подтверждение доставки, заказов, угадывание и автоответ клиенту пока соединяемся с компанией — вся вот эта история. В комментариях мне резонно заметили, что про ботов я говорю много, а показываю мало. Это легко исправить! Хакатон 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» и добавляем в проект мозг, который умеет разговаривать о погоде. Ну, как «разговаривать». Отвечать на простые вопросы. После чего в левом меню выбираем созданный проект и там же кликаем на иконку шестеренки. В открывшемся окне настроек проекта нас интересует «Client access token» — по нему мы сможем отправлять запросы. Например, вот так узнается погода в Москве:

В ответ вы получите немаленький json, спрятанный под спойлером. Самое ценное в ключе result, где в action можно проверить тему, а в address и city — где погодой интересуются. Обратите внимание, что это очень простая демка, и на вопрос «какая погода за окном» вы получите адрес «за окном».

Скрытый текст

Шаг третий: узнаем погоду на Марсе

Получив город, для которого звонящий хочет узнать погода (или информацию о том, что звонящий говорит совсем не о погоде), можно узнать саму погоду. Апишек для этого миллион, для демонстрации я воспользуюсь первой попавшейся openweathermap.org, на которой можно зарегистрироваться и получить ключик api. Обратите внимание, что ключ начинает работать не сразу. Пример запроса, который вернет погоду в Москве:

В ответ мы точно так же получаем json, в котором есть готовое к проговариванию поле description. В Москве сейчас пасмурно:

Скрытый текст

Шаг последний: собираем все вместе

Все что осталось — это включить потоковое распознавание в JavaScript сценарии Voximplant (мы про него уже писали), дождаться вопроса от пользователя, сделать запрос к NLP, получить название города, затем сделать запрос к сервису погоды, получить описание погоды и синтезировать его в звонок. Для пользователя пройдет меньше секунды, и все это обеспечит вот такой код:

Автор: eyeofhell

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js