Pull to refresh
69.24
Rating
Voximplant
Облачная платформа голосовой и видеотелефонии

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

Voximplant corporate blog Website development *JavaScript *Programming *Development of mobile applications *
Tutorial
Мы регулярно пишем про голосовых ботов и автоматику входящих-исходящих звонков. Подтверждение доставки, заказов, угадывание и автоответ клиенту пока соединяемся с компанией — вся вот эта история. В комментариях мне резонно заметили, что про ботов я говорю много, а показываю мало. Это легко исправить! Хакатон S7 в Парке Горького в самом разгаре, 50 команд фигачат прототипы разного интересного — а у меня есть возможность попробовать уложиться в как можно меньшее количество строк кода. Минимализм в примерах — это круто.

Как все будет работать


Для демонстрации я сделаю самый простой кейс: общение о погоде с помощью известного движка работы с речью api.ai, недавно купленного google. В ответ на произвольный запрос этот сервис возвращает json с результатом «понимания» этого запроса. Если там что-то, похожее на запрос погоды, с помощью openweathermap можно получить текстовое описание, например «облачно». Как сейчас за окнами коворкинга. Но, надеюсь, к середине дня распогодится!

А платформа Voximplant обеспечит аренду телефонного номера, прием звонка, распознавание речи пользователя и синтез ответа. Одна из наших ключевых фишек — это JavaScript, который выполняется в нашем облаке параллельно со звонком. И не просто выполняется, а в реальном времени. Плюс из этого JavaScript можно делать HTTP запросы к другим сервисами, так что Backend как таковой нам не понадобится: все будем делать в том же облаке, которое обрабатывает звонок. Чтобы у пользователя было как можно меньше задержек между его речью и ответом. У нас же бот, а не пошаговая стратегия с asterisk?

Шаг 1: получаем телефонный номер и отвечаем на входящий звонок


У меня есть хорошее введение в Voximplant, но оно на английском. Хорошо для наших клиентов по всему миру, но не очень хорошо для обучающей статьи на Хабре, поэтому позволю себе краткий пересказ. После регистрации в админке нужно перейти в раздел «Приложения» и создать новое, а затем сценарий в нем: тот самый JavaScript код, который будет выполняться в облаке. Самый простой сценарий ответит на звонок, синтезирует «привет, хабрапользователь» и повесит трубку. Вот его код:


Для организации кода и инструктирования когда и что выполнять у нас есть правила. Переходим в свое приложение, затем в раздел «Роутинг» и добавляем правило с маской по умолчанию точка-звездочка (что значит «для звонков на любые номера». В нашем примере мы будем использовать арендованный номер и звонки очевидно будут приходить на него. Но в общем случае звонок может прийти и от другой телефонии, и из web sdk — для таких случаев правила помогают распределять их, не делая лишних if в сценариях) и назначаем этому правилу созданный JavaScript сценарий.

Что еще нужно, чтобы позвонить на номер? Правильно, он сам. Они арендуются в разделе номера, купить. Важно: можно купить, как реальный, так и тестовый номер, например, в Готэм-Сити. Звонки на них идут через единый номер доступа и добавочные.

Арендовав номер, из верхнего меню переходим в раздел «Номера» в рабочем приложении и подключаем нужный. Все, можно звонить и проверять. Кстати, если во время тестов закончился стартовый баланс, то можно написать мне в личку и я пополню. Хабр — это в первую очередь сообщество, своих надо поддерживать.

Шаг второй: пытаемся понять звонящего


Чуть позже я покажу, как из JavaScript Voximplant начать распознавание и получить текст вместо голоса. Но пока представим, что это уже есть и нам нужно «понять», что сказал пользователь. Для этого регистрируемся в api.ai, подключаем гугловый аккаунт, заходим в раздел «prebuild agents» и добавляем в проект мозг, который умеет разговаривать о погоде. Ну, как «разговаривать». Отвечать на простые вопросы. После чего в левом меню выбираем созданный проект и там же кликаем на иконку шестеренки. В открывшемся окне настроек проекта нас интересует «Client access token» — по нему мы сможем отправлять запросы. Например, вот так узнается погода в Москве:


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

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



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


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


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

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



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


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

Tags:
Hubs:
Total votes 23: ↑21 and ↓2 +19
Views 14K
Comments Comments 4

Information

Founded
Location
Россия
Website
www.voximplant.com
Employees
101–200 employees
Registered