Создание генератора битов lofi

Автор: Алисия Ван [PL], Алена Чао, Эрик Лю, Зейн Моганнам, Хлоя Вонг, Ирис Чжоу

Итак, что такое lofi байты?

Представьте себе: это средний семестр, вам нужно закончить массу работы, и вам нужен долгий сеанс работы с библиотекой. Вы тянетесь к наушникам, но вместо того, чтобы включить Spotify, вы открываете lofi bytes: красивое веб-приложение, которое берет сэмплы песен и выводит холодный lofi с настраиваемыми фоновыми звуками и битами.

В течение весеннего семестра 2023 года наша команда создавала интегрированное удобное веб-приложение, которое позволяет пользователям создавать треки lofi из входных сэмплов MIDI и дополнительно настраивать звуки дождя, огня и атмосферу кафе. В этой статье будет описан наш процесс от обучения до конечного продукта, обсуждено все, что мы сделали, от обучения модели машинного обучения до создания приложения с полным стеком, а также рассмотрены ограничения, расширения и возможности дальнейшего обучения.

Посетите наш сайт по адресу https://callaunchpad.github.io/lofi-bytes-app/! Это семестровый проект Launchpad, творческой организации машинного обучения, основанной в кампусе Калифорнийского университета в Беркли.

Каковы наши данные?

Когда мы начинали наш проект, мы хотели иметь хорошее представление о том, с какими данными мы работаем, поскольку это в конечном итоге повлияет на то, какую модель ML мы в конечном итоге будем использовать. Мы можем использовать два основных типа музыкальных данных: первый — это то, с чем вы, возможно, лучше всего знакомы, цифровое аудио. Это цифровое представление звука в виде звуковых волн. Однако файлы часто бывают большими и содержат много информации, поэтому для создания нового звука требуются большие модели и длительные периоды времени. Ранее уже проводились работы по созданию необработанного звука (например, Jukebox от OpenAI), но это может быть не лучший подход для быстрого и удобного приложения.

Итак, вместо этого мы обратились к MIDI-данным. MIDI — это программное обеспечение, которое представляет музыкальную информацию в цифровом формате, сохраняя такую ​​информацию, как высота ноты, длина тона, скорость и громкость тона. Возможно, вы видели это представление музыки в Интернете. Он соответствовал тому, что мы хотели сделать: он был компактным, позволял нам быстро создавать музыку и давал пользователям больший контроль над генерируемыми битами.

Первая проблема: нет данных

Одна из самых больших проблем, с которой мы столкнулись с самого начала, заключалась в том, что для успешного обучения нашей модели требовалось больше данных lofi MIDI. К сожалению, большинство данных lofi, которые мы нашли, были в цифровом аудио. Изначально для обучения мы использовали набор данных lo-fi от Cymatics; однако в этом наборе данных было всего 93 коротких музыкальных трека, поэтому неудивительно, что наши результаты после обучения были менее чем удовлетворительными.

Решение: просто получите больше данных!

Поиск внешних наборов данных был тупиковым; Учитывая это, нам пришлось проявить творческий подход и сделать свой собственный!

Мы начали с создания плейлиста на YouTube из компиляций lofi, специально отыскивая треки с чистым звуком фортепиано и избегая многослойной инструментальной обработки и фонового шума, чтобы убедиться, что процесс преобразования даст нам более чистые MIDI-результаты. Затем мы написали сценарии, которые автоматически загружали эти компиляции в формате MP3, нарезали их на 90-секундные сегменты и преобразовывали эти клипы в MIDI-файлы. Мы успешно создали новый набор данных, содержащий более 7 часов MIDI-файлов lofi для фортепиано.

Нам пришлось проявить изобретательность в наших методах, чтобы получить больше данных. Каждый член группы добавил чистую компиляцию фортепиано lofi в список воспроизведения YouTube, который затем был пропущен через серию сценариев, чтобы разделить список воспроизведения на клипы MP3, а затем преобразовать эти клипы в файлы MIDI. В результате появился новый 7-часовой набор данных Lofi Piano MIDI, на котором мы обучали нашу модель в течение 500 эпох.

Метод проб и ошибок: наша базовая модель LSTM

Для начала мы хотели поэкспериментировать и посмотреть, насколько хорошо простая модель LSTM будет работать с нашими MIDI-данными. LSTM, что означает долговременную кратковременную память, хорошо распознает и кодирует долговременные паттерны в нашей MIDI-музыке. Мы сделали простой двухслойный LSTM и сначала обучились на простом наборе данных MIDI для пианино под названием Nottingham. Мы обнаружили, что, несмотря на то, что модель могла генерировать несколько ударов музыки после начального урока, она в конечном итоге превращалась в шум и не имела долговременной структуры, которую мы хотели. Тем не менее, это было отличное место для начала. Мы знали, что нам нужна более надежная модель, и решили обратиться к трансформаторам, чтобы спасти ситуацию.

Представляем модель дня: MusicTransformer

Поэкспериментировав с различными моделями, мы остановились на MusicTransformer, архитектуре модели, разработанной командой Magenta, которая могла генерировать MIDI-музыку с долговременной структурой.

Говоря более подробно, MusicTransformer представляет собой архитектуру нейронной сети, в которой используется преобразователь для создания полифонической музыки с долговременной согласованностью и структурой. Как правило, преобразователи состоят из слоев кодировщика и декодера, которые обрабатывают входные последовательности и генерируют выходные последовательности, способные отслеживать контекст и взаимосвязи между входными данными. Эта функция трансформаторов удобна при работе с музыкой, поскольку выходные последовательности должны следовать шаблонам на протяжении всей входной последовательности.

Наша модель изучает данные MIDI (цифровой интерфейс музыкальных инструментов), которые кодируют музыку на основе высоты тона, продолжительности, скорости, канала и т. д. MIDI не кодирует форму сигнала, что делает его оптимальным для работы с большими объемами данных. Модель MusicTransformer работает, принимая последовательность MIDI, называемую учебником, и выводит новый MIDI, который следует заученным шаблонам учебника. Слои кодировщика преобразователя обрабатывают праймер и извлекают соответствующие функции, которые фиксируют паттерны и структуру музыки. Затем слои декодера берут эти функции и генерируют новую последовательность MIDI, которая следует изученному образцу.

Одной из ключевых особенностей MusicTransformer является его способность генерировать музыку, состоящую из нескольких независимых мелодий или голосов. Модель использует условную выборку, создавая новую последовательность MIDI шаг за шагом, причем каждый шаг зависит от предыдущего сгенерированного MIDI. Это позволяет модели генерировать музыку, которая соответствует выученным паттернам учебника.

Стремясь придать больший вес наиболее важным частям букваря при создании вывода, MusicTransformer использует внимание к себе. Как правило, модель внутреннего внимания вычисляет баллы внимания между каждой парой позиций в букваре и использует эти баллы для оценки важности каждой позиции в поколении. В нашем случае внимание к себе используется для фиксации отношений между различными музыкальными событиями во входной последовательности. Обращая внимание на соответствующие события в последовательности, модель может изучить сложные зависимости и структуру, составляющие общий образец учебника. С самостоятельным вниманием MusicTransformer может изучать структуру и шаблоны входного MIDI и генерировать новую музыку, которая следует этим шаблонам.

Полученные результаты

Наши результаты не были новаторскими — мы достигли около 40% точности оценки на нашей модели, прежде чем наша точность вышла на плато. Однако сгенерированные произведения определенно звучали как музыка лофи. Наша модель научилась играть продолжительные аккорды, следуя нашим учебникам для начинающих, и часто вводила новые мелодии в той же тональности. Однако иногда он проигрывал пару неправильных нот, которые мы приписали шуму в нашем наборе данных. Когда мы создавали наш набор данных с помощью извлеченной музыки, он часто был шумным, и наша модель, к сожалению, уловила его.

Будущая работа

Хотя мы довольны нашим проектом, мы можем многое улучшить. Это включает в себя создание лучшего и более чистого набора данных музыки lofi, что значительно улучшит способность нашей модели генерировать. Мы также можем настроить модель для создания более четких мелодий и аккордов. Мы также рассматривали модель передачи стиля Groove2Groove и хотели знать, можем ли мы взять модель, которая генерирует классическую музыку, и заставить ее генерировать более мягкую и джазовую музыку лофи.

Все о нашем сайте

Серверная часть

Наша команда использовала Flask API для развертывания нашей модели машинного обучения. Flask — это легкий и простой в использовании веб-фреймворк, позволяющий разработчикам быстро создавать и развертывать веб-приложения. Используя возможности маршрутизации и обработки запросов Flask, мы можем легко представить нашу обученную модель ML в качестве конечной точки, которая может принимать входящие данные и возвращать прогнозы в режиме реального времени. Это позволяет интегрировать нашу модель в другие приложения, такие как мобильные приложения, чат-боты и, в данном случае, в наше веб-приложение lofi bytes!

Когда пользователи загружают MIDI-файл через наше веб-приложение Lofi-Bytes, почтовый запрос Axios отправляет данные в модель ML (которая находится в API Flask). Наша модель генерирует выходной MIDI-файл, возвращает его в наш интерфейс React, и сгенерированная музыка lofi воспроизводится для наших пользователей!

Внешний интерфейс

React — это библиотека JavaScript, объединяющая отдельные компоненты в сложный пользовательский интерфейс. Его встроенные темы веб-сайта, свойства, кнопки, значки и многое другое сделали его очевидным выбором для поддержки нашего веб-сайта.

Внешняя архитектура

  • Главный экран содержит скелет веб-сайта: верхний и нижний колонтитулы, поля и фон.
  • Midi Generator содержит API-соединение: загруженный пользователем миди-файл отправляется на серверную часть API Flask. Выходной сигнал, сгенерированный трансформатором, отправляется обратно.
  • Synth содержит взаимодействие с окружающим звуком: пользователи могут настраивать ползунки, чтобы увеличивать и уменьшать громкость ударов барабана, дождя, звуков кафе и огня.

Кроме того, мы использовали tone.js для одновременного воспроизведения MIDI-музыки и различных звуков атмосферы. Это также позволило пользователям взаимодействовать с различными объемами на нашем веб-сайте, и мы надеемся представить различные инструменты и звуки для музыки MIDI в будущем.

Спасибо за чтение! Пожалуйста, ознакомьтесь с нашим Github по адресу https://github.com/callaunchpad/lofi-bytes.