Как я сделал навык для Алисы и заработал 200 тысяч рублей

Два года делал голосовую игру, которая понравилась пользователям и другим разработчикам, но провалилась на конкурсе Алисы. Я отложил этот проект, начал всё заново и внезапно победил.

Как я сделал навык для Алисы и заработал 200 тысяч рублей

Привет! Меня зовут Кирилл Богатов, я дизайнер разговорных продуктов в KODE: проектирую чат-ботов и учу их общаться с людьми. В апреле мой навык «Идеи для рисования» выиграл премию Алисы. В статье расскажу, как создавал его и дам несколько рекомендаций по проектированию, если вы тоже так хотите.

Первая попытка: успех, но не победа

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

В премии Алисы я участвую с 2021 года. Моим первым успешным навыком была «Охота на Вампуса» — голосовая игра, в которой нужно выслеживать монстров и грабить (корованы) пещеры.

Как я сделал навык для Алисы и заработал 200 тысяч рублей

Игру хорошо приняли игроки и сообщество разработчиков, но с премией Алисы ей не везло. В список призёров «Вампус» попал только со второй попытки, заняв 9 место. Так я понял, что популярность и высокие оценки не гарантируют победы.

«Вампус» — игра непредсказуемая: игрок никогда не знает, что ждёт его в следующей комнате или сундуке. Ловушки, монстров и содержимое комнат навык выбирает случайным образом и выводит в определённом порядке:

Комната номер [17]:

[Зал поющих кристаллов].

[<звуки монстра из соседней комнаты>]

Нашли диковинку — [Кристалл-сопрано].

Коридоры ведут в комнаты номер [7], [16] и [18].

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

Где я подсмотрел новую идею

Идею для нового навыка подсказала младшая сестра — пока настраивал ей телефон, увидел в нём приложение с идеями для рисунков. Как оказалось, тема эта весьма популярна: подобные решения можно найти как для смартфона, так и для веба. Не говоря уже о сотнях списков в Pinterest и других соцсетях с картинками.

Концепция хорошо подходила для голосового взаимодействия, поэтому я решил реализовать её в навыке для Алисы.

Приложение Virink
Приложение Virink

Существующие генераторы как правило используют собранные вручную идеи, либо ограничиваются небольшим перечнем универсальных характеристик («персонаж» + «поза» + «настроение»).

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

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

Котобус из аниме «Мой сосед Тоторо» и Дарт Вейдер в отпуске
Котобус из аниме «Мой сосед Тоторо» и Дарт Вейдер в отпуске

Я задумывал навык в качестве помощника для ежедневной практики рисования. Однако ему нашлось и другое применение — генерация идей для нейросети. По ходу рассказа я буду показывать, что выдаёт Midjourney, если скопировать в неё задания из навыка.

Как я боролся с хаосом

В первой версии навык просто брал 5–6 случайных слов и связывал их воедино. В итоге получались бессмысленные предложения, которые невозможно изобразить.

«Воодушевленная лесная волна разочарованно медитирует за кассой супермаркета».

Чтобы избежать этого, я решил разделить приложение на два режима: «Персонажи» и «Сюжеты».

Как я сделал навык для Алисы и заработал 200 тысяч рублей

В режиме «Персонажи» нужно нарисовать персонажа с учётом одной из его характеристик:

  • среды обитания (космический, лесной),
  • настроения (радостный, грустный),
  • строения (бумажный, призрачный),
  • черты характера (отважный, ленивый),
  • внешних особенностей (усатый, бородатый).

Вот как с подобными заданиями справляется Midjourney:

Задания из навыка: «Механический динозавр», «Пушистое мороженое», «Бумажная фея», «Космический торговец древностями».
Задания из навыка: «Механический динозавр», «Пушистое мороженое», «Бумажная фея», «Космический торговец древностями».

В режиме «Сюжеты» к описанию персонажа добавляется действие и место действия. Прилагательные отбирались так, чтобы не перегружать задание и не создавать парадоксов (например, когда персонаж одновременно улыбается и грустит).

«Сердитый осьминог левитирует в средневековой Европе», «Неуловимый жираф прячется в офисе», «Коварный путешественник охотится за артефактами в затерянной библиотеке», «Изысканная свинья занимается йогой в торговом центре».
«Сердитый осьминог левитирует в средневековой Европе», «Неуловимый жираф прячется в офисе», «Коварный путешественник охотится за артефактами в затерянной библиотеке», «Изысканная свинья занимается йогой в торговом центре».

Контент для навыка я отбирал вручную, беря за основу идеи из Pinterest, фэнтези и работ художников-сюрреалистов.

Получилось 90 персонажей, 50 действий и 60 мест действия — всего 270 тысяч комбинаций.

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

  • персонаж не должен проявлять агрессию, ярко выраженные негативные эмоции или деструктивное поведение («тихоходка нападает», «пингвин страдает», «разбойник курит»);
  • персонаж должен быть понятен вне зависимости от возраста (пришлось отказаться от малоизвестных мифологических созданий вроде мантикоры и гарпии);
  • результат генерации не должен приводить к нежелательной двусмысленности («лесная нимфа познаёт себя»).

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

… и добавлял капельку абсурда

Для поиска нестандартных решений я использую метод латерального мышления. Для этого нужно взять за основу какое-то утверждение (базовое состояние) и поочередно применять к нему различные провокации:

  • Базовое состояние: пользователь рисует персонажа.
  • Отрицание: пользователь рисует персонажа, но без персонажа (вырезать из бумаги? заштриховать фон, оставив только контур?).
  • Дополнение: пользователь рисует персонажа и пишет текст (рисунок из букв? инструкция? постер к фильму?).
  • Инверсия: персонаж рисует пользователя (рисование у зеркала?).
  • Исключение: пользователь рисует персонажа, но без цвета (ввести ограничение на количество цветов?).
  • Гиперболизация: пользователь рисует огромного персонажа (добавить прилагательные, указывающие на размер?).
  • Замена элементов: пользователь рисует персонажа, но не ручкой или не на бумаге (лепка из пластилина? рисунок из хлебных мякишей? что если сам персонаж будет мякишем?).

Не все идеи оказались жизнеспособными, но часть из них перекочевала в режим «Персонажи». К ним также добавились задания на стилизацию рисунка: сделать иллюстрацию к средневековой книге, мозаику и так далее.

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

«Пещерный фламинго в виде хлебушка», «Загадочный банан в виде шедевра абстрактной живописи», «Нахальный голубь в виде рисунка в гробнице фараона», «Хитрый енот в виде статуи древнегреческого бога».
«Пещерный фламинго в виде хлебушка», «Загадочный банан в виде шедевра абстрактной живописи», «Нахальный голубь в виде рисунка в гробнице фараона», «Хитрый енот в виде статуи древнегреческого бога».

Описание некоторых стилей могло быть непонятно для детей, поэтому в сложных местах я добавил подсказки: «Нарисуй весёлого мага в стиле “кубизм”. Используй квадраты, треугольники и другие простые фигуры».

Помимо идей по стилизации, я также добавил задания на объединение черт нескольких персонажей: «У меня есть енот, у меня есть рыцарь. Бам! Енот-рыцарь!». Получилось забавно, а главное — проще для понимания.

«Енот-рыцарь», «Краб-путешественник во времени», «Страус — офисный менеджер», «Орк-дворецкий».
«Енот-рыцарь», «Краб-путешественник во времени», «Страус — офисный менеджер», «Орк-дворецкий».

Недостатком подобных заданий было их восприятие на слух. Несмотря на дефис в названии персонажа, Алиса часто произносила его без паузы. Пришлось разделять части слова с помощью союза: «Объедини енота и рыцаря».

Технические нюансы

Чтобы создать навык, нужно написать код на Node.js или Python. Если навык простой, то его можно собрать без программирования в конструкторе диалогов, например Aimylogic.

В основе навыка лежит сценарий — последовательность шагов, состоящая из реплик пользователя и ответов Алисы. Вот как это выглядит в моём навыке:

  1. Поприветствовать пользователя.
  2. Спросить, в каком режиме нужно выдать задание.
  3. Сгенерировать задание для выбранного режима. Озвучить пользователю.
  4. Если пользователь скажет «Дальше» — вернуться к пункту 3.

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

«Нарисуй [прилагательное] [существительное] [стиль рисунка]».

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

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

Если существительное женского рода, а прилагательное оканчивается на «ый», то замени его окончание на «ая»: «прекрасный» — «прекрасная».

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

Как я сделал навык для Алисы и заработал 200 тысяч рублей

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

Было: «Нарисуй изящного крокодила», «нарисуй изящного банан».

Стало: «Нарисуй изящного крокодила», «нарисуй изящный банан».

На работу над навыком ушло около месяца, я создавал его вечерами, тратил по 1-2 часа. Большую часть времени я подбирал слова и тестировал формулировки. Для сравнения на «Вампуса» я потратил около года и ещё год на выпуск обновлений.

Стиль и удобство

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

  • обращение «Привет тебе, художник!»;
  • иконки в виде карандашных рисунков;
  • звук карандашного росчерка при запуске навыка.

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

  • Во время приветствия навык напоминает, что если идея не понравилась, можно попросить другую.
  • Добавил команды для повтора последней реплики, если пользователь её не расслышал или забыл: «повтори», «прослушал», «ещё раз».
  • Позволил пользователю в любой момент перейти из одного режима в другой.
  • Учёл, что одни и те же понятия пользователи могут называть по-разному: сюжет = история, персонаж = герой.
  • Добавил вариативные подводящие фразы в ответы Алисы, чтобы сделать диалог живее: «Как насчёт этого?», «Попробуем вот так», «А может быть так?».
Как я сделал навык для Алисы и заработал 200 тысяч рублей

Частые ошибки при разработке навыков

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

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

  • длинное приветствие, из которого непонятно, что делать дальше;
  • орфографические и пунктуационные ошибки;
  • пёстрые иконки меню, выполненные в разном стиле;
  • напоминание о том, что навык ещё в разработке;
  • навязчивая просьба оценить навык или посмотреть другие работы автора.

Избыточность голоса. Не все идеи подходят для голосовых колонок. Если пользователю придётся запоминать много информации или отвечать на серию вопросов там, где можно обойтись парой кликов, то лучше спроектировать текстового или мультимодального бота (это когда можно отвечать и текстом, и голосом).

Простыни текста. Длинные абзацы тяжело воспринимать на слух, они заставляют напрягаться при чтении. Идеальное решение — сократить текст, избавившись от тяжелых оборотов. Если не поможет — «разрезать» простыню на несколько простых абзацев, или выдавать информацию в несколько этапов.

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

Неинформативные сообщения об ошибке. Когда навык не может понять пользователя, появляется сообщение вроде «Извините, непонятно». Пользователь продолжает пытаться достучаться, но каждый раз получает один и тот же ответ. Чтобы избежать этого, можно постепенно добавлять в сообщение небольшие подсказки:

  • Извините, непонятно. Повторите, пожалуйста.
  • Простите, не понимаю. Вы хотите выбрать А или Б?
  • Всё ещё непонятно. Чтобы узнать список команд, скажите «Помощь».

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

Всё это я стараюсь учитывать в своей работе.

О победе в премии Алисы

Премия Алисы — это конкурс среди разработчиков разговорных навыков. В этом году его разделили на две категории: «Полезные навыки» и «Развлекательные навыки». Жюри конкурса отбирает по 10 номинантов, а потом — победителя среди них. Оценивают идею навыка, стабильность работы и интерес среди пользователей.

«Идеи для рисования» победили в категории «Полезные навыки». Для сообщества разработчиков это стало сюрпризом, ведь среди номинантов было много достойных претендентов, чьи навыки решали более значимые проблемы, чем поиск вдохновения для творчества.

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

«Идеи для рисования» я планирую развивать дальше: добавить больше элементов для генерации, сделать задания с неодушевлёнными предметами. Если у вас есть есть идеи на этот счет — буду рад вашим комментариям.

Ссылки

1414
2 комментария

Меня вдохновляют такие неугомонные люди как Вы. Которые пробуют раз за разом. Я считаю, что именно таким людям должно вести чуточку больше по жизни 😉

2
Ответить

Спасибо за отзыв! Такие слова здорово мотивируют экспериментировать и не забрасывать проекты.

1
Ответить