Привет! Я Виктор, проектный менеджер в 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 — расшарю проект и по возможности добавлю в бота новые функции.
Думаю, что проект будет развиваться по мере появления идей у сообщества. Вся база уже есть.
Делайте музыку, создавайте полезные проекты и делитесь предложениями по улучшению бота в комментариях! До новых встреч.
Комментарии (10)
softwaresimian Автор
25.07.2024 10:47+3Из-за вашей активности бот прилёг =)
Спасибо! Неожиданно и приятно)
P.S. Он снова работает
zlo1
25.07.2024 10:47+1Мой бот на demucs + yt-dlp: SeparateAudioBot
и за "жирности" запросов, поднял свой экземпляр Telegram Bot API
softwaresimian Автор
25.07.2024 10:47Очень чисто отделяет вокал! Дообучали модель или как-то файнтюнили?
TG Locacl API у меня тоже присутствует - Tdlib =)
ibyteyou
25.07.2024 10:47+3огонь, как раз не получалось больше года поставить сплитер на новый комп))
sfirestar
25.07.2024 10:47+1Вау, статья очень интересная, да и сам бот - то, что надо! Сам совмещаю программирование и написание музыки, поэтому рад, когда вижу подробные инструменты в открытом доступе.
deee
Пожалуй подобный бот нужен для тех, музыкантов, которые через бот захотят и смогут удаленно воспользоваться тем или иным дорогущим или уникальным музыкальным железом и получить «магию».
Какими-нибудь железными Lexicon 960 или Lexicon 480, которые а) давно не выпускаются, б) не увеличиваются в количестве, в) стоят, как чугунный мост.
softwaresimian Автор
Да, было бы здорово =)
Но даже не все движки VST такое тянут и могут - куда уж ботам)
deee
А в чем сложность для бота принять сэмпл (дорожку), через MIDI выставить нужный пресет в железке, проиграть сэмпл (дорожку) через железо без преобразований в аналог - сразу через цифровой AES/EBU, отправить музыканту результат в wav?
Здесь не нужно писать математику софтового ревербератора. Нужен только интерфейс к железу, с которым общается бот.
softwaresimian Автор
Приму в дар железки для опытов)