Привет! Я Виктор, проектный менеджер в Selectel. Последние 20 лет мое хобби — написание музыки. Выходит с переменным успехом (писать музыку, конечно), но это часть моей жизни. Сначала был Fruity Loops 3, потом Reaper, но душа всегда тянулась к «железу» и новым технологиям.
Под катом — история pet-проекта, который призван упростить жизнь мобильным музыкантам. Либо заставить технических специалистов сказать *meh* («До» малой октавы). Осторожно — внутри нейронки, музыкальное «железо» и плохой код на Python.
Используйте навигацию, если не хотите читать текст полностью:
→ Идея
→ О принципе работы Stem Splitter Bot
→ Что использовали
→ Сколько нужно ресурсов
→ А что дальше?
Идея
В январе 2024 года прошел слух, что вот-вот в AKAI MPC Live появится разделитель на STEMS (акроним от Stereo Masters) — изолированные аудио-дорожки (ударные, голос, бас и прочее). Общественность была взбудоражена: теперь в дороге можно будет разделить трек, сразу его засемплить и стать немного счастливее.
Реальность оказалась суровее. В начале 2024 года компания зарелизила «разделитель» только в свой софт и уже который месяц дает обещания о расширении функциональности. Тогда же я задумался, можно ли такую функцию поместить в Telegram-бота.
UPD. Пока писал статью, AKAI выпустила MPC STEMS для Standalone-решений, но это нельзя назвать бескомпромиссным и универсальным решением.
Для кого
Для пользователей устройств Roland SP-404mk2 (у меня такой), Elektron Digitakt, DirtyWave M8 и прочих. Бот поможет музицировать в дороге и воспроизводить функции, которых в «железе» нет.
Вот, например, как вживую играет новосибирский музыкант Женя PNV
(это лайв: под футболкой рекордер, все в порядке):
Еще ниже — мой походный набор:
Сэмплер Roland SP-404MK2, наушники KZ ZSN Pro, USB-провод и стереопара 6.3-3.5 для подключения к телефону, powerbank на всякий случай.
Зачем, если есть софт в браузере
Есть, но сидеть со смартфона на сайтах типа lalal.ai или vocalremover.org просто неудобно. К тому же у них есть ограничения на длительность и количество треков в бесплатном тарифе.
Скриншот сайта lalal.ai.
Есть решение и для тех, кто не хочет пользоваться веб-версиями, — Koаla Sampler. Хороший софт, но стоит денег (от 450 ₽ единовременно). Многие творят на нем красоту, ведь это уже полноценная студия в кармане.
Как работают STEMS Koаla Sampler.
Зная все это, хотелось сделать «из кармана» проект без дополнительного софта. С этим может помочь Telegram, ведь он априори установлен на большинстве устройств.
Кто-то скажет: «Но ведь и боты уже есть». Тут все проще, чем кажется. На момент первого релиза я просто не встречал таких разработок. Да и хотелось создать pet-проект, разобраться в библиотеках и путях реализации.
О принципе работы Stem Splitter Bot
Telegram-бот принимает на вход любые файлы расширений mp3, ogg, wav, далее — предлагает список действий. Как вы понимаете, простым разделением на дорожки я не ограничился.
Скриншот из Telegram-бота Stem Spitter.
Кстати, на whosampled.com этот трек тоже есть — кто-то уже им вдохновился.
Пробежимся по функциям.
- BPM — позволяет определить скорость (количество ударов в минуту) дорожки. Пригодится, когда в «железе» не реализовано автоопределение BPM.
- Ключ — показывает тональность трека или дорожки. Помогает клавишникам или пользователям, которые используют chroma-режим на сэмплерах, чтобы играть сэмплом вживую.
- MIDI — конвертирует дорожку в midi-файл. Пригодится тем, кто не умеет или не хочет наигрывать что-то самостоятельно, но «снять» ноты нужно. Далее полученный midi вы можете использовать в любом секвенсоре (Fruity Loops, Ableton Live, Reaper) и играться по полной с любыми синтезаторами. Однако ожидать эффекта «Вау!», как и особых хитрых функций, не стоит.
- STEM MP3 или STEM WAV — разделяет трек и высылает пользователю отдельные дорожки в mp3 или wav.
- /bp — калькулятор, который рассчитывает, насколько нужно поменять Pitch при изменении BPM, чтобы сохранить тональность трека. Можно просто ввести команду, дорожка для этого не нужна.
Библиотека Spleeter от Deezer
Если вкратце, то я был в восторге от библиотеки. Пробегусь по ключевым преимуществам.
- Позволяет работать с tensorflow-cpu (работа только на процессоре и памяти). При этом реализация довольно быстрая.
- Интегрируется в бот «на раз-два» (но есть нюансы, про них позже).
- Есть пачка предобученных моделей на две, четыре и пять дорожек.
- Около-продакшн решение: используется в плагинах от iZotope и других.
Почему не demuqs
Библиотека работает, но не подошла мне по нескольким параметрам. Во-первых, она оптимизирована под работу с CUDA-ядрами. Можно использовать опцию работы только на CPU, но это не сильно поможет. Во-вторых — у нее низкая скорость работы: в моем случае на моделях из четырех дорожек demuqs в 10 раз медленнее spleeter. Для бота это критично.
Что еще
- Aiogram — базовая библиотека для тех, кто работает с синхронными вызовами для ботов. Есть немного токсичное сообщество, которое поможет при необходимости.
- Librosa — одна из лучших библиотек для работы с музыкальными файлами. Вдобавок использовали форк (микропроект) Tonal_Fragment и sound_to_midi.
- Ffmpeg — не библиотека, но набор софта и кодеков. Нужен для работы spleeter.
- Tdlib — библиотека для работы с Telegram Local API. Позволяет увеличить допустимый размер файлов, которые мы отправляем в бота, до 2 ГБ.
- Aiosqlite. Sqlite — де-факто стандарт для pet-проектов на Python. Ее асинхронная версия чуть больше подходит для ботов. Для production-решений — выбор не самый оптимальный, но мне просто удобнее работать с Aiosqlite.
Сколько нужно ресурсов
Плюс Spleeter в том, что он может обходиться без GPU. Работает при этом довольно шустро, а в умелых руках с tensorflow-cpu — еще быстрее.
При условии, что я не храню треки пользователей и конечные дорожки, хватит виртуальной машины с достаточно простой конфигурацией.
Конфигурация
- 6 vCPU,
- 12 ГБ RAM + 4 ГБ SWAP,
- сетевой диск на 50 ГБ (чтение — 320, запись — 120 IOPS, 100 МБ/с),
- CentOS 9 Stream.
Однако можно оптимизировать процессы и доработать код. По моим расчетам это позволит снизить потребление до 4 vCPU и 8 ГБ RAM.
А что по цифрам
Сегодня больше «танцую о литературе», чем пишу непосредственно о звуке. Как показывают тесты, бот разделяет дорожки приемлемо для большинства мобильных музыкантов. При желании библиотеку Spleeter можно протестировать или посмотреть исследования. Немного пороемся в статистике:
Статистика использования бота.
Бот распространяется методом сарафанного радио — один раз поделился им в каналах битмейкеров и DIY-музыкантов. Общая численность каналов — около 8 000 человек (на самом деле, около 10 000, но 20-30% аудитории пересекается и активно сидит то в одном, то в другом канале).
Общая аудитория уникальных пользователей с двух ботов — около 250 человек. В обе версии при этом «ходили» всего 37 человек. Итоговая конверсия бота — 3%.
Изначально было предположение, что бота на две дорожки будут использовать чаще, ведь он удобен для мэшапов и забавных ремиксов для соцсетей. Еще помню, как в конце двухтысячных все искали инструменталы для школ вокала в местных ДК и использовали Adobe Audition с его чудесными плагинами. Но время, видимо, прошло.
Однако интересно, что бот на четыре дорожки использует настоящая целевая аудитория — музыканты. У меня есть отзывы живой аудитории — вот топ-причин:
- «Нужно взять кусок мелодического сэмпла и “сотворить магию”»,
- «Хочу взять дорожку вокала и сделать ремикс»,
- «Пытаюсь понять, как «работают» бас или барабаны в треке»,
- «Определить количество реальных слоев (дорожек) в треке»,
- «Быстро определяю тональность, BPM и прочее».
То есть аудитория мобильных DIY-музыкантов просто делает музыку и постоянно учится на разных вещах. И, конечно, использует инструменты в некоммерческих целях.
Внимательный читатель спросит, где split_wav, о котором я упомянул ранее, или скорость работы самого «разделителя». Дам короткую затравку: логирование и оптимизация — моя страсть.
Проблемы
В статье я планировал планировал показать, как проект быстро работает даже на моем плохом коде, на минимуме ресурсов. Однако в ходе подготовки выяснилось, что мне не хватает опыта взаимодействия с логами.
start_time = datetime.datetime.now()функцияdownload_time = (datetime.datetime.now()-start_time).total_seconds()
Код выше отрабатывает, но с aiogram и асинхронным кодом, видимо, нужна своя «черная магия».
Провальная попытка сбора статистики по скорости скачивания трека.
Придется поверить: бот одинаково приемлемо работает на разных VPS и не требователен к быстродействию диска. При использовании HDD- или NVMe-дисков ощутимой разницы нет.
Второе, с чем я не смог совладать, — oversell по памяти при запуске Spleeter и его работе. Это известный топик на Reddit: с базовым ограничением на 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 Premium, но это тоже очень приятно.
Если у вас есть предложения по улучшению Telegram-бота или вы хотите взять мой код и сделать нечто прекрасное (обязательно — без платной подписки), то пишите мне в Telegram — расшарю проект и по возможности добавлю в бота новые функции.
Думаю, что проект будет развиваться по мере появления идей у сообщества. Вся база уже есть.
Делайте музыку, создавайте полезные проекты и делитесь предложениями по улучшению бота в комментариях! До новых встреч.