- PVSM.RU - https://www.pvsm.ru -

Привет! Я Виктор, проектный менеджер в Selectel [1]. Последние 20 лет мое хобби — написание музыки. Выходит с переменным успехом (писать музыку, конечно), но это часть моей жизни. Сначала был Fruity Loops 3, потом Reaper, но душа всегда тянулась к «железу» и новым технологиям.
Под катом — история pet-проекта, который призван упростить жизнь мобильным музыкантам. Либо заставить технических специалистов сказать *meh* («До» малой октавы). Осторожно — внутри нейронки, музыкальное «железо» и плохой код на Python.
Используйте навигацию, если не хотите читать текст полностью:
→ Идея [2]
→ О принципе работы Stem Splitter Bot [3]
→ Что использовали [4]
→ Сколько нужно ресурсов [5]
→ А что дальше? [6]
В январе 2024 года прошел слух, что вот-вот в AKAI MPC Live появится разделитель на STEMS [7] (акроним от Stereo Masters) — изолированные аудио-дорожки (ударные, голос, бас и прочее). Общественность была взбудоражена: теперь в дороге можно будет разделить трек, сразу его засемплить и стать немного счастливее.
Реальность оказалась суровее. В начале 2024 года компания зарелизила «разделитель» только в свой софт и уже который месяц дает обещания о расширении функциональности. Тогда же я задумался, можно ли такую функцию поместить в Telegram-бота.
UPD. Пока писал статью, AKAI выпустила MPC STEMS для Standalone-решений, [8] но это нельзя назвать бескомпромиссным и универсальным решением.
Для пользователей устройств Roland SP-404mk2 (у меня такой), Elektron Digitakt, DirtyWave M8 и прочих. Бот поможет музицировать в дороге и воспроизводить функции, которых в «железе» нет.
Вот, например, как вживую играет новосибирский музыкант Женя PNV
(это лайв: под футболкой рекордер, все в порядке):
Еще ниже — мой походный набор:

Сэмплер Roland SP-404MK2, наушники KZ ZSN Pro, USB-провод и стереопара 6.3-3.5 для подключения к телефону, powerbank на всякий случай.
Есть, но сидеть со смартфона на сайтах типа lalal.ai [9] или vocalremover.org [10] просто неудобно. К тому же у них есть ограничения на длительность и количество треков в бесплатном тарифе.

Скриншот сайта lalal.ai [9].
Есть решение и для тех, кто не хочет пользоваться веб-версиями, — Koаla Sampler [11]. Хороший софт, но стоит денег (от 450 ₽ единовременно). Многие творят на нем красоту, ведь это уже полноценная студия в кармане.
Как работают STEMS Koаla Sampler [11].
Зная все это, хотелось сделать «из кармана» проект без дополнительного софта. С этим может помочь Telegram, ведь он априори установлен на большинстве устройств.
Кто-то скажет: «Но ведь и боты уже есть». Тут все проще, чем кажется. На момент первого релиза я просто не встречал таких разработок. Да и хотелось создать pet-проект, разобраться в библиотеках и путях реализации.

Telegram-бот [12] принимает на вход любые файлы расширений mp3, ogg, wav, далее — предлагает список действий. Как вы понимаете, простым разделением на дорожки я не ограничился.

Скриншот из Telegram-бота Stem Spitter [12].
Кстати, на whosampled.com [13] этот трек тоже есть — кто-то уже им вдохновился.
Пробежимся по функциям.
Если вкратце, то я был в восторге от библиотеки [15]. Пробегусь по ключевым преимуществам.
Библиотека работает, но не подошла мне по нескольким параметрам. Во-первых, она оптимизирована под работу с CUDA-ядрами. Можно использовать опцию работы только на CPU, но это не сильно поможет. Во-вторых — у нее низкая скорость работы: в моем случае на моделях из четырех дорожек demuqs в 10 раз медленнее spleeter. Для бота это критично.
Плюс Spleeter в том, что он может обходиться без GPU. Работает при этом довольно шустро, а в умелых руках с tensorflow-cpu — еще быстрее.
При условии, что я не храню треки пользователей и конечные дорожки, хватит виртуальной машины с достаточно простой конфигурацией [25].
Конфигурация
Однако можно оптимизировать процессы и доработать код. По моим расчетам это позволит снизить потребление до 4 vCPU и 8 ГБ RAM.

Сегодня больше «танцую о литературе», чем пишу непосредственно о звуке. Как показывают тесты, бот разделяет дорожки приемлемо для большинства мобильных музыкантов. При желании библиотеку Spleeter можно протестировать или посмотреть исследования. Немного пороемся в статистике:

Статистика использования бота.
Бот распространяется методом сарафанного радио — один раз поделился им в каналах битмейкеров и DIY-музыкантов. Общая численность каналов — около 8 000 человек (на самом деле, около 10 000, но 20-30% аудитории пересекается и активно сидит то в одном, то в другом канале).
Общая аудитория уникальных пользователей с двух ботов — около 250 человек. В обе версии при этом «ходили» всего 37 человек. Итоговая конверсия бота — 3%.
Изначально было предположение, что бота на две дорожки будут использовать чаще, ведь он удобен для мэшапов и забавных ремиксов для соцсетей. Еще помню, как в конце двухтысячных все искали инструменталы для школ вокала в местных ДК и использовали Adobe Audition с его чудесными плагинами. Но время, видимо, прошло.
Однако интересно, что бот на четыре дорожки использует настоящая целевая аудитория — музыканты. У меня есть отзывы живой аудитории — вот топ-причин:
То есть аудитория мобильных DIY-музыкантов просто делает музыку и постоянно учится на разных вещах. И, конечно, использует инструменты в некоммерческих целях.
Внимательный читатель спросит, где split_wav, о котором я упомянул ранее, или скорость работы самого «разделителя». Дам короткую затравку: логирование и оптимизация — моя страсть.
В статье я планировал планировал показать, как проект быстро работает даже на моем плохом коде, на минимуме ресурсов. Однако в ходе подготовки выяснилось, что мне не хватает опыта взаимодействия с логами.
start_time = datetime.datetime.now()
функция
download_time = (datetime.datetime.now()-start_time).total_seconds()
Код выше отрабатывает, но с aiogram и асинхронным кодом, видимо, нужна своя «черная магия».

Провальная попытка сбора статистики по скорости скачивания трека.
Придется поверить: бот одинаково приемлемо работает на разных и не требователен к быстродействию диска. При использовании HDD- или NVMe-дисков ощутимой разницы нет.
Второе, с чем я не смог совладать, — oversell по памяти при запуске Spleeter и его работе. Это известный топик на Reddit [27]: с базовым ограничением на 50% сталкиваются многие. Проблема в том, что при старте и первом запуске Spleeter он забирает чуть более 2 ГБ памяти. Различные методы и советы от коллег не помогли справиться с этим нюансом.
Безошибочное решение — взять больше памяти и добавить swap, что я и сделал. 🙂 Но вы можете поделиться в комментариях советами и возможными решениями — будет интересно почитать! Однако памяти не нужно будет много, если вы потратите время на оптимизацию.
Почему ботов два? Почему бы не уместить все в одну функциональность, если столько ресурсов и не нужно? Возможно, вы все поймете, увидев фрагмент кода:
if name == 'main':
separator = Separator('spleeter:{0}stems'.format(stem_type_default))
executor.start_polling(dp, skip_updates=True)
Если нет, то расскажу вкратце о проблеме. Separator следует запускать в основном блоке программы. Все мои попытки поместить его определение — например, в двух экземплярах — потерпели сокрушительное фиаско. Затем пришло смирение и идея: новые функции можно обкатывать на боте в две дорожки. Какое-никакое A/B-тестирование на реальной аудитории.
Я не знаю. 🙂 Программирование и музыка — мои хобби, тренировка для
Если у вас есть предложения по улучшению Telegram-бота [12] или вы хотите взять мой код и сделать нечто прекрасное (обязательно — без платной подписки), то пишите мне в Telegram [29] — расшарю проект и по возможности добавлю в бота новые функции.
Думаю, что проект будет развиваться по мере появления идей у сообщества. Вся база уже есть.
Делайте музыку, создавайте полезные проекты и делитесь предложениями по улучшению бота в комментариях! До новых встреч.
Автор: Виктор Дёмин
Источник [30]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/392897
Ссылки в тексте:
[1] в Selectel: https://selectel.ru/services/cloud/?utm_source=habr.com&utm_medium=referral&utm_campaign=cloud_article_stem-splitter_250724_content
[2] Идея: #1
[3] О принципе работы Stem Splitter Bot: #2
[4] Что использовали: #3
[5] Сколько нужно ресурсов: #4
[6] А что дальше?: #5
[7] разделитель на STEMS: https://www.akaipro.com/stems
[8] MPC STEMS для Standalone-решений,: https://www.youtube.com/watch?v=KTAQqY7N8z4
[9] lalal.ai: https://www.lalal.ai
[10] vocalremover.org: http://vocalremover.org
[11] Koаla Sampler: https://www.koalasampler.com
[12] Telegram-бот: https://t.me/stemsplitter4bot
[13] whosampled.com: http://whosampled.com
[14] играть сэмплом вживую: https://www.youtube.com/watch?v=lXGnIpHTmV0
[15] от библиотеки: https://github.com/deezer/spleeter/blob/master/spleeter/separator.py
[16] tensorflow-cpu: https://pypi.org/project/tensorflow-cpu/
[17] в плагинах от iZotope: https://www.izotope.com/en/products/rx/features/music-rebalance.html
[18] Aiogram: https://aiogram.dev/
[19] Librosa: https://librosa.org/doc/latest/index.html
[20] Tonal_Fragment: https://github.com/jackmcarthur/musical-key-finder
[21] sound_to_midi: https://github.com/tiagoft/audio_to_midi
[22] Ffmpeg: https://ffmpeg.org/
[23] Tdlib: https://github.com/tdlib/td
[24] Aiosqlite: https://github.com/omnilib/aiosqlite
[25] простой конфигурацией: https://selectel.ru/services/cloud/servers/?utm_source=habr.com&utm_medium=referral&utm_campaign=cloud_article_stem-splitter_250724_content
[26] VPS: https://www.reg.ru/?rlink=reflink-717
[27] известный топик на Reddit: https://www.reddit.com/r/devops/comments/17eg14g/50_cpu_utilization_problems/
[28] мозга: http://www.braintools.ru
[29] в Telegram: http://t.me/@vdiomin
[30] Источник: https://habr.com/ru/companies/selectel/articles/831348/?utm_source=habrahabr&utm_medium=rss&utm_campaign=831348
Нажмите здесь для печати.