- PVSM.RU - https://www.pvsm.ru -

Разработка навыков для Алисы. Опыт работы с голосовыми интерфейсами, советы начинающим

Всего месяц назад мы захотели попробовать себя в создании расширения для функционала Алисы — навыков [1]. По опыту общения в чате поддержки Яндекс.Диалогов [2] сложилось впечатление что уже есть, чем поделиться с начинающими особенностями работы над голосовыми интерфейсами.
В заметке хочу рассказать свои впечатления от трех недель работы нашего детского новогоднего навыка Снегурочки [3] и о вопросах и ответах в чате разработчиков диалогов.

Разработка навыков для Алисы. Опыт работы с голосовыми интерфейсами, советы начинающим - 1

Для профессионала в VUI [4] в заметке не будет ничего нового, но дельные советы и комментарии от опытных приветствуются. Пишу впервые, прошу не судить строго.

Почему стоит обратить внимание на Алису? [5]
Зачем все это: голос, навыки? [6]
Как создать навык? [7]
Общий подход и типичные ошибки. [8]
Текущие недостатки платформы. [9]

Почему стоит обратить внимание на Алису?

Если за рубежом голосовые помощники уже стали обыденностью, многочасовые разговоры с роботом уже утекают в сеть [10], то у нас это пока остается на уровне взаимодействия с навигатором, болтовни детей с Алисой, баловством гиков с умными домами. Мало кто из моих знакомых заносит заметки и напоминания с помощью Siri, хотя, на мой взгляд — это один из самых удобных вариантов ее использования. С большой вероятностью в наступающем году эта ситуация изменится в лучшую сторону, ведь фундамент уже заложен:

  • Алисе исполнился только год, она учится, но уже многое умеет.
  • Выход Яндекс станции [11] — думаю, постепенно она будет становиться умнее и более функциональной.
  • Появление в продаже в декабре первых недорогих партнерских мини-колонок [12].
  • Запуск школы Алисы [13] для обучения разработчиков созданию навыков
  • Анонсированы серьезные улучшения инфраструктуры Яндекс.Диалогов, в частности, «discovery навыков» — средство для удобного поиска и ранжирования навыков от сторонних разработчиков

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

Зачем все это: голос, навыки?

Думаю, многим уже понятно преимущество голосовых интерфейсов в некоторых случаях, но не лишним будет напомнить:
Иногда это самый подходящий вариант. Например, в автомобиле или на кухне занимаясь приготовлением еды, при любой другой деятельности, где руки заняты, удобнее отдавать команды голосом. Например, уже давно есть роботы-медсестры, управляемые голосом [14], помогающие при хирургических операциях.
Голос — привычный людям интерфейс взаимодействия. Пожилые люди и дети без особых проблем осваивают этот метод для получения информации и управления гаджетами.
Для людей с нарушением зрения голос и слух — являются еще более важным каналом взаимодействия с окружающей средой. Судя по чату Яндекс.Станции [15] такая категория людей очень оценила появление такого устройства, облегчающего их жизнь.
Продолжать перечислять кейсы не буду, если интересно, то можно детальнее узнать обо всем этом из специальной литературы.
Навык — это программа реализующая некий диалог, который запускается заданной командой активации в Алисе и расширяющий возможности голосового помощника от Яндекса.

Как создать навык?

Есть уже некоторое количество хороших сторонних навыков [16], но еще много ниш которые можно занять и сделать по-настоящему интересный и полезный навык.
По созданию их есть несколько статей, в том числе и на хабре. Есть документация [17], есть краткие общие рекомендации [18]. Не стану сильно углубляться в технические детали реализации, т.к. хотелось бы поделиться общими подходами для начинающих.
Технически навык очень похож на бота, с тем отличием, что он не может сам отправить сообщение, а только ответить на запрос пользователя.
Вот небольшой список ресурсов которые помогут начать:
Библиотеки и ресурсы для Яндекс.Диалогов

Неофициальный FAQ [19]по работе с Яндекс.Диалогами
В документе собраны актуальные и не очень ссылки и вопросы-ответы
Вышеупомянутый чат яндекс диалогов [2]

Для начала разработки нужен аккаунт на Яндексе, сервер, на котором будет находиться и выполняться код нашей программы, вебсервер и само приложение, написанное на любом удобном вам языке, который сможет обеспечить работу по https протоколу [20].

Детали реализации своих навыков я тут приводить не буду, если будет запрос от сообщества, то уделю этому внимание в отдельной статье. Тем более что подобные материалы уже есть.
Оставлю только пример простого навыка на PHP [21] с комментариями который, думаю, позволит сделать быстрый старт новичку.
В репозитории находится скрипт для создания простой среды для разработки, который запускает встроенный в PHP вебсервер и используя сервис serveo.net [22] делает локальный порт доступным из интернет:
Разработка навыков для Алисы. Опыт работы с голосовыми интерфейсами, советы начинающим - 2
Сохраняем урл https://******.serveo.net — это будет урл вашего вебхука. В отличие от ngrok [23] этот урл не изменяется со временем, не надо менять его в настройках диалога. Можете проверить доступность вебхука введя в браузере этот урл — должен вернуться json с ошибкой. Это нормально, мы не передали скрипту необходимых параметров.

Далее регистрируем сам навык по ссылке [24]:
Разработка навыков для Алисы. Опыт работы с голосовыми интерфейсами, советы начинающим - 3

Выбираем пункт «Навык в Алисе»
Разработка навыков для Алисы. Опыт работы с голосовыми интерфейсами, советы начинающим - 4

Заполняем все поля согласно подсказкам и документации диалогов:
Разработка навыков для Алисы. Опыт работы с голосовыми интерфейсами, советы начинающим - 5
В поле webhook url вводим полученный ранее урл.

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

Общий подход и типичные ошибки.

Как я и предполагал, подходы привычные в обычной веб-разработке или разработке телеграм ботов тут мало подходят. Основное отличие — частая непредсказуемость ответов. Платформа диалогов позволяет добавлять кнопки с четкими ответами на вопрос, но пользователь часто отвечает совсем не то, что ожидает программист, привыкший следовать четкой логике.
Пример.
Вы хотите выучить еще одно стихотворения?
[да] [нет]
Ожидаем что человек ответит да или нет, но у нам приходило много других вариантов:

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

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

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

Так же следует стараться предусмотреть различные варианты ответов пользователя, выделять смысловую часть. В зависимости от ситуации иногда лучше один раз ошибиться в пользу неверного распознавания ответа, а не заставлять пользователя ответить четко. Если в ожидаемые ответы добавить что-то с паттерном (да *), то чаще будет срабатывать так как надо, а случаи, когда нам ответили «да отстань ты уже» будут уже как исключение и ничего критичного в логике программы не произойдет. Если, конечно, нам нужен точный ответ, из-за неверного распознания которого, в системе будут необратимые последствия, то тогда следует добиться от пользователя внятного ответа. Либо в случае если мы не уверены в ответе, то можем спросить дополнительно недостающую информацию.
Каждый из случаев взаимодействия следует рассматривать отдельно.

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

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

Использование сторонних API
Обратили внимание, что для предоставления в своих навыках каких-то полезных функций, разработчики прибегают порой к чрезмерному использованию сторонних API. Однако не стоит забывать, что время ответа вашего webhook не должно превышать 1,5 секунды. Иногда это может стать причиной отрицательного опыта пользователя с навыком, который то отвечает корректно, то пишет: «что-то пошло не так».

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

Произношение слов
Существующий инструмент тестирования синтеза речи [26] не всегда соответсвует тому, что будет у вас в навыке на самом деле. Не ленитесь предусмотреть механизмы добавления tts к любым вашим ответам. Мы понадеялись на движок Яндекса, и часть фраз в нашем навыке теперь уже сложно разметить [27] для более качественного произношения (без больших изменений в коде). Учтем на будущее.

Очень помогли простые, но достаточно эффективные PHP функции для нечеткого сравнения слов:
similar_text() [28], levenshtein() [28], в других языках тоже есть подобные интсрументы. Ну, и, конечно, регулярные выражения, куда без них.
Эти функции позволили, например, принять корректно ответ на загадку с частично верным ответом — не точно распознанный, в разных склонениях.
Это, конечно, для специалистов по NLP [29] (Обработке естественного языка) будет выглядеть несерьезно, но, повторюсь, заметка — для начинающих.

Текущие недостатки платформы.

Кратко обозначу основные претензии разработчиков к Яндекс.Диалогам, которые заметил в чате:

Долгая, часто кажущаяся нелогичной, модерация. Бывает, что ваш навык не проходит модерацию по причине того, что у вас, скажем, слишком общее имя навыка, например, «погода в Крыму» при том, что уже есть навык с подобным именем — «Погода в Северодвинске». Так понимаю, что связано это с тем, что раньше требования к именам и активационным словам были проще и сыну маминой подруге тому вот парню повезло, а у вас так уже не получится. Ищите другую фразу или попробуйте использовать бренд [30].

Не всегда документация соответсвует действительности. Сама платформа развивается быстро, документация не поспевает, трактуется пользователями и представителями яндекса иногда по-разному.

Платформа пока предоставляет лишь базовые средства для дебага навыков.
При добавлении навыка в панель разработчика ваш вебхук уже должен отвечать правильно, или просто произойдет ошибка валидации. Что за ошибка, какой JSON был отправлен и какой пришел — мы не увидим. Если же вам удалось добавить навык, то у вас будет минимальная панель с содержимым лишь последнего запроса-ответа и все! Никаких средств проверить как это будет в реальности работать и звучать на устройстве до модерации нет. Есть сторонний эмулятор [31], который достаточно нестабильно работает, не во всех браузерах, да и не соответсвует текущему протоколу.

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

Помогает то, что в чате [2] поддержка стабильно отвечает, так же организовалось уже более менее опытное и отзывчивое сообщество, которое очень помогло мне, поможет и вам. На многие претензии поддержка достаточно оперативно реагирует сообщениями «приняли к сведению», «про документацию знаем, исправим», «насчет модерации решаем». Ок, мы ждем с нетерпением.

Для быстрого старта советую опубликовать приватный навык, они сейчас проверяются с минимальными требованиями:

  • Навык проверяется на имя и активационную фразу [32], так как база общая для всех разработчиков.
  • Вебхук должен корректно отвечать [20] на запросы.
  • Приватный навык должен сообщать о том, что навык закрытый в своем приветственном обращении. Чтобы пользователь, случайно запустивший его, был уведомлен.

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

Вывод

В целом сами голосовые интерфейсы показались очень интересной темой, все более востребованной в будущем, планирую больше погружаться в нее, читая специальную литературу инструкции и советы зарубежных аналогичных сервисов (Google, Amazon, Siri, etc.)
Еще раз напомню о яндексовской школе Алисы, если кого-то так же как и меня заинтересовала эта тематика.
Еще несколько ссылок по теме:
Легкий диалог [33]
Книга Designing Voice User Interfaces

Natasha: библиотека для извлечения именованных сущностей [34]

Автор: FError

Источник [35]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/umny-j-dom/303399

Ссылки в тексте:

[1] навыков: https://tech.yandex.ru/dialogs/alice/doc/about-docpage/

[2] чате поддержки Яндекс.Диалогов: https://t.me/yadialogschat

[3] детского новогоднего навыка Снегурочки : https://dialogs.yandex.ru/store/skills/f2fcc75c-vnuchka-deda-moroz

[4] VUI: https://en.wikipedia.org/wiki/Voice_user_interface

[5] Почему стоит обратить внимание на Алису?: #why-alice

[6] Зачем все это: голос, навыки?: #for-what

[7] Как создать навык?: #how-to

[8] Общий подход и типичные ошибки.: #mistakes

[9] Текущие недостатки платформы.: #wait-for-updates

[10] утекают в сеть: https://habr.com/post/434062/

[11] Яндекс станции: https://station.yandex.ru/#station

[12] мини-колонок: https://yandex.ru/company/services_news/2018/2018-11-19-1

[13] школы Алисы: https://yandex.ru/blog/dialogs/yandeks-otkryvaet-shkolu-alisy-uchimsya-sozdavat-navyki

[14] роботы-медсестры, управляемые голосом: https://www.engadget.com/2006/09/06/meet-penelope-the-new-medical-assistant-robot/

[15] чату Яндекс.Станции: https://t.me/station_yandex

[16] навыков: https://dialogs.yandex.ru/store/

[17] документация: https://tech.yandex.ru/dialogs/alice/doc/about-docpage

[18] общие рекомендации: https://tech.yandex.ru/dialogs/alice/doc/recommendations-docpage/

[19] Неофициальный FAQ : https://docs.google.com/document/d/1SWxcIL0eKaMCIiuym6DQ4CtascBwm4IU1EL-Oxc2ldk/edit#heading=h.3zultqebwfax

[20] https протоколу: https://tech.yandex.ru/dialogs/alice/doc/protocol-docpage/

[21] пример простого навыка на PHP: https://github.com/FishErr/alisa-example

[22] serveo.net: http://serveo.net

[23] ngrok: https://ngrok.com

[24] ссылке: https://dialogs.yandex.ru/developer/

[25] именованных сущностей: https://tech.yandex.ru/dialogs/alice/doc/nlu-docpage/

[26] инструмент тестирования синтеза речи: https://webasr.yandex.net/ttsdemo.html

[27] разметить: https://tech.yandex.ru/dialogs/alice/doc/speech-tuning-docpage/

[28] similar_text(): http://php.net/manual/en/function.levenshtein.php

[29] NLP: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B5%D1%81%D1%82%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0

[30] бренд: https://tech.yandex.ru/dialogs/alice/doc/requirements-docpage/#specific__name

[31] сторонний эмулятор: https://station.aimylogic.com

[32] активационную фразу: https://tech.yandex.ru/dialogs/alice/doc/requirements-docpage/#specific__key-phrase

[33] Легкий диалог : https://medium.com/@igolubev/%D0%BB%D1%91%D0%B3%D0%BA%D0%B8%D0%B9-%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC-%D0%BD%D0%B0%D0%B2%D1%8B%D0%BA-%D0%B4%D0%BB%D1%8F-%D0%B3%D0%BE%D0%BB%D0%BE%D1%81%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D0%BD%D0%B8%D0%BA%D0%B0-4a795a366d20

[34] Natasha: библиотека для извлечения именованных сущностей: https://github.com/natasha/natasha

[35] Источник: https://habr.com/post/434194/?utm_campaign=434194