Как стать автором
Обновить
Selectel
IT-инфраструктура для бизнеса

Telegram вместо студии звукозаписи: как я создал бота для мобильных музыкантов

Время на прочтение6 мин
Количество просмотров3K

Привет! Я Виктор, проектный менеджер в 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 с его чудесными плагинами. Но время, видимо, прошло.

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

Если у вас есть предложения по улучшению Telegram-бота или вы хотите взять мой код и сделать нечто прекрасное (обязательно — без платной подписки), то пишите мне в Telegram — расшарю проект и по возможности добавлю в бота новые функции.

Думаю, что проект будет развиваться по мере появления идей у сообщества. Вся база уже есть.

Делайте музыку, создавайте полезные проекты и делитесь предложениями по улучшению бота в комментариях! До новых встреч.
Теги:
Хабы:
+31
Комментарии7

Публикации

Информация

Сайт
selectel.ru
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия
Представитель
Влад Ефименко