Голосовые навыки с нуля: как Алиса учила песни Цоя, не давала уснуть за рулем и принесла мне шесть наград от Яндекса

Необязательно посвящать годы изучению разговорных интерфейсов, чтобы у тебя получился крутой голосовой навык. Меня зовут Сергей Кул, и я считаю, что каждый навык – это маленький стартап: либо выстрелит, либо нет. Я создал первый голосовой скилл меньше года назад, ничего не зная о разработке ботов и голосовом UX. Теперь у меня четыре Премии Алисы и два специальных приза от Яндекса. Рассказываю, как так вышло и чему я научился, осваивая вместе с Алисой JavaScript, формулу Видмарка и песни «Кино».



Как создавать навыки без специальных навыков


1 июля 2019 года я начал активно искать какое-то новое направление для бизнеса в интернете. Работа в IT приелась, хотелось сменить деятельность. И вдруг наткнулся на статью, что для голосового ассистента Алисы сторонние разработчики могут делать свои навыки. Это было озарение! Понял, что хочу освоить такую разработку и закрепиться в этой нише. Что на тот момент я знал про голосовые интерфейсы или разработку ботов? НИЧЕГО! Совершенно! Но решил в течение одного месяца всё изучить и сделать первый навык.

Весь следующий день я смотрел уроки в Школе Алисы на Youtube. Вот, например, один из самых популярных уроков – про выбор инструмента:


В итоге понял две вещи. Первое – я опоздал с этим направлением на год: возможность развивать экосистему Алисы разработчики получили в 2018 году. Второе – это все еще настолько в новинку, что есть смысл запрыгнуть в этот паровоз.
Еще пара дней ушла на изучение навыков, которые уже были представлены в каталогах Алисы и Google Ассистента. Оказалось, что интересных не так и много, и это явно шанс для творческих людей. Именно для творческих, а не с сугубо программистским опытом, т.к. залог успеха навыка – это идея и полезность, а уже потом реализация. По сути, каждый навык – это маленький стартап, который может выстрелит, а может и нет.

4 июля у нас в семье поселилась Яндекс.Станция с Алисой! Теперь было нужно определиться с платформой для создания навыков. Стало ясно, что работать над навыками можно в конструкторах или самостоятельно изучив Python или Node.js. Второй вариант я отверг (все-таки долго), а вот с конструкторами начать было куда проще, оставалось только выбрать.

В моем личном топе инструментов оказались два претендента: Dialogflower (это Google Dialogflow для Алисы) и Aimylogic (конструктор от Just AI). Dialogflower все же больше заточен под Google Ассистента, да и без минимального опыта программирования с ним было не справиться. Aimylogic мне подходил почти идеально.

1. Взаимосвязи

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



2. Свобода действий

Конструктор дает возможность подключить сторонние сервисы, такие как IFTTT, Google Таблицы или любые другие, к которым можно направлять запросы. Удобно, что можно использовать JavaScript для своих функций: в упрощенной форме, но, если разобраться, можно создавать условия, циклы, массивы и т.д.

3. Интенты

Навык для голосового ассистента – это не просто бот. Нужно заранее продумать все возможные ответы и действия пользователя. А их может быть в сотни раз больше, чем в обычных играх с кнопками. Так, например, на просьбу назвать свой город, пользователь может ответить: «Санкт-Петербург», «Петербург», «Питер», «Спб». И для таких моментов в конструкторе есть самообучающаяся система интентов, которая поймет любой ответ. Это особенно пригодилось мне в одном из навыков для распознавания имен игроков.

Первый блин: тестируем навык на бабушке


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

— запись в Google Таблицу сообщения пользователя (как во внешнюю базу данных);
— распознавание пользователя по ID и считывание его сообщения из Google Таблицы;
— запись и считывание данных о пользователе;
— распознавание, кто играет – новый или постоянный игрок, и выбор соответствующего приветствия;
— разнообразные диалоги в зависимости от ситуации в игре.

В итоге через 10 дней ещё не опубликованный в каталоге Алисы навык был презентован нашей бабушке. И тут случилось ужасное! Бабушка ничего не поняла. Кому говорить? А уже можно отвечать? А что сказать? В общем, навык был полностью забракован. Стало ясно, что нужно делать проще и понятнее для пользователя.


В итоге навык был переименован в «Послание в бутылке», переписаны все диалоги, добавлены картинки и звук. Именно в такой версии мой первый навык появился в Каталоге Алисы. Теперь в него можно было играть на нашей Яндекс.Станции!
«Послание в бутылке»: можешь слушать реальные послания, оставленные игроками из других городов, и записывать свои сообщения, которые тоже кто-то услышит из уст Алисы. Google Таблицы служат в качестве базы данных для хранения посланий, а для сохранения данных о пользователе – база Aimylogic.

Гейм-джем для рывка


В конце июля я узнал, что 3-4 августа в Питере пройдет открытый гейм-джем «Игры с голосовым управлением». Это такой игровой хакатон, где за два дня нужно с командой придумать голосовой навык и его реализовать. Никогда раньше такие мероприятия не посещал, стало интересно. Решил пойти, тем более там разыгрывались три Яндекс.Станции, ну и вообще это был хороший повод завести новые знакомства.



Со мной в команде были еще три человека. Через пару часов мозгового штурма мы презентовали общий навык «Text Mixer». Еще во время обсуждения мне пришла идея навыка со стульями – ну, как та игра из детства, когда все бегают под музыку вокруг стульев и должны успеть сесть, когда музыка внезапно закончится. Но она никому не понравилась. А мне показалась настолько интересной, что я решил сделать навык лично, как дополнительный (если останется время).

Начали командную работу над «Text Mixer». Я взял на себя разработку, остальные должны были подобрать материалы и написать тексты. Но уже через 1.5 часа двое ребят решили делать квест и вышли из проекта. Вдвоем с напарником мы допилили навык к вечеру, разъехались по домам. На следующий день его нужно было только «причесать» и презентовать.

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



К обеду поехал на финал гейм-джема. Обещал дочке не возвращаться без приза! Но меня ждал сюрприз. Ребята, которые раскололи нашу команду, были на месте и сообщили, что делают «Text Mixer», от которого сами же и отказались. Мой вчерашний напарник по разработке не приехал. Я остался один. Тогда я решил, что буду презентовать только «Музыкальные стулья», т.к. игра была полностью готова.

Мой навык был единственным, который отработал без ошибок, да еще и развеселил всю аудиторию – всем пришлось играть! Но по итогам голосования «Музыкальные стулья» остались на задворках, и я не понимал почему. Решили с дочкой, что попытаемся завоевать Премию Алисы! 30 августа Яндекс объявил 5 лучших навыков августа. И «Музыкальные стулья» одержали победу в категории «Для детей».
«Музыкальные стулья»: игроки бегают вокруг стульев, пока играет музыка, но, как и в детстве, стульев на всех не хватит. Алиса в роли ведущей! Я задействовал блоки Условия и системную переменную $lastSeen для проверки, новый игрок перед вами или он уже участвовал. Для включения в сценарий разных мелодий использовал блок Текст, который позволяет указать несколько рандомных фраз (а в данном случае – несколько мелодий).

Хакатон Яндекса


В середине августа я присоединился к сообществу разработчиков Яндекс.Диалогов в Telegram, где можно не только новые знания получить, но и обзавестись друзьями и наставниками. Там мне рассказали, что Яндекс проводит на фестивале Chaos Constructions в Питере свой первый хакатон по голосовым навыкам. Я подал заявку на участие с навыком «Послание в бутылке». Он попал в число перспективных, и меня пригласили на хакатон.

Сначала участники должны были выслушать мнения экспертов (в жюри было много знакомых по видеоурокам Школы Алисы лиц) о своих навыках, в течение дня их доработать, а к вечеру презентовать на сцене фестиваля. Было волнительно, но все сразу стали своими. Эксперты не критиковали, а помогали, давали советы, делились опытом. И сами участники были больше не конкурентами, а партнерами.



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

Навык «Тест на алкоголь»: откуда брать идеи


Я работал на даче, и один из соседей постоянно просил глянуть в интернете табличку – сколько ему можно выпить, чтобы на утро можно было за руль. Я подумал, что на такой вопрос может ответить и Алиса. К началу сентября я подготовил уже свой третий навык «Тест на алкоголь».
«Тест на алкоголь»: Алиса узнает ваш вес, что вы пили и в каком количестве, а потом решает, можете ли вы сесть за руль прямо сейчас или нужно подождать (и сколько именно ждать!). Лучше поговорить с Алисой, чем с инспектором ГАИ. Тут тоже использована системная переменная для определения, новый игрок перед нами или нет. Для сбора ответов пользователя используется блок Ввод текста, после чего ответы пользователя проходят проверку через блок Условия и выдается нужный результат.
Реализация навыка заняла около недели, пришлось досконально разобраться в формуле Видмарка и узнать, как рассчитываются промилле. Навык был опубликован в конце августа.
Через пять дней пришел фидбэк от Яндекса с советами, что можно улучшить. Изначально в моем сценарии можно было выбрать только определенные напитки. Ребята из Яндекс.Диалогов посоветовали сделать так, чтобы пользователь не выбирал из предложенного, а мог просто голосом назвать свой напиток. Пришлось добавлять инфу про спирт, абсент, самогон и так далее.

Сделав нужные доработки, я со спокойной душой, с семьей и на премию от «Музыкальных стульев» уехал на море. С собой я прихватил книжку Джона Даккетта «JavaScript и jQuery». Отличная книга для начинающих, хотя за отпуск осилил только половину из 640 страниц.



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

Освоение новых рубрик


Самая конкурентная категория навыков в каталоге Алисы – это «Игры и развлечения». И мне хотелось попробовать силы там. Я взялся за навык «Звездный поединок», разработка заняла примерно три недели. Большая часть времени ушла на придумывание поединков и шуток + подбор экшен-составляющих (музыки, звуков). Тут я уже вовсю использовал JavaScript. Это позволило реализовать ряд интересных фич – например, выдавать пользователю рандомные поединки, записывать их номера в массив и далее выводить только новые бои, чтобы в течение одной игры поединки не повторялись.
«Звездный поединок»: битвы звезд и известных персонажей (Иван Ургант или Дима Нагиев? Колобок или Красная Шапочка?), делаешь ставки и зарабатываешь монеты. Ну и теряешь тоже. Вычисления для подсчета баллов реализованы через блок Условия. Для записи данных об игроке использовался сервис IFTTT, с помощью которого можно отправить данные в Google Таблицу.



После публикации навыка в ноябре прошла пара месяцев. Но ни фидбэка от Яндекса, ни высоких позиций в каталоге Алисы навык не получил. Я решил, что потерял хватку. И тогда за неделю запилил навык, который придумал еще на гейм-джеме: навык должен был помогать водителям не заснуть за рулем и не попасть в аварию. Назвал его «Не спи за рулем». Он не очень сложный в исполнении, но довольно полезный.
«Не спи за рулем»: Алиса заботливо уточняет, насколько вы устали, а потом каждые несколько минут бодрит водителя затейливыми вопросами вроде «А вода легче масла?». В сценарии навыка есть небольшие вычисления на JS в блоке Условия, Google Таблицы используются в качестве базы данных для хранения вопросов.
Только в конце января Яндекс дал обратную связь по «Звездному поединку». Доработок было много, но это был хороший знак. К февралю я все доделал. Наступил конец месяца, день вручения премий. По моему прошлому опыту, если в этот день до обеда тебе не пришло сообщение от Яндекса, то ты в ауте. Я никаких сообщений не получил и уже потерял надежду. Но напрасно! Вечером пришло письмо о том, что на премию номинирован и «Звездный поединок», и «Не спи за рулем»! Было здорово понимать, что все не зря.

В итоге – победа в желанной категории «Игры и развлечения», а «Не спи за рулем» попал в категорию «Специальный приз». Так что пока осталась неохваченной одна премиальная рубрика – «Образование»!

И что, всё правда так просто?


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

Самое главное не расстраиваться, что сначала все будет не так, как планировали. Так даже интереснее. А вот мои советы – как создать навык, который достоин премии:

  1. Навык не обязательно должен быть идеальным, но он должен нести новую идею, которой еще не было в каталоге Алисы.
  2. Навык должен быть полезным или интересным, поднимать настроение.
  3. Диалоги в навыке должны быть живыми, чтобы Алиса проявляла свой характер и эмоции в беседе с пользователем.
  4. Все навыки я проектирую для умной колонки, ведь если навык понятен и удобен в использовании на Яндекс.Станции, то на смартфоне будет понятен наверняка, но еще и с кнопочными подсказками.
  5. Во всех навыках я использую экшен-приемы – музыку при запуске навыка и при выходе. Обязательно думаю о звуковом оформлении – звуки делают навык дружелюбнее. Беру их обычно здесь: zvukipro.com, а редактирую здесь: mp3cut.net/ru.
  6. Почти во всех моих навыках, если пользователь играет повторно, Алиса его узнает и приветствует индивидуально.
  7. Моя боль и гордость – склонения. Если хотите, чтобы Алиса в навыке не звучала, как робот, и говорила «у вас 5 подсказок», а не «у вас 5 подсказка», этому нужно уделить время. Это как раз решается JavaScript. Текст идет числами, а озвучка в TTS – словом. И это, конечно, касается не только чисел, но склонения мужского/женского/среднего рода.
  8. Во всех навыках я использую TTS, проверяю паузы и правильность произношения через Яндекс SpeechKit.
  9. Все новые навыки я презентую сначала в сообществе разработчиков Яндекс.Диалогов. Конечно, тут не стоит ждать поощрения или похвалы, зато можно хватануть полезной критики и единиц в оценках по самое не хочу! Но если сможете это пережить и доработать навык, то он точно станет лучше. Считайте, что станете героем фильма «Выживший».
  10. Модерация навыка не всегда проходит гладко. После того, как навык «Музыкальные стулья» был опубликован и уже несколько дней висел в каталоге Алисы, я решил поменять аватарку к нему. Подал на повторную модерацию. В итоге навык не одобрили. Причина – неподходящее название! Только когда я письмом написал, что навык уже давно в каталоге с этим названием, повторная модерация была пройдена. И так случается часто, судя по рассказам других разработчиков.
  11. Остальное – вера в свою идею!

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


Именно поэтому я изначально выбрал в качестве инструмента конструктор, все-таки он позволяет создать навык не за месяцы, а за дни. А это возможность не терять время бездарно, а попробовать создать навык в формате MVP (минимально-жизнеспособного продукта). И уже потом, трезво взглянув на то, что получилось, принять решение о развитии навыка и вложении средств.

P.S. Хочу поблагодарить всех камрадов по разработке, которые продвигают голосовые навыки, верят в свою полезность, помогают в чатах, делают что-то новое! Навыки становятся лучше, переходят на новый уровень. И сейчас совсем не поздно подключиться, чтобы занять своё место под солнцем. Я тоже постараюсь не отставать. И надеюсь после карантина увидеться на Боткэмпе или Хакатоне! А пока можно глянуть мой новый навык «Память о Викторе Цое», который в мае получил специальный приз от Яндекса.
«Память о Викторе Цое»: навык, в котором нужно не только узнать песню группы «Кино» по отрывку, но и правильно вспомнить название. А Алиса подскажет, в каком году песня была записана и в какой альбом вошла. Песни и стихи сохраняются в Google Таблице. Для описания различных фактов используется блок Текст, а для проверки правильного варианта – блок Условия. Для сохранения данных о пользователе использовал базу Aimylogic.

Всем желаю здоровья и признания!
Сергей Кул (GarEngin)

Обложка: dribbble.com
Источник: habr.ru