Следующая новость
Предыдущая новость

Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python

18.09.2019 14:25
Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python

Содержание статьи

  • Первый навык — эхо-бот
  • Тестирование навыков
  • Поиграем в слова
  • А теперь картинки
  • Размещение в сети

По примеру американских коллег из Apple, Amazon, Google и Microsoft в «Яндексе» в 2017 году сделали своего голосового ассистента, который понимает русский язык и пользуется неплохой популярностью в России. Одна из причин успеха — это возможность создания своих навыков, то есть собственных приложений. О том, как научить «Алису» новым вещам, используя Python и веб-фреймворк Flask, мы и поговорим в этой статье.

Как вообще работают навыки? Если говорить простыми словами, то «Алиса» и твой сервер будут обмениваться файлами в формате JSON, где будет содержаться необходимая информация. Причем на сервер придет не просто распознанный текст, но уже подготовленный для обработки запрос. Ты можешь выбрать любой удобный язык программирования — нужна только возможность создавать на нем веб-сервер. Мы выберем Python как один из самых простых и популярных.

INFO

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

  • Python 3.6 или новее;
  • Flask 1.0.2 или новее.

Первый навык — эхо-бот

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

Для начала основные термины:

  • request — запрос, который поступил от «Алисы»;
  • response — ответ нашего сервера, который отправляется «Алисе».

Как будет работать наш навык? На наш сервер поступает request, мы будем получать из него содержимое в виде текста, а затем отправлять response, где в качестве содержимого укажем текст запроса. Переходим к коду!

from flask import Flask from flask import request import json  app = Flask(__name__)  @app.route('/post', methods=['POST']) def main():     ## Создаем ответ     response = {         'session': request.json['session'],         'version': request.json['version'],         'response': {             'end_session': False         }     }     ## Заполняем необходимую информацию     handle_dialog(response, request.json)     return json.dumps(response)   def handle_dialog(res,req):     if req['request']['original_utterance']:         ## Проверяем, есть ли содержимое         res['response']['text'] = req['request']['original_utterance']     else:         ## Если это первое сообщение — представляемся         res['response']['text'] = "Я echo-bot, повторяю за тобой"  if __name__ == '__main__':     app.run() 

Как-то много кода... Давай разбираться по частям. Во-первых, важно сказать, что наш сервер написан на Flask, и если ты хочешь разобраться в этом фреймворке поглубже, на «Хабрахабре» есть отличный гайд. Здесь же отметим пару основных вещей.

  • Важно не забыть импортировать модули: Flask отвечает непосредственно за работу веб-приложения, request — за работу с запросами, а json необходим, потому что мы и получаем, и отправляем файлы JSON, а не объекты из Python.
  • Нужно создать экземпляр класса Flask, а затем его запустить. Это и есть непосредственно «ядро» сервера.
  • Декоратор app.route необходим, чтобы связать URL, тип запроса и функцию, которая будет обрабатывать этот запрос.

С основами Flask покончено — в принципе, для разработки простых навыков нам ничего больше не потребуется. Давай разберем, что же происходит в наших двух функциях.

В main() мы сначала создаем шаблон для ответа. Обрати внимание, что мы передаем туда два параметра из запроса: session и version, а затем во вторую функцию передаем наш шаблон для ответа и запрос, сконвертированный в JSON.

Основная функциональность нашего навыка содержится в функции handle_dialog(res,req). Если нам пришло какое-то сообщение, то все просто: нужно получить содержимое запроса. Кстати, оригинальный текст запроса содержится внутри req['request']['original_utterance']. Чтобы отправить его обратно пользователю, нужно скопировать содержимое в res['response']['text'].

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

Вроде бы все? Теперь нужно проверить, работает наш пример или мы где-то ошиблись. Но как протестировать?

Тестирование навыков

Существует несколько способов тестирования навыков. Один из самых простых — с помощью утилиты alice-nearby, которую можно запускать локально на своем компьютере. О том, как ее установить, написано достаточно подробно, так что не буду заострять на этом внимание. Итак, начинаем тестирование.

  1. Запускаем наше приложение.
Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Отображение в IDLE
  1. Запускаем alice-nearby, указав в качестве значения webhook http://localhost:5000/post.
Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Запуск на MacOS
  1. Открываем любой браузер и переходим по ссылке localhost:3456, чтобы убедиться, что открылось приложение для тестирования.
Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Приложение для тестирования

Поздравляю, твой первый навык работает! Обрати внимание: справа отображаются запрос и ответ в JSON. Но на самом деле авторы этой утилиты не придумывали интерфейс самостоятельно. Они просто сделали локальную версию приложения для тестирования навыков на основе тестового стенда в личном кабинете «Яндекс.Диалоги».

Зарегистрируемся в «Диалогах», регистрируем свой навык и попробуем его протестировать. При создании нового диалога разработчику предлагается выбрать его тип. Выбираем «Навык в Алисе».

Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Типы диалогов

Откроется страница с настройками. Их много, сконцентрируемся на основных.

Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Основные настройки

Для проверки работы нашего бота нам необходимо указать Webhook URL в «Яндекс.Диалогах». Но если мы попробуем добавить туда http://localhost:5000/post, то ничего не произойдет и на вкладке «Тестирование» будет лишь сообщение об ошибке сервера.

Чтобы протестировать навык, запущенный на компьютере, а не на сервере, можно использовать приложение ngrok. Эта программа создает публичный URL для сайта или сервера, запущенного на локальной машине.

Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
ngrok

Запустим ngrok, скопируем выданный нам URL-адрес в поле Webhook URL, сохраним настройки и перейдем на вкладку «Тестирование». Обрати внимание, что ngrok выдает два URL: HTTP и HTTPS, нам нужен HTTPS. И не забудь добавить к адресу /post, чтобы запросы обрабатывались корректно.

Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Тестирование на «Я.Диалогах»

Хотелось бы не только писать, но и проверить, как бы все это звучало, если бы наши ответы зачитывала «Алиса». Это можно будет сделать, если наш навык пройдет модерацию… Он вряд ли ее пройдет, но не надо отчаиваться! Существует целых два решения.

  1. Сделать навык приватным. Для этого в настройках необходимо поставить соответствующую галочку. В таком случае модераторы проверят только название, активационное имя и приветственное сообщение, где должно быть описано, что делает навык. Подробнее про модерацию навыков можно узнать из видеоруководства.
  2. Воспользоваться симулятором. В настройках необходимо указать URL — и можно начинать.
Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python
Все мы не в своем уме. Как сделать новый навык для «Алисы» на Python

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

1 год

7690 р.

1 месяц

720 р.

Я уже участник «Xakep.ru»

Источник

Последние новости