Привет всем! Недавно я познакомился с сервисом создания музыки Suno (о котором было много публикаций на Хабре, в том числе здесь, здесь и здесь). Я был впечатлен качеством сгенерированных треков и тем, что она могёт на русском языке. Это натолкнуло меня на мысль: почему бы не объединить Suno с Алисой, чтобы Алису можно было не только попросить что-то сыграть, но также придумать, что она сыграет. Так родилась идея создания навыка для Алисы.
Поскольку у навыка ограниченное время на ответ, а процесс генерации трека занимает некоторое время, нужно как то запросить у Алисы проигрывание трека, уже после завершения генерации. Это, например, можно сделать из локальной сети с помощью расширения для Node-Red под названием node-red-contrib-yandex-station-management. Это расширение позволяет выполнять команды на умной колонке из локальной сети, произносить фразы и многое другое, в том числе воспроизвести звук, сохраненный в ресурсах навыка.
На видео можно посмотреть пример взаимодействия с навыком, в котором Алиса придумывает песню про Хабр:
Алгоритм работы
Пользователь запрашивает у Алисы (через сценарий или активацию навыка) придумать песню.
Алиса отправляет запрос в Яндекс.
Яндекс передает запрос нашему навыку (приложению на Python) на сервере.
Приложение связывается с suno.com, генерирует песню и скачивает ее.
Приложение загружает скачанную песню в хранилище ресурсов навыка.
Приложение публикует сообщение в MQTT-топик с ссылкой на аудио-ресурс.
Сервер в домашней сети подписанный на MQTT-топик, обнаруживает новое сообщение и с помощью плагина для Node-Red отправляет команду умной колонке для воспроизведения аудиофайла из ресурсов.
Если вас заинтересовало, как настроить это для себя, ниже инструкция.
Подготовка
Нам понадобятся:
Сервер, привязанный к домену с действующим SSL-сертификатом. Самоподписанный сертификат не подойдет.
Сервер в одной локальной сети с умной колонкой.
MQTT сервер, который будет доступен как из локальной сети, так и с сервера с навыком (например, расположенный на сервере с навыком). Он понадобится для того чтобы сообщить серверу в локальной сети, что композиция сгенерирована и успешно загружена в ресурсы навыка.
Создать новый диалог. Инструкции по созданию диалогов можно почитать тут, тут, тут, тут.
Привязать диалог к вашему серверу
Установка навыка на сервер
git clone https://github.com/guinmoon/alice_suno.git
cd alice_suno
pip install -r reuirements.txt
Конфигурация
Настроить сервер взаимодействия с навыком.
Ниже пример конфигурации 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/
Скопировать файл
config_sample.py
вconfig.py
и указать свои параметрыАвторизоваться в Suno.com и получить Cookie, например с помощью режима отладки браузера:
Установите и настройте сервер MQTT. Я использовал docker-compose для этого. Файл Compose можно найти в репозитории проекта.
Запуск
python3 alice_suno.py
Если все настроено правильно, при открытии вкладки "Отладка" в консоли тестирования навыка вы должны увидеть сообщение "Привет, я Суно". При отправке любого текста навык должен ответить "Придумываю песню". После создания трека он должен появиться в директории output
, а в MQTT-топике Suno должна появиться команда для его воспроизведения.
Осталось настроить клиент в локальной сети
Конфигурация клиента в локальной сети
Нам понадобится:
Установка:
Импортируйте файл
alice_suno.json
в Node-Red и настройте узел взаимодействия с умной колонкой. Для аторизации узла требуется oAuthToken одного из сервисов Yandex. У меня расширение само получило токен из меню настроек. Если с получением токена возникли проблемы можно прочитать тут.Проверьте работоспособность, отправив любую фразу, убедившись, что Алиса ее произнесла.
Укажите в настройках MQTT-узела адрес вашего сервера.
После импорта json файла, поток должен выглядеть примерно так:
Все готово, можно просить Алису придумать песню.
Пример вывода при правильной работе:
======== 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 минуты) скажет "Песня сгенерировалась, скачивание". Затем, спустя некоторое время, трек будет воспроизведен.