Все мы не в своем уме. Как сделать новый навык для «Алисы» на 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. Запускаем наше приложение.

    Отображение в IDLE

  2. Запускаем alice-nearby, указав в качестве значения webhook http://localhost:5000/post.

    Запуск на MacOS

  3. Открываем любой браузер и переходим по ссылке localhost:3456, чтобы убедиться, что открылось приложение для тестирования.

    Приложение для тестирования

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

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

Типы диалогов

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

Основные настройки

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

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

ngrok

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

Тестирование на «Я.Диалогах»

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

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

  2. Воспользоваться симулятором. В настройках необходимо указать URL — и можно начинать.



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

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

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

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Комментарии (1)

  • Все хорошо только как приделать к ip имя сайта... Сертификат что ли нужен..? Не пойму... Ну сделаю 2 сервера и будет репликация как... Капец я походу понял это клрневве же центры сертификации _ если что я не про статью.