Мечтают ли андроиды об электропанке? Как я учил нейросеть писать музыку +76


На курсах по машинному обучению в Artezio я познакомился с учебной моделью, способной создавать музыку. Музыка – существенная часть моей жизни, я много лет играл в группах (панк-рок, регги, хип-хоп, рок и т. д.) и являюсь фанатичным слушателем.  

К сожалению, многие группы, большим поклонником которых я был в юности, распались по разным причинам. Или не распались, но то, что они теперь записывают…  в общем, лучше бы они распались.

Мне стало любопытно, существует ли сейчас готовая модель, способная обучиться на треках одной из моих любимых групп и создать похожие композиции. Раз у самих музыкантов уже не очень получается, может, нейросеть справится за них?

Источник

Изучая готовые модели, я быстро наткнулся вот на такую статью с обзором шести наиболее известных вариантов. Речь идет, конечно, о цифровых форматах музыки. Из статьи видно, что можно выделить два главных подхода к генерации музыки: на основе оцифрованного аудиопотока (звука, который мы слышим из колонок – raw audio, wav файлы) и на основе работы с MIDI (нотное представление музыки).

Варианты с raw audio я отбросил, и вот почему.

  • Результаты не впечатляют – использование таких моделей для полифонической музыки дает весьма специфический результат. Это необычно, можно создавать интересные полотна, но не подходит для моих целей: звучит странно, а мне хотелось услышать что-то похожее на оригинал.

Источник

Удачный пример с фортепианной музыкой:


А с оркестровой музыкой или роком звучит уже гораздо более странно:


Вот тут ребята пробовали обрабатывать Black Metal и не только в raw audio.

  • В композициях моих любимых групп звучат разные инструменты – вокал, ударные, бас, гитары, синтезаторы. Каждый инструмент звучит вместе с остальными. Я ищу модель, которая действовала бы так же, то есть работала бы не только с отдельными инструментами, но и учитывала их совместное звучание.

    Когда музыканту необходимо выучить партию какого-нибудь инструмента по слуху, он пытается выделить из всего звукового потока нужный ему инструмент. Затем он повторяет его звучание, пока не добивается схожего результата. Задача не самая простая даже для человека с хорошим слухом – музыка бывает сложной, инструменты «сливаются».

Источник

Я сталкивался с программными средствами, которые пытались решить аналогичную задачу. Есть несколько проектов, которые делают это на основе машинного обучения. Например, пока я писал этот текст, Magenta выпустила новый инструмент Wave2Midi2Wave, способный «снимать» ноты фортепиано и реалистично их «отыгрывать». Есть и другие инструменты, хотя в целом эта задача пока не решена.

Так вот, чтобы выучить партию из произведения, легче всего взять готовые ноты. Это самый простой способ. Логично предположить, что и нейросети будет легче работать с нотным представлением музыки, где каждый инструмент представлен отдельной дорожкой.

  • В случае raw audio результат является миксом всех инструментов, партии нельзя по отдельности загрузить в секвенсор (аудиоредактор), подправить, изменить звучание и так далее. Меня вполне устроит, если нейросеть сочинит хит, но ошибется в паре нот – при работе с нотами я легко их подправлю, с raw audio это уже почти невозможно.

В нотной записи тоже есть свои минусы. Она не учитывает массу нюансов исполнения. Когда речь идет о MIDI, не всегда известно, кто эти MIDI файлы составлял, насколько они близки к оригиналу. Может быть, составитель просто ошибся, ведь точно «снять» партию – не простая задача.

При работе с полифоническими нотами надо следить, чтобы инструменты в каждый момент времени были созвучны. Кроме этого, важно, чтобы последовательность этих моментов представляла собой логичную с точки зрения человека музыку.  

Оказалось, что решений, которые могли бы работать с нотами, да еще при этом не с одним инструментом, а с несколькими звучащими одновременно не так много. Проект Magenta от Google TensorFlow я изначально упустил из вида, ведь он был описан как «не полифонический». На тот момент библиотека MusicVAE еще не была опубликована, поэтому я остановился на проекте BachBot.

Источник

BachBot


Оказалось, что решение моей задачи уже есть. Послушайте мелодию Happy Birthday, обработанную BachBot и звучащую как хорал Баха.


Хорал – специфическая музыка, она состоит из четырех голосов: сопрано, альта, тенора и баса. Каждый из инструментов может выдавать одну ноту одновременно. Тут придется немного углубиться в музыку. Мы будем говорить о музыке в размерности четыре четверти.

В нотной записи у ноты есть два показателя – высота тона (до, ре, ми…) и длительность (целая, половинная, восьмая, шестнадцатая, тридцать вторая).  Соответственно, нота длительностью целая звучит весь такт, две половинных звучат весь такт, шестнадцать шестнадцатых звучат весь такт.

При подготовке данных для тренировки нейросети создатели BachBot учли следующее:

  • чтобы не сбивать модель аккордами из разных тональностей, которые вместе не будут звучать благозвучно, все хоралы привели к одной тональности;
  • нейронной сети на вход надо подавать дискретные значения, а музыка – процесс непрерывный, значит, необходима дискретизация. Один инструмент может играть длинную целую ноту, а другой в это же время несколько шестнадцатых. Чтобы решить эту проблему, все ноты были разбиты на шестнадцатые. Иными словами, если в нотах встречается четвертная нота, она поступает на вход четыре раза как одна и та же шестнадцатая – в первый раз с флагом, что ее нажали, а в последующие три раза с флагом, что она продолжается.

Формат данных получается такой – (высота тона, новая нота | продолжение звучания старой ноты)

(56, True)   #Сопрано
(52, False)  #Альт
(47, False)  #Тенор
(38, False)  #Бас

Прогнав все хоралы из популярного набора данных music21 через такую процедуру, авторы BachBot обнаружили, что в хоралах используется всего 108 комбинаций сочетаний из четырех нот (если привести их к одной тональности), хотя, казалось бы, потенциально их может быть 128 х 128 х 128 х 128 (128 ступеней высот тона используется в midi). Размер условного словаря не такой уж и большой. Это любопытное замечание, мы вернемся к нему, когда будем говорить о MusicVAE. Итак, у нас есть хоралы Баха, записанные в виде последовательностей вот таких четверок.

Часто говорят, что музыка – это язык. Поэтому не удивительно, что создатели  BachBot применили популярную в NLP (Natural Language Processing) технологию к музыке, а именно натренировали LSTM-сеть на сформированном датасете и получили модель, способную дополнять один или несколько инструментов или даже создавать хоралы с нуля. То есть вы задаете альт, тенор и бас, а BachBot дописывает за вас мелодию сопрано, и все вместе звучит, как Бах.

Вот еще один пример:  

Звучит здорово!

Подробнее можно посмотреть вот это видео. Там есть занятная аналитика, собранная на основе опроса на сайте bachbot.com  

Пользователям предлагается отличить оригинальные хоралы Баха от музыки, созданной нейросетью. В результатах упоминается, что если нейросеть создает партию баса при всех остальных заданных, то только половина пользователей может отличить созданные нейросетью хоралы от оригинальных. Забавно, но больше всего путаются музыкальные эксперты. С остальными инструментами дела обстоят чуть лучше. Для меня как для басиста звучит обидно – скрипач, похоже, пока еще нужен, а вот басистам пора освежить в памяти навыки работы с гипсокартоном.


Magenta


Изучая BachBot, я обнаружил, что он был включен в проект Magenta (Google TensorFlow). Я решил внимательнее к нему присмотреться и обнаружил, что в рамках Magenta разработано несколько интересных моделей, одна из которых как раз посвящена работе с полифоническими композициями. Magenta сделали свои замечательные инструменты и уже даже запустили плагин для аудиоредактора Ableton, что особенно приятно в прикладном плане для музыкантов.

Мои фавориты: beat blender (создает вариации на тему заданной барабанной партии) и
latent loops (создает переходы между мелодиями).

Основная идея инструмента MusicVAE, которым я решил воспользоваться, заключается в том, что создатели попробовали совместить в сети LSTM модель и вариационный автоэнкодер – VAE.

Если помните, в разговоре про Bach Bot мы заметили, что словарь аккордов состоит не из 128х128х128х128 элементов, а всего из 108. Создатели MusicVAE тоже заметили это и решили использовать сжатое латентное пространство.

Кстати, что характерно, для тренировки MusicVAE не надо переводить исходники в одну тональность. Транспонирование не нужно, полагаю, потому что исходники все равно будут преобразованы автоэнкодером и информация о тональности исчезнет.

VAE устроен таким образом, что позволяет декодкеру эффективно восстанавливать данные из тренировочного датасета, при этом латентное пространство представляет собой гладкое распределение особенностей входных данных.

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

Хороший пример – как дорисовать очки на фотографию при помощи автоэнкодера – в этой статье. Почитать подробнее, как устроена Muisc VAE, можно на официальном сайте Magenta вот в этой статье, там же есть ссылка на arXiv.

Итак, инструмент выбран, осталось использовать его с моей первоначальной целью – создать новую музыку на основе уже записанных треков и оценить, насколько это получится похоже на звучание оригинальной группы. Magenta не работает на моем ноутбуке с Windows да и довольно долго обсчитывает модель без GPU. Помучившись с виртуальными машинами,  docker контейнером и т.д., я решил воспользоваться облаком.

Google предоставляет colab тетради, в которых вполне можно баловаться с моделями Magenta. Однако в моем случае обучить модель не удалось, процесс все время падал из-за различных ограничений – объема доступной памяти, отключения по таймауту, отсутствия нормальной командной строки и root прав для установки необходимых библиотек. Гипотетически там даже есть возможность использовать GPU, но, повторюсь, установить модель и запустить мне не удалось.

Я  задумался о покупке сервера и, о, удача, обнаружил, что Google предоставляет облачные сервисы Google Cloud с GPU, причем там даже есть бесплатный триальный период. Правда, оказалось, что в России они официально доступны только юридическим лицам, но в тестовом бесплатном режиме меня пустили.

Итак, я создал виртуальную машину в GoogleCloud с одним модулем GPU, нашел в интернете несколько midi файлов одной из моих любимых групп и залил их в облако в папку midi.

Устанавливаем Magenta:

pip install magenta-gpu

Как здорово, что все это можно установить одной командой, подумал я, но… ошибки. Похоже, придется прикоснуться к командной строке, жаль.

Смотрим ошибки: на облачной машине не устанавливается библиотека rtmidi, без которой не работает Magenta.

А она, в свою очередь, падает из-за отсутствия пакета libasound2-dev, а еще у меня нет прав root.

Не так страшно:

sudo su root
apt-get install libasound2-dev

Ура, теперь pip install rtmidi проходит без ошибок, равно как и pip install magenta-gpu.

Находим в интернете и загружаем исходные файлы в папку midi. Звучат они примерно так.

Преобразовываем midi в формат данных, с которыми уже может работать сеть:

convert_dir_to_note_sequences --input_dir=midi--hparams=sampling_rate=1000.0--output_file=notesequences_R2Midi.tfrecord --log=DEBUG --recursive

и запускаем обучение

music_vae_train --config=hier-multiperf_vel_1bar_med --run_dir=/home/RNCDtrain/ --num_steps=1 --checkpoints_to_keep=2 --hparams=sampling_rate=1000.0 --hparams=batch_size=32,learning_rate=0.0005 --num_steps=5000 --mode=train --examples_path=notesequences_R2Midi.tfrecord

Опять проблема. Tensorflow падает с ошибкой – не может найти библиотеку, благо несколько дней назад кто-то уже описал эту ошибку, а исходники на Python можно исправить.

Залезаем в папку

/usr/local/lib/python2.7/dist-packages/tensorflow_probability/python/distributions#

и заменяем строчку импорта, как описано в баге на github.

Запускаем music_vae_train еще раз  и… Ура! Обучение пошло!

Источник

hier-multiperf_vel_1bar_med - я использую полифоническую модель (до 8 инструментов), выдающую по одному такту.

Важный параметр – checkpoints_to_keep=2, объем диска в облаках ограничен, одна из проблем – у меня все время обрывался процесс обучения из-за переполнения диска, чекпоинты достаточно тяжелые – по 0.6-1гб.

Где-то на 5000 эпох ошибка начинает скакать вокруг 40-70. Не знаю, хороший это результат или нет, но, похоже, что при небольших тренировочных данных, дальше сеть переобучается и нет смысла тратить столь любезно предоставленное мне бесплатно время графических процессоров в гугловских датацентрах. Переходим к генерации.

По какой-то причине при установке Magenta не установила собственно файл генерации, пришлось докинуть его руками в папку к остальным:

curl -o music_vae_generate.py https://raw.githubusercontent.com/tensorflow/magenta/master/magenta/models/music_vae/music_vae_generate.py

Наконец, создаем фрагменты:

music_vae_generate --config=hier-multiperf_vel_1bar_med --checkpoint_file=/home/RNCDtrain/train/ --mode=sample --num_outputs=32 --output_dir=/home/andrey_shagal/  --temperature=0.3

config — тип генерации, точно такой же, как и при тренировке — мультитрек, 1 такт
checkpoint_file – папка, откуда взять последний файл с обученной моделью
mode — sample – создать семпл (есть еще вариант interpolate – создать переходный такт между двумя тактами)
num_outputs – сколько штук сгенерить
temperature – параметр рандомизации при создании семпла, от 0 до 1. В 0 результат более предсказуем, ближе к первоисточникам, в 1 — я художник, я так вижу.

На выходе я получаю 32 фрагмента по такту. Запустив генератор несколько раз, я слушаю фрагменты и склеиваю лучшие в один трек: neurancid.mp3.


Вот так «я провел этим летом». Я доволен. Конечно, радио «Максимум» вряд ли возьмет его в плей-лист, но, если прислушаться, это действительно похоже на исходную группу Rancid. Звучание, конечно, отличается от студийной записи, но мы в первую очередь работали с нотами. Дальше уже простор для действий – обрабатывать midi различными VST плагинами, перезаписать партии с живыми музыкантами или дождаться, пока ребята из Wave2Midi2Wave доберутся и до гитар с перегрузом.

К нотам же претензий нет. В идеале мне бы хотелось, чтобы нейросеть создала шедевр или хотя бы хит для Billboard top 100. Но пока она научилась у рокеров употреблять алкоголь и наркотики, играть весь такт одну ноту восьмыми (на самом деле не только, а я по-отечески горжусь ее переходом с 20 по 22 секунду). Этому есть причины, и о них дальше.

  1. Небольшой объем данных.
  2. Модель, которую я использовал, выдает фрагменты в размере одного такта. В панк-роке в рамках одного такта, как правило, происходит не так много событий.
  3. Интересные переходы и мелодичность работают как раз на фоне качёвых риффов, переходов от аккорда к аккорду, а автоэнкодер в совокупности с небольшим объемом данных, похоже, большинство мелодий потерял, да еще и свел все риффы к двум созвучным и нескольким атональным аккордам.  Нужно попробовать модель, работающую с 16 тактами, жаль, в ней доступны только три голоса.

Я связывался с разработчиками, они рекомендовали попробовать уменьшить размерность латентного пространства, ведь они свою сеть обучали на 200 000 треках, а я на 15. Мне видимого эффекта от уменьшения z-пространства добиться не удалось, но есть еще с чем повозиться.

Кстати, однообразие и монотонность – это далеко не всегда минус. От шаманских ритуалов до техно-вечеринки, как известно, один шаг. Надо попробовать обучить модель на чем-то таком — рейве, техно, дабе, регги, хип-хоп минусах. Наверняка, есть шанс создать что-то приятно зомбирующее. Я нашел штук 20 песен Боба Марли в midi и, вуа-ля, очень приятный луп:


Выше midi партии перезаписаны живым басом и гитарами, обработаны VST синтезаторами, чтобы фрагмент звучал сочнее. В оригинале сеть выдала просто ноты. Если проиграть их стандартным midi плеером, то звучит это так:


Наверняка, если создать некоторое количество базовых тематических барабанных рисунков, запустить их в beat blender + базовые партии баса и синтов с latent loop (о них было выше), вполне можно запустить алгоритм для техно-радио, которое будет непрерывно создавать новые треки или даже один бесконечный трек. Вечный кайф!

MusicVAE также предоставляет возможность натренировать сеть на генерацию 16-ти тактовых фрагментов трио – ударные, бас и лид. Тоже достаточно интересно. Входные данные –мультитрековые midi файлы – система разбивает на тройки во всех возможных комбинациях и дальше на этом обучает модель. Такая сеть требует значительно больше ресурсов, но и результат сразу 16 тактов! Невозможно устоять. Я попробовал представить, как могла бы звучать группа, которая играет что-то среднее между Rancid и NOFX, загрузив для обучения примерно по равному количеству треков от каждой группы:


Тут также midi партии переписаны живыми гитарами. Стандартным midi плеером так:


Интересно! Это уже определенно лучше моей первой группы! И, кстати, эта же модель выдает нам достойный фри джаз:


Проблемы, с которыми я столкнулся:

  1. Отсутствие хорошего, удобного стенда, который бы сократил время на ожидание обучения. Модель работает только под linux, обучение длительное, без GPU очень долго, а все время хочется попробовать поменять параметры и посмотреть, что получится. Например, облачный сервер с одним GPU процессором 100 эпох для модели «трио на 16 тактов» обсчитывал 8 часов.
  2. Типичная проблема машинного обучения – недостаток данных. Всего 15 midi файлов – это очень мало, чтобы понять музыку. Нейросеть, в отличие от меня в юности, не заслушивала 6 альбомов Rancid до дыр, не ходила на концерты, этот результат получен из 15 неизвестно кем составленных midi треков, которые далеки от оригинала. Вот если облепить гитариста датчиками и снимать каждый призвук от каждой ноты… Посмотрим, как будет развиваться идея Wave2Midi2Wave. Может быть, через несколько лет можно будет отказаться от нот при решении такой задачи.
  3. Музыкант  должен попадать четко в ритм, но не идеально. В выходных midi в нотах (например, в ударных) нет динамики, все они исполнены с одинаковой громкостью, точно в клик (как говорят музыканты, т.е. ровно в доли такта), даже если случайным образом их разнообразить, то музыка начинает звучать живее и приятнее. Опять же этим вопросом уже занимается Wave2Midi2Wave.

Теперь вы имеете некоторое представление о возможностях ИИ в создании музыки и моих музыкальных предпочтениях. Как вам кажется, какая роль ждет ИИ в творческом процессе в будущем? Может ли машина создавать музыку наравне или даже лучше чем человек, быть помощником в творческом процессе? Или искусственный интеллект прославится на музыкальном поприще только примитивными поделками.




К сожалению, не доступен сервер mySQL