Русский
Русский
English
Статистика
Реклама

Голосовые интерфейсы

Clubhouse без iPhone. How-to инструкция

19.02.2021 10:18:50 | Автор: admin

Дисклеймер

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

Шаг 1. Виртуальный iPhone

Для того, чтобы зарегистрироваться в приложении вам понадобится сервис, предлагающий автоматизированное тестирование мобильных телефонов. В целом можно обойти это требование и зарегистрироваться с использованием реверснутой библиотеки, но вероятно вас смогут вычислить и забанить. К тому же в виртуальной лабе вы сможете потыкать приложение до выхода андройд версии и зафолловить понравившихся людей, чтобы у вас был список комнат с вашими интересами. На рынке есть несколько таких сервисов. Я остановился на browserstack.com там есть возможность получить доступ к реальному iphone, который лежит где-то в серверной и его экран расшаривается на веб-приложение. Нам понадобится функционал App Live он доступен только по подписке. Я честно отдал порядка 40 долларов за один месяц тестирования. Кроме этого, нам понадобится любое .ipa приложение, чтобы сервис позволил вам запустить выбранную модель iPhone'а:

iPhone 11 на app-live.browserstack.comiPhone 11 на app-live.browserstack.com

Никаких дополнительных настроек не надо - заходим в App Store под своим Apple ID и устанавливаем Clubhouse:

Установка приложения ClubhouseУстановка приложения Clubhouse

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

Поиск людей в приложении Clubhouse через онлайн-доступ к реальному iPhoneПоиск людей в приложении Clubhouse через онлайн-доступ к реальному iPhone

У всех онлайн-сервисов по тестированию мобильных телефонов есть недостаток: они не умеют перенаправлять звук и микрофон на ваш браузер. То есть с этого эмулятора вы не сможете послушать в Clubhouse ни одной беседы и сами сказать ничего не сможете. Чтобы общаться в комнатах и слушать, что говорят другие, вам придется запустить python приложение на своем компьютере.

Шаг 2. Сlubhouse-py

Для прослушивания комнат и для диалогов будем использовать консольное pyhton приложение. Брать отсюда: https://github.com/stypr/clubhouse-py

Оно основано на реверснутом протоколе clubhouse'а и автор обещает удалить приложение после выхода нормальной версии для андройда. Для работы приложения требуется Python версии 3.7 и выше. Приложение работает под Windows и macos.
Установка простая:

git clone https://github.com/stypr/clubhouse-pycd ./clubhouse-pypip3 install -r requirements.txtpip3 install agora-python-sdk

Для запуска выполните:

python3 cli.py

Если у вас все заработало с первого раза поздравляю!

Но скорей всего будут проблемы.
Во-первых, на 19 февраля 2021 сборка библиотеки agora-python-sdk под Windows сломана, поэтому вместо установки через pip лучше собрать проект руками. Инструкция здесь: https://github.com/AgoraIO-Community/Agora-Python-SDK#installation

Во-вторых, для macos надо дать разрешения на доступ к Микрофону ( Microphone ) и Универсальный Доступ ( Accessability ) для терминала и python'а. А также, вероятно, потребуется изменить комбинацию клавиш для "поднятия руки", так как в двуязычном маке нормально не работает модуль для биндинга горячих клавиш. Для этого откройте в любом редакторе cli.py и измените :

if not channel_speaker_permission:      print("[*] Press [Ctrl+Shift+H] to raise your hands for the speaker permission.")      keyboard.add_hotkey(            "ctrl+shift+h",            _request_speaker_permission,            args=(client, channel_name, user_id)      )

на что-то подобное:

if not channel_speaker_permission:      print("[*] Press [3] to raise your hands for the speaker permission.")      keyboard.add_hotkey(            "3",            _request_speaker_permission,            args=(client, channel_name, user_id)      )

В-третьих, в macos из-за биндинга клавиш приложение надо запускать под рутом:

sudo python3 cli.py

После запуска приложение попросит указать номер телефона и ввести код для аутентификации, после чего сохранит полученный токен в settings.ini
Вот так выглядит запущенное клиентское приложение:

консольный интерфейс управления clubhouse-pyконсольный интерфейс управления clubhouse-py

Еще важный момент: консольное приложение по-умолчанию отображает 20 записей в списке каналов и 20 пользователей в каналах. Чтобы увеличить лимиты можно изменить значение переменной max_limit в файле cli.py:

max_limit = 30

Вывод

Я смог протестировать Clubhouse и полноценно зарегистрировать себя и еще нескольких друзей таким способом. И уже несколько дней слушаю беседы и периодически общаюсь в них.
У приложения на python'е есть недостатки: самый главный - это консольный интерфейс. Вы не увидите обновления списка спикеров и не сможете включать/выключать ваш микрофон из приложения. Как workaround включайте/выключайте микрофон другими способами. Кроме того, список доступных бесед ограничен количество строк и возможна ситуация, когда вы не увидите нужную вам беседу. Немного поэкспериментировав, я не нашел способа выводить больше 30 записей в списке бесед, но думаю что такой способ точно есть. Иногда помогает сохранить channel_name отдельно и подключаться напрямую по адресу. Адрес беседы можно взять из ссылки на событие, например: https://www.joinclubhouse.com/event/M1e7eO3N. Приложение не создает подписку на события ( это не реализовано в протоколе clubhouse-py ), поэтому вы не сможете получать приглашения на приватные беседы и прочие оповещения. Но часть проблем можно решить, используя виртуальные лабы с iPhone'ами. Например, это удобно для того, чтобы посмотреть список предстоящих мероприятий, подписаться на каких-то известных людей и просто поискать своих друзей.

В общем, если нет айфона, но есть мозги, то решить проблему с популярным приложением можно. Обратное не работает.
Спасибо за внимание!

Подробнее..

Как разработчику голосовых навыков получить выход на аудиторию Сбера (короткий путь)

13.03.2021 14:14:35 | Автор: admin

Just AI стал первым аккредитованным технологическим партнером SberDevices по созданию голосовых навыков для виртуальных ассистентов Салют. Теперь бизнес может заказывать в Just AI разработку голосовых смартапов, которые будут доступны в ТВ-приставке SberPortal, умном экране SberBox и в мобильных приложениях Сбера в том числе навыки со встроенными платежами. А в конструкторе чат-ботов Aimylogic и enterprise-платформе JAICP появилась удобная интеграция с новым каналом разработчики могут самостоятельно создавать смартапы и даже переносить в ассистентов Салют уже готовые навыки (например, разработанные для Алисы). Рассказываем, как это делать и зачем.

Интеграция Aimylogic и JAICP с экосистемой Салют позволяет не только разрабатывать любые новые голосовые навыки под устройства и приложения Сбера (это само по себе интересно, там много любопытных фич), но и переносить в ассистентов Салют ваши навыки, которые уже работают в Алисе, Марусе, Google Assistant. Что это дает?

Выход на аудиторию экосистемы Сбера

Голосовых ассистентов в России всё больше, они становятся всё популярнее. Это дает возможность разработчикам привлекать новых пользователей и увеличивать трафик в навыки. Ассистенты семейства Салют Афина, Джой и Сбер живут в умной ТВ-приставке SberBox, умном экране SberPortal и даже в мобильных приложениях Сбера. Ежемесячная аудитория виртуальных ассистентов Салют по итогам первого квартала после запуска 2,5 млн, а потенциальная аудитория всей экосистемы Сбера 100+ млн.

Возможность выиграть 2,5 млн рублей

Каждый квартал команда SmartMarket определяет лучшие навыки (смартапы) для виртуальных ассистентов Салют. Разработчики Aimylogic тоже могут побороться за призовой фонд! Например, Сергей Кулаков, который рассказал на Хабре о том, как завоевал несколько Премий Алисы с помощью разработки на Aimylogic, недавно завоевал главный приз в 2,5 миллиона в номинации Ежедневные активные пользователи за навык Угадай песню.

Попробовать новые фичи

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

Проверить, как навыки будут работать на экранах и не только. Для смартапов, подключенных к платформе Сбера, доступен эмулятор. Он упрощает их тестирование на основных поверхностях платформы умных устройствах SberPortal и SberBox, а также на мобильных устройствах в приложениях СберБанк Онлайн и Сбер Салют.

В Aimylogic вывод готовых голосовых навыков в ассистентов Салют возможен с текстом, картинками и аудио (а там и видео не за горами): читайте туториал Как подключить канал Салют

Екатерина Лебедева, руководитель партнерской программы Just AI:

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

Ну и на заметку. Just AI помогает бизнесу создавать контент для голосовых ассистентов и умных устройств с 2018 года. Компания внимательно следит за трендами в области голосового UX и бизнес-моделями в voice-индустрии и обладает серьезной экспертизой в реализации таких проектов. В области голосовых ассистентов и создания контента для них Just AI сотрудничает с Google, Яндекс, Mail.Ru Group, SberDevices, а также с производителями умных устройств Roobo, NotAnotherOne, Cinemood, Mishka AI, Elari и другими компаниями.

Подробнее..

Открытие двери с телефона, голосовом ассистентом и с помощью модуля Sonoff Mini

22.04.2021 00:12:56 | Автор: admin

Всем привет.

Сегодня я хочу рассказать, как я сделал открытие двери с помощью Команд на телефоне (iPhone) и в последующем реализовал данную функцию через голосового помощника Yandex.Алиса.

В процессе эксплуатации обычного штатного контроля доступом мне всегда хотелось реализовать что-нибудь "ЭTAKOE". Однажды один из наших заказчиков просит сделать у себя в частном доме открытие калитки без видеодомофона, а только с помощью беспроводной кнопки и функцией открытия с телефона. Изначально задача показалась не интересной, дешевые решения на Aliexpress не внушали доверия (НИКОГДА). В процессе поиска вариантов на просторах интернета попадается статья на habr.com Открываем дверь домофона при помощи голосового ассистента и ардуино и я осознал: это то самое, что надо. Кстати, во время тестирования у себя дома, мне удалось реализовать 2 проекта: открытие домофона и слив воды в унитазе.

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

Используемые компоненты

  • WiFi модуль Sonoff Mini;

  • Контроллер СКУД (в моем случаи Считыватель/Контроллер Matrix 2K);

  • Блок питания на 12 Вольт 1,5 Ампера (необходим для контроллера и замка);

  • Исполнительный механизм (электромеханический или электромагнитный замок);

  • Реле на 220 Вольт (промежуточное реле). Необходимо для реализации сухого контакта;

  • Несколько проводков для подключения, вилка с проводом и прямые руки.

Собираем следующую схему

Схема подключения с промежуточным релеСхема подключения с промежуточным реле

Далее дело остается за малым. Скачиваем приложение eWeLink, по инструкции добавляем устройство в учетную запись и в настройках устройства необходимо Включить "Inching" устанавливаем время удержание 0,5-1 секунда. Таким образом мы имитируем кратковременное нажатие кнопки выхода на контроллере.

В итоге мы получаем простое решение по открытию двери с телефона.

Что еще можно сделать?

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

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

Обязательно меняем маркировку на корпусе, чтобы случайно не подключить 220 Вольт на контроллер

В таком случаt у нас получается следующая схема подключения:

Схема подключения "Модернизированного" модуля без промежуточного релеСхема подключения "Модернизированного" модуля без промежуточного реле

Теперь добавим учетную запись eWeLink к учетной записи в приложении Яндекс

В процессе сборки и тестирования я периодически выкладывал Сторисы в своем Instagram и кто-то из моих подписчиков оставил комментарий: "Ты еще попроси "Алису" за тобой унитаз смыть". И я подумал, а почему бы и нет?

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

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

  2. Вообще бесполезная затея, использую только для того чтобы удивить гостей.

Для добавления учетки eWeLink к Яндексу, достаточно добавить к своим устройствам в приложение Яндекс - Другое устройство. Из списка Устройств находим и выбираем eWeLink Smart Home и вносим свои логин и пароль от учетной записи eWeLink. Нажимаем обновить список устройств и наша "Розетка" успешно появляется в устройствах Яндекс.

Яндекс по умолчанию видит, устройство Sonoff Mini как умную розетку, так как основное предназначение ее: управление розетками, выключателями и приборами в составе умного дома. В настройках устройства можно изменить название на что угодно, у меня например - это Унитаз.

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

Если я скажу фразу ".....", то включи устройство из моего спискаЕсли я скажу фразу ".....", то включи устройство из моего списка

Если я скажу фразу ".....", то включи устройство из моего списка

Сохраняем сценарий. Говорим ключевую фразу из сценария и наблюдаем как она послушно выполняет наши указания. В сценарии можно указать несколько фраз, не обязательно одну, хоть 10, вас ограничивает только фантазия и здравый смысл. В ответ на выполненное действие, Алису можно обучить сказать: Всегда готова служить, мой господин!

Заключение

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

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

Подробнее..

Как мы интегрировали Яндекс.Музыку с Siri. Доклад Яндекса

19.01.2021 12:23:47 | Автор: admin
Siri мощный инструмент с публичным API для сторонних приложений. Например, музыкальных. В докладе я рассказал, как начать разработку обработки голосовых медиазапросов от Siri, используя Intents.framework. Поделился нашим опытом с чем пришлось столкнуться, чего нет в документации и что не работает.

Всем привет! Меня зовут Ваня, я из команды Яндекс.Музыки. Сегодня я вам расскажу, как Siri попала в Яндекс.Музыку. Музыку можно включать с помощью Siri.

Чтобы вам было понятно, что это и как работает, пример первый. Говорим: Включи Сектор Газа в Яндекс.Музыке и бум, музыка пошла. Второй пример: можно сказать Мне нравится этот трек в Яндекс.Музыке. Вы идете, слушаете, не хотите доставать телефон, whatever. Все полайкано, все хорошо.



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



Пасхалка от Apple. На страничке документации класса INPlayMediaIntent есть много примеров того, как это работает на разных языках. На русском написано: Играй Qeen на Яндекс Музыке. Это было сделано еще до того, как мы реализовали поддержку Siri, так что Apple, спасибо вам большое. Это очень лестно.

Зачем мы это делали? Во-первых, почему бы и нет, крутая фича. Во-вторых, это была часть большой задачи по реализации Яндекс.Музыки под Apple CarPlay, но мы сейчас не об этом.

Давайте теперь про Siri. Siri появилась в iPhone 4S, начиная с iOS 5, если я все правильно гуглил. Она выглядела вот так, была совсем неуклюжей. Только к iOS13, на WWDC 2019 показали, что теперь вы можете реализовывать в своих музыкальных приложениях поддержку Siri. Здорово.



Как это работает? Я не придумал ничего лучше, чем просто взять этот слайд из презентации WWDC. Пользователь говорит что-то Siri. Siri это обрабатывает и отдает вам данные в какой-то extension. Вы с этими данными идете в ваши сервисы, бэкенды, app-группы, общие контейнеры. Это работает с вашим приложением, но не всегда. Дальше объясню, почему, и расскажу всю обратную сторону: чтобы вам на экране показалось то, что надо, Siri сказала то, что надо, и так далее.

Типы интентов. Первый INPlayMediaIntent, интент из серии включи что-нибудь. INAddMediaIntent это добавь что-нибудь. Добавь этот трек в плейлист, когда грустно. INUpdateMediaAffinityIntent это интент лайк/дизлайк. Последний INSearchMediaIntent, найди. То есть вы говорите: Найди Сектор Газа в Яндекс.Музыке. Открывается приложение Яндекс.Музыка, в котором сразу открыт Сектор Газа.



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



Как я говорил, это extension. Называется IntentsExtension. Его нужно создать. Вы его создаете, у вас появляется таргет, в котором вы должны написать строками названия классов, этих интентов, которые вы поддерживаете. Как видите, у нас их два: INPlayMediaIntent и INUpdateMediaAffinityIntent.

Далее снизу вылезает менюшка, где вы должны указать, какие типы данных вы поддерживаете. Эти типы данных будут настраиваться в зависимости от того, какие классы вы указали.



Если это не медиазапрос, а что-нибудь другое например, у Siri есть еще поддержка заметок, то там будут другие типы.

Также у вас появляется класс IntentHandler. Он появляется за вас, вам ничего делать не надо. Он выглядит так, он есть у вас в таргете. Все здорово.



Про реализацию протокола INMediaIntentHandling. Это протокол, как очевидно из названия, обрабатывает INPlayMediaIntent. У него больше двух методов, чуть ли не семь. Но я расскажу про эти два, потому что они нам как раз понадобились. Мы их реализовали. Это resolveMediaItems, такой метод нужен для того, чтобы вы собрали данные, с которыми Siri за вас что-то сделала. Вы пошли в ваш поиск, помапили нужные данные для Apple и вернули их в коллбэк. handle это первая часть обработки этих данных. Дальше объясню, почему первая.



У этих двух методов есть общий параметр: INPlayMediaIntent. Давайте посмотрим, что это такое. Здесь много букв. Запомните MediaItems мы потом о нем еще поговорим. Здесь есть куча всего. Например, playback speed для подкастов. Играть с шафлом, без шафла. Repeat mode. Но сейчас нам нужен mediaSearch.



Объясню и покажу, что это. Это класс, у которого есть очень много значений от mediaType до mediaIdentifier. Некоторые вещи заполняет Siri, некоторые заполняете вы. Сейчас объясню на примерах, как это все работает.



Пример 1: Включи трек Skyfall от Adele в Яндекс.Музыке. Вы можете это сказать Siri прямо сейчас, если у вас есть подписка Яндекс.Музыки. Слово включи определяет тип интента. INPlayMediaIntent. Соответственно, будут вызываться те методы, которые я показывал ранее. Слово трек определяет поле mediaType, значение song. Его говорить необязательно, дальше объясню, почему. Когда вы произносите такие дополнительные штуки для Siri, вы улучшаете качество вашего поиска. Вы все еще можете сказать Включи Skyfall в Яндекс.Музыке. Если наш поиск посчитает, что Skyfall это трек, который вам нужен, Siri именно его и включит.

Слово Skyfall определяет mediaName. От Adele определяет artistName. Как вы можете заметить, предлог от просто игнорируется, потому что Siri сама за вас поняла: от значит, что следующим будет название артиста. И последняя часть: в Яндекс.Музыке, в каком приложении это должно работать. К сожалению, мы не можем назначить музыкальное приложение по умолчанию. Поэтому нужно всегда в конце добавлять: в Яндекс.Музыке.

Пример 2: Включи грустную акустическую музыку в Яндекс.Музыке. Включи понятно. Слово грустную определяет moodNames == [sad]. Обратите внимание, что тут написано на английском, а не на русском. Есть список констант, который матчит ваши слова в moodNames, вот этот массив, но в документации его нет. Готовьтесь.

Слово акустическую определяет genreNames, которое тоже написано на английском. Но эти константы уже есть в документации. Зайдя в документацию по INMediaSearch.genreNames, вы увидите, что она там есть. Огромная таблица, в которой написано, какие жанры понимает Siri. Главное, если вы будете реализовывать это у себя, приготовьтесь к тому, что ваш поиск должен понимать английский язык. Наш, к счастью, понимает.

Слово музыка определяет mediaType==.music. Это считается типом сущности, который можно воспроизводить.



Пример 3: Скажи Яндекс.Музыке включить рок. То есть мы полностью поменяли слова во фразе местами. И это все равно работает. Еще есть вот такая штука: Включи музыку, чтобы уснуть, в Яндекс.Музыке. Казалось бы, что здесь такого? То ли в genreNames, то ли в moodNames будет слово meditation. Почему здесь слово meditation, решает только Siri. Ваше дело реализовать то, что сказала Siri, а дальше надо разбираться самим. И еще куча всего, чего мы не знаем. Возможно, есть и другие фразы, но не в документации. Надо готовиться к тому, что Siri сделает кучу всего за вас. Это прикольно, но одновременно очень странно.





Дальше расскажу прикольную штуку. Siri в прошлом году обучили на библиотеке Apple Music. Когда вы начинаете разговаривать с Siri в музыкальном контексте, например, Включи Сектор Газа в Яндекс.Музыке, она поймет, что Сектор Газа это исполнитель, и сама подставит значение, сделает все за вас.

Вы можете даже сказать на английском: Play Sector Gaza in Yandex.Music. Сектор Газа нормально распарсится. Это очень здорово. До этого был вообще кошмар. Во-первых, как видите, имя Децл она не смогла спокойно распознать. А вот тут она еще почему-то взяла название проекта Xcode, которого ни в каких константах нет. Очень странно. Если ваш проект называется в Xcode Суперпуперприкольное приложение, то здесь будет написано то же самое, хотя название самого приложения другое. Очень странно. Видите, внизу написано Я.Музыка и все окей.

Поговорим конкретно про реализацию этих методов. Это resolveMediaItems. Первое, что вы должны сделать по крайней мере, если у вас так же, как у нас, это проверить, что пользователь залогинен и у него есть подписка. Как вы видите, существует куча стандартных ответов результатов для Siri. Вы с ними ничего не можете сделать. Вы можете только сказать ей, что нужно сделать. Она скажет проверить данные подписки пользователя, вашего аккаунта. Вы в этих фразах никак не участвуете. Их знает сама Siri, локализует сама Siri. Все делает сама Siri.



Далее вы должны взять этот mediaSearch и склеить эти данные. Мы берем практически все, что есть, помещаем в один массив, делаем из него строку, где каждый элемент просто разбит через пробел, и отправляем в наш поиск, потому что наш поиск такое может съесть. Это здорово. Дальше вы мапите эти данные и отдаете в коллбэки с результатом success. Но важно, как мапить эти данные и во что.




Помните, я вам говорил запомнить INMediaItem? Это они и есть. Вы должны помапить ваши сущности в INMediaItem. Это пример того, как у нас мапятся треки. Для всех остальных сущностей типа плейлиста, артиста, альбома, whatever, все идет таким же образом. Поле mediaItems в интенте будет заполнено данными, которые вы запомнили. Давайте разберем, что куда летит. Оно иногда может показываться на экране дальше покажу, как. identifier вы заполняете, скорее, для себя. Это id сущности, который хранится у вас на стораджах и на бэкенде. Title, тип, обложка, артист вот они. Все здорово.



Дальше реализация handle. mediaItems, которую вы напарсили и вернули в том коллбэке, теперь появляется в поле mediaItems у интента. Вы проверяете, что они есть? возвращаете вот такой response, в котором передаете ей код handleInApp. Помните, я говорил, что у handle есть две части.



Так вот, это оно и есть. В AppDelegate, где же еще, вы должны реализовать еще один метод, который называется application handle with completionHandler, в котором появляются базовые классы интента. Поскольку у нас музыкальное приложение, то мы проверяем только на музыкальные интенты на то, что это INPlayMediaIntent. Дальше отдаем это в класс, который умеет ходить на бэкенды и качать треки, помещаем все это в плеер и получается вот так. Все, что нужно. Самое прикольное: если вы вернете больше одного успешного результата, то Siri это видно на виджете плеера на первом скриншоте покажет кнопку Maybe you wanted. При тапе на эту кнопку открывается второй экран, который находится справа. Там как раз будут сущности, которые вы еще не искали. Максимум четыре. Вы можете сложить туда хоть миллион, но система покажет только четыре. В целом здорово, ничего страшного.



Дальше давайте поговорим про INUpdateMediaAffinityIntentHandling. Из названия протокола очевидно, что он умеет обрабатывать интент INUpdateMediaAffinity. Это как раз лайки и дизлайки. Тут намного интереснее. У самого протокола, по-моему, четыре-пять методов. Я расскажу про три из них, которыми мы воспользовались.



Они вызываются в таком порядке: resolveMediaItems, resolveAffinityType, IntentHandler.

resolveMediaItems работает так же, как и с предыдущим интентом. Вы берете эти данные, идете в ваш поиск, мапите в INMediaItem и возвращаете в коллбэки.

Все то же самое. resolveAffinityType. Нужно проверить, что вы можете с этой конкретной сущностью, которую вы нашли в поиске, совершить это конкретное действие. Например, лайк или дизлайк. Дальше покажу подробнее, зачем это нужно. Handle уже одинарный, не двойной, в котором мы должны совершить это действие лайк/дизлайк. У них есть общий параметр. Это INUpdateMediaAffinityIntent. Давайте разберем, что это такое. Он гораздо меньше.



У него есть три поля. С mediaItems и mediaSearch мы уже знакомы. Что такое affinityType? Это enum, у которого есть три значения: unknown, like и dislike. В целом понятно, это как раз тип действия, которое вы должны совершить.



С mediaSearch вы уже знакомы, но у него есть одно поле, которым мы не пользовались: reference.



Что это такое? Это значение INMediaReference, тоже enum. У него есть два значения: unknown и currentlyPlaying.



Если еще кто-то не догадался, что это такое, то давайте я вам покажу на примерах.

Пример 1. Мне нравится трек Skyfall от Adele в Яндекс.Музыке. Фраза мне нравится определяет тип интента, INUpdateMediaAffinityIntent. То есть по этому протоколу будет вызываться именно ваш код, INUpdateMediaAffinityIntentHandling. Также это определяет поле affinityType как like, потому что Мне нравится. Cлово трек определяет mediaType==.song так же, как раньше.

Skyfall точно так же определяет поле mediaName. Adele artistName. В целом понятно.

Пример 2. Мне не нравится этот трек в Яндекс.Музыке. Тут по-другому. Мне не нравится определяет тип интента и affinityType==dislike, так как Мне не нравится.

Слово этот определяет слово reference как currentlyPlaying. То есть как раз то самое значение, то, что сейчас играет.

Слово трек определяет mediaType==.song, которое также необязательно, потому что можно сказать: Мне нравится это в Яндекс.Музыке. Этого будет достаточно. Но трек улучшит поиск.




Реализация resolveMediaItems. В начале вы точно так же проверяете логин, подписку. Дальше идет небольшой паттерн-матчинг, примерно похожий на тот, который есть у нас в коде. Пример resolveNotCurrent я рассматривать не буду, потому что он точно такой же. Вы берете все данные, которые есть у вас в интенте, в mediaSearch, идете в ваш поиск, мапите и возвращаете в коллбэке. Все здорово. Но я расскажу про вот эту штуку, потому что она интереснее. resolveCurrent. Во-первых, как вы можете заметить, этот enum работает не совсем правильно. CurrentlyPlaying это хорошо, если сказать, что мне нравится этот трек. Но если сказать, мне нравится это, значение будет unknown, а query будет пустым. Почему так? Понятия не имею. Но это так. Мы это поняли в момент испытания Siri. Это очень странно, но работает именно так. Давайте теперь подумаем. currentlyPlaying, что сейчас сыграет. Extension это другая часть приложения. У нас нет доступа.

Что делать? Для начала расскажу, кто не знает, что такое NowPlayingInfo. Это большой словарь с кучей стандартных ключей, которые есть в Media Player framework, если я ничего не путаю. Вы его заполняете данными. На виджете плеера, на локскрине и в Control Center появляются как раз те данные, которыми вы заполнили этот словарь.

Apple нам обещала, что если положить в NowPlayingInfo по тому ключу, который вы видите на экране, любое строковое значение, то в intent.mediaSearch?.mediaIdentifier будет как раз то значение, которое лежит в NowPlayingInfo. Но это вообще не работает. Я пытался, не сработало. К счастью, на помощь пришли божественные App Groups, которые работают уже тысячу лет, и никаких проблем с ними нет.



Как они помогли? Вы создаете appGroupUserDefaults, указываете в suitName id вашей app.group. В основном приложении вы вставляете значение по ключу. Из extension достаете по этому ключу. Все работает классно. Я на всякий случай решил воспользоваться ключом, который как раз не работает, чтобы как минимум оставить напоминание самому себе, что это не работает.



Есть еще вот такая штука. Один из результатов, которые нужно запомнить, это disambiguation. Например, пользователь сказал, что ему нравится этот артист в Яндекс.Музыке.

Но играет трек, у которого несколько исполнителей. Что делать? Этот результат как раз для этого и нужен.



Siri отобразит вот такое меню.





Вы можете голосом или тапом выбрать то, что нужно. INMediaItem, один из них уйдет дальше в метод handle. Точнее, сначала в resolve AffinityType. Зачем он нужен? Например, в Музыке так повелось, что мы дизлайкать можем только треки. Артиста или альбом вы дизлайкать не можете. Этот метод нужен как раз для таких случаев. Вы проверяете тип значения, и если это трек, то его можно лайкать и дизлайкать. Если это что-то другое, вы можете только лайкать. Дальше проверяете: если они совпадают, возвращаете константу unsupported. Тут забавно. Siri мне говорит, что это работает для какого-то определенного типа. Поэтому она скажет, что просто не поддерживаются дизлайки. Хотя они поддерживаются, но только для треков. Спасибо!




Метод handle. Вы точно так же проверяете MediaItems, который у нас есть, берете его id и дальше должны сходить в API и полайкать. То есть в целом все просто.



По ответу от сервера вы можете вернуть два значения: success или fail. Если пришла ошибка, то все плохо. Siri обязательно об скажет, что произошла какая-то ошибка, либо как я показывал в примере: Я сказала Яндекс.Музыке, что вам это нравится.

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



Как они нам помогли и что это такое, сейчас объясню. Дарвиновские нотификации это core-штука системы. Ими можно обмениваться между таргетами, между приложениями. Отправка выглядит так, обработка так. В целом понятно. Мы из extension отправляем нотификацию, что мы дизлайкнули текущий трек. Это ловит основное приложение, делает скип, все довольны.

Нюанс номер два русский язык. Сейчас объясню, почему. Я тестировал на английском, потому что система у меня стоит на английском. Наше приложение называется Yandex Music. Никаких проблем нет, для Siri тем более. Но на русском языке наше приложение называется Я.Музыка. Когда я попробовал что-то типа Включи Сектор Газа в Я.Музыке, Siri посчитала, что Я сказано случайно и надо включить исполнителя в Apple Music. Вот так это и работало. К счастью, есть решение.



Вы в вашем info.plist заполняете один ключ, массив словарей, где указываете альтернативное название для вашего приложения и подсказку по произношению.

Именно поэтому у нас как альтернативное название приложения указана Яндекс.Музыка. Подсказка для произношения описана в Яндекс.Музыке, потому что пользователь скажет, что ему нравится что-нибудь в Яндекс.Музыке. Это работает без проблем, спасибо, Apple. Очень элегантное, хорошее решение.



Нюанс номер три. С ним поинтереснее. Наши пользователи в курсе, что это такое. Это два умных плейлиста из списка скольки-то наших умных плейлистов. С ними возникли нюансы. Начнем с плейлиста дня.

Включи плейлист дня в Яндекс.Музыке. Казалось бы, мы хотим, чтобы слово Включи определило тип интента, а слова плейлист дня определили mediaName. Но это работает по-другому. Слово плейлист определяется как mediaType==.playlist, потому что Siri поняла: нужно включить какой-то плейлист. А слово дня распознается как mediaName.

Есть workaround, но он для пользователя. Включи плейлист плейлист дня в Яндекс.Музыке, где слово плейлист определится как mediaType. Второе слово плейлист определится как mediaName, и все счастливы.

Кажется, можно это закостылить сразу объясню, почему мы не стали этого делать. На разных версиях iOS и на разных языках это работает по-разному. Например, если я скажу на английском: Play playlist playlist of the day in Yandex Music, Siri решит, что вы случайно сказали слово playlist два раза подряд, а of the ничего не значит, она его выкинет. У вас будет mediaName== day. Как вы можете догадаться, включится Green Day (00:26:05). Это аботает не так хорошо, как хотелось бы.

Включи плейлист с Алисой в Яндекс.Музыке. Тут еще интереснее. Включи по-прежнему определяет интент. Слово плейлист определяет playlist. А с Алисой определяется как artistName.

Знаете, почему? Потому что есть такая рок-группа Алиса. Русская Siri посчитала, что Алиса это та самая рок-группа. Причем если сказать ту же самую фразу на английском, то включится исполнитель, которого зовут A-List.

К этому можно было бы найти решение. Есть класс INVocabulary, который может задавать для Siri кастомный вокабуляр ваших сущностей в приложении. Слишком умно сказано, в чем соль? Вы можете передать туда название ваших сущностей, как у нас плейлист дня и плейлист с Алисой. Передаете по специальному типу mediaPlaylistTitle, чтобы Siri поняла, что это такие плейлисты. И все должно заработать. Это первая фишка из моего опыта, которая кидает exception при обращении к ней, если не выставлен entitlement для этой API. Я проверял, оно не помогает. Они это как-то асинхронно делают.

Вторая проблема. Все это, к сожалению, не сработало. Слово плейлист все-таки важнее для Siri как тип сущности, а не как название этой сущности.



Нюанс номер пять. Когда мы закинули сборку в App Store Connect, нам пришло письмо счастья с перечислением проблем приложения. К счастью, это был просто warning, не автоматический reject о том, что Siri реализована неправильно. В письме было сказано, что мы не представили примеры фраз по каждому из языков, со ссылкой на документацию.

В итоге, покопавшись в документации, мы поняли, что нужно создать plist именно с таким названием. Вы не указываете его ни в build settings, нигде. Это просто название. И локализуется оно вот таким образом. То есть сам файл локализован, а не локализованы строки внутри него. Как вы можете догадаться, это неудобно, потому что большинство сервисов, сторонних, которые мы используем, не поддерживают такой тип локализации. Поэтому все переведенные строчки я решил поместить в нее руками, а не писать какие-то скрипты. Вы знаете, что лучше сделать за пять минут руками, чем автоматизировать пять часов.

В этих строчках нужно писать для каждого интента примеры того, как пользователю пользоваться Siri. Например: Включи рок в Яндекс.Музыке, Мне не нравится этот трек. Я это сделал. Потом у меня возник вопрос: где это показывается? В документации этого нет. Никто ничего не пишет.



В какой-то момент до меня дошло. Помните бородатые времена, когда была iOS 13 и Siri была полноэкранной? У нее, если совершить определенное количество действий, появлялись подсказки. Там есть сторонние приложения. Вы видите Яндекс.Музыку и Telegram. Почему это здесь написано, мне неизвестно, но Apple, очевидно, это чинить не будут, потому что Siri в iOS 14 уже неполноэкранная. Там просто маленький красивый кругляшок снизу, и все.



Итого:

  1. Siri это круто. Можно идти в плохую погоду, например по ужасному морозу, и говорить, что нужно включить, что лайкнуть, что дизлайкнуть.
  2. Siri неплохо задокументирована, почти без багов. Я никаких серьезных багов сегодня не приводил.
  3. Если у вас тип сущности содержится в названии этой сущности, то вы страдаете вместе с нами.

А помимо того, что всем это нравится и все довольны, вы получаете заветную маленькую иконку в App Store для вашего приложения, на которой написано, что Siri его поддерживает. Очень здорово и мило. На этом у меня всё, всем спасибо!
Подробнее..

Зачем нам потребовалось написать свою реализацию MRCP-сервера. Часть 1

30.04.2021 12:16:20 | Автор: admin

Привет, Хабр! Сегодня мы хотели бы поделиться кейсом создания собственного MRCP-сервера. Это протокол передачи данных, используемый серверами для предоставления различных услуг (таких как распознавание речи и синтез речи) для своих клиентов. MRCP опирается на другие протоколы, в частности, потоковый протокол реального времени (протокол RTSP) или протокол установления сеанса связи (протокол SIP) для установления и управления сеансом аудиопотоков между клиентом и сервером. О том, что нас привело к созданию собственной реализации этого сервера - под катом. Во второй части расскажем об особенностях своего проекта, с подробным разбором возможностей.

UniMRCP - хорошо, но может быть и лучше

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

UniMRCP - кроссплатформенное ПО с открытым исходным кодом, которое включает все необходимое для реализации функций MRCP-клиента и MRCP-сервера. Распространяется под лицензией Apache License 2.0. Все бы ничего, но при работе с UniMRCP у нас возникло несколько проблем.

Проблема 1. Дорого!

Если использовать просто сервер - то все отлично, но для наших целей был необходим плагин к серверу. Плагин называется UMS Transcribe Plugin, а нужен он для распознавания речи. Все бы ничего, но стоит он $50 за канал. А когда нужно несколько тысяч каналов, как в нашем случае, то такой вариант не очень подходит.

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

Проблема 2. Паузы

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

В документации говорится о назначении speech-complete-timeout - это время, после которого должен вернуться результат распознавания, если абонент молчит. В UniMRCP, как мы не пытались, мы не могли этим управлять. Наш собственный VAD к этому параметру восприимчив.

Пример запроса

MRCP/2.0 304 RECOGNIZE 1
Channel-Identifier: 230f4b33-fcdc-1239-d5a6-d00ddfa58be9@speechrecog
Content-Type: text/uri-list
Cancel-If-Queue: false
Recognition-Timeout: 30000
Start-Input-Timers: true
No-Input-Timeout: 5000
Speech-Complete-Timeout: 750
Content-Length: 25builtin:speech/transcribe

Параметром speech-complete-timeout управлять никак не удавалось - такое впечатление, что это просто не предусмотрено разработчиками. Единственный таймаут, который нормально работал в UniMRCP - это recognition-timeout.

Пример разговора (HR-сценарий)

Бот: Здравствуйте! Меня зовут Елена, звоню по поводу вашего резюме. Подскажите, предложение по вакансии актуально для вас?

Абонент: Да, здравствуйте

Бот: Смотрите, сейчас у нас открыта вакансия специалиста офиса продаж. В обязанности входит консультация абонентов, продажа оборудования и работа с кассой. Оформление идет полностью официальное, белая зарплата, средний уровень дохода N рублей, максимальный уровень практически не ограничен, есть возможность карьерного роста. График 5 рабочих дней с двумя плавающими выходными. Также предоставляем все социальные гарантии, дмс, бонусы и скидки от компании. Рассмотрите такие условия для себя?

Абонент: А еще раз, откуда вы звоните?

Бот: Это розничная сеть NNN

Абонент: А какой у вас график?

Бот: График работы формируется программой автоматически с учетом потока клиентов и нагрузки на офис с двумя плавающими выходными, то есть смены рабочие 6 8 10 12 часов в день могут быть и не более 40 часов в неделю. При этом график составляется заранее на 2 недели, то есть вы заранее знаете ваш график, ваши выходные, и можете уже планировать.

Абонент: Ну хорошо

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

Проблема 3. Сложности с реакцией на отказ

Речь идет о возможности управлять логикой отправки (START-OF-INPUT) - сообщение, которое сигнализирует о том, что начался ввод и надо бы прервать воспроизведение.

Так, система проигрывает определенный скрипт пользователю.

Бот: Здравствуйте! Меня зовут Валентин и я хочу вам предложить супер-пупер предложение

Абонент: не-не-не, ниче не надо

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

Проблема 4. Необходимость кастомизации

UMS Transcribe Plugin - проприетарный плагин, в нем ничего нельзя менять и настраивать. Да, можно связаться с разработчиками, что-то там предложить, но такое взаимодействие требует немало сил и, главное, времени. А его никогда ни у кого нет.

Нам же нужно было реализовать не одну кастомную фичу, а сразу несколько, включая:

  • распознавание пола.

  • разделение кредов по проектам.

  • кэширование синтеза.

Хватит это терпеть!

Помучавшись с UniMRCP, мы решили, что не хотим больше проблем, поэтому решили найти выход из положения. И лучшим выходом стало написание собственного сервера/плагина.

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

Недостатки UniMRCP мы превратили в достоинства собственного продукта, который получил:

  • Собственный NLU-алгоритм, способный обучаться на небольшом объеме данных.

  • Короткие паузы в диалогах.

  • Умную систему реагирования на прерывания разговора со стороны собеседника.

  • Возможность создания любого количества каналов.

  • Возможность кастомизации - систему можно подстраивать под нужды любого проекта.

Решение стать самостоятельными стало более чем правильным. Кроме того, что мы сами его используем во всех проектах, так им еще и заинтересовались многие компании. Сейчас наша разработка, MRCP-сервер, успешно продается на рынке, ее используют крупные банки и телеком-операторы.

Подробнее..

Автоматизация, безопасность, онлайн-знакомства для чего еще используют голосовые технологии в 2021 году

22.05.2021 16:14:00 | Автор: admin

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

Автоматизация бизнес-процессов

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

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

Онлайн-знакомства

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

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

Голосовые помощники

Кажется, голосовые ассистенты скоро будут у каждой уважающей себя IT-компании. Начиналось все c зарубежных Siri, Google Assistant, Alexa, затем появились Алиса от Яндекса, Олег от Тинькофф банка и Маруся от Mail.Ru Group. Некоторые помощники обретают физическую форму в виде колонки или станции, другие остаются только в виртуальном виде.

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

Подкастинг

Рынок подкастов продолжает уверенный рост. По данным недавнего исследования, к 2026 году его размер достигнет $41,8 млрд. Аудиоконтент востребован как никогда свои подкасты запускают крупные СМИ, IT-компании, банки, независимые эксперты и отдельные энтузиасты. Диапазон тематик широк: от развлекательных ток-шоу и обзоров новостей до образовательных и бизнес-программ.

Рекламодатели тоже не обошли индустрию подкастов стороной. Согласно прогнозам PwC, объем рекламного рынка подкастинга в России составит $133 млн к 2023 году.

Голосовая биометрия

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

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

***

А какие еще интересные и необычные голосовые инструменты и приложения знаете вы?

Подробнее..

Ультимативное сравнение систем распознавания речи Ashmanov, Google, Sber, Silero, Tinkoff, Yandex

27.05.2021 16:21:56 | Автор: admin

sandwich_fake


Какое-то время назад мы писали цикл статей про то, как правильно измерять качество систем распознавания речи, и собственно снимали метрики с доступных решений (цикл статей 1, 2, 3) (на тот момент и коммерческих и некоммерческих решений). На Хабре была выжимка из этого цикла в рамках этой статьи, но до масштабного обновления исследования, достойного публикации на Хабре, руки никак не доходили (это требует как минимум большого количества усилий и подготовки).


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


  • Добавилось много валидационных сетов из разных реальных доменов;
  • На рынок вышел Сбер, в первую очередь интересно протестировать именно его;
  • Для чистоты эксперимента, мы не предупреждали разработчиков систем о доменах и факте проведения тестов;
  • Мы также попробовали немного протестировать пропускную способность сервисов (понятно, что мы не знаем какое железо и ограничения стоят в облаке);
  • Мы рассматриваем только коммерческие системы, к которым у нас получилось получить доступ и которые показали хоть какой-то намек на "всеядность", работу с холодного старта и "энтерпрайзность";

Методология


Мы старались следовать нашей стандартной методологии (см. ссылки выше) с небольшими изменениями:


  • Тестируем одни и те же данные в формате wav (или просто PCM);
  • Мы слали запросы во все системы в 8 параллельных потоков (если было очень много таймаутов или все было медленно, то снижали);
  • Расчет скорости делался отдельным небольшим прогоном без всяческой пред- или пост-обработки, чтобы не "загрязнять" метрики, допустим, нормализацией или ресемплингом;
  • Считаем основную метрику WER. Не пугайтесь высоких показателей в районе 20% WER, нужно понимать что в самой разметке заложено порядка 5% WER и что иногда система получает штраф за неверную форму слова (но корень сохраняется, подробнее писал по ссылке в начале статьи);
  • По причине большого количества доменов в этот раз на каждый домен случайно выбрали по 1 часу аудио. Стабильные результаты как правило получаются с 2-3 часов аудио (поэтому некоторые метрики могут визуально быть "хуже" прошлых тестов). За тесты в Гугле нам пришлось заплатить почти 500 долларов!;
  • Метрики считаются на нормализованных текстах (то есть без цифр, "как слышится так и пишется"), так как системы нормализации могут быть разными и строго говоря к качеству распознавания имеют непрямое отношение и зачастую делаются под домен;
  • Если у системы нет такого функционала, то мы нормализуем тексты самостоятельно. В любом случае это влияет в рамках 1 п.п. WER, мы проверяли;
  • Сначала мы пробовали слать ogg/opus в системы, которые его поддерживают, но потом отказались от такой идеи, потом что резко вырос процент "пустых" ответов;
  • Все данные по умолчанию отправляются с родной частотой дискретизации (8 или 16 kHz), но мы не записывали исходную частоту дискретизации всех оригинальных аудио до обработки;

Сухие метрики


Все модели, кроме Silero bleeding egde, это модели упакованные в production сервисы.


Датасет Ashmanov Google Google Sber Sber Silero Silero new Tinkoff Yandex
default enhanced IVR prod bleeding edge
Чтение 10 11 10 7 7 6 8 13
Умная колонка 35 24 6 30 27 27 14
Энергосбыт 24 39 41 20 16 11 15 13
Звонки (такси) 47 16 18 22 32 13 12 21 15
Публичные выступления 28 27 24 18 14 12 20 21
Финансы (оператор) 31 37 37 24 33 25 24 23 22
Аэропорт 31 36 37 26 21 22 25 21
Аудио книги 22 60 54 19 24 20 28 22
Радио 24 61 40 26 18 15 27 23
Умная колонка (далеко) 42 49 8 41 27 52 18
Банк 62 30 32 24 28 39 35 28 25
Звонки (e-commerce) 34 45 43 34 45 29 29 31 28
Заседания суда 34 29 29 31 20 20 31 29
Yellow pages 45 43 49 41 32 29 31 30
Финансы (клиент) 43 55 59 41 67 38 37 33 32
YouTube 32 50 41 34 28 25 38 32
Звонки (пранки) 44 72 66 46 41 35 38 35
Медицинские термины 50 37 40 50 35 33 42 38
Диспетчерская 61 68 68 54 41 32 43 42
Стихи, песни и рэп 54 70 60 61 43 41 56 54
Справочная 39 50 53 32 25 20 27

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


Ashmanov Google Google Sber Sber Silero Tinkoff Yandex
default enhanced IVR
Чтение 0% 0% 0% 0% 0% 5% 4%
Умная колонка 0% 2% 0% 0% 4% 0%
Энергосбыт 1% 12% 13% 6% 0% 2% 1%
Звонки (такси) 0% 0% 0% 1% 0% 0% 7% 0%
Публичные выступления 0% 1% 0% 0% 0% 2% 0%
Финансы (оператор) 0% 0% 0% 2% 0% 0% 6% 0%
Аэропорт 0% 8% 10% 4% 0% 4% 0%
Аудио книги 0% 22% 6% 2% 0% 1% 0%
Радио 0% 19% 2% 3% 1% 4% 0%
Умная колонка (далеко) 0% 12% 0% 0% 1% 0%
Банк 0% 2% 3% 1% 1% 0% 5% 1%
Звонки (e-commerce) 0% 0% 0% 7% 1% 0% 7% 0%
Заседания суда 0% 0% 0% 1% 0% 4% 0%
Yellow pages 1% 13% 9% 14% 0% 2% 2%
Финансы (клиент) 0% 0% 7% 35% 9% 0% 5% 0%
YouTube 0% 13% 1% 6% 0% 1% 0%
Звонки (пранки) 1% 33% 12% 17% 5% 1% 1%
Медицинские термины 0% 1% 0% 7% 0% 6% 1%
Диспетчерская 3% 26% 28% 25% 0% 2% 4%
Стихи, песни и рэп 2% 19% 3% 25% 0% 1% 1%
Справочная 1% 12% 14% 9% 0% 3% 0%

Качественный анализ и интерпретация метрик


Неудивительно, что каждый силен в том домене, на котором фокусируется. Tinkoff на звонках в банк, справочную, финансовые сервисы. Сбер имеет ультимативно лучшие результаты на своей "умной колонке" (спекулирую, что они поделились в лучшем случае 1/10 своих данных) и в среднем неплохие показатели. IVR модель Сбера на доменах, где оригинальные данные лежат у нас в 8 kHz, показывает себя достойно, но она не ультимативно лучшая. Приятно удивил Яндекс в прошлых рейтингах их модели были не в списке лидеров, а сейчас точно лучше, чем в среднем по больнице. Другой сюрприз Google, который является аутсайдером данного исследования вместе с Ашмановым.


Также интересно посчитать количество доменов, где production модели поставщика лучшие / худшие (допустим с неким "послаблением" в 10% от лучшего или худшего результата):


Сервис Лучше всех Хуже всех
Ashmanov 0 7
Google 1 13 (9 у enhanced)
Sber 2 0
Sber IVR 4 4
Silero 13 0
Tinkoff 6 2
Yandex 10 1

Как и ожидалось наша модель показывает в среднем неплохие показатели на всех доменах, заметно отставая на банках и финансах. Также если смотреть по формальной метрике "на каком числе доменов модель лучшая или почти лучшая" то наша модель как минимум лучше всех генерализуется. Если включить в забег нашу bleeding edge модель (мы пока не выкатили ее еще), то она отстает только на "умной колонке" и банковских датасетах, лидируя уже на 17 доменах из 21. Это логично, так как у нас нет своей колонки и банки очень неохотно делятся своими данными даже приватно.


Удобство использования


У Сбера на момент тестирования было только gRPC API. Это не самое удачное решение для SMB клиентов с точки зрения удобства, имеющее более высокий порог на вход. Также в их реализации вообще не прокидываются важные ошибки (или отсутствуют в принципе, чем часто грешат корпоративные сервисы). Документация запрятана внутри портала их экосистемы, но в целом кроме лишней "сложности" проблем особо там нет, читать приятно. 40 страниц на два метода это конечно сильно (мы читали сначала в PDF), но документация хотя бы подробная и с примерами и пояснениями.


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


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


У сервиса Ашманова вообще нет документации, примеры не работают из коробки, пришлось немного позаниматься перебором для запуска. Отдельно отмечу, что обычно b2b сервисы не славятся читаемыми ошибками и читаемой документацией, но тут вообще не было ни ошибок, ни документации. Или 500-я ошибка или 200 с пустым ответом. Это создает легкий когнитивный диссонанс с учетом проработки анимации девушки-маскота, количества маркетинговых материалов и "успешных" кейсов.


ashmanov


У нашего сервиса само публичное АПИ весьма минималистичное и состоит из 2 методов (синтеза и gRPC нет еще в публичной документации) с примерами. Есть также gRPC АПИ, которое сейчас проходит обкатку. Наверное я тут не лучший судья, но основная ценность как мне кажется состоит в радикальной простоте для публичного АПИ и детальных инструкциях / сайзингах / опциях конфигурирования для более крупных клиентов.


Пропускная способность


Все АПИ, которые мы протестировали (кроме Ашманова) показали себя довольно бодро по скорости (это баг или фича решать вам). Для измерения пропускной способности мы считаем показатель секунд аудио в секунду на 1 поток распознавания (RTS = 1 / RTF):


Сервис RTS per Thread Threads Комментарий
Ashmanov 0.2 8
Ashmanov 1.7 1
Google 4.3 8
Google enhanced 2.9 8
Sber 13.6 8
Sber 14.1 1
Silero 2.5 8 4-core, 1080
Silero 3.8 4 4-core, 1080
Silero 6.0 8 12 cores, 2080 Ti
Silero 9.7 1 12 cores, 2080 Ti
Tinkoff 1.4 8
Tinkoff 2.2 1
Yandex 5.5 2 8 много пустых ответов

Поскольку никто не публикует сайзинги облачных и даже иногда коробочных (тут поправьте меня, если пропустил) версий своих систем публично (кстати прошлая версия нашего сайзинга например доступна по ссылке), то довольно сложно оценить адекватность работы систем по ресурсам. Ведь за АПИ может скрываться как одна VDS, так и сотни карт Nvidia Tesla, которыми любят хвастаться корпорации в своих пресс-релизах (что кстати частично подтверждается результатами Сбера пропускная способность там не падает от роста нагрузки совсем). Расчеты выше не являются заменой полноценным сайзингам.


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


Вообще меня очень приятно удивили результаты Сбера. На текущих версиях моделей у нас например сайзинг на 12 ядерном процессоре + GPU рассчитан на ~150 RTS. По идее это означает, что если мы поднимем тестовый и сервис на 12+ ядрах процессора на чуть более новой карточке, мы должны получить результаты более близкие к Сберу. У нас все равно не получается получить такие же высокие показатели без просадки от нагрузки, но какие-то выводы уже можно строить и получается все равно весьма достойно. Снимаем шляпу перед инженерами Сбера и ставим aspirational цель сделать наш сервис еще в 2-3 раза быстрее.


На цене мы останавливаться особо не будем (большая часть серьезных клиентов все равно не использует облако), но в очередной раз неприятный сюрприз преподнес Гугл выставив круглый счет за смешной (как нам кажется) объем. А ответ прост зачастую облачные корпоративные сервисы распознавания имеют не только крутой ценник (и в случае Гугла еще и в долларах), но и неочевидные системы округления вверх. В начале своего пути мы тестировали какой-то сервис из Великобритании который округлял до 60 секунд!


photo_2021-05-27_09-18-04


Небольшая ложка дегтя


Довольно приятно, что наш публичный некоммерческий датасет Open STT, неоднократно обсуждавшийся на Хабре, был предвестником релизов публичных данных, например от Сбера. Но долгосрочно все равно хотелось бы видеть хотя бы какую-то соразмерность вклада госкорпораций количеству вложенных в них публичных денег. В сравнении с похожими релизами на западе, мы пока сильно отстаем. Да и Яндекс традиционно не публикует ничего полезного в сфере распознавания речи, интересно почему.

Подробнее..

Мы сделали наш публичный синтез речи еще лучше

18.06.2021 14:19:30 | Автор: admin

6cc6e0011d4d26aeded6f052080b1890


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


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


Если коротко:


  • Мы сделали наш вокодер в 4 раза быстрее;
  • Мы сделали пакетирование моделей более удобным;
  • Мы сделали мультиспикерную / мультязычную модель и "заставили" спикеров говорить на "чужих" языках;
  • Мы добавили в наши русские модели возможность автопростановки ударений и буквы ё с некоторыми ограничениями;
  • Теперь мы можем сделать голос с нормальным качеством на 15 минутах 1 часе (с теплого старта в принципе заводилось даже на 3-7 минутах) или на 5 часах аудио (с холодного старта). Но тут все очень сильно зависит от качества самого аудио и ряда деталей;
  • Мы привлекли коммьюнити к работе, и нам помогли сделать удобный интерфейс для записи. Мы начали работу над голосами на языках народностей СНГ (украинский, татарский, башкирский, узбекский, таджикский). Если вы хотите увидеть свой язык в числе спикеров пишите нам;
  • Мы продолжаем собирать обратную связь по применимости нашей системы для экранных интерфейсов чтения, и пока кажется, что нужно где-то еще всё ускорить в 5-10 раз, чтобы наши модели закрывали и этот кейс;

Справедливая критика


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


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


Хотя мы вроде явно написали про это и даже сделали warning в коде про то, что модель принимает только предложения (а не целые тексты или книги), все равно основной поток комментариев был именно про это. Также мало кто обратил внимание на раздел статьи про скорость работы моделей и батчи (если вы не видели его, прочитайте).


Я привел в комментариях к статье пару простейших примеров в виде ответов на вопросы (раз, два, три, четыре), но чтобы не возвращаться к этому правильный алгоритм работы с моделью такой:


  • Сначала текст надо разбить на предложения оптимальным способом для вашего домена;
  • Потом надо проставить ударения (новые модели русского языка автоматически проставляют ударение и там, где его нет, и букву ё, но можно поставить и руками);
  • Далее надо кормить модель батчами в соответствии с оптимальным сайзингом (например на 2 ядрах процессора оптимальнее всего использовать батч-сайз 1-2);

Упрощаем запуск


Вспоминая опыт с silero-vad, чтобы не множить сущности, мы опубликовали наш синтез в нашем репозитории silero-models. Это имело очевидные плюсы, но и ряд минусов:


  • Если запускать модель через интерфейс с torch.hub, то нахождение в одном репозитории с моделями распознавания речи требовало установки двух библиотек (omegaconf для парсинга yaml-конфига и torchaudio для чтения аудио). Сам синтез не имеет внешних зависимостей кроме стандартной библиотеки питона и PyTorch. Но, если судить только по гневным комментариям и сообщениям в личку, это оказалось слишком сложным даже если дисконтировать радикальные мнения (мне всерьез писали в личку люди, c энтузиазмом стремящиеся доказать что "питон говно"). Люди в итоге не обращали внимание как на интерактивное демо в colab, так и на standalone примеры. По этой причине через какое-то время я добавил пример # Minimal Example to Run Locally;
  • Вообще конечно в идеале для полностью независимого оффлайнового запуска нужно было просто скачать модель, взять этот скрипт загрузки модели, дополнить его своими функциями и убрать лишнее. Но это тоже оказалось слишком сложным и неочевидным;

С учетом того, что механизм вызова моделей сильно усложнился (добавились мульти-язычная модель и автопростановка ударений и буквы ё для русского языка), мы решили довести вопрос с пакетированием до конца и просто использовать новый механизм пакетирования моделей из PyTorch 1.9. По сути единственное реальное отличие состоит в том, что утилиты для каждой модели теперь упакованы вместе с самой моделью и дистрибутив вместе с утилитами теперь можно скачать одним файлом.


Если вызов через torch.hub по сути особо и не изменился:


import torchlanguage = 'ru'speaker = 'kseniya_v2'sample_rate = 16000device = torch.device('cpu')model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',                                     model='silero_tts',                                     language=language,                                     speaker=speaker)model.to(device)  # gpu or cpuaudio = model.apply_tts(texts=[example_text],                        sample_rate=sample_rate)

То полностью standalone вызов стал сильно проще:


import osimport torchdevice = torch.device('cpu')torch.set_num_threads(4)local_file = 'model.pt'if not os.path.isfile(local_file):    torch.hub.download_url_to_file('https://models.silero.ai/models/tts/ru/v2_kseniya.pt',                                   local_file)  model = torch.package.PackageImporter(local_file).load_pickle("tts_models", "model")model.to(device)example_batch = ['В недрах тундры выдры в г+етрах т+ырят в вёдра ядра кедров.',                 'Котики - это жидкость!',                 'М+ама М+илу м+ыла с м+ылом.']sample_rate = 16000audio_paths = model.save_wav(texts=example_batch,                             sample_rate=sample_rate)

Снижение требований по количеству часов и расширение базы голосов


Не секрет, что записывать 15 20 часов аудио это тяжелая и кропотливая работа. Мы проверили некоторые исследования, чтобы понять, сколько часов нужно реально для того, чтобы сделать адекватный голос. Например системы синтеза прошлого поколения требуют около 2-3 часов аудио.


У нас получились такие результаты:


Количество аудио Тип старта Результат
15 20 часов с холодного модели в репозитории
5-6 часов с холодного заводится, нормальное качество, примеры ниже
3 часа с холодного заводится, но речь уже не очень членораздельна
1 час с холодного не заводится совсем
-------------------------- ------------------------ ---------------------------------------------------------
5-6 часов с теплого, похожий голос заводится чуть быстрее, нормальное качество, примеры ниже
5-6 часов с теплого, другой пол заводится, нормальное качество, примеры ниже
5-6 часов с теплого старта с теплого, другой язык заводится, нормальное качество, примеры ниже
3 часа с теплого, похожий голос заводится, качество чуть хуже, примеры ниже
1 час с теплого, похожий голос заводится, качество чуть хуже, примеры ниже
3 15 минут с теплого, похожий голос заводится, на 3 минутах уже сильно проседает качество

С холодного старта, 6 часов:




С теплого старта, 6 часов:



С холодного старта, 3 часа:


Тут уже понятно, что для холодного старта 3 часов маловато.



С теплого старта, 3 часа:



С холодного старта, 1 час:


На холодном старте 1 час вообще уже не работает и генерирует хрип вместо голоса.



С теплого старта, 1 час:


На 1 часу с теплого старта продолжает работать.



С теплого старта, 3 15 минут:


И тут нам стало интересно, а какой же минимальный порог после которого с теплого старта перестает работать? На похожем голосе получилось, что нижняя граница лежит где-то в районе 3 минут.





На моем голосе из голосового чата:


Тут у нас закралась мысль, а может в наших экспериментах что-то подтекает или есть ошибки (то есть мы выдаем желаемое за действительное).


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


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



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


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


Немного усложним задачу:


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





Хм, все работает с некими оговорками.


Прочие эксперименты:


Ну и напоследок попробуем заставить Ксению говорить по-немецки. Например, вот эту фразу: Mein Knig, das Fichtenbaum, Bundesausbildungsfrderungsgesetz, die Ubng..



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


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


  • Для более менее качественного синтеза точно достаточно 5-6 часов качественного аудио (особенно, если новый язык сильно не похож на имеющиеся);
  • Если записи очень качественные и язык похож на имеющиеся, то в принципе можно опускаться и ниже, вплоть до 15 минут 1 часа;
  • Естественно интонации и эмоции модель выучивает из записанного корпуса, искусственно управлять интонациями мы пока не научились;
  • Именно качество аудиозаписей является критическим моментом для качества синтеза;
  • Мы пока не понимаем как добиться качества и интонаций сравнимых с Алисой, но есть подозрение, что дело в количестве часов (40 100 часов) и чистоте аудио;

Мультиязычная модель


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


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













Записываем голоса языков народностей СНГ


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


photo_2021-05-17_18-05-35


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


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


Ускорение модели


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


В текущей итерации у нас получилось ускорить вокодер примерно в 4 раза почти без потери качества (на глаз потеря 0.1 0.2 MOS в среднем) и достичь примерно таких цифр:


Модель 8 kHz 16 kHz
v1 только вокодер, 1 поток 18 8
v2 только вокодер, 1 поток 70 35

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


Автоматическая простановка ударений


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


Основные проблемы:


  • Слов в русских и украинских языках реально много. Словарь может весить 100 200 мегабайт. Нужно не только добиться приемлемого качества и скорости работы моделей но и высокой степени сжатия моделей по сравнению со словарем;
  • В отличие от словаря, модели обладают хоть какой-то генерализацией;
  • У слов в языке сильно отличается частотность и надо соблюсти баланс между размером всей системы, точностью на всех когортах и стоимостью обладания системой;

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


  • Для самых популярных слов и словоформ (их примерно 130 тысяч), мы ставим ударение с точностью 99.9%;
  • Для слов со средней популярностью (их примерно 540 тысяч), мы ставим ударение с точностью 99.9%;
  • Примерно 1,300 слов мы включаем в словарь исключений (ошибки на остальных словах из этих когорт);
  • Для слов с низкой популярностью (длинный хвост, примерно 2 миллиона), мы ставим ударение с точностью 99%;
  • В каждой из этих категорий есть примерно 3% слов-омографов, которые мы пока не можем обработать (например зАмок замОк, хлОпок хлопОк). Такие слова наша модель специально пропускает, тем самым перенося бремя по простановке усредненного ударения на нашу модель синтеза;

Мы знаем как решить эти 3% в простановке ударений, но нам нужен большой корпус, в котором были бы размечены ударения в предложениях целиком (а не просто отдельные слова). Если вы знаете, где найти такой корпус будем признательны за наводку. Так мы сможем окончательно решить этот вопрос для синтеза.


Задача простановки буквы ё была также решена с некоторыми оговорками:


  • Омографы, связанные с буквой ё (например все всё, колеса колёса), не пропускаются, как в случае с ударениями. Выбрать подобные омографы из корпуса оказалось нетривиальной задачей (часто буква ё на письме игнорируется, поэтому отделить омограф от hard negative сложно без специально размеченных данных);
  • На словаре буквы ё мы ставим её с точностью 99% (как для hard positive, так и для hard negative слов);
  • Модель немного генерализовалась на слова, которых она не видела при обучении. Но всё-таки общее поведение на незнакомых словах не ставить ё;
  • Случается, что модель предсказывает ударение и букву ё на разные позиции. В таких ситуациях буква ё не будет проставлена;

Есть ещё одна проблема, не решённая на данном этапе: слова с побочными ударениями или несколькими буквами ё (например авиаметеослужба, премьер-министр, трёхколёсный).
Сейчас модель проставляет только одно ударение (и одну ё) в таких словах, но мы планируем в будущем исправить эти кейсы.


Несправедливая критика


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


Если перечислить самые популярные претензии:


  • Нет middleware под конкретный домен или платформу;
  • Нет приложения / интеграции в какое-то другое существующее приложение под какую-то платформу;
  • Слишком сложно, невозможно разобраться;
  • Алиса звучит лучше;

На первые ответ довольно простой middleware делаются на заказ как часть коммерческого продукта. Если вы хотите поддерживаемый клиент / интеграцию под какую-то платформу, то цена вопроса цена на поиск + зарплата команды разработки (1-2 человека), умноженная на требуемый срок поддержки.


Насчет Алисы вы сами выбираете дарить ли свои персональные данные корпорациям. Практика показывает, что де-факто никакой защиты от их недобросовестного поведения нет кроме сил конкуренции. Как говорится: "Если подписал не удивляйся". Также мы примерно приценивались к "звездным" голосам, там только бюджет на запись голоса уже в разы больше бюджета на весь некоммерческий релиз целиком (нам называли оценки в районе 0.25 0.5 миллиона долларов только за запись голоса).


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


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


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


Дальнейшие планы


Текущий релиз:


  • Ускорение вокодера в 4 раза;
  • Многоязычная мультиспикерная модель (и возможность говорить на другом языке с акцентом);
  • Снижено количество файлов и упрощено пакетирование;
  • Добавление автоматической простановки ударений и простановки буквы ё;
  • Снижение требований по количеству данных и начало работы над голосами народностей СНГ;

Следующие релизы:


  • Высота голоса и скорость;
  • Радикальное ускорение моделей (10+ раз);
  • Эмоции, управление интонацией;
  • Еще большее снижение требований по данным;
  • Добавление новых голосов по мере появления открытых голосов на других языках;
  • Добавление малых языков и языков народностей России и СНГ по мере сбора датасетов;
Подробнее..

ИИ-модель Microsoft превзошла результат человека в тесте на понимание естественного языка SuperGLUE

19.01.2021 10:15:06 | Автор: admin

Алгоритм понимания естественного языка (Natural Language Understanding, NLU)Microsoft DeBERTaпревзошел человеческие возможности в одном из самых сложных тестов для подобных алгоритмов SuperGLUE. На данный момент модель занимает первое место врейтингес показателем в 90,3, в то время как среднее значение человеческих возможностей составляет 89,8 баллов.

Рейтинг алгоритмов по прохождению теста SuperGLUEРейтинг алгоритмов по прохождению теста SuperGLUE

Тест SuperGLUE включает в себяряд задач, которые разработаны для оценки способности ИИ-моделей распознавать и понимать естественный язык, например, дать правильный ответ на вопрос на базе прочитанного абзаца, определить, правильно ли используется многозначное слово в определенном контексте и т.д. Тест был разработан группой исследователей в 2019 году. Когда был представлен SuperGLUE, разрыв между самой эффективной моделью и показателями человека в таблице лидеров составлял почти 20 баллов.

Для того чтобы добиться текущего результата в 90,3 балла, DeBERTa получила масштабное обновление архитектуры: теперь она состоит из 48 слоев и имеет 1,5 млрд параметров. Microsoft сделает публичной модель и ееисходный код. Кроме того, DeBERTa будет интегрирована в следующую версию Тьюринговой модели Microsoft Turing (Turing NLRv4).Тьюринговые модели используются в таких продуктах Microsoft, как Bing, Office, Dynamics и Azure Cognitive Services, чтобы совершенствовать, к примеру, взаимодействие с чат-ботами, предоставление рекомендаций и ответов на вопросы, поиск, автоматизацию поддержки клиентов, создание контента и решение многих других задач на пользу сотен миллионов пользователей.

Архитектура модели DeBERTaАрхитектура модели DeBERTa

В отличие от других моделей, DeBERTa учитывает не только значения слов, но и их позиции и роли. К примеру, в предложении a new store opened beside the new mall (англ. новый магазин открылся рядом с торговым центром) она может понять, что близкие по контекстному значению store (магазин) и mall (торговый центр) играют разные синтаксические роли (подлежащим здесь является именно store). Более того, она способна определять зависимость слов друг от друга. Например, DeBERTa понимает, что зависимость между словами deep и learning гораздо сильнее, когда они стоят рядом (термин глубокое обучение), чем когда они встречаются в разных предложениях.

Несмотря на то, что модель DeBERTa превзошла человеческие показатели в тесте SuperGLUE, это не означает, что ИИ-модель достигла уровня человека в понимании естественного языка. В отличии от машин, люди хорошо умеют использовать знания, ранее полученные при выполнении различных задач, для решения новых это называется композиционным обобщением (англ. compositional generalization). Поэтому, несмотря на многообещающие результаты DeBERTa в тесте, необходимо продолжить исследования, для того чтобы развить у модели этот навык.

Microsoft активно работает над усовершенствованием технологий искусственного интеллекта. Так, в октябре 2020 года былпредставленпрогрессивный ИИ-алгоритм для автоматической генерации подписей к изображениям, которые во многих случаях оказываются более точными, чем написанные людьми. Это позволит сделать продукты и сервисы Microsoft еще более инклюзивными и доступными для большего количества пользователей. В первую очередь, автоматическое описание помогает людям с нарушениями зрения при работе с документами или веб-страницами, а также в целом позволяет получить доступ к содержимому любого изображения, к примеру, при поиске или подготовке презентаций.

Подробнее..

Распознавание эмоций в записях телефонных разговоров

21.06.2021 02:14:29 | Автор: admin

Технология распознавания эмоций в речи может может найти применение в огромном количестве задач. В частности, это позволит автоматизировать процесс мониторинга качества обслуживания клиентов call-центров.

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

1) Empath

В 2017 году был основан японский стартап Empath. Он создал платформу Web Empath, основанную на алгоритмах, обученных на десятках тысяч голосовых образцов японской медицинской технологической компании Smartmedical. Недостатком платформы является то, что она анализирует только голос и не пытается распознать речь.

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

Также важное влияние на форму проявления эмоционального состояния оказывают культурные и языковые особенности. И попытки многоязычной классификации эмоций демонстрируют значительное снижение эффективности их распознавания [1]. Тем не менее, такое решение имеет место быть, а компания имеет возможность предлагать свое решение клиентам по всему миру.

2) Центр речевых технологий

В составе программного продукта Smart Logger II компании ЦРТ есть модуль речевой аналитики QM Analyzer, позволяющий в автоматическом режиме отслеживать события на телефонной линии, речевую активность дикторов, распознавать речь и анализировать эмоции. Для анализа эмоционального состояния QM Analyzer измеряет физические характеристики речевого сигнала: амплитуда, частотные и временные параметры, ищет ключевые слова и выражения, характеризующие отношение говорящего к теме [2]. При анализе голоса первые несколько секунд система накапливает данные и оценивает, какой тон разговора был нормальным, и далее, отталкиваясь от него, фиксирует изменения тона в положительную или отрицательную сторону [3].

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

3) Neurodata Lab

Компания Neurodata Lab разрабатывает решения, которые охватывают широкий спектр направлений в области исследований эмоций и их распознавания по аудио и видео, в том числе технологии по разделению голосов, послойного анализа и идентификации голоса в аудиопотоке, комплексного трекинга движений тела и рук, а также детекции и распознавания ключевых точек и движений мышц лица в видеопотоке в режиме реального времени. В качестве одного из своих первых проектов команда Neurodata Lab собрала русскоязычную мультимодальную базу данных RAMAS комплексный набор данных об испытываемых эмоциях, включающий параллельную запись 12 каналов: аудио, видео, окулографию, носимые датчики движения и другие о каждой из ситуаций межличностного взаимодействия. В создании базы данных приняли участие актеры, воссоздающие различные ситуации повседневного общения [4].

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

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

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

Empath

ЦРТ

Neurodata Lab

Разрабатываемый сервис

семантический анализ

-

+

+

+

русский дата-сет

-

нет

+

+

дата-сет спонтанных эмоций

+

-

+

В качестве материалов для создания русскоязычного эмоционального дата-сета со спонтанной речью мне была предоставлена база записей телефонных разговоров от IT-компании Эм Си Арт.

Общий алгоритм работы разрабатываемого сервиса выглядит следующим образом.

Блок-схема алгоритма обработки звонкаБлок-схема алгоритма обработки звонка

При реализации были использованы следующие инструменты:

  1. Шумоочистка RNNoise_Wrapper

  2. Диаризация pyAudioAnalysis

  3. Транскрибация vosk-api

  4. Анализ эмоций текста dostoevsky

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

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

Я выбрала пять наиболее часто используемых признаков:

  • мел-частотные кепстральные коэффициенты (MFCC)

  • вектор цветности

  • мел-спектрограмма

  • спектральный контраст

  • тональный центроид (Tonnetz)

На основе выделенных из записей телефонных разговоров отрезков я составила 3 варианта дата-сетов с различным количеством выделяемых классов эмоций. Также для сравнения результатов обучения была взята берлинская база эмоциональной речи Emo-DB, созданная с привлечением профессиональных актеров.

Сначала я попробовала обучить простые классификаторы библиотеки scikit-learn:

  • SVC

  • RandomForestClassifier

  • GradientBoostingClassifier

  • KNeighborsClassifier

  • MLPClassifier

  • BaggingClassifier

В результате обучения на дата-сете Emo-DB получилось достичь точности распознавания 79%. Однако при тестировании полученной модели на размеченных мной записях телефонных разговоров, точность оказалась равной всего 23%. Это подтверждает тезисы о том, что при многоязычной классификации и переходе от модельных эмоций к спонтанным точность распознавания значительно снижается.

На составленных мной дата-сетах получилось достичь точности 55%.

База данных

Количество классов

Количество записей

Модель

Точность

Emo-DB

4

408

MLPClassifier

79.268%/22.983%

MCartEmo-admntlf

7

324

KNeighborsClassifier

49.231%

MCartEmo-asnef

5

373

GradientBoostingClassifier

49.333%

MCartEmo-pnn

3

421

BaggingClassifier

55.294%

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

Далее я попробовала обучить сверточную нейронную сеть на дата-сете MCartEmo-pnn. Оптимальной архитектурой оказалась следующая.

Точность распознавания такой сети составила 62.352%.

Далее я провела работу по расширению и фильтрации дата-сета, в результате чего количество записей увеличилось до 566. Модель заново была обучена на этих данных. По итогу точность распознавания увеличилась до 66.666%. Это говорит о необходимости дальнейшего расширения набора данных, что приведет к увеличению точности распознавания эмоций по голосу.

График истории обучения и матрица ошибок полученной CNNГрафик истории обучения и матрица ошибок полученной CNN

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

Сервис Gateway API производит аутентификацию пользователей по стандарту JSON Web Token и выполнять роль прокси-сервера, направляя запросы к функциональным микросервисам, находящимся в закрытом контуре.

Разработанный сервис был проинтегрирован с Битрикс24. Для этого было создано приложение Аналитика речи. В понятиях Битрикс24 это серверное приложение или приложение второго типа. Такие приложения могут обращаться к REST API Битрикс24, используя протокол OAuth 2.0, а также регистрировать свои обработчики событий. Поэтому достаточно было в сервере добавить роуты для установки приложения (по сути регистрация пользователя), удаления приложения (удаление аккаунта пользователя) и обработчик события OnVoximplantCallEnd, который сохраняет результаты анализа записей в карточках связанных со звонками CRM-сущностей. В качестве результатов приложение добавляет расшифровку записи к звонку и комментарий с оценкой успешности разговора по пятибалльной шкале с прикреплением графика изменения эмоционального состояния по каждому участнику разговора.

Заключение

В работе представлен результат исследования на тему распознавания эмоций в речи, в ходе которой на основе русскоязычных записей телефонных разговоров был создан дата-сет эмоциональной речи, на котором была обучена CNN. Точность распознавания составила 66.66%.
Был реализован веб-сервис, с помощью которого можно выполнять очистку аудиозаписей от шума, диаризацию, транскрибацию и анализ эмоций в аудиозаписи или текстовых сообщениях.
Сервис был доработан, чтобы его также можно было использовать как приложение Битрикс24.

Данная работа выполнялась по заказу компании Эм Си Арт в рамках ВКР бакалавра образовательной программы "Нейротехнологии и программирование" университета ИТМО. Также по этой теме у меня был доклад на X КМУ и была принята на публикацию в "Сборнике трудов Конгресса" статья.

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

Список источников

  1. Давыдов, А. Классификация эмоционального состояния диктора по голосу: проблемы и решения / А. Давыдов, В. Киселёв, Д. Кочетков // Труды международной конференции "Диалог 2011.". 2011. С. 178185.

  2. Smart Logger II. Эволюция систем многоканальной записи. От регистрации вызовов к речевой аналитике [Электронный ресурс]. Режим доступа: http://www.myshared.ru/slide/312083/.

  3. Smart logger-2 не дремлет. Эмоции операторов call-центров и клиентов под контролем [Электронный ресурс]. Режим доступа: https://piter.tv/event/_Smart_logger_2_ne_drem/.

  4. Perepelkina, O. RAMAS: Russian Multimodal Corpus of Dyadic Interaction for Studying Emotion Recognition / O. Perepelkina, E. Kazimirova, M. Konstantinova // PeerJ Preprints 6:e26688v1. 2018.

Подробнее..

Биометрия, персонализация голоса, NLU и речевая аналитика о чем расскажут на конференции Conversations

05.06.2021 12:14:00 | Автор: admin

21 и 22 июня в Питере (и онлайн) пройдет конференция по разговорному ИИ Conversations. Поток для разработчиков будет посвящен conversational lego технологиям вокруг разговорного AI, из которых состоят чат-боты, голосовые ассистенты и диалоговые решения. Персонализация голоса от Yandex Speechkit, стратегия управления диалогом от DeepPavlov, платформа речевой аналитики Тинькофф Банка, голосовая биометрия от SberDevices, анализ и разметка интентов при создании голосовых ботов от X5 Retail Group и другие тулзы рассказываем, с чем еще можно познакомиться на Conversations V.

Доклад про лайфхаки разговорного UI на Conversations'19: как сделать бота и не разозлить пользователяДоклад про лайфхаки разговорного UI на Conversations'19: как сделать бота и не разозлить пользователя

Конференция будет проходить два дня Business Day (21 июня) и Technology Day (22 июня). Онлайн-билет дает доступ к двухдневному стриму!

Technology Day откроет секция Conversational Lego, посвященная технологиям, которые лежат в основе различных разговорных решений от чат-ботов с NLU до прокачанных голосовых ассистентов.

Кто выступит и о чем расскажут?

  • Поиск смысла в океане данных: анализ и разметка интентов при создании голосовых ботов. Антон Кленицкий, X5 Retail Group

  • Голос бренда. Зачем нужны технологии персонализации голоса и как они устроены. Никита Ткачев, Yandex.Cloud

  • Биометрический бум: как технологии помогают нам в повседневной жизни. Станислав Милых, SberDevices

  • Стратегия управления диалогом: как сделать чат-бота более умным и объемным с помощью дискурс-менеджмента. Данила Корнев, CPO, DeepPavlov

  • Особенности алгоритмов распознавания речи и их влияние на опыт пользователей. Николай Шмырев, CEO, АЦ Технологии

  • Как спроектировать диалоговый интерфейс для мультилингвальных ботов. Brielle Nickoloff, Cofounder & Head of Product, Botmock.

Больше имен и тем на сайте Conversations!

Еще разработчиков в Technology Day ждет секция по голосовым ассистентам, где Яндекс, SberDevices, Mail.Ru Group расскажут о новых фичах Алисы, Маруси и семейства Салют. Например, Алексей Фивинцев из Mail.ru покажет, какой профит можно извлечь из разработки голосовых навыков для Маруси, используя интеграцию Маруси с ВКонтакте.

А на секции Partners in AI: как заработать на разговорных решениях расскажут, как разработчику стать предпринимателем, как придумать и монетизировать сценарии для различных бизнес-задач и индустрий.

В общем, будет много интересного! Один билет в стрим два дня экспертизы, доступ к приложению для нетворкинга и всем материалам конференции. За новостями можно следить в официальномтелеграм-канале Conversations.

Подробнее..

Новые возможности для Python-разработчиков SmartApp Framework в open source

09.02.2021 10:17:03 | Автор: admin
Платформа SmartMarket позволяет разработчику с любым уровнем подготовки создавать мультимодальные приложения для виртуальных ассистентов Салют, даже без программирования. Конечно, если хочется сделать что-то красивое и сложное, без кода не обойтись. Чтобы облегчить жизнь разработчикам, мы делимся с ними нашими наработками в open source.На митапе разработчиков SmartMarket, прошедшем в декабре, мы рассказали о новом фреймворке.
Ниже вы найдете текстовую версию доклада и его видеозапись.


Друзья, привет! Меня зовут Кристина, я backend-разработчик SberDevices и тимлид сервиса управления диалогом, который используется для работы виртуальных ассистентов Салют. Расскажу вам сегодня о новом инструменте SmartMarket SmartApp Framework, который мы выложили в open source.

Итак, давайте посмотрим, что же это такое. Во-первых, это Python-фреймворк, который создан для того, чтобы вы могли разрабатывать backend для смартаповс поддержкой виртуальных ассистентов Салют. Мы активно используем этот фреймворк внутри Сбера, большое число наших собственных смартапов построено на нем. Это такие диалоговые приложения, как погода, текущее время, многие банковские навыки, это и диалоговая часть Canvas App, про который очень хорошо и подробно рассказал мой коллега Антон. Наш самый любимый и вкусный пример Canvas App это заказ попкорна, а также это app каталога.



C помощью фреймворка можно разрабатывать диалоговую часть Native App, как яркий пример это app видео. (О разных типах смартапов можно узнать здесь. Примеч. ред.)

Диалоговая механика


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

Одно из основных свойств поля филлер. Филлер это сущность, извлекающая из запроса пользователя информацию, которую мы хотим узнать. Помимо этого у поля есть свойство question, которое позволяет задать вопрос пользователю.

Здесь есть несколько важных, на мой взгляд, моментов. Во-первых, диалог может строиться в произвольном порядке. Например, по шагам, когда пользователь сначала называет получателя, затем сумму. Также можно сказать в одном предложении: Переведи 100 рублей папе. Или просто: Переведи 100 рублей, и ассистент уточнит: Кому?. Таким образом, нет необходимости переспрашивать у пользователя информацию и учитывать всю вариативность в описании диалога.



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

Сам диалоговый сценарий мы можем описывать несколькими путями. Первый и самый простой декларативно с помощью нашего внутреннего языка DSL, который выглядит, как JSON. Здесь я привела пример того, как декларативно описать поле, которое извлекает имя пользователя и задает ему вопрос.



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

Предобработка текста


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

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



Работать с сырым JSON неудобно, поэтому для разработчиков внутри SmartApp Framework реализовано представление результатов предобработки в виде объектов классов, позволяющих удобно обращаться к сущностям предобработки. Благодаря этому филлер, который извлекает из предобработанного текста фамилию, имя, отчество пользователя, можно описать одной строкой на DSL или парой строк кода.

Запуск и тестирование смартапа


Допустим, вы разработчик, не зарегистрированный в SmartMarket, вам не хочется подключаться к нашему виртуальному ассистенту, но, тем не менее, написать и запустить свой смартап вы можете. Внутри SmartApp Framework реализовано локальное тестирование. При этом вы будете видеть подробный лог того, что у вас происходит. Но есть одна особенность: смартап должен принимать на вход предобработанный текст. В фреймворке есть модуль предобработки текста. Это не полноценная платформенная предобработка, в ней присутствуюет морфология, леммы, но отсутствуют извлекаемые сущности. Тем не менее этого достаточнодля запуска прототипа.



Если вы зарегистрированы в SmartApp Studio, вы умеете регистрировать свой вебхук и хотите попробовать запустить фреймворк, вам нужно сделать три простых шага:


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

  • третий командой run_app вы запускаете смартап и уже можете тестировать. Из коробки вам будет доступен тестовый сценарий, который знакомится с пользователем и показывает базовые умения ассистента.




На этом у меня все. Будем рады вашим отзывам, пулреквестам и даже issues. SmartApp Framework доступен по ссылке.

***
Приглашаем 11 февраля на Второй онлайн-митап разработчиков SmartMarket.
В этот раз поговорим об устройстве хорошего мультимодального приложения для виртуальных ассистентов Салют, возможностях ASR и TTS, а также о монетизации смартапов на платформе SmartMarket.
Узнать подробнее, что вас ждет на митапе, и зарегистрироваться на него можно здесь.
Подробнее..

Голосовой ассистент Виталий (школьный проект)

26.03.2021 14:15:31 | Автор: admin

Предостережение

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

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

Введение

Меня зовут Глеб (8 кл) и я задался целью сделать хорошую открывалку/закрывалку и немного говорилку для windows, вообщем голосового ассистента на python.

На момент написания поста ассистент имеет версию alfa 4.0 и непозицианирует себя как серьезный продукт или не дай бог конкурента Алисе или Siri.

Для ассистента был по-быстрому накидан сайт, где можно скачать exe или исходник на питоне, который вероятно вам и интересен. Гитхаб тоже в наличии.

КОД

Так как я уже прикреплял гитхаб, предлагаю с акцентировать внимание на интересных, спорных или непонятных для меня моментах.

РАСПОЗНОВАНИЕ РЕЧИ

Для работы разпозновалки я выбрал speech recognition и в итоге был реализован такой код(сборная солянка из видеоуроков):

import speech_recognition as sr#кортеж с предлжениями, каждую итерацию цикла ассистент дает рандомное предложение (Скажите что-нибудь например "открой браузер")recomend = ("Открой браузер", "Найди в интернете стихи А. Пушкина.", "Как дела?", "Что ты умеешь?", "Запомни код от домофона 495 544.", "Найди на ютубе котиков.")#распознование (и не просите, в функцию не добавлю так, как оно все-равно нужно только раз за итерацию цикла)    rec1 = len(recomend) - 1    rec2 = recomend[random.randint(0, rec1)]    print('-------------------')    r = sr.Recognizer()    with sr.Microphone() as source:    print("Скажите что нибудь, например:", rec2)    r.pause_threshold = 1    #r.adjust_for_ambient_noise(source, duration=1)    audio = r.listen(source)    try:    #разпознаное сохраняется в переменную an (answer)      an = r.recognize_google(audio, language="ru-RU").lower()    print("Вы сказали: " + an)    except sr.UnknownValueError:        t = "Я вас не слышу, говорите громче!"        print("Сбой системы распознования речи. ")

Очень прошу в комментарии покидать более качественные аналоги speech recognition.

СИНТЕЗ РЕЧИ

Для синтеза речи я выбрал голос vokolizer, а также библиотеку pyttsx3. В коде это выглядит так:

import pyttsx3#Настройка голоса, индекс голоса читаем из файла.f = open("tts.txt", "r")tts1 = int(f.read(1))f.close()text = ""tts = pyttsx3.init()speak_engine = pyttsx3.init()voices = speak_engine.getProperty('voices')speak_engine.setProperty('voice', voices[tts1].id)#функция синтезы речиdef run():    tts.say(t)    tts.runAndWait()    print("Виталий:", t)    #пример запросаt = "Привет мир"run()

ПОДБОР ФРАЗ ДЛЯ КРАСИВОГО SMALLTALK

Тут я решил сделать возможность быстрого изменения фраз, поэтому сделал такой алгоритм:

import os#читаем файл smalltalk и делаем 2 списка: 1 - с ключевыми словами, 2 - с ответами ассистентаf = open("smalltalk.txt", "r", encoding="utf-8")smalltalkdialog = f.read()asksmalltalk = smalltalkdialog[len("вопросы: "):smalltalkdialog.find(" | [конецстроки1]")].split(" | ")answersmalltalk = smalltalkdialog[smalltalkdialog.find("ответы: ") + len("ответы: "):smalltalkdialog.find(" | [конецстроки2]")].split(" | ")#подбор нужной фразыfor word in range(len(asksmalltalk)):    if asksmalltalk[word] in an:        t = answersmalltalk[word]        run()        break

Тут тоже нужен ваш совет: подскажите пожалуйста более эфективный способ искать фразы.

К Dialog Flove у меня непреязнь. Личная.

ОТКРТИЕ ПРОГРАММ, САЙТОВ И ПОИСК В ИНТЕРНЕТЕ

import webbrowser#переменная error сообщает о том, нашла-ли программа ответ на фразу пользователя, если да, то error = 0while условный True:    #поиск    elif "найди" in an:        error = 0        if "в интернете" in an:            t = "Начинаю поиск в интернете" + an[an.find("ете")+3:]            run()            sear = an[an.find("ете")+3:]            webbrowser.open("https://www.google.com/search?q=" + sear)        elif "youtube" in an:            sear = an[an.find("be")+2:]            t = "Начинаю поиск в ютубе " + sear            run()            webbrowser.open("https://www.youtube.com/results?search_query=" + sear)        else:            t = "Вы дали мало данных, скажите найди в интернете, либо найди в ютубе и ваш вопрос."            run()        continue    #функция на закрытие Тут мы берем 2 кортежа, в кортеже "listprogram" у нас ключевые слова, а в "listprogram2" команды.    elif "закрой" in an:        listprogram = ("steam", "skype", "браузер")        listprogram2 = ("TASKKILL /IM steam.exe", "TASKKILL /IM skype.exe", "TASKKILL /IM chrome.exe")        for net in range(len(listprogram)):            if listprogram[net] in an:                program = listprogram2[net]                os.system(program)                os.system('cls' if os.name == 'nt' else 'clear')                t = "Закрываю " + listprogram[net]                 run()                error = 0        continue    #синтезатор речи    elif "текст" in an:        error = 0        t = "Вставьте сюда текст, который надо синтезировать. в конце текста напишите команду стопсинтез"        run()        t = ""        while True:            t = t + " " + str(input("Вставьте сюда текст > "))            if "стопсинтез" in t:                break                t = t[:t.find("стопсинтез")]        run()             #интернет Тут мы берем 2 кортежа, в кортеже "fordefweb" у нас ключевые слова, а в "fordefweb" ссылки.    fordefweb = ("youtube", "вконтакте", "браузер", "google", "новости", "окко", "хабр", "facebook", "wifmedia", "свой сайт")    fordefweb2 = ("https://www.youtube.com/", "https:/vk.com", "https://www.google.ru/", "https://www.google.ru/", "https://lenta.ru/", "https://okko.tv/", "http://personeltest.ru/aways/habr.com/ru/feed/", "https://www.facebook.com/", "https://wifmedia.com/", "http://vitaliy.renderforestsites.com")    for net in range(len(fordefweb)):        if fordefweb[net] in an:            web = fordefweb2[net]            runweb()            error = 0    #программы Тут мы берем 2 кортежа, в кортеже "listprogram" у нас ключевые слова, а в "listprogram2" команды.    listprogram = ("проводник", "skype")    listprogram2 = ("explorer.exe", "start skype.exe")    for net in range(len(listprogram)):        if listprogram[net] in an:            program = listprogram2[net]            os.system(program)            t = "Открываю " + listprogram[net]             run()            error = 0

Опять-же не могу найти ничего действенее elif, но в этой версии и хотя-бы меньше.

ОСТАЛЬНОЕ

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

Материаллы

САЙТ (просто дешевая одностраничка на renderforest)

ГИТХАБ

демонстрационный ролик

Подробнее..

Как адаптировать языковые модели Kaldi? (со смешными животными)

24.05.2021 14:14:07 | Автор: admin


Как научить русскоязычную модель распознавать речь геймеров? Подобными вопросами задаются те, кто увлекается и занимается NLP. В частности, NLP-специалистов интересует, как можно адаптировать русскоязычную модель vosk под их предметную область, чтобы улучшить качество распознавания. Это мы и разберём в данной статье.


Привет! Приглашаю вас кушать блины и распознавать речь

Сейчас можно легко заставить компьютер распознавать обычную устную речь, благо, есть пакет vosk, который является человечной обёрткой (wrapperом) к предобученным моделям Kaldi. Alphacephei и Николай Шмырёв проделали колоссальное количество работы по продвижению опен-сорса в распознавании русскоязычной речи, и vosk, пожалуй, венец всего их труда. Большая модель vosk-ru для распознавания устной русской речи без всяких доработок может решать множество задач распознавания речи.

По умолчанию большая модель vosk-ru предназначена для распознавания обычных разговорных слов и синтаксических конструкций. Однако, когда появляется необходимость распознавать другие слова и другие языковые конструкции, которые не предусмотрены моделью vosk-ru по умолчанию, качество распознавания заметно ухудшается. Если таких конструкций немного, то можно выстроить соответствие между тем, что нужно распознать, и тем, что распознаётся на самом деле. Например, текущая модель vosk-model-ru-0.10 не умеет распознавать слово коронавирус, но распознает отдельные слова: корона и вирус. В подобных случаях нам будет предоставлен своеобразный ребус, который нам, со своей стороны, нужно будет решить программно. К сожалению, на ребусах далеко не уехать.

Собственно, как здорово, что все мы здесь сегодня собрались научиться адаптировать модель vosk-ru. Для этого существуют пути адаптации:



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



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

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

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

Соответственно, в Kaldi есть два основных способа проектирования языковых моделей: ARPA LM и грамматика FST:



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


Мопс выделяет частоты в сигнале, на которых находится речь

СТРУКТУРА VOSK-MODEL-RU-0.10

Начнём работу с разбора того, как устроена модель для vosk. То, что нам НЕ понадобится при файн-тюнинге выделено курсивом.

vosk-model-ru-0.10
\__ am сокращённо от Acoustic Model. Содержит модель распознавания звуков (фонем)
\__ conf папка с файлами конфигураций для запуска модуля
\__ graph графы для описания вероятностей переходов от одной фонемы к другой. Содержит информацию о заученных переходах фонем, а также переходы с учётом языковой модели
\__ ivector папка с сохранёнными голосовыми слепками из обучающей выборки
\__ rescore n-граммная языковая модель для переопределения цепочек слов
\__ rnnlm языковая модель на основе рекуррентной нейронной сети для дополнительного переопределения цепочек слов
\__ decode.sh исполняемый файл для запуска моделей с помощью инструментов Kaldi
\__ decoder-test.scp, decoder-test.utt2spk служебные файлы для распознавания пробного файла
\__ decoder-test.wav пробный файл
\__ README документация


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

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

Модификация словаря
Замена словаря
Модификация ЯМ
Замена ЯМ

Ну что ж, приступим?


Этот хороший мальчик готов адаптировать модель распознавания речи, а вы?

УСТАНОВКА KALDI

Прежде всего нам нужно поставить Kaldi на нашу рабочую машину (Linux или Mac). Благо, делается это весьма просто:

git clone https://github.com/kaldi-asr/kaldi.gitcd kaldi/tools/./extras/check_dependencies.shmake -j 4 # тут в качестве параметра указываете количество параллельных процессов при установкеcd ../src/./configure --sharedmake depend -j 4 # аналогичноmake -j 4 # аналогично

В результате установки на машине компилируются зависимости и непосредственно сам Kaldi. Если что-то идёт не так, смотрите логи, гуглите и обращайтесь за помощью в комментарии.

УСТАНОВКА KENLM

Затем нам нужно установить инструмент kenlm для построения статистических языковых моделей. Есть альтернативы для построения статистических языковых моделей, такие как SRILM, он поддерживает бОльшее количество видов сглаживаний для языковых моделей, но он сложнее при установке и использовании. Помимо всего прочего, kenlm можно использовать без ограничений для коммерческих приложений.

git clone https://github.com/kpu/kenlm.gitmkdir -p kenlm/buildcd kenlm/buildcmake ..make -j 4


НАСТРОЙКА ДИРЕКТОРИИ

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

# Создаём рабочую директориюmkdir your_asr_project/cd your_asr_project/# Копируем необходимые файлы из модели vosk-аcp -R /path/to/your/vosk-model-ru-0.10/am .cp -R /path/to/your/vosk-model-ru-0.10/conf/ .cp -R /path/to/your/vosk-model-ru-0.10/graph/ .cp -R /path/to/your/vosk-model-ru-0.10/ivector/ .# Копируем необходимые скрипты из рецептов Kaldicp -R /path/to/your/kaldi/egs/mini_librispeech/s5/steps/ .cp -R /path/to/your/kaldi/egs/mini_librispeech/s5/utils/ .cp -R /path/to/your/kaldi/egs/mini_librispeech/s5/path.sh .cp -R /path/to/your/kaldi/egs/mini_librispeech/s5/cmd.sh .

Рекомендуется брать скрипты из рецепта mini_librispeech, так как именно он изначально использовался для обучения vosk-model-ru-0.10.

НАСТРОЙКА ОКРУЖЕНИЯ

Предыдущим шагом мы установили все зависимости. Теперь необходимо прописать пути к нашим зависимостям. Это делается через файл path.sh, который мы только что скопировали:

./path.sh
export KALDI_ROOT=/path/to/your/kaldi # Здесь указываете путь до вашего Kaldi[ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ROOT/tools/env.shexport PATH=$PWD/utils/:$KALDI_ROOT/tools/openfst/bin:$PWD:$PATH[ ! -f $KALDI_ROOT/tools/config/common_path.sh ] && echo >&2 "The standard file $KALDI_ROOT/tools/config/common_path$. $KALDI_ROOT/tools/config/common_path.shexport LC_ALL=C# For now, don't include any of the optional dependenices of the main# librispeech recipe

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

НАСТРОЙКА ОКРУЖЕНИЯ ДЛЯ KENLM

Чтобы kenlm также был доступен из вашей рабочей директории, нужно определить до него путь. Можно отдельно выполнять эту строку в командной строке или прописать в path.sh:

export PATH=$PATH:/path/to/your/kenlm/build/bin # Здесь указываете путь до вашего kenlm

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

export PATH=$PATH:/path/to/your/kaldi/src/lmbin

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


Сколько можно настраиваться, давайте уже что-нибудь предметное делать!

КОНФИГУРАЦИЯ СЛОВАРЯ

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

При работе с Kaldi графом называется детерминированный конечный автомат (finite state transducer) в формате openfst. Можно выделить 3 основных графа, с которыми так или иначе приходится иметь дело при обучении и адаптации систем распознавания речи, основанных на Kaldi:
  1. L_disambig.fst граф лексикона, по своей сути фонетический словарь, закодированный в детерминированный конечный автомат.
  2. G.fst граф языковой модели, представляет собой закодированную в детерминированный конечный автомат языковую модель.
  3. HCLG.fst объединение графов лексикона, языковой модели и акустической модели.


Нашей задачей по умолчанию является восстановление графа лексикона (и затем графа языковой модели), который используется vosk-ом при создании итогового графа ./graph/HCLG.fst. Файл с графом HCLG.fst в папке graph поставляется вместе с моделью vosk-model-ru-0.10 по умолчанию.

Итак, для генерации графа лексикона нам нужно создать папку ./data/local/dict, в нее нужно будет добавить несколько файлов:

  1. data/local/dict/lexicon.txt словарь фонетических транскрипций
  2. data/local/dict/extra_questions.txt словарь фонетических вариантов
  3. data/local/dict/nonsilence_phones.txt список значимых фонем
  4. data/local/dict/optional_silence.txt список необязательных обозначений тишины
  5. data/local/dict/silence_phones.txt словарь обозначений тишины


Сейчас подробно разберём, что должно быть в каждом из указанных выше файлов. Начнём со словаря фонетических транскрипций. Словарь фонетических транскрипций был также указан ранее во вводной части. Повторюсь, в таком словаре через пробел указано сначала само слово, а затем поочерёдно фонемы, которые отражают произношение слова. Конкретно в реализации vosk-model-ru можно выделить несколько разновидностей фонем:

  • SIL, GBG неречевые звуки:
    • SIL обозначение тишины
    • GBG обозначение иных любых неречевых звуков
  • a0, e0, i0, безударные гласные
  • a1, e1, i1, ударные гласные
  • bj, dj, fj, мягкие парные согласные
  • c, ch, j, остальные непарные согласные.


Основа для этого словаря поставляется с моделью vosk-model-ru-0.10 в файле ./extra/db/ru.dic. В таком словаре через пробел указано сначала само слово, а затем поочерёдно фонемы, которые отражают произношение слова. Кроме непосредственного содержания этого словаря надо добавить две строки в начало ru.dic: !SIL и [unk]. Начало файла будет следующее:

./data/local/dict/lexicon.txt
!SIL SIL[unk] GBGа a0а a1а-а a0 a1а-а-а a0 a0 a1

Весь дальнейший файл аналогичен ./extra/db/ru.dic, добавлены только две строчки сверху. Изменённый файл нужно сохранить в ./data/local/dict/lexicon.txt.

Затем нужно определить файл extra_questions.txt, который описывает схожести среди разных фонем. Его нужно оформить следующим образом:

./data/local/dict/extra_questions.txt
a0 a1 b bj c ch d dj e0 e1 f fj g gj h hj i0 i1 j k kj l lj m mj n nj o0 o1 p pj r rj s sch sh sj t tj u0 u1 v vj y0 y1 z zh zjSIL GBG

Также нужно определить другие файлы, описывающие различные фонемы и категории, к которым эти фонемы относятся. ./data/local/dict/nonsilence_phones.txt сформирован на основе файла ./graph/phones.txt, но убрана нумерация после пробела и убраны постфиксы у фонем. С помощью этих же фонем описаны все слова (кроме !SIL и [unk]) в lexicon.txt, то есть это наш основной инструмент по описанию обыкновенных русскоязычных слов с точки зрения их произношения. После того как провели сортировку и убрали дубликаты, у нас получается файл ./data/local/dict/nonsilence_phones.txt, первые пять строк которого указаны ниже:

./data/local/dict/nonsilence_phones.txt
a0a1bbjc

Ну и наконец определяем наши мусорные звуки и звук тишины.

./data/local/dict/optional_silence.txt
SIL

./data/local/dict/silence_phones.txt
SILGBG

Следует обратить особое внимание на то, чтобы все строки были однообразно оформлены, чтобы были Linux-овские переносы строк "\n", чтобы все файлы были в кодировке UTF-8. После шагов, обозначенных выше, мы наконец можем выполнять шаги по адаптации нашей модели.


Читающий эту статью, кот и файлы для генерации графа L_disambig.fst


МОДИФИКАЦИЯ СЛОВАРЯ

На этом этапе нам нужно дополнить наш словарь транскрипций другими наименованиями. Сделать это можно, вписав дополнительные строки со словами и их транскрипциями и упорядочив словарь. Транскрипции можно написать вручную, проанализировав те закономерности, которые присутствуют в словаре, но когда новых слов очень много, то это не представляется возможным. Поэтому на подмогу приходит пакет russian_g2p_neuro. Устанавливать и пользоваться данным пакетом предельно просто, для этого скачайте пакет в вашу директорию с сторонними модулями:

git clone https://github.com/DinoTheDinosaur/russian_g2p_neuro.gitcd russian_g2p_neuro/python setup.py install

Этот модуль предобучен на ru.dic, поэтому он формирует новый словарь по образу и подобию изначального словаря для vosk-model-ru-0.10. Чтобы сгенерировать новые транскрипции для списка слов достаточно запустить команду:

generate_transcriptions extra/db/input.txt extra/db/output.dict

В input.txt перечислены в любом виде слова на кириллице (в том числе целые тексты с повторениями), а в output.dict формируется список всех этих слов с соответствующими транскрипциями. Результат output.dict можно совместить с данными из lexicon.txt и сформировать новый расширенный словарь:

mv data/local/dict/lexicon.txt extra/db/lexicon_old.txtcat extra/db/lexicon_old.txt extra/db/output.dict | sort | uniq > data/local/dict/lexicon.txt


ЗАМЕНА СЛОВАРЯ

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

Шаги по установке и использованию те же самые:

git clone https://github.com/DinoTheDinosaur/russian_g2p_neuro.gitcd russian_g2p_neuro/python setup.py installcd /path/to/your_asr_project/generate_transcriptions extra/db/input.txt extra/db/output.dict

Однако последний шаг отличается:

mv data/local/dict/lexicon.txt extra/db/lexicon_old.txtsed s/^/!SIL SIL\n[unk] GBG\n/ extra/db/output.dict > data/local/dict/lexicon.txt

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

ФОРМИРОВАНИЕ ГРАФА ЛЕКСИКОНА


Это не граф, это кот

Когда все файлы корректно сформированы, директория наконец-то готова к запуску скрипта utils/prepare_lang.sh из корневой директории вашего проекта по адаптации. Запуск данного скрипта создаст нужный нам граф лексикона под названием L_disambig.fst

utils/prepare_lang.sh --phone-symbol-table graph/phones.txt data/local/dict "[unk]" data/tmp/ data/dict/

Если при запуске скрипт возвращает ошибку, то стоит проверить свои файлы для построения лексикона на правильность. Если не удаётся сформировать данные файлы своими силами, то можно воспользоваться дампом директории локальной dict за дату 04/03/2021 по ссылке в google drive.

По итогу выполнения скрипта можно будет найти нужный нам L_disambig.fst в папке data/dict. После этого можно приступать к модификации и замене языковой модели.

ЗАМЕНА ЯЗКОВОЙ МОДЕЛИ НА N-ГРАММНУЮ

Работу над нашими языковыми моделями будем вести в новой директории ./data/local/lang. Если у вас есть тексты, по аналогии с которыми вы хотите распознавать какие-то фиксированные ключевые фразы, но при этом не хотите распознавать обычную спонтанную речь, то этот пункт для вас. Обычно имеет смысл использовать такой подход, если есть большой массив примеров команд и каких-то кодовых фраз и нет возможности прописать грамматику, которая бы предусмотрела все варианты.

Допустим, что корпус с вашими примерами реплик вы положили в ./extra/db/your.corpus. Начнём с того, что сформируем новую языковую модель с помощью установленного ранее kenlm:

lmplz -o 3 --limit_vocab_file graph/words.txt < extra/db/your.corpus > data/local/lang/lm.arpa

Проясним немного, что в этой команде обозначает каждый из параметров:

  1. -o order, то есть максимальный порядок словесных n-грамм, для которых мы подсчитываем вероятности
  2. --limit_vocab_file словарь, в соответствии с которым фильтруются входные данные. Мы будем использовать этот параметр, если мы не хотим добавлять новых слов в словарь. Если мы не используем этот параметр, то необходимо после построения языковой модели также модифицировать словарь и следовать пунктам, отмеченным
  3. -S 30% не указан, но можно добавить в случае если в системе не хватает памяти на расчёт модели.


По результату выполнения этой команды мы получим файл такого формата:

./data/local/lang/lm.arpa
\data\ngram 1=51515ngram 2=990559ngram 3=3056222\1-grams:-5.968162       [unk]   00       <s>     -2.2876017-1.5350189      </s>    0-2.3502047      а       -0.7859633-3.6979482      банки   -0.42208096-3.9146104      вторую  -0.46862456-2.0171714      в       -1.142168

Языковая модель в формате ARPA построена следующим образом:

  1. Вначале указана шапка \data\, в которой указано количество каждой n-граммы
  2. Затем по очереди указаны все униграммы, биграммы и т.п. с соответствующими им заголовками \1-grams, \2-grams и т.п.
  3. Перечисление n-грамм начинается со значения логарифма вероятности появления последовательности (-3.6979482)
  4. Затем через знак табуляции указана сама последовательность (униграмма банки)
  5. Через ещё один знак табуляции так называемый backoff weight (-0.42208096), который позволяет высчитывать вероятности для последовательностей, которые явным образом не представлены в языковой модели
  6. Заканчивается файл ARPA меткой \end\


Когда у нас готова наша языковая модель, нужно заменить все "&ltunk&gt" обозначения на "[unk]":

sed -i "s/<unk>/[unk]/g" data/local/lang/lm.arpa

Ну и наконец, когда у нас есть готовая ARPA модель, мы можем сгенерировать новый граф языковой модели G.fst и таким образом подготовиться к итоговому объединению всех результатов в HCLG.fst:

arpa2fst --disambig-symbol=#0 --read-symbol-table=data/dict/words.txt data/local/lang/lm.arpa graph/G.fst

В результате выполнения последней команды рядом с графом по умолчанию HCLG.fst мы положили новый граф языковой модели G.fst. Следующим и последним шагом мы генерируем новый итоговый граф HCLG.fst с помощью нового графа языковой модели G.fst.

МОДИФИКАЦИЯ N-ГРАММНОЙ ЯЗКОВОЙ МОДЕЛИ

Когда мы хотим распознавать спонтанную речь, и при этом добавить какие-то необычные речевые конструкции, то можно расширить нашу языковую модель. Благо, вместе с моделью vosk-model-ru-0.10 поставляются сжатые языковые модели в формате ARPA ./extra/db/ru-small.lm.gz и ./extra/db/ru.lm.gz, которые участвовали в формировании модели vosk-model-ru-0.10.

Аналогично предыдущему пункту, мы генерируем нашу новую lm.arpa и заменяем в ней символы "&ltunk&gt":

lmplz -o 4 --limit_vocab_file graph/words.txt < extra/db/your.corpus > data/local/lang/lm.arpased -i 's/<unk>/[unk]/g' data/local/lang/lm.arpa

Обратим ваше внимание, что здесь мы используем другое максимальный порядок n-грамм (параметр -o). Это мы делаем, чтобы продемонстрировать то, как можно объединить две языковых модели в одну, а объединять можно языковые модели только одинакового порядка. Рассмотрим те модели, которые мы имеем на данный момент:

  1. ./extra/db/ru-small.lm.gz 3-граммная ЯМ
  2. ./extra/db/ru.lm.gz 4-граммная ЯМ


Как вы могли догадаться, мы для примера будем объединять нашу модель с большой языковой моделью ru.lm. Для объединения языковых моделей порядка 4 можно воспользоваться следующим кодом merge_lms.py. Если же вы будете объединять свою модель порядка 3 с моделью ru-small.lm, то можно воспользоваться кодом, представленным в данной статье Kaldi ASR: Extending the ASpIRE model в пункте под названием Merging the input files.

Перед использованием извлечём архив с моделью:

gunzip /path/to/your/vosk-model-ru-0.10/extra/db/ru.lm.gz

Использование merge_lms.py из корневой директории проекта:

python utils/merge_lms.py /path/to/your/vosk-model-ru-0.10/extra/db/ru.lm data/local/lang/lm.arpa data/local/lang/lm_joint.arpa

Теперь результат объединения можно конвертировать в граф с помощью команды arpa2fst:

arpa2fst --disambig-symbol=#0 --read-symbol-table=data/dict/words.txt data/local/lang/lm_joint.arpa graph/G.fst

Аналогично предыдущему пункту, G.fst готов, остался последний шаг генерация HCLG.fst.


Братья L_disambig.fst и G.fst

ЗАМЕНА ЯЗКОВОЙ МОДЕЛИ НА ГРАММАТИКУ

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

./graph/G.txt
0 1 [unk] [unk]0 1 да да0 1 нет нет1 0.0

Эта грамматика служит способом выявления конкретных речевых событий команд и распознаёт только 3 команды:

  1. Слово да
  2. Слово нет
  3. Иное слово


События эти равновероятны, и все могут повторяться только один раз. Это пример очень простой грамматики, однако с помощью этого подхода можно задавать куда более сложные структуры. У конкретно такой грамматики 0 является начальной вершиной графа, 1 конечной, но могут быть также промежуточные вершины, может быть несколько конечных состояний, и также можно определять вероятности каждого перехода. Этот граф определяет переходы из начального состояния в конечное по нескольким возможным равновероятным ребрам: [unk], да и нет.

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

fstcompile --isymbols=data/dict/words.txt --osymbols=data/dict/words.txt --keep_isymbols=false --keep_osymbols=false G.txt | fstarcsort --sort_type=ilabel > G.fst

Ура! Теперь и с помощью этого последнего способа мы смогли сгенерировать тот же самый G.fst. Осталось совсем чуть-чуть.

ФОРМИРОВАНИЕ ИТОГОВОГО ГРАФА

Наконец-то мы можем приступить к финальному и самому ответственному моменту: к генерации итогового графа. Делается это ровно одной строкой:

utils/mkgraph.sh --self-loop-scale 1.0 data/lang/ am/ graph/

Теперь ваше персонализированное распознавание речи готово! Достаточно лишь сослаться на вашу рабочую директорию при инициализации модели vosk-а:

from vosk import Modelmodel = Model("/path/to/your_asr_project/")

И далее уже в интерфейсе vosk-а реализовывать распознавание.


Вы заслужили

ПРОДОЛЖЕНИЕ СЛЕДУЕТ...

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

Все, что вы хотели знать про диалоговый UXUI в проектировании чат-ботов

21.05.2021 20:16:58 | Автор: admin

Читайте в статье: что такое диалоговый UX/UI и какего создавать, а также полезные лайфхаки при проектировании сценария длячат-бота.

В марте 2021 годааналитики Voicebot провели опрос300 маркетологов и узнали, что они думают про голосовых помощников. Оказалось, что более 60% специалистов уверены в пользе голосовых ассистентов длямаркетинга. Виртуальные помощники и чат-боты больше не новинка и не пустой повод дляхайпав новостях. Бизнесактивно использует разговорные технологии дляэффективной коммуникации спользователями, дляпрямых продаж и создания прочных связей сбудущими и настоящими клиентами. И мы в Just AI уверены, что в будущем эта тенденция будет толькорасти.

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

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

Для новичков. Что такое диалоговый UX и в чем его отличие отдиалогового UI?

Начнем спростого: UX это user experience или опыт, который получает пользователь в ходе его взаимодействия синтерфейсом сервиса, продукта или услуги. UI это user interface, пользовательский интерфейсили то, что мы привыкли называть дизайном.

Идем дальше. Диалоговый UX это опыт пользователя, который позволяет ему общаться сботом, свиртуальными помощниками или людьми. К нему относятся: общение сголосовыми помощниками, игра в голосовую игру, голосовое управление автомобилем, голосовая команда в поисковую строку.

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

В рамках диалогового UI мы рассматриваем два условных типа интерфейсов: голосовой и разговорный. Кажется, что это синонимы, но не все такпросто. Под разговорным интерфейсом или Conversational User Interface (CUI) подразумеваются все интерфейсы, скоторыми можно общаться на естественном языке кактекстом, таки голосом.

Соответственно, в понятие CUI входит Voice User Interface (VUI) или голосовой интерфейс. Он предполагает взаимодействие сустройством спомощью голоса.

Так выглядит схема диалогового интерфейсаТак выглядит схема диалогового интерфейса

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

Закрепим. Итак, Алиса в Яндекс.Станции это VUI, а в смартфоне, где сней можно говорить голосом и чатиться CUI. А все вместе это диалоговый UI.

Кто создает диалоговый UX и UI при проектировании чат-ботов

Созданием диалогового UХ и UI занимается отдельный специалист. Он разрабатывает диалоговый пользовательский интерфейс, продумывая пользовательский опыт.В Just AI мы называем такого специалиста дизайнер разговорных интерфейсов.

Но в русском языке точный термин до сих пор не закрепился. Поэтому можно встретить разные переводы. Так, на HH.ru мы встретили 17 разных названий вакансий: дизайнер диалогов, диалоговый редактор, digital-лингвист, voice UX designer, диалог-дизайнер, сценарист чат-бота и такдалее. Подробности о нашем исследовании смотрите в вебинаре Создатели разговорных интерфейсов: кто они и чем занимаются?. На нем мы рассказали, каксделать так, чтобы специалисты и компании нашли друг друга.

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

Собрали основные термины из этой статьи. Сохраняйте себе, чтобы не потерятьСобрали основные термины из этой статьи. Сохраняйте себе, чтобы не потерять

Для продвинутых. Какразработать диалоговый UX/UI

Шаг 1. Узнайте, подходит ли разговорный интерфейсдляваших задач.

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

Чек-лист диалогового UX/UI

  • Ваш вопросможно решить только при участии человека.

  • В качестве формата диалога подойдет вопрос-ответ без дополнительных уточнений.

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

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

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

  • Задачу можно выполнить, одновременно делая другие дела.

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

  • Пользователю комфортно говорить или писать о теме задачи.

Отмечайте в чек-листе, какие пункты соответствуют вашей задачеОтмечайте в чек-листе, какие пункты соответствуют вашей задаче

Обратите внимание, что голосовой интерфейсможет не подойти в следующих ситуациях и пространствах:

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

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

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

  • В случаях, когда речь идет о чем-то личном. Если в переписке счат-ботом необходимо сообщить персональные данные или личные сведения, то голосовой интерфейсдлятакого не подойдет.

Если голосовой интерфейс не подходит, возможно, подойдет текстовыйЕсли голосовой интерфейс не подходит, возможно, подойдет текстовый

Шаг 2. Узнайте все о пользователе

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

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

  • Кто ваши пользователи?

  • Что хотят сделать? Какую проблему хотят решить?

  • Какони делают это сейчас?

  • Какие слова или фразы они используют, говоря о задаче?

  • Каков контекст, обстоятельства этих задач или проблем пользователей?

Перед разработкой сценария задайте себе эти вопросы о пользователяхПеред разработкой сценария задайте себе эти вопросы о пользователях

Продумайте tone of voice то, какую речь будет использовать ботили ассистент при общении спользователем. Если это чат-бот, какон обращается кклиенту на ты или на вы? Использует ли он профессиональные термины? Умеет ли общаться на отвлеченные темы и шутить,какботКвик?

Tone of voice основывается на стратегии поведения компании в отношении пользователей. Это то, какботбудет разговаривать свашим пользователем. В отрыве отполитики компании ботможет выглядеть очень странно, например, если он слишком шутлив в диалогах, а в компании принято говорить склиентом серьезно и на Вы сбольшой буквы.

Чтобы найти tone of voice, поизучайте ресурсы, на которых сидят пользователи это могут быть Известия, Ревдинский рабочий, Одноклассники, ВКонтакте и такдалее.

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

Ирина Степанова, аналитикразговорных интерфейсов отдела лингвистики в компании Just AI

Сравните сами, какможет отличаться Tone of Voice в сообщениях отразных компаний:

1. Привет, Иван! Посмотри новые тарифы на сайте в разделе Цены! Мы подготовили длятебя классные предложения!

2. Здравствуйте, Иван Иванович. Просим обратить внимание, что с1.06.2021 обновляются Тарифы. Актуальная информация находится в соответствующем разделе.

Тональность диалогов влияет на то, как пользователи воспринимают бота или голосового помощникаТональность диалогов влияет на то, как пользователи воспринимают бота или голосового помощника

При создании диалогов обязательно используйтемаксимы Грайса. Это правила ведения разговора, которые подчиняются принципу кооперации, введенному философом Гербертом Полом Грайсом. Они актуальны и дляголосового ассистента сискусственным интеллектом, и дляпростого бота в Facebook Messenger.

Четыре максимы помогают сделать диалог бота спользователем наиболее человечным и эффективным.

Максима качества информации:

  • не говори того, что считаешь ложным;

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

Максима количества информации:

  • изложи не меньше информации, чем требуется;

  • изложи не больше информации, чем требуется.

Максима релевантности:

  • не отходи оттемы.

Максима ясности:

  • будь последовательным:

  • избегай неясности;

  • избегай двусмысленности;

  • будь краток;

  • будь систематичен.

В кратком изложении они описаны на картинке.

Эти принципы помогут сделать диалог бота с пользователем эффективнееЭти принципы помогут сделать диалог бота с пользователем эффективнее

Шаг 3. Спроектируйте диалог

Создание сценария чат-бота стоит начать со схемы диалога в голосовом или текстовом каналах (Voice Flow или Chat Flow). Это диаграмма, которая показывает пути, через которые может идти диалог.

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

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

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

Шаг 4. Пропишите текстовый сценарий

Чтобы выполнить этотшаг, берите за основу путь пользователя и выбранный tone of voice. Готовые кусочки диалогов потом пойдут в код и превратятся в реальные реплики бота или ассистента.

Кусочек настоящего текстового сценария чат-бота. Показано, что произойдет, если бот не знает ответаКусочек настоящего текстового сценария чат-бота. Показано, что произойдет, если бот не знает ответа

Шаг 5. Сборка прототипа диалога

Итак, вы узнали самое важное про диалоговый UX и UI, изучили задачу и аудиторию, а также подготовили сценарий. После этого нужно заняться UX-проектированием диалога и собрать его прототип. Это поможет узнать, кактекст будет восприниматься в мессенджере, проверить навигацию и протестировать гипотезы. Такой работой обычной занимается дизайнер-проектировщик UX-дизайнер, специализирующийся на разговорных интерфейсах.

UX-дизайнер не просто рисует красивые кнопки. Он проектирует эмоциональный и чувственный опыт. Неважно приятный, неприятный, напряженный Эти оттенки зависят отпоставленной задачи, а UX-дизайнер спроектирует то, что необходимо.

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

Екатерина Юлина, Head of Product UX, Just AI

Чтобы узнать, какими будут дальнейшие шаги и увидеть практикум сборки прототипа диалога, посмотрите наш вебинар Дизайн голосовых интерфейсов: как, что, где и главное, зачем?. Специалисты Just AI рассказали и показали, каксоздают UX и UI при проектировании чат-бота HR дляпроизводственной компании, а также поделились практическими советами.

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

Подробнее..

Навык для Алисы Проведи стендап

02.06.2021 20:09:34 | Автор: admin

Многие программисты (и не только) хотя бы раз сталкивались с agile-разработкой. Одной важной составляющей agile методов разработки являются ежедневные встречи - стендапы - на которых участники команды за короткое время рассказывают о проделанной и планируемой работе на этот день. У большинства таких встреч есть ведущий, определяющий очередность, а также следящий за временем. Но не в каждой команде есть человек, желающий взять на себя эту роль.

Так почему бы не автоматизировать этот процесс? Идея проста: написать что-нибудь, что может опрашивать каждого человека о рабочем дне. Желательно, чтобы это что-нибудь обладало голосом. Мой выбор пал на Алису, поскольку при помощи станции в переговорке вполне можно провести стендап.

Так я написал навык Проведи стендап.

О навыке

Возможности

  • Добавление/удаление людей из команды. Какой стендап без команды? Для того, чтобы навык знал о составе вашей команды, есть фразы: Добавь в команду ИМЯ [ФАМИЛИЯ], Удали из команды ИМЯ [ФАМИЛИЯ] и дополнительная фраза Добавь в команду человека ИМЯ [ФАМИЛИЯ]. Зачем нужна ещё одна фраза будет описано в разделе про интенты. Достаточно сделать это один раз - информация о команде сохранится.

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

  • Если вы не хотите, чтобы содержание вашего стендапа уходило куда-то неизвестно к кому на сервер, то навык предлагает возможность проигрывать звук тишины во время вашего рассказа. Во время воспроизведения Алиса не воспринимает реплики, поэтому вы можете сообщать о своей работе не беспокоясь о том, что кто-то ещё вас услышит.

  • Навык также может запоминать небольшие фразы. Вы начали своё выступление, у вас появилась какая-то идея или вопрос к коллеге, но эта идея/вопрос не вписывается в регламент стендапа, а вы боитесь, что к концу стендапа эта идея/вопрос вылетит из головы. Для этой ситуации есть команда запомни тему . В конце стендапа Алиса расскажет, кто какие напоминания оставил.

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

Разработка

Сам по себе навык - простой веб сервер с одним обработчиком, куда поступают все запросы с репликами пользователей. Я реализовал этот сервер на питоне через Flask. В качестве базы данных была выбрана PostgreSQL.

Хотелось бы отметить 2 возможности, которые Яндекс предоставляет для навыков:

Интенты

Интент - встроенный NLP от Яндекса, позволяющий обрабатывать реплики пользователя. Используя простой язык, можно описать интенты, присутствие которых в реплике будет проверять Яндекс. С их помощью легко описывать фразы, имеющие один смысл для навыка, например для окончания стендапа: я закончил или у меня на сегодня всё.

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

Авторизация

Яндекс.Диалоги предоставляют возможность авторизации через навык в сторонних сервисах, поддерживающих OAuth. Однако по неизвестным причинам прикрутить авторизацию в гитхабе у меня не получилось, и поддержка не смогла помочь с поиском проблемы. В итоге авторизация в гитхабе проходит через Github App. Чтобы она работала, нужно установить приложение в свой репозиторий, и тогда авторизация и работа с гитхабом идут уже от лица приложения. С трекером Яндекса вышло проще - OAuth авторизация заработала без проблем. Но есть один минус - OAuth авторизация поддерживается максимум только для одного сервиса. (Поэтому, если бы получилось сделать авторизацию для гитхаба, пришлось бы делать костыли для авторизации в трекере).

Итоги

С исполнением такой простой задачи, как вызов участников, Алиса справляется успешно, голосовой интерфейс удачно вписывается в стендапы.

Репозиторий

Навык

Подробнее..

Hi-tech коммуникации, или как мы создаем голосового агента всего на 500 записях

18.03.2021 10:09:11 | Автор: admin
На Хабре не раз и не два писали о голосовых роботах, принципах их работы и задачах, которые они способны решать. Соответственно, общие принципы создания таких роботов (их мы предпочитаем называть цифровыми агентами) понятны многим. И это хорошо, ведь в этой статье мы хотели бы поговорить о быстром обучении роботов.

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

Что должен уметь цифровой агент?


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

  • Определять в речи человека и классифицировать различные ответы, вопросы, возражения.
  • Подбирать подходящий по смыслу ответ или реакцию.
  • Определять кейсы, когда абонент не настроен на диалог и выражает негатив. Определять, когда абонент является ребенком и/или пожилым человеком, и корректно завершать звонок в таких случаях.
  • Определять в речи человека и фиксировать, если необходимо, различные сущности, которые называет абонент: имена, адреса, даты, номера телефонов и т.д.
  • Естественным образом реагировать на попытки перебить со стороны абонента. Так, если собеседник начинает говорить параллельно с ассистентом, последний останавливается, слушает возражение абонента и отрабатывает его. Пример разговора с перебиванием вы найдете чуть ниже.
  • Поддакивать и воспроизводить разные междометия (угу, ага) в уместные моменты, чтобы речь ассистента звучала максимально естественно.
  • Произносить, в зависимости от заданных условий (например, в зависимости от региона проживания конкретного абонента) различные переменные. Допустим, разную стоимость услуги или разные ее составляющие.
  • Воспроизводить на протяжении всего звонка background sound (фоновый шум). Это может быть, например, шум офиса, чтобы создать у абонента ощущение, что он общается с реальным сотрудником колл-центра и многие другие функции, т.к. это не весь важный функционал. Пример ниже.


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

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




Как обучить робота вести диалог


Это весьма интересная задача. Сейчас мы решаем ее совсем не так, как еще пару лет назад. И как раз сейчас нам хватает несколько сотен записей для обучения агента. Но, конечно, пришли к этому мы не сразу пришлось немало поработать.

Как было раньше?


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

  • Необходимость в большом и квалифицированном человеческом ресурсе для создания регулярных выражений.
  • Необходимость постоянного анализа и ручной обработки больших объемов информации для улучшения качества распознавания система, работающая на регулярных выражениях, не способна к самообучению на размеченных данных.
  • Трудность, а иногда полная невозможность сложной классификации.
  • Ошибки, вызванные человеческим фактором.
  • Сроки подготовки регулярных выражений для конкретного голосового ассистента по сравнению с использованием интент-классификатора (NLU).
  • Средний срок подготовки паттернов (анализ диалогов, создание регулярных выражений на его основе, тесты, правки, доработки) для запуска проекта составлял порядка 3-7 дней; после этого для достижения необходимого качества требовалось еще несколько итераций анализа и масштабных доработок.

А что сейчас?


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

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

Сейчас обучение состоит из двух этапов: непосредственно обучение модели на датасете и дальнейшее дообучение в ходе коммерческой эксплуатации. На текущий момент подключение к движку NLU и экспресс-тесты распознавания занимают у нас всего несколько часов.
Качество, которое раньше достигалось неделями скрупулезной работы, сейчас обеспечивается сразу благодаря основной базе. К примеру, в сегменте b2c первоначальный % ошибок при распознавании согласия/отказа на совершение целевого действия уменьшился в 3 раза (с 10% до 2-3% от общего числа кейсов).

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

Для ее решения мы используем специализированный движок NLU Engine. Его основа семантический разбор текста, который поступает от ASR-систем. В ходе распознавания основных объектов распознавания два типа:

Entities (сущности).
Intents (намерения).

Важный момент: у нас не классическая диалоговая система в её традиционном понимании, система на машинном обучении не составляет ответ динамически, ответ определяется скрипт-дизайнерами. Фразы бота строго предопределены, никакой свободы воли для искусственного интеллекта здесь нет, к счастью или сожалению

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

Пример диалога


Ниже сложный HR-скрипт с обозначением intents и entities; распознанные сущности и интенты указаны под каждой репликой абонента и выделены курсивом.

Бот: Здравствуйте! Меня зовут Елена, звоню по поводу вашего резюме. Подскажите, предложение по вакансии актуально для вас?

Абонент: Да, здравствуйте

Intent: hello_confirm=true

Бот: Смотрите, сейчас у нас открыта вакансия специалиста офиса продаж. В обязанности входит консультация абонентов, продажа оборудования и работа с кассой. Оформление идет полностью официальное, белая зарплата, средний уровень дохода N рублей, максимальный уровень практически не ограничен, есть возможность карьерного роста. График 5 рабочих дней с двумя плавающими выходными. Также предоставляем все социальные гарантии, дмс, бонусы и скидки от компании.

Рассмотрите такие условия для себя?

Абонент: А еще раз, откуда вы звоните?

Intent: question =what_company

Бот: Это розничная сеть NNN

Абонент: А какой у вас график?

Intent: question=schedule

Бот: График работы формируется программой автоматически с учетом потока клиентов и нагрузки на офис с двумя плавающими выходными, то есть смены рабочие 6 8 10 12 часов в день могут быть и не более 40 часов в неделю. При этом график составляется заранее на 2 недели, то есть вы заранее знаете ваш график, ваши выходные, и можете уже планировать.

Абонент: Ну хорошо

Intent: confirmation=true

Бот: Давайте тогда сверим с вами анкетные данные
Подскажите, пожалуйста, ваши Фамилию Имя Отчество полностью

Абонент: Гудкова Елена Вячеславовна

Entity: name=true

Бот: Назовите, пожалуйста, вашу дату рождения

Абонент: тринадцатое ноль второе восемьдесят седьмого

Entities:
day=[30]
month==[February]
year==[1987]


Бот: Скажите, номер, на который вам звоню, могу записать как контактный?

Абонент: Да нет, наверное

Intent: confirmation=false

Бот: Подскажите тогда номер, по которому можно к вам обращаться?

Абонент: девятьсот десять восемьсот восемьдесят пятьдесят двадцать пять

Entity: telephone=true

Бот: Подскажите, какое у вас образование?

Абонент: Высшее

Entity: education=higher

Бот: Уточните, вы сейчас обучаетесь на очной основе?

Абонент: Нет

Intent: confirmation=false

Бот: Скажите, у вас гражданство Российской Федерации?

Абонент: Российское гражданство

Entity: citizenship=russia

Бот: Хорошо, это был последний вопрос. Спасибо, что ответили на мои вопросы, сейчас я отправлю анкету на рассмотрение руководителю. Анкеты рассматривают в течение 3 дней, и, в случае положительного решения, с вами свяжутся наши сотрудники. Всего доброго, до свидания.

Хорошо, скрипт разработан, что потом?


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

  • Способ интеграции.
  • Входные / выходные параметры.
  • Подключение SIP транка (если планируется к использованию телефония заказчика).
  • SMS-подключение или подключение к сторонним системам заказчика (CRM, Campaign management).

Что за входные и выходные параметры? Это различные переменные, которые нужны нашему цифровому агенту для инициализации звонка. В первую очередь это, конечно, номер телефона или id абонента, которого мы вызываем. Опционально, в зависимости от конкретного заказчика и проекта, это могут быть и другие данные, например:

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

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

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

К примеру: номер телефона абонента, длительность звонка, название проекта, в рамках которого совершался звонок, итоги звонка и т.д. Еще выходные данные содержат основной результат звонка, которые зависит от итогов диалога по конкретному проекту (самый простой пример результат Согласие если абонент согласился совершить целевое действие или результат Отказ если абонент отказался). Ну и последнее, это технические данные о статусе звонка и различные коды возможных ошибок (звонок состоялся, звонок не состоялся из-за проблем телефонии, звонок не состоялся из-за некорректных входных данных, и т.п.).
Эти данные могут просто попадать в выходные данные из входных (допустим, во входных данных мы передали ассистенту номер абонента, и в выходных данных по итогам звонка ассистент передал нам тот же номер телефона).

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

Ну а потом наступает черед таких этапов, как озвучка скриптов, разработка логики, разработка паттернов, верификация ПО и, наконец передача проекта клиенту.

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

FAQ чатбот COVID-19 спустя год

19.03.2021 18:12:20 | Автор: admin

Предисловие

Около года назад я решил написать чат-бота, который отвечает на часто задаваемые вопросы о COVID-19. В тот момент многим показалось, что моя идея не более чем хайп, который спустя короткий промежуток времени потухнет. Однако, оказалось, что спустя год, данная тема только набирает обороты. В этой статье я расскажу о том, как мы создавали чат-бот для консультации по вопросам COVID-19 по просьбе МВД (BMI) Германии, а также выражу идею о создании аналогичного проекта в России.

Зачем нужен этот чатбот?

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

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

Кейс МВД Германии

С Августа 2020 года я являюсь PhD студентом и научном сотрудником в одном из немецких вузов. В мои обязанности также входит помогать моему научруку проводить курс Question Answering & Chatbots. В рамках курса, студенты совместно с реальными организациями из индустрии делают реальные проекты по чатботам в заданном домене знаний. В этом году, одной из организаций было МВД Германии, которое уже на тот момент имело разработанный простенький FAQ Бот, работающий на немецком языке. Их запрос заключался в разработке функциональности доступа к данным через вопросы на естественном языке (data-driven questions). Например: "Сколько случаев заражений было в прошлый месяц в Берлине"? Фишка в том, что приложение должно было работать не только на немецком, но и на английском, а также определять как большие города (Мюнхен, Гамбург), так и маленькие посёлки и районы.

Результатом работы стало приложение, которое будет в дальнейшем интегрировано в основной функционал чатбота. Демо доступно по этой ссылке: https://coronabot.ins.hs-anhalt.de/

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

Личная инициатива

Идея данной статьи заключается в том, чтобы сподвигнуть заинтересованных людей на создание данного приложения в Российской Федерации в рамках совместного сотрудничества. Ведь без партнёрства со стороны государства или больших компаний идея вряд ли получит дальнейшее развитие. Текущая реализация FAQ чатбота на русском языке всё ещё доступна в телеграме. Вы можете с ним пообщаться и сообщить о багах или пожеланиях в комментариях к данной статье -- это поможет нам в дальнейшей разработке.

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

Спасибо за внимание!

Подробнее..

Яндекс научил Алису принимать платежи за онлайн-покупки. Девочка созрела?

31.05.2021 16:13:25 | Автор: admin

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

А еще "Яндекс" как настоящий родитель. Холит, лелеет и иногда не справляется со своей дочерью. Она показывает характер, замыкается в себе, но, стоит отдать должное, не грубит. И вот настал светлый час, дочка созрела и родители доверили ей первые карманные деньги. Точнее научили ими пользоваться, а вот сами деньги, конечно, "Алиса" будет брать у покупателей. Это хоть и робкий, но серьезный шаг. Учитывая, что "Яндекс" изо всех сил вытащить свой Маркет на передовую, новая функция может ему в этом помощь. В будущем.

Что добавили и как работает?

Компания заявила, что меню голосового помощника впервые дополнилось функцией покупки. Пока речь идет только о книгах и совместном проекте "Яндекса" и "ЛитРес". Выглядит все так: пользователь должен подать голосовую команду "Алиса, купи эту книгу" или "Оплати "ЛитРес". Сама "Алиса" провести платеж не сможет. Уверены, к счастью. После пользовательского запроса она отправляет push-уведомление для подтверждения платежа. Работать вся эта "магия" должна на Яндекс.Станции, Станции Мини и Станции Макс.

"ЛитРес" рад сотрудничеству, хотя и без него у компании все отлично. По итогам прошлого года емкость рынка аудиокниг в России выросла на 44%. При этом навыком "Аудиокниги ЛитРес" с момента его бета-тестирования воспольховался каждый десятый владелец станции от "Яндекс", а это более 100 000 человек.

Ради чего это все?

Следующим этапом "Алису" хотят научить давать рекомендации о том какую книгу лучше всего купить. Думаем, что это отличная возможность для развитие еще одного рекламного канала. Только представьте, умные устройства смогут таргетироваться на пользователей и нативно (хотя кто его знает) рассказывать им о товарах, которые решат продвигать сами продавцы.

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

Пока что все это выглядит как робкий и неуверенный шаг. Яндекс словно и сам переживает, что доверил Алисе право распоряжаться покупками клиентов. Но без этого никуда. И очевидно, что свой куш компания все равно сорвет. Как заявляет сам "Яндекс" в январе-июле 2020 года продажи портативной акустики и "умных" колонок в Россиивырослина 31% до 1,3 млн штук. Как минимум, владельцы станций - это уже немаленькая аудитория говорящего маркетплейса.

Правда продаётся?

Мало ли что говорит официальная статистика. Мы решили проверить как дела с продажами умных устройств Яндекса обстоят на самом деле в 2021 году. С помощью сервиса внешней аналитики маркетплейсов SellerFox мы собрали данные о спросе и выручке всех моделей Яндекс.Станции с января по мая этого года. А вдруг умные колонки и вовсе не покупают, а навыки "Алисы" лишь способ для привлечения внимания?

На Wildberries за 5 месяцев было продано более 8 тысяч колонок. Самые популярные модели - версии Мини. Видимо на это влияет низкая стоимость устройств. Общее количество продаж таких колонок всех цветов 3 341 штук за первые пять месяцев 2021 года. Станция.Макси - самая дорогая модель колонки от Яндекса и самая непопулярная. По крайней мере, на Wb.

Объем продаж, выручки и средняя стоимость товаров на маркептлейсе Wildberries с 01.01 - 31.05.2021, данные сервиса аналитики SellerFoxОбъем продаж, выручки и средняя стоимость товаров на маркептлейсе Wildberries с 01.01 - 31.05.2021, данные сервиса аналитики SellerFox

На Ozon устройства Яндекс с голосовыми помощниками продавались в первом полугодии гораздо веселее. С января по май покупатели заказали здесь больше 22 000 колонок. Тут в топ тоже выбились "Мини". Далеко в отстающих их старшие братья. А вот максимально продвинутая колонка "Макси" продалась за первые 5 месяцев года вообще в 7 раз хуже лидера.

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

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

Подробнее..

Алиса обучает английскому

04.05.2021 12:13:46 | Автор: admin

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

Занятия с использованием Алисы проводились в студии английского языка ABC Friends (ссылка на их группу в VK). Вот несколько фото.

И пара коротких видеороликов. В первом - дети играют с навыком Алисы "Русская загадка английскаяразгадка", а во втором - с навыком "Угадайцветок".

Кстати, в Яндексе также отметили эти (и другие) навыки Алисы -- недавно в их Инстаграме появилась заметка на эту тему:

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

На сегодня это всё. Другие материалы следуют. Кому подобное читать интересно - подписывайтесь на уведомления о новых публикациях. Подписаться можно на этом сайте (кнопка Подписаться внизу), или на Telegram-канал IT Туториал Захар, или на одноимённое сообщество в VK, или Twitter @mikezaharov.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru