Pull to refresh

Заменяем Google Assistant на нейросеть Порфирьевич и троллим Алису

Reading time4 min
Views51K

Вы уже видели, что вытворяет нейросеть Порфирьевич? Она дописывает текст к любой вашей фразе. И действительно забавные штуки получаются, потому что обучена она на книгах Достоевского, Толстого, Пушкина, Булгакова, Гоголя и Пелевина.

«Озвучить все это дело голосом Левитана — получился бы отличный заменитель гугловского ассистента к новогоднему застолью...» — подумал я. И решил не откладывать это мероприятие на посленовогогода (а то ведь сами понимаете).

Под катом — весь процесс создания опенсорсного голосового ассистента Порфирьевич на исключительно опенсорсном фреймворке Aimybox, и его запуск вместо штатного Google ассистента. Ну и заодно Алису потроллить можно.

Если хочется сразу попробовать все это в деле, то можно установить последний релиз отсюда

Порфирьевич API


На хабре недавно вышла статья, в которой рассказывается про то, как Михаил Гранкин научил нейросеть GPT-2 дописывать «осмысленные» тексты к любой фразе. Получилось забавно. Вдобавок, доступ к нейросети открыт через обычный HTTP API.

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



Лимитов на этом API нет, но разработчик все же рекомендует скачать модель Порфирьевича и развернуть на своем сервере.


Aimybox SDK


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

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

Можно склонировть к себе сэмпловое приложение и на его базе создать проект.
Кстати, недавно появилась первая версия iOS SDK, так что все то же самое можно повторить и для iOS.
Aimybox умеет работать с любым диалоговым движком, например Aimylogic, Rasa или Dialogflow, и в том числе позволяет реализовать подключение к любому другому. В нашем случае нужно напрямую слать запросы на API Порфирьевича и парсить ответы. Для этого необходимо всего ничего — написать соответствующие классы Request, Response и реализацию самого DialogAPI, которая собственно шлет запросы и парсит ответы.

Распознавание и синтез


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

Голос Левитана


Раньше у Яндекс Speechkit-a (облачного решения для распознавания и синтеза речи) был замечательный голос «Левитан», как нельзя лучше подходящий к нашему проекту. Сейчас все переехало в Яндекс Облако, все стало платным (без всяких пробных 10к запросов), поэтому пришлось искать альтернативы.

Есть такой прекрасный сервис для тестирования навыков для Алисы — station.aimylogic.com. На нем можно выбрать голос, которым синтезируются ответы и потестировать свой навык прямо в браузере. Смотрим в его API и находим endpoint, на который идут запросы на синтез речи



Тут видно, что если подставить в этом URL в параметр speaker значение levitan, то можно получить желаемый результат. Это нам и нужно!

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

Заменяем Google Assistant на Порфирьевича


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

Для этого нужно лишь прописать в AndroidManifest еще один интент-фильтр android.intent.action.ASSIST, проставить флаг android:launchMode=«singleTop» и в MainActivity реализовать метод 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 и strings.xml можно изменить цвета стандартного GUI Aimybox и заодно указать стартовую фразу, которая будет отображаться на экране при запуске нашего ассистента.

Запускаем


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



Если положить рядом другой смартфон с Яндекс Алисой и запустить на ней болталку, то можно получить местами «вменяемый» диалог двух не вполне здоровых людей



Что дальше?


Вот такие идеи приходят пока в голову

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

Если у вас есть идеи получше или нашли багу — то велком в Github, где и лежит теперь весь код проекта. Также можно поконтрибьютить (код пописать).

Полезные ссылки


Tags:
Hubs:
Total votes 31: ↑30 and ↓1+41
Comments22

Articles