Как сделать сценарий для алисы

Обновлено: 03.07.2024

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

Голосовые квесты — отличный способ убить время и попробовать себя в неожиданных амплуа

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

Дуся — это виртуальный ассистент для вашего Android устройства. Здесь мы рассказываем о самых свежих новостях проекта.

  • Aimylogic — визуальный конструктор скриптов для Дуси 17.02.2019
  • Dialogflower — создавать навыки для Алисы стало еще проще 21.05.2018
  • Простой и быстрый способ создать бота для Дуси 08.04.2018
  • Как научить Алису своим функциям 18.03.2018
  • Что нового в версии 2.2.1 11.11.2017

Блог голосового ассистента Дуся


Совсем недавно Яндекс объявил о том, что теперь любой желающий может создать для голосового ассистента Алиса свои собственные функции. Пусть пока это и бета-версия платформы, но попробовать научить Алису чему-то интересному или полезному можно уже сейчас.

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


Как вы наверное помните, мы пару лет назад запустили свою платформу для создания чат-ботов под названием Zenbot. Она позволяет легко создавать своих чат-ботов для любых мессенджеров и каналов типа Telegram, Facebook, или даже создать чат-бота или функцию для Дуси. И при этом вам не понадобится арендовать сервера и искать решения для процессинга естественного языка или диалогового движка. Все это уже есть в Zenbot.

Яндекс Диалоги (бета)

Ну и наконец еще одно различие в том, что даже если навык нужен только вам, и вы не хотите, чтобы им пользовались другие люди, вам все равно придется его опубликовать, пройдя процедуру модерации в Яндексе. И его все равно увидят все пользователи Алисы.

Кстати каталог пользовательских навыков для Алисы сейчас доступен только в бета-версии приложения Яндекс. Нажимаем меню в правом верхнем углу и далее — Что умеет Алиса.

Как создать навык для Алисы

Короче говоря, нужно проделать немало работы, прежде чем наш навык заработает. А Zenbot как раз освобождает нас от этой рутины, решая все вопросы с серверами, протоколами и естественным языком!

Создаем навык на Zenbot

Откроется окно, где можно добавить нового бота (бот — это и есть наша голосовая функция для Алисы). После добавления откроется страница настроек бота. Тут же можно будет бота потестировать.

Код для Zenbot

Итак, создадим на своем ПК обычный текстовый файл например skill.xml и напишем там

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

Как загрузить бота на Zenbot

После этого зайдем в настройки нашего бота на Zenbot и нажмем Configure Git repository. Заполняем поля для нашего репозитория. Если вы используете github, то поля имя пользователя и пароль можно не указывать. Еще в каждом репозитории можно держать код для нескольких ботов. Поэтому в настройках есть поле Directory. Тут можно указать папку в ваших исходниках, где лежат XML и JS файлы для именно этого бота.

Нажимаем Save settings. После этого Zenbot попытается собрать вашего бота и расскажет о своем успехе или провале на странице Build reports. Кстати тут же можно нажать кнопку Rebuild now чтобы поскорее пересобрать бота, когда вы изменили его код в репозитории.

Тестируем бота в Zenbot

Подключаем бота к Алисе

Делаем бота умнее

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

А что-нибудь поинтереснее есть?

Несколько полезностей

Как добавить кнопки?

Используйте тэг sample. Он создает кнопку, при нажатии на которую в бота придет запрос, текст которого указан на кнопке. Подробнее в документации по sample.

Первый запрос

Как закончить сессию

Если в вашем навыке в какой-то момент нужно закончить сессию, просто создайте переменную end_session вот так

Как синтезировать речь

Если вы хотите, чтобы Алиса произнесла не то, что ваш бот возвращает в виде текстового ответа, то создайте переменную tts вот так

Как сформировать JSON ответ

Если вы хотите полностью сформировать ответ в JSON формате по протоколу Алисы (например если вам не хватает функционала тэга sample), то вы можете вернуть JSON ответа в output вот так

Куда дальше?

Для Zenbot мы написали подробную документацию с примерами. Еще у нас есть репозиторий с примерами готовых ботов и FAQ который описывает некоторые основные особенности платформы. У вас не займет много времени, чтобы понять, как писать сценарии ботов, которые понимают естественный язык и могут выполнять полезные (и бесполезные) функции.

История написания навыков для Алисы и тестилок для них.

Яндекс Алиса, Список покупок, Вторая память, Node.js

Предыстория

В chords-viewer была одна фича: голосовой поиск через браузерный API. Так я наступил в голосовые интерфейсы. Начиналось лето 2018.

Я написал простой список, который можно заполнять голосом - voice-list.

Потом написал список, который умеет отвечать на вопросы что где лежит (речь о вкусах жижи для есиг в разноцветных бутыльках) - voice-whatis.

И тут я вспомнил, что Яндекс запустил возможность обучать Алису в марте и решил, что это неплохая идея для навыка.

Yandex Dialogs SDK - фреймворк для Node.js

Писать с нуля я не люблю, первым делом пошёл на Github искать готовые проекты и либы.

Я сразу нашёл yandex-dialogs-sdk, другого тогда ничего не было в нормальном качестве.

Мы с автором пару месяцев сотрудничали: он писал SDK, учитывая мои хотелки. Трудно представить себе нужные в SDK фичи в вакууме, а я имел боевой навык, покрытый автотестами, который быстро выявлял проблемы в SDK и просил обновлений платформы.

Навык “Вторая память”

Колонка с Алисой

В декабре я решил, что раз я пишу навыки для Алисы, надо купить соответствующий девайс. Взял Irbis A, в общем понравилось. Я бы и до этого взял, но был только один вариант за 10 000 рублей, меня жаба душила.

Покупка колонки открыла все удобства и недостатки навыка, после этого было много правок с учётом особенности работы на колонке.

Интерфейс навыка - Алиса, то есть у него нет никакого UI, это называется VUI (Voice User Interface). Но для тестирования это не подходит…

Yandex Dialogs Client - инструмент для тестирования навыков

yandex-dialogs-client написал параллельно с разработкой первого навыка, потому что понял, что нужны автотесты, чтобы прогонять разные сценарии.

Настройки

Не выходить в интернет

Сейчас для этого я бы взял что-то готовое, тогда тестилок ещё нормальных не написали.
Моя - далеко не единственная.

Прикинуться настоящим

Я хотел сделать максимально похоже на дизайн Алисы в официальных приложениях. Официальная тестилка почему-то этого не хотела и выглядела как поделка начинающего верстальщика. Сейчас выглядит уже хорошо.

Технически это Vue.js с Element UI.

Проверить все сценарии

Этой фичи до сих пор у других не видел.

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

Тесты можно запускать по одному или все вместе. Для этого внизу чата они выводятся в виде кнопочек.

После прохождения всех тестов будет сводка: сколько тестов прошло, сколько упало, перезапустить все упавшие или один.

Кнопочки раскрашиваются в цвет результата последнего прохождения.

Синтаксис scenarios.yml

Пример одного теста в файле:

В итоге в первом навыке получилось 73 диалога. Все сценарии навыка.

На боевом навыке у меня тестирование 73 диалогов (404 реплики) проходит примерно за 30 секунд, на локалке за 15 секунд.

Я покрыл все сценарии тестовыми диалогами, так я мог не боясь рефакторить код и обновлять версию SDK, сразу сообщая автору, в каких местах что сломалось (а ломалось каждый раз в разных).

Вручную тоже

Для ручного тестирования тоже есть пара фич:

Картинки и карточки я не делал, поэтому в тестилке их нет.

Yandex Dialogs Tester - Continous Integration

Потом захотелось прикрутить Travis CI, чтобы там гонялись те же тесты, что и в WebUI. так появился yandex-dialogs-tester, там та же система тестов, но в виде отдельной либы.

Больше об этом проектике нечего сказать, быстрый, но неудобный.

Навык “Список покупок”

Когда я подавал навык на премию Алисы в феврале, мне посоветовали выделить часть, которая касается списка покупок в отдельный навык. Так появился “Вкусный список".

По сути всё уже было готово, я за вечер выбросил всё лишнее, переписал справку и запустил.

Название было такое, потому что “Список покупок” занял какой-то киберсквоттер, но навык он не сделал, там была просто заглушка.

Через какое-то время мне отдали нормальное название “Список покупок”.

Уменьшившийся упростил жизнь как мне, так и пользователю. Например, стало можно сказать просто “добавь картошку”, а не “добавь картошку в список покупок” и т.п.

Сделал возможность добавлять и удалять помногу, защиту от двойного добавления и прочие мелочи.

В итоге оказалось, что навыком действительно удобно пользоваться. На телефоне список выглядел как список, при нажатии на каждый продукт он удалялся из списка, легко было идти по списку и “вычёркивать”.

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

Были косяки, которые меня не парили, а пользователи жаловались. Список хотелок юзеров в какое-то время превысил мои возможности. Например, я надиктовываю сразу группами: “добавь масло, сгущёнку и сыр”, при этом навык должен определить 3 продукта и действие “добавить”. Самое сложное, что я добавлял - “соевый соус”, его я научился определять как один продукт, определяя прилагательное + существительное.

А пользователь хотел “добавить приправу для плова”, можно было через “для” определить связку, но…

Я устал, я ухожу

Под конец простых регулярок перестало хватать для понимания запроса юзера, я начал прикручивать к навыку Томита-парсер для какого-то понимания смысла услышанного (никакого машинного обучения), но всё остановилось на прототипе tomita-parser-test, т.к. навыком я сам пользовался редко, поднадоело.

Вообще я навыки делал в первую очередь для себя, “Вторая память” оказалась бесполезной даже для меня, списком покупок я пользовался несколько месяцев, пока Яндекс не сделал официальный список покупок, он в чём-то хуже (не продуман механизм быстрого удаления в магазине), но в основном он конечно лучше. А больше я не знаю что писать )

Ещё была неудача с премией: Яндекс проводит ежемесячные премии Алисы, где награждает авторов лучших навыков, я ни с одним из 2 навыков не был удостоен. “Ачивки”, которуе я получил от Яндекса: название “Список покупок” и размещение “Второй памяти на главной странице на несколько дней (это подняло посещаемость с 10 до 500 юзеров в день).

К весне 2019 я наигрался с разработкой навыков, поэтому мои тулзы тоже застыли. Я всего 2 навыка сделал и помогал немного в развитии yandex-dialogs-sdk, автору которого надоело ещё раньше меня.


Полезности, история и квесты

По ходу игры надо постоянно соблюдать баланс между богатством и влиянием. Иначе король казнит вас за растраты и глупость или из-за боязни потерять власть и зависти к богатству.

Для взрослых и вместе с детьми

Для детей

В детской категории собрано много навыков для младших школьников и дошкольников. Часть из них направлена на развитие тех или иных навыков. А другая часть — игры и викторины.


Интерактивные игрушки


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

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

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

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

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

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

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

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

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

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

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

Запускаем наше приложение.

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

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

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

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

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

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

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

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

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

Читайте также: