Главная » Хабрахабр » Мечтают ли андроиды об электропанке? Как я учил нейросеть писать музыку

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

На курсах по машинному обучению в 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   Подробнее можно посмотреть вот это видео.

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

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

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

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

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

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

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

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

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

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

Однако в моем случае обучить модель не удалось, процесс все время падал из-за различных ограничений – объема доступной памяти, отключения по таймауту, отсутствия нормальной командной строки и root прав для установки необходимых библиотек. Google предоставляет colab тетради, в которых вполне можно баловаться с моделями Magenta. Гипотетически там даже есть возможность использовать 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 инструментов), выдающую по одному такту.

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

Не знаю, хороший это результат или нет, но, похоже, что при небольших тренировочных данных, дальше сеть переобучается и нет смысла тратить столь любезно предоставленное мне бесплатно время графических процессоров в гугловских датацентрах. Где-то на 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 — я художник, я так вижу.

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

Вот так «я провел этим летом». Я доволен. Конечно, радио «Максимум» вряд ли возьмет его в плей-лист, но, если прислушаться, это действительно похоже на исходную группу 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-ти тактовых фрагментов трио – ударные, бас и лид. Такая сеть требует значительно больше ресурсов, но и результат сразу 16 тактов! Входные данные –мультитрековые midi файлы – система разбивает на тройки во всех возможных комбинациях и дальше на этом обучает модель. Я попробовал представить, как могла бы звучать группа, которая играет что-то среднее между Rancid и NOFX, загрузив для обучения примерно по равному количеству треков от каждой группы: Невозможно устоять.

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

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

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


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Локомотивы: что мы знаем о самоходном рельсовом экипаже

В первой половине двадцатого века именно они помогли нарастить грузо- и пассажироперевозки, с которыми не справлялись архаичные паровозы. Электричество помогло создать невероятно мощные и быстрые локомотивы без едкого выхлопа. Для тех, кто знает о локомотивах чуть больше, чем ничего, мы ...

Клиенты: как продать корпоративное ПО и выжить?

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