Как упростить жизнь мобильным музыкантам с помощью бота

Как упростить жизнь мобильным музыкантам с помощью Telegram-бота

Виктор Дёмин Виктор Дёмин Менеджер проектов 24 июля 2024

Рассказываем о pet-проекте для музыкантов. Внутри — выбор подходящих библиотек, обзор решений на рынке и планы по развитию проекта.

Изображение записи

Идея

В январе 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.
Сэмплер Roland SP-404MK2, наушники KZ ZSN Pro, USB-провод и стереопара 6.3-3.5 для подключения к телефону, powerbank на всякий случай.

Зачем, если есть софт в браузере

Есть, но сидеть со смартфона на сайтах типа lalal.ai или vocalremover.org просто неудобно. К тому же у них есть ограничения на длительность и количество треков в бесплатном тарифе.

Скриншот сайта lalal.ai.
Скриншот сайта lalal.ai.

Есть решение и для тех, кто не хочет пользоваться веб-версиями, — Koаla Sampler. Хороший софт, но стоит денег (от 450 ₽ единовременно). Многие творят на нем красоту, ведь это уже полноценная студия в кармане.

Как работают STEMS в Koаla Sampler.

Зная все это, хотелось сделать «из кармана» проект без дополнительного софта. С этим может помочь Telegram, ведь он априори установлен на большинстве устройств.

Кто-то скажет: «Но ведь и боты уже есть». Тут все проще, чем кажется. На момент первого релиза я просто не встречал таких разработок. Да и хотелось создать pet-проект, разобраться в библиотеках и путях реализации.

О принципе работы Stem Splitter Bot

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

Скриншот Telegram-бота.
Скриншот из 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 с его чудесными плагинами. Но время, видимо, прошло.

Однако интересно, что бот на четыре дорожки использует настоящая целевая аудитория — музыканты. У меня есть отзывы живой аудитории — вот топ-причин:

  1. «Нужно взять кусок мелодического сэмпла и “сотворить магию”»,
  2. «Хочу взять дорожку вокала и сделать ремикс»,
  3. «Пытаюсь понять, как «работают» бас или барабаны в треке»,
  4. «Определить количество реальных слоев (дорожек) в треке»,
  5. «Быстро определяю тональность, 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, но это тоже очень приятно. Думаю, что проект будет развиваться по мере появления идей у сообщества. Вся база уже есть.