Как сделать голосового бота

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

Для демонстрации я сделаю самый простой кейс: общение о погоде с помощью известного движка работы с речью 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, получить название города, затем сделать запрос к сервису погоды, получить описание погоды и синтезировать его в звонок. Для пользователя пройдет меньше секунды, и все это обеспечит вот такой код:

Источник

Сделаем это по-быстрому: голосовой бот на Dialogflow и Voximplant

Голосовые боты были и остаются полезной фичей для общения с клиентами. Потому что если что-то возможно автоматизировать, то надо срочно это делать. Подтверждение заказов и информация о них, запись обратной связи от клиентов, распознавание голоса и действия согласно тому, что распозналось и т.д. Кстати, о последнем – сделать бота с распознаванием в 2018 году стало еще проще: Voximplant отлично умеет распознавать и транскрибировать речь, а инструмент Dialogflow от “корпорации добра” хорошо анализирует текст. Ниже я покажу, как можно быстро собрать демо-бота, который расскажет о погоде в названном городе.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

Почему “демо”-бот?

Потому что принцип. Эта статья показывает принцип создания ботов на Dialogflow + Voximplant. Поэтому диалог с ботом будет простым, например:

Бот: – Привет, хабрапользователь! Спроси, какая погода в Москве или другом городе.
Хабрапользователь: – Какая погода в Лондоне?
Бот: – Сегодня в городе Лондон – облачно.

Voximplant позволит арендовать телефонный номер, распознать и транскрибировать голос, а также взаимодействовать с сервисами Dialogflow и openweathermap.org. Мы передадим в Dialogflow строку, транскрибированную из ответа пользователя, после чего NLP (Natural Language Processing) вернет нам JSON, в котором будет лежать название города в именительном падеже. Название города мы передадим в openweathermap.org, который, в свою очередь, расскажет нам, что же там с погодой в указанном городе.

Создаем тайного агента NLP

Dialogflow – это мощный сервис NLP, которым владеет google. Сервис бесплатный, но чтобы использовать его, нужен гугловский аккаунт. Заходим на https://dialogflow.com/ и регистрируемся. Сервис оперирует понятием “агент” – по сути, агент это и есть бот. По умолчанию у нового аккаунта нет агентов. В сервисе есть prebuild agents, но вот так сразу их нельзя себе добавить. Поэтому создаем нового агента просто для того, что получить доступ к предустановленным агентам; звучит как костыль, но поверьте, это он и есть.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

Введите имя для агента, остальные параметры можно оставить по умолчанию. Поле Google project подразумевает проект в Firebase (если у вас нет проектов Firebase, то создастся новый). Нажимаем Create и попадаем в консоль Dialogflow, так называется главный экран сервиса. Слева вертикальное меню, кликаем Prebuild Agents, находим агента Weather и щелкаем Import. Готово, теперь в нашем аккаунте есть агент weather!

По умолчанию агент поддерживает только английский язык, поэтому берем агента на редактирование (заодно можно поменять его имя, если есть желание), переходим на вкладку Languages, добавляем русский язык и клацаем “Save”.

Теперь у нашего агента есть выбор языка. Увы, агент не умеет общаться на русском “из коробки”, но ничего, научим. Щелкаем “ru”, чтобы сделать русский язык активным и затем проваливаемся в “Intents”.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

В открывшемся списке Intents выбираем самый верхний – weather. На новом экране видим раздел User says, здесь должны быть реплики пользователя: чем больше вариаций, тем лучше. Мы же пока обойдемся фразой “какая погода в Москве?”. Когда вы введете ее, Dialogflow почти сразу подсветит название города и назначит ему соответствие в возвращаемом JSON’е! Обязательно используем это в нашем коде. Также на этом экране видно название контекста/темы разговора — weather.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

Теперь мы можем проверить работу агента либо в сервисе Dialogflow (правый верхний угол, Try it now), либо сделать запрос через cURL. Чтобы меньше курить документацию, можно посмотреть пример cURL и возвращаемого JSON здесь же.

Обратите внимание, что текст query должен быть URIencoded и надо обязательно передавать ключик в заголовке (ключ можно найти в настройках агента). Если в запросе указан контекст, то желательно задавать уникальные номера сессии при всех последующих запросах, чтобы не “смешивать” контексты.

Как будет выглядеть этот запрос из нашего облачного сценария:

Запрашиваем погоду

Теперь, когда мы знаем город, мы может запросить погоду. Я использовал довольно простой API openweathermap.org. Регистрируемся, получаем API-ключ и можем делать запросы вида:

Из ответа мы возьмем простейшее описание погоды из поля description: “облачно” / “пасмурно” / “небольшой снегопад” и т.д.:

Зная погоду, мы можем синтезировать эту информацию в звонок.

All together now.

Настало время отразить все эти шаги в сценарии Javascript. Для этого сначала создадим приложение в панели управления Voximplant, а затем – сценарий в нем. В приложении также необходимо создать правило и привязать его к арендованному номеру (подробности есть на нашем сайте). Итак, что мы хотим сделать?

Источник

Голосовой бот + телефония на полном OpenSource. Часть 1 — создание и обучение текстового бота RU

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

Пример разговора Б-бот Ч-человек

Бот работает на принципе понятия намерения пользователя. На каждое намерение есть список заготовленных ответов. Чтобы бот мог понять намерение пользователя, необходимо обучить модель на датасете с намерениями и фразами, которые могут активировать это намерение

Намерение: Поздороваться
Возможные фразы: привет, добрый день, дратути…
Ответ: Привет

Намерение: Попрощаться
Возможные фразы: Пока, До свидания, Прощай…
Ответ: Пока

Шаг 1: Предобработка датасета

За основу взят датасет из открытого обучения skillbox по написанию чат бота в телеграмм, который может пообщаться с вами на тему кино. Выложить не могу по понятным причинам.
Предобработка является очень важным этапом.

Первым делом уберем все символы и цифры из текста и приведем все к нижнему регистру.

Далее необходимо исправить опечатки и ошибки в словах.

Эта задача не самая простая, есть хороший инструмент от Yandex под названием Speller, но он ограничен по числу запросов в день, поэтому будем искать бесплатные альтернативы
Для python есть замечательная библиотека jamspell, которая неплохо исправляет опечатки. Для нее есть хорошая предобученная модель для русского языка. Прогоним все входные данные через эту библиотеку. Для голосового бота этот шаг не так актуален, так как система распознавания речи не должна выдавать слова с ошибками, она может выдать не то слово. Для чат бота этот процесс необходим. Так же для минимизации влияния опечаток можно обучать сеть не на словах, а на n-граммах.

N-граммы, это части слов, состоящие из n букв. к примеру 3-граммы для слова привет будут
при, рив, иве, вет. Это поможет быть менее зависимым от опечаток и повысит точность распознавания.

Далее необходимо привести слова к нормальной форме, так называемый процесс лемматицизии слов.

Так же можно из фраз убрать стоп слова, которые несут мало смысловой нагрузки, но увеличивают размер нейронной сети (я брал из библиотеки nltk stopwords.words(«russian»)), но в нашем случае лучше их не убирать, так как пользователь может ответить роботу только одним словом, а оно может быть из списка стоп слов.

Шаг 2: Преобразование датасета в понятный для NN вид

Для начала необходимо сформировать словарь из всех слов датасета.

Для обучения модели понадобится перевести все слова в oneHotVector
Это массив, которые равен длине словаря слов, в котором все значения равны 0 и только одно равно 1 в позиции слова в словаре.

Далее все входные фразы преобразовываются в 3-х мерный массив, который содержит все фразы, фраза содержит список слов в формате oneHotVector — это и будет наш входной датасет X_train.

Каждой входной фразе нужно сопоставить подходящее к ней намерение так же в формате oneHotVector — это наш выход y_train.

Шаг 3: Создание модели

Для небольшого бота достаточно маленькой модели с двумя слоями lstm и двумя полносвязными слоями:

Компилируем модель и подбираем оптимизитор, я выбрал adam, так как он давал лучший результат.

Шаг 4: Обучение модели

После подготовки датасета и компиляции модели можно запустить ее обучение. Так как датасет небольшой, пришлось обучать модель на 250-500 эпохах, после чего происходило переобучение.

Шаг 5: Пытаемся поговорить с нашим ботом

Чтобы поговорить с нашим ботом, надо на вход обученной модели подать правильно подготовленные данные. Пользовательский ввод необходимо обработать так же как и датасет из первого шага. Дальше преобразовать его в вид, понятный NN как во втором шаге используя тот же словарь слов и их индексы, чтобы входные слова соответствовали словам, на которых проводилось обучение.

Обработанный ввод подаем в модель и получаем массив значений, в котором присутствуют вероятности попадания нашей фразы в то или иное намерение, нам же необходимо выбрать то намерение, у которого самая высокая вероятность, это можно сделать через библиотеку numpy

Необходимо оценить уверенность сети в этом ответе и подобрать порог, при котором выдавать пользователю failure phrases, типа — я вас не понял. Для своих целей я установил порог в 50% уверенности, ниже которого бот скажет, что не понял вас.

Далее из списка наших намерений выбираем подходящий ответ и выдаем его пользователю

Источник

Будущее веб-технологий: создаём интеллектуального чат-бота, который может слышать и говорить

Голосовые интерфейсы в наши дни вездесущи. Во-первых — всё больше пользователей мобильных телефонов используют голосовых помощников, таких как Siri и Cortana. Во-вторых — устройства, вроде Amazon Echo и Google Home, становятся привычным элементом интерьера. Эти системы построены на базе программного обеспечения для распознавания речи, которое позволяет пользователям общаться с машинами с помощью голосовых команд. Теперь же эстафета, в обличье Web Speech API, переходит к браузерам.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

В ходе разработки веб-приложения мы, для организации взаимодействия с пользователем, можем полагаться на различные графические элементы управления. Web Speech API позволяет интегрировать в приложения естественные для человека способы голосовой коммуникации при минимальном визуальном интерфейсе. В нашем распоряжении оказывается бесчисленное множество вариантов применения новой технологии, обогащающей возможности программ. Кроме того, Web Speech API способно сделать работу с веб-приложениями удобнее для людей с физическими или когнитивными ограничениями или травмами. Таким образом, веб-пространство будущего вполне может стать общительнее и доступнее.

Web Speech API позволяет веб-сайтам и веб-приложениям не только говорить с пользователем, но и воспринимать его речь. Взгляните хотя бы на несколько отличных примеров того, как это может быть использовано для расширения возможностей взаимодействия программ с человеком.

Сегодня мы расскажем о том, как используя Web Speech API создать интеллектуальный браузерный голосовой чат. Программа будет слушать пользователя и отвечать на его реплики синтезированным голосом. Так как Web Speech API всё ещё носит статус экспериментального, приложение будет работать лишь в тех браузерах, которые поддерживают это API.

Возможности, использованные в этом материале, и распознавание, и синтез речи, сейчас поддерживают только браузеры, основанные на Chromium, в том числе — Chrome 25+ и Opera 27+, в то время как Firefox, Edge и Safari поддерживают только синтез речи.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота
Поддержка синтеза и распознавания речи в различных браузерах

Вот видео, в котором показано, как то, что мы собираемся создать, работает в Chrome.

Работа над веб-приложением состоит из трёх основных шагов:

Полный исходный код того, что мы тут создадим, можно найти на GitHub.

Данное учебное руководство основано на Node.js. Для того, чтобы успешно с ним разобраться, вы должны знать JavaScript и иметь базовое понимание Node.js. Проверьте, установлен ли у вас Node и можете приступать к работе.

Подготовка Node.js-приложения

Для начала подготовим каркас Node.js-приложения. Создайте папку и разместите в ней следующее:

Затем выполните такую команду для инициализации приложения:

Теперь нужно установить зависимости, необходимые для сборки программы:

Мы собираемся использовать Express — серверный фреймворк для Node.js-приложений, который будет работать на локальном сервере. Для того, чтобы организовать двунаправленный обмен данными между сервером и клиентом в реальном времени, применим Socket.IO. Кроме того, мы установим средство для взаимодействия со службой обработки естественного языка API.AI. Это позволит нам создать интеллектуального чат-бота, способного поддерживать беседу с человеком.

Socket.IO — это библиотека, упрощающая использование технологии WebSockets в Node.js. После установки соединения между клиентом и сервером, основанном на сокетах, сообщения между ними будут передаваться очень быстро. А именно, происходить это будет, со стороны клиента, в тот момент, когда Web Speech API преобразует фразу пользователя в текстовое сообщение, и, со стороны сервера, когда текст ответа искусственного интеллекта придёт от API.AI.

Теперь займёмся работой над клиентской частью системы. На следующем этапе работы мы интегрируем Web Speech API в интерфейс приложения.

Распознавание речи с помощью SpeechRecognition

В Web Speech API есть основной интерфейс контроллера, называемый SpeechRecognition. Он позволяет преобразовывать в текст то, что пользователь сказал в микрофон.

Добавим в тело HTML-документа кнопку:

Захват голоса с использованием JavaScript

При желании распознавание речи можно настроить, устанавливая различные свойства соответствующего объекта. Мы применяем следующие настройки:

Затем нам нужна ссылка на кнопку. Мы будем прослушивать событие нажатия на неё, которое используется для запуска процесса распознавания речи.

После запуска распознавания воспользуемся событием result для того, чтобы получить текстовое представление того, что сказал пользователь:

Сейчас воспользуемся Socket.IO для передачи данных серверному коду.

Обмен данными в реальном времени с использованием Socket.IO

Socket.IO — это библиотека, предназначенная для веб-приложений реального времени. Она позволяет организовать двунаправленный обмен данными между клиентской и серверной частями системы. Мы собираемся использовать эту библиотеку для передачи текстового представления распознанной речи коду, работающему на Node.js-сервере, а затем — для передачи ответа сервера в браузер.

Возможно, вы зададитесь вопросом о том, почему мы не используем простые HTTP или AJAX-запросы. Данные можно было бы отправить на сервер, например, используя POST-запрос. Однако, мы используем WebSockets посредством Socket.IO, так как это — наиболее удачное решение для организации двунаправленного обмена, в особенности для тех случаев, когда события передаются с сервера в браузер. Благодаря постоянному соединению на базе сокета, нам не нужно перезагружать данные в браузере или часто отправлять AJAX-запросы.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота
Схема взаимодействия клиента, сервера и стороннего сервиса обработки естественного языка

Затем добавим следующий код туда, где мы обрабатываем событие result от SpeechRecognition :

Теперь перейдём к серверной части приложения. Она должна получить текст, переданный клиентом и передать его стороннему сервису, реализующему функции искусственного интеллекта. После получения ответа от сервиса, сервер должен передать его клиенту.

Получение ответа от внешнего сервиса

Множество платформ и сервисов позволяют интегрировать приложение с системой искусственного интеллекта с использованием преобразования речи в текст и с обработкой естественного языка. Среди них — IBM Watson, Microsoft LUIS, и Wit.ai. Для быстрого построения голосового интерфейса мы будем использовать API.AI. Здесь можно получить бесплатную учётную запись разработчика и быстро настроить ядро простого чат-бота, используя веб-интерфейс сервиса и библиотеку для Node.js.

После того, как вы создали учётную запись, создайте агента. Почитать об этом можно в начале руководства по началу работы. Полная настройка подразумевает создание сущностей и настройку связей между фразами, сказанными пользователем, и действиями, выполняемыми системой. Мы не будем этим заниматься, воспользовавшись предустановкой Small Talk. Этот пункт надо выбрать в левом меню, а затем, с помощью переключателя, включить сервис.

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота
Настройка Small Talk в API.AI

Тут же, используя интерфейс API.AI, настроим агента. Перейдите к странице General Settings, щёлкнув по значку шестерёнки рядом с именем агента и получите ключ API. Вам понадобится то, что называется здесь «client access token» — токен доступа к сервису. Этот токен мы будем использовать в Node.js SDK.

Использование SDK API.AI для Node.js

Подключим наше Node.js-приложение к API.AI с использованием соответствующего SDK. В файле index.js инициализируем API.AI, используя токен доступа.

Итак, мы, на сервере, используем Socket.IO для получения из браузера результата распознавания речи. Как только соединение будет установлено и сообщение будет доставлено на сервер, воспользуемся возможностями API.AI для получения ответа бота на высказывание пользователя:

Когда API.AI вернёт результат, используем метод socket.emit() Socket.IO для отправки данных в браузер.

SpeechSynthesis — голос для бота

Создадим функцию для синтеза голоса. Тут мы будем использовать интерфейс контроллера SpeechSynthesis из Web Speech API.

Функция принимает, в качестве аргумента, строку, после чего система произносит текст из этой строки:

Теперь получим ответ от сервера, снова воспользовавшись Socket.IO. Как только сообщение будет получено, вызовем вышеописанную функцию:

Теперь с нашим интеллектуальным чат-ботом можно поболтать!

Как сделать голосового бота. Смотреть фото Как сделать голосового бота. Смотреть картинку Как сделать голосового бота. Картинка про Как сделать голосового бота. Фото Как сделать голосового бота

Общение с чат-ботом

Обратите внимание на то, что при первой попытке общения с программой браузер запросит у вас разрешение на использование микрофона. Как и в случае с другими API (Geolocation, Notification), браузер, перед работой с конфиденциальными данными, запрашивает разрешение. В результате ваш голос не будет записываться без вашего ведома.

Если вы пообщаетесь с этим ботом какое-то время, вам наскучит его болтовня, так как использованный здесь ИИ очень прост. Однако, боты, созданные на базе API.AI, поддаются настройке и обучению. Вы можете сделать вашего бота умнее, почитав документацию к API.AI и поработав над его интеллектом.

Надо отметить, что в этом руководстве освещены лишь основные возможности нового API, однако оно, на самом деле, очень гибко и поддерживает множество настроек. Можно менять язык распознавания и синтеза речи, синтезированный голос, включая акцент (например — американский и британский английский), высоту голоса и скорость произнесения слов. Вот несколько полезных ссылок, которые помогут вам узнать больше о Web Speech API:

Итоги: шаг в будущее веба

Полагаем, в списке разработчиков платформ для обработки естественного языка далеко не случайно оказались Google, Facebook, Microsoft, IBM и Amazon. Значит ли это, что будущее веба однозначно за голосовыми интерфейсами? Нет, с полной уверенностью этого утверждать нельзя. Однако, это, а также то, что такие интерфейсы пользуются определённой популярностью на мобильных платформах, говорит о том, что им найдётся место и в веб-приложениях. Голосовые технологии и искусственный интеллект дополнят привычные способы работы с веб-содержимым, сделав интернет удобнее и доступнее.

Надеюсь, вам понравился наш рассказ о голосовых веб-технологиях и вы создали интересного виртуального собеседника.

Уважаемые читатели! Какие способы применения технологий распознавания и синтеза речи в веб-приложениях кажутся вам самыми интересными и перспективными?

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *