Привет всем! Недавно я познакомился с сервисом создания музыки Suno (о котором было много публикаций на Хабре, в том числе здесьздесь и здесь). Я был впечатлен качеством сгенерированных треков и тем, что она могёт на русском языке. Это натолкнуло меня на мысль: почему бы не объединить Suno с Алисой, чтобы Алису можно было не только попросить что-то сыграть, но также придумать, что она сыграет. Так родилась идея создания навыка для Алисы.

Поскольку у навыка ограниченное время на ответ, а процесс генерации трека занимает некоторое время, нужно как то запросить у Алисы проигрывание трека, уже после завершения генерации. Это, например, можно сделать из локальной сети с помощью расширения для Node-Red под названием node-red-contrib-yandex-station-management. Это расширение позволяет выполнять команды на умной колонке из локальной сети, произносить фразы и многое другое, в том числе воспроизвести звук, сохраненный в ресурсах навыка.

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

Алгоритм работы

  1. Пользователь запрашивает у Алисы (через сценарий или активацию навыка) придумать песню.

  2. Алиса отправляет запрос в Яндекс.

  3. Яндекс передает запрос нашему навыку (приложению на Python) на сервере.

  4. Приложение связывается с suno.com, генерирует песню и скачивает ее.

  5. Приложение загружает скачанную песню в хранилище ресурсов навыка.

  6. Приложение публикует сообщение в MQTT-топик с ссылкой на аудио-ресурс.

  7. Сервер в домашней сети подписанный на MQTT-топик, обнаруживает новое сообщение и с помощью плагина для Node-Red отправляет команду умной колонке для воспроизведения аудиофайла из ресурсов.

Алгоритм

Если вас заинтересовало, как настроить это для себя, ниже инструкция.

Подготовка

Нам понадобятся:

  • Сервер, привязанный к домену с действующим SSL-сертификатом. Самоподписанный сертификат не подойдет.

  • Сервер в одной локальной сети с умной колонкой.

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

  • Создать новый диалог. Инструкции по созданию диалогов можно почитать туттуттуттут.

  • Привязать диалог к вашему серверу

Установка навыка на сервер

git clone https://github.com/guinmoon/alice_suno.git
cd alice_suno
pip install -r reuirements.txt

Конфигурация

  1. Настроить сервер взаимодействия с навыком.

    Ниже пример конфигурации Nginx, для создания WebHook URL взаимодействия с навыком, с использованием сертификата letsencrypt:

Пример конфигурации Nginx
server {
server_name mydomain.ru;
location /alice-suno/ {
  proxy_pass http://localhost:8080/;
  proxy_set_header Host $http_host;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection upgrade;
  proxy_set_header Accept-Encoding gzip;
}

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mydomain.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mydomain.ru/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
if (host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name mydomain.ru;
return 404; # managed by Certbot
}

В настройках навыка в качестве WebHook URL указываем ваш домен:

https://mydomain.ru/alice-suno/
  1. Скопировать файл config_sample.py в config.py и указать свои параметры

  2. Авторизоваться в Suno.com и получить Cookie, например с помощью режима отладки браузера: 

  3. Установите и настройте сервер MQTT. Я использовал docker-compose для этого. Файл Compose можно найти в репозитории проекта.

Запуск

python3 alice_suno.py

Если все настроено правильно, при открытии вкладки "Отладка" в консоли тестирования навыка вы должны увидеть сообщение "Привет, я Суно". При отправке любого текста навык должен ответить "Придумываю песню". После создания трека он должен появиться в директории output, а в MQTT-топике Suno должна появиться команда для его воспроизведения.

Осталось настроить клиент в локальной сети

Конфигурация клиента в локальной сети

Нам понадобится:

Установка:

  1. Импортируйте файл alice_suno.json в Node-Red и настройте узел взаимодействия с умной колонкой. Для аторизации узла требуется oAuthToken одного из сервисов Yandex. У меня расширение само получило токен из меню настроек. Если с получением токена возникли проблемы можно прочитать тут.

  2. Проверьте работоспособность, отправив любую фразу, убедившись, что Алиса ее произнесла.

  3. Укажите в настройках MQTT-узела адрес вашего сервера.

    После импорта json файла, поток должен выглядеть примерно так:

Поток в node-red

Все готово, можно просить Алису придумать песню.

Пример вывода при правильной работе:

======== Running on http://localhost:8080 ========
(Press CTRL+C to quit)
в стиле хип хоп про блок хабра хабр
5
Waiting for results...
...
['https://audiopipe.suno.ai/?item_id=7375d33b-fc76-4945-8f4f-7bf57a6b8ee2', 'https://audiopipe.suno.ai/?item_id=a3d139a4-e666-4a2c-98e5-168e574ebcb3']
Downloading song... 7375d33b-fc76-4945-8f4f-7bf57a6b8ee2
Send <speaker audio="dialogs-upload/37cbad04-a60e-4a9b-833b-1e47352e5cf5/f9c6753d-cf34-4479-a15a-50e0de651ea4.opus"> to topic suno
UploadedSound(_raw_kwargs={}, id='f9c6753d-cf34-4479-a15a-50e0de651ea4', originalName='suno_7375d33b-fc76-4945-8f4f-7bf57a6b8ee2.mp3', skillId='37cbad04-a60e-4a9b-833b-1e47352e5cf5', size=None, createdAt='2024-05-20T15:23:35.422Z', isProcessed=False, error=None)

Если всё настроено правильно, после ответа "Придумываю песню", Алиса через некоторое время (1-2 минуты) скажет "Песня сгенерировалась, скачивание". Затем, спустя некоторое время, трек будет воспроизведен.

Ссылка на github проекта.