- PVSM.RU - https://www.pvsm.ru -
Вы уже видели, что вытворяет нейросеть Порфирьевич [1]? Она дописывает текст к любой вашей фразе. И действительно забавные штуки получаются, потому что обучена она на книгах Достоевского, Толстого, Пушкина, Булгакова, Гоголя и Пелевина.
«Озвучить все это дело голосом Левитана — получился бы отличный заменитель гугловского ассистента к новогоднему застолью...» — подумал я. И решил не откладывать это мероприятие на посленовогогода (а то ведь сами понимаете).
Под катом — весь процесс создания опенсорсного голосового ассистента Порфирьевич [2] на исключительно опенсорсном фреймворке Aimybox [3], и его запуск вместо штатного Google ассистента. Ну и заодно Алису потроллить можно [4].
Если хочется сразу попробовать все это в деле, то можно установить последний релиз отсюда [5]
На хабре недавно вышла статья [1], в которой рассказывается про то, как Михаил Гранкин научил нейросеть GPT-2 [6] дописывать «осмысленные» тексты к любой фразе. Получилось забавно. Вдобавок, доступ к нейросети открыт через обычный HTTP API.
Идем на сайт [7], через который можно делать запросы к Порфирьевичу, открываем инспектор и смотрим, куда летят запросы и какого формата.
Лимитов на этом API нет, но разработчик все же рекомендует [8] скачать модель Порфирьевича и развернуть на своем сервере.
API Порфирьевича у нас есть! Теперь нужно было запилить собственно голосовое приложение для смартфонов, которое бы распознавало и синтезировало речь.
Отличным решением для этого является открытый фреймворк Aimbox [3], про который уже писали на Хабре тут [9] и тут [10]. Он позволяет быстро создать голосовое приложение или встроить голосовые функции в уже работающий проект. Заодно уже есть красивый GUI [11], который можно кастомизировать.
Можно склонировть к себе сэмпловое приложение [12] и на его базе создать проект.
Кстати, недавно появилась первая версия iOS SDK [13], так что все то же самое можно повторить и для iOS.
Aimybox умеет работать с любым диалоговым движком, например Aimylogic, Rasa или Dialogflow [14], и в том числе позволяет реализовать подключение к любому другому. В нашем случае нужно напрямую слать запросы на API Порфирьевича и парсить ответы. Для этого необходимо всего ничего — написать соответствующие классы Request [15], Response [16] и реализацию самого DialogAPI [17], которая собственно шлет запросы и парсит ответы.
На любом Андроид-девайсе из коробки работает бесплатное распознавание и синтез речи от Google, так что за это можно было не волноваться. Вот только голос, конечно, хотелось поменять на что-то более подходящее литературному слогу Порфирьевича…
Раньше у Яндекс Speechkit-a (облачного решения для распознавания и синтеза речи) был замечательный голос «Левитан», как нельзя лучше подходящий к нашему проекту. Сейчас все переехало в Яндекс Облако, все стало платным (без всяких пробных 10к запросов), поэтому пришлось искать альтернативы.
Есть такой прекрасный сервис для тестирования навыков для Алисы — station.aimylogic.com [18]. На нем можно выбрать голос, которым синтезируются ответы и потестировать свой навык прямо в браузере. Смотрим в его API и находим endpoint, на который идут запросы на синтез речи
Тут видно, что если подставить в этом URL в параметр speaker значение levitan, то можно получить желаемый результат. Это нам и нужно!
Собственно, в классе PorfirResponse [16] как раз и происходит подстановка этого URL-а с нужными параметрами для того, чтобы заставить синтезатор речи просто проиграть сгенерированный mp3 вместо того, чтобы произносить текст ответа от Порфирьевича.
Запускать нашего голосового Порфирьевича можно просто открыв приложение и тапнув по кнопке микрофона. Но куда приятнее запускать его вместо штатного гугловского ассистента, потому что многие смартфоны имеют встроенную поддержку ассистента (например, на моем Oneplus 7 можно зажать кнопку включения, чтобы активировать ассистента с любого экрана).
Для этого нужно лишь прописать в AndroidManifest [19] еще один интент-фильтр android.intent.action.ASSIST, проставить флаг android:launchMode=«singleTop» и в MainActivity [20] реализовать метод onNewIntent, в котором запускать распознавание речи, когда приложение вызывается в режиме ассистента.
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
if (intent?.action == Intent.ACTION_ASSIST) {
val aimybox = (application as PorfirApplication).aimybox
val channel = aimybox.stateChannel.openSubscription()
launch {
channel.consume {
aimybox.startRecognition()
}
}.invokeOnCompletion { channel.cancel() }
}
}
В настройках смартфона нужно выбрать Порфирьевича в качестве ассистента по умолчанию. Настройки -> Приложения -> Приложения по умолчанию
В файлах styles.xml [21] и strings.xml [22] можно изменить цвета стандартного GUI Aimybox и заодно указать стартовую фразу, которая будет отображаться на экране при запуске нашего ассистента.
Собственно все! После запуска можно наблюдать вот такие перлы
Если положить рядом другой смартфон с Яндекс Алисой и запустить на ней болталку, то можно получить местами «вменяемый» диалог двух не вполне здоровых людей
Вот такие идеи приходят пока в голову
Если у вас есть идеи получше или нашли багу — то велком в Github [23], где и лежит теперь весь код проекта. Также можно поконтрибьютить (код пописать).
Автор: Дмитрий Че
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android-development/341617
Ссылки в тексте:
[1] нейросеть Порфирьевич: https://habr.com/ru/news/t/482174/
[2] опенсорсного голосового ассистента Порфирьевич: https://github.com/morfeusys/porfir
[3] опенсорсном фреймворке Aimybox: https://github.com/just-ai/aimybox-android-assistant
[4] Алису потроллить можно: https://youtu.be/4wVgmXiQjZc
[5] отсюда: https://github.com/morfeusys/porfir/releases
[6] GPT-2: https://habr.com/ru/post/440564/
[7] сайт: https://text.skynet.center/
[8] рекомендует: https://github.com/mgrankin/ru_transformers/issues/8
[9] тут: https://habr.com/ru/company/just_ai/blog/470259/
[10] тут: https://habr.com/ru/company/just_ai/blog/479554/
[11] красивый GUI: https://help.aimybox.com/en/article/android-ui-components-hvh9vw/
[12] сэмпловое приложение: https://github.com/just-ai/aimybox-android-assistant/tree/master/app
[13] iOS SDK: https://github.com/just-ai/aimybox-ios-sdk
[14] Aimylogic, Rasa или Dialogflow: https://help.aimybox.com/en/article/dialog-api-components-1hm93q3/
[15] Request: https://github.com/morfeusys/porfir/blob/master/app/src/main/java/com/porfir/api/PorfirRequest.kt
[16] Response: https://github.com/morfeusys/porfir/blob/master/app/src/main/java/com/porfir/api/PorfirResponse.kt
[17] реализацию самого DialogAPI: https://github.com/morfeusys/porfir/blob/master/app/src/main/java/com/porfir/api/PorfirDialogApi.kt
[18] station.aimylogic.com: http://station.aimylogic.com
[19] AndroidManifest: https://github.com/morfeusys/porfir/blob/master/app/src/main/AndroidManifest.xml
[20] MainActivity: https://github.com/morfeusys/porfir/blob/master/app/src/main/java/com/porfir/MainActivity.kt
[21] styles.xml: https://github.com/morfeusys/porfir/blob/master/app/src/main/res/values/styles.xml
[22] strings.xml: https://github.com/morfeusys/porfir/blob/master/app/src/main/res/values/strings.xml
[23] велком в Github: https://github.com/morfeusys/porfir/issues
[24] Репозиторий модели Порфирьевича: https://github.com/mgrankin/ru_transformers
[25] Источник: https://habr.com/ru/post/482416/?utm_source=habrahabr&utm_medium=rss&utm_campaign=482416
Нажмите здесь для печати.