По примеру американских коллег из Apple, Amazon, Google и Microsoft в «Яндексе» в 2017 году сделали своего голосового ассистента, который понимает русский язык и пользуется неплохой популярностью в России. Одна из причин успеха — это возможность создания своих навыков, то есть собственных приложений. О том, как научить «Алису» новым вещам, используя Python и веб-фреймворк Flask, мы и поговорим в этой статье.
Как вообще работают навыки? Если говорить простыми словами, то «Алиса» и твой сервер будут обмениваться файлами в формате JSON, где будет содержаться необходимая информация. Причем на сервер придет не просто распознанный текст, но уже подготовленный для обработки запрос. Ты можешь выбрать любой удобный язык программирования — нужна только возможность создавать на нем веб-сервер. Мы выберем Python как один из самых простых и популярных.
Чтобы все примеры исходного кода, приведенные в статье, успешно запускались, тебе понадобится установить:
Навык «Алисы» — это, по сути, чат-бот. А разработчики чат-ботов для теста обычно первым делом пробуют написать «эхо-бота», который отправляет тебе то же самое, когда ты ему что-то пишешь.
Для начала основные термины:
Как будет работать наш навык? На наш сервер поступает 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, и если ты хочешь разобраться в этом фреймворке поглубже, на «Хабрахабре» есть отличный гайд. Здесь же отметим пару основных вещей.
request
— за работу с запросами, а json
необходим, потому что мы и получаем, и отправляем файлы JSON, а не объекты из Python.app.route
необходим, чтобы связать URL, тип запроса и функцию, которая будет обрабатывать этот запрос.С основами Flask покончено — в принципе, для разработки простых навыков нам ничего больше не потребуется. Давай разберем, что же происходит в наших двух функциях.
В main()
мы сначала создаем шаблон для ответа. Обрати внимание, что мы передаем туда два параметра из запроса: session
и version
, а затем во вторую функцию передаем наш шаблон для ответа и запрос, сконвертированный в JSON.
Основная функциональность нашего навыка содержится в функции handle_dialog(res,req)
. Если нам пришло какое-то сообщение, то все просто: нужно получить содержимое запроса. Кстати, оригинальный текст запроса содержится внутри req['request']['original_utterance']
. Чтобы отправить его обратно пользователю, нужно скопировать содержимое в res['response']['text']
.
Когда пользователь подключается к навыку в первый раз, запрос тоже приходит, но никакого текста в нем нет. Для обработки этой ситуации я добавил в функцию проверку.
Вроде бы все? Теперь нужно проверить, работает наш пример или мы где-то ошиблись. Но как протестировать?
Существует несколько способов тестирования навыков. Один из самых простых — с помощью утилиты alice-nearby, которую можно запускать локально на своем компьютере. О том, как ее установить, написано достаточно подробно, так что не буду заострять на этом внимание. Итак, начинаем тестирование.
http://localhost:5000/post
.localhost:3456
, чтобы убедиться, что открылось приложение для тестирования.Поздравляю, твой первый навык работает! Обрати внимание: справа отображаются запрос и ответ в JSON. Но на самом деле авторы этой утилиты не придумывали интерфейс самостоятельно. Они просто сделали локальную версию приложения для тестирования навыков на основе тестового стенда в личном кабинете «Яндекс.Диалоги».
Зарегистрируемся в «Диалогах», регистрируем свой навык и попробуем его протестировать. При создании нового диалога разработчику предлагается выбрать его тип. Выбираем «Навык в Алисе».
Откроется страница с настройками. Их много, сконцентрируемся на основных.
Для проверки работы нашего бота нам необходимо указать Webhook URL в «Яндекс.Диалогах». Но если мы попробуем добавить туда http://localhost:5000/post
, то ничего не произойдет и на вкладке «Тестирование» будет лишь сообщение об ошибке сервера.
Чтобы протестировать навык, запущенный на компьютере, а не на сервере, можно использовать приложение ngrok. Эта программа создает публичный URL для сайта или сервера, запущенного на локальной машине.
Запустим ngrok, скопируем выданный нам URL-адрес в поле Webhook URL, сохраним настройки и перейдем на вкладку «Тестирование». Обрати внимание, что ngrok выдает два URL: HTTP и HTTPS, нам нужен HTTPS. И не забудь добавить к адресу /post
, чтобы запросы обрабатывались корректно.
Хотелось бы не только писать, но и проверить, как бы все это звучало, если бы наши ответы зачитывала «Алиса». Это можно будет сделать, если наш навык пройдет модерацию… Он вряд ли ее пройдет, но не надо отчаиваться! Существует целых два решения.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее
1 год7690 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости