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

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

    Теперь вы имеете некоторое представление о возможностях ИИ в создании музыки и моих музыкальных предпочтениях. Как вам кажется, какая роль ждет ИИ в творческом процессе в будущем? Может ли машина создавать музыку наравне или даже лучше чем человек, быть помощником в творческом процессе? Или искусственный интеллект прославится на музыкальном поприще только примитивными поделками.
    ГК ЛАНИТ
    493,00
    Ведущая многопрофильная группа ИТ-компаний в РФ
    Поделиться публикацией

    Комментарии 46

      –8
      Не справится с этим ИИ. Музыка — хоть и комплексный процесс, но всё же за неё отвечает правое полушарие в первую очередь. ИИ — это имитация левого полушария. Какой-нибудь психодел может и можно делать, но не более того.
        +10
        Учебники гармонии и теории музыки почитайте. Вполне можно писать музыку без слуха, по правилам гармонии на одном листе бумаги(без инструмента). Многие классики писали музыку отнють не так, как вы думаете.
          –3
          Да в курсе я, что музыка — это математика. И что есть скоп алгоритмов, в который можно уложиться.
          Есть пара но. Например, можно идеально вписать в общую картину диссонансы, дисгармонии и частотные конфликты за счёт психоакустических процессов. И по математике, физике и физиологии это будет нарушением, а по психологии — нет. Можно, конечно, прикрутить статистику, собрать фактор-группу, дать послушать опытные образцы, отдать на дальнейший анализ… машина всё равно много идеально вписывающихся трюков не провернёт. Точнее, идеальное количество идеально вписывающихся трюков.
          Оставьте эмоциональное тем, кто способен в эмоции.
            +2
            «Качественность» музыки отражается опытом музыканта, он так-же впитал опытные образцы и провёл дальнейший анализ, одно синкопирование и форте-пиано делает огромную пропость между попсой и классикой. Единственное, что машина, возможно(И лишь только возможно) не сможет, так это быть переменьчивой в эмоциональном плане и направлять эту музыку относительно чего-то, хотя вполне, как пишется музыка под стихотворение(Метель) или картины, так-же сможет возможно и машина. Передаст глубину текста её тона и краски. Просто ещё сами сети не доросли, а так, мы приувеличиваем возможности нашего мозга, вполне возможно машина все-таки будет писать шедевры
              –3
              Впервые в своей жизни слышу данное мнение — «мы преувеличиваем возможности нашего мозга» :)
              Интересно, копну в эту сторону.
                0
                Т.е. сначала так-же, как музыканта(Кстати это практикуется в преподавании композиторства) заставить машину писать музыку по картинам стихам, а потом закинуть её посреди города и дать пройтись, на основе этого она напишет так, как по факту музыкант бы мог себя чувствовать в этой суете, шуме и красках.
                  0
                  Не в защиту вашего оппонента, но
                  «Качественность» музыки отражается опытом музыканта, он так-же впитал опытные образцы и провёл дальнейший анализ

                  Не сбрасывайте со счетов и талант, плюс способность не только анализировать, но и создавать что-то новое. Повторить или выдать компиляцию нескольких источник != создать. Разумеется, это не значит, что не надо пробовать, рано или поздно машина должна будет выдать что-то своё, притом не ужасное х)
            +6
            Спасибо за статью!
            Хотя мне больше понравился не достигнутый результат, а отступления от основной темы с рассказами о других проектах. Получился очень хороший обзор проектов по данной тематике.
              +3
              Здорово! Спасибо за статью.
              У меня есть мысли как заставить компьютер генерить хорошую музыку, но… я бы не хотел, что бы это случилось (хотя это обязательно случится — всё что может коммерциализироваться — коммерциализируется), спасибо — нам уже шахмат и го хватает. )
              Впрочем возможно я попробую что-то сделать подобное ))) в связи с чем вопрос — чем лучше генерить миди? Имеется ввиду, чтобы можно было задать некие алгоритмы. Навскидку приходит в голову Lilypond («ru.wikipedia.org/wiki/LilyPond») — я могу писать алгоритм на любимом С++, и создавать текстовые файлы формата Лилипонда, но может еще что сделано интересное уже?
                +3
                Тут кажется несколько вопросов в одном. Попробую на все ответить. Для того чтобы выводить результаты работы алгоритма в midi и обратно есть готовые библиотеки. Наверняка есть на C++, я пользовался Python там свои. В крайнем случае можно вообще написать самому, формат описан, но зачем тратить время, кто-то наверняка уже это сделал. Для записи «руками» партий музыки есть много программ, но как правило платных. Скажем для репетиций, изучения материала довольно популярная программа Guitar Pro, в ней так же можно создавать midi. Для полноценной студийной записи — различные аудиосеквенсоры типа ProTools, Ableton, Cubase и т.д. Если у вас есть midi интерфейс, например, midi клавиатура, то партии можно просто наиграть, а редактор сам превратит их в нотную запись. Ну, и наконец есть библиотеки с тысячами midi файлов типа music21 и безграничный интеренет, где столько всего лежит ими тоже можно пользоваться.
                  0
                  Для того чтобы выводить результаты работы алгоритма в midi и обратно есть готовые библиотеки.
                  Вот именно это я и имел ввиду. Например я хочу пассаж 16-тыми, хроматическую гамму от «До» 1-й октавы. Можно расковырять миди, но там много избыточного лично для меня.
                  Остальное я знаю/умею/пользуюсь.
                  0
                  Впрочем возможно я попробую что-то сделать подобное ))) в связи с чем вопрос — чем лучше генерить миди?


                  можно сразу открыть в онлайн редакторе сгенерированные ноты чтоб прослушать, отредактировать или экспортировать в *.mid. Все параметры передаются простым текстом в самой ссылке.

                  Пример https://jsbin.com/dulupib/edit?html,output

                  Или нпм https://www.npmjs.com/package/riffplay
                  0

                  Надо продолжать, например скооперироваться с "Нейронной обороной"!
                  :)

                    +5
                    Результат моих попыток. Блюз \ Джаз лучше всего получается. Сетка довольно простая. Секрет в предобработке midi перед обучением.

                    https://soundcloud.com/andrew-gulenko/blues-neural-network-music-generation-rnn-lstm
                    https://soundcloud.com/andrew-gulenko/piano-neural-network-music-generation-rnn-lstm
                    https://soundcloud.com/andrew-gulenko/sinister-neural-network-music-generation-rnn-lstm-1
                    https://soundcloud.com/andrew-gulenko/sinister-neural-network-music-generation-rnn-lstm
                      +2
                      Интересный результат! Расскажете про предобработку? Очистка данных — наше все!
                        +1
                        Обратите внимание еще и на длительность ноты, ускорение, канал.
                          +2
                          С длительностью думаю примерно понятно, с каналом — это видимо о том, что у каждого инструмента свой канал, звучит аккорд, а вот с ускорением — не совсем уловил?
                            +3
                            1) Я не использовал Magenta и что конкретно там в коде не знаю. Я писал свое решение. Keras для сетки и библиотека mido для обработки midi файлов.
                            2) Абсолютно во всех статьях в интернете при создании последовательности (sequence) для обучения, используют только код ноты. Но в midi файле больше информации. И одна и та же нота может проигрываться по разному. Если не учитывать это, то результат получается монотонный. К сожалению такой подход увеличивает время обучения и требует большего количества midi файлов. Обратите внимание также на temp мелодии и отбирайте midi файлы с приблезительно одинаковым значением. И конечно же одного стиля музыки. Для тренировки я арендовал сервер с видеокартой NVIDIA Tesla-100 у Google.

                            Более наглядно:
                            block = ""
                            if msg.type == 'note_off':
                                block = "0"
                            elif msg.type == 'note_on':
                                block = "1"
                            else:
                                continue
                            
                            block += " " + str(msg.channel)
                            block += " " + str(msg.note)
                            block += " " + str(msg.velocity)
                            block += " " + str(msg.time)
                            
                            sequence.append(block)
                            
                              +2
                              Да, вы правы, velocity MuisicVAE похоже игнорирует. Они затачивали свою сеть под обучение на 200к midi файлов самых разных стилей, предположу, что при таком объеме еще один параметр существенно усложнил бы обсчет. Судя по комментарию ниже, новый формат MPE даст в этом плане еще больше возможностей. Гугловским видеокартам будет чем заняться.
                      +2
                      На данном этапе на мой взгляд интереснее «сотрудничество» ИИ/нейросетей и человека. Также как с призмой и подобными программами для перерисовки изображений, можно брать результат из нейросети и использовать его как идейную основу для собственной оригинальной работы. Для большинства людей придумать оригинальную концепцию гораздо сложнее чем воплотить ее технически. Применительно к музыке это могут быть «риффы», интересные сочетания аккордов, музыкальная тема, которую можно развить — все что может подтолкнуть творческий процесс. Ну да, бас и ударные можно уже сейчас менять нейросетью :P. Скажем в лоджике и гаражбэнд есть виртуальные ударники, а приложение Music Memos позволяет накладывать сгенерированные партии ударных и баса к собственным наброскам

                      Кстати, сейчас миди не обязательно должно звучать так деревянно. С появлением MPE возможности передачи экспрессии выросли на порядок. Если дойдут руки, напишу статью с парой примеров
                        +2
                        Насчет сотрудничества – инструменты beat blender и latent loop мне из-за этого и приглянулись.
                        Про MPE не знал, спасибо! Посмотрел вот тут www.midi.org/articles-old/midi-polyphonic-expression-mpe – видео выглядят очень прилично! Осталось дождаться широкого распространения формата в редакторах, контроллерах и синтах и будет на чем учить нейросети с развитым чувством прекрасного. Интересно было бы почитать поподробнее. Да и Music Memos кстати тоже вполне в своих рамках!
                        0
                        Мне кажется что пока та музыка, которую генерирует ИИ уровнем напоминает школьника, который впервые взял в руки какой-нибудь инструмент и сыграл первые несколько аккордов. Наверное когда ИИ обучится на большем количестве примеров будет что-то действительно годное, но пока что на троечку
                          +2
                          Транскрипция музыки в ноты это отдельная задача.
                          По сложности примерно как из звукового файла сделать текстовый файл.

                          Один из лучших коммерческих продуктов в этой области — Melodyne
                          www.youtube.com/watch?v=-ojHdfhl_iw

                          От стандартных «MP3 to MIDI Converter» отличается тем что действительно работает.
                            +2
                            Melodyne — отличный продукт для записи в студии, он отлично работает с одним голосом, неплохо работает на отдельно звучащей гитаре с аккордами, но он значительно хуже справится с несколькими инструментами звучащими одновременно. Ну, а с mp3 все еще сложнее, т.к. сжатие увы с потерями.
                              0
                              Сжатие звука с потерями в распознавании значения не имеет, примерно как цвет букв отсканированного текста никак не влияет на смысл написанного.

                              МП3 это как пример плохоработающих приложений по сравнению с профессиональным коммерческим продуктом.
                                +2
                                Тут и с цветом все не так просто — черный на зеленом распознает каждый человек, а красный вот уже нет. С mp3 — сведенный трек рок группы может иметь синтезаторы, гитары, бас, голос, и все это звучит на пересекающихся частотах. Думаю, что информация об обертонах совсем не помешает чтобы всю эту кашу разгрести, а mp3 не линейно выбрасывает часть частот при том может и основных, просто если они не слышны большинством слушателей, при чем это все от фрейма к фрейму еще меняется. Не знаю какие там алгоритмы распознавания используются, но думаю что уменьшение исходных данных имеет значение
                                  +1
                                  обертоны это ерунда. Равно как и громкость отдельной ноты.

                                  Если алгоритм распознает квинту вместо кварты или не сможет отделить бас от гитары играющей в унисон то он неприемлим, если пропустит 5% нот — приемлим.

                                  Равно как и текст на зеленом фоне (почему зеленый-то? это ж кампутир, ему все равно) — небольшой процент ошибочных букв это нормально, а вот распознать латиницу вместо кириллицы — это неприемлимо.

                                  Между Мелодином и конкурентами есть качественные различия, а не количественные.
                                    +2
                                    Ну я собственно о том, что дополнительная информация может как раз помочь отличить гитару от баса, возможно это не принципиально, я могу только предположить как работает Мелодин. Востребованность этой информации зависит от алгоритма. Равно как и информация о цвете в зависимости от алгоритма (дальтоники вот не отличают — не совершенный алгоритм) может иметь значение, я к этому
                            +1
                            В ряде областей требуется фоновая музыка в довольно больших количествах. В ней не нужно никакой индивидуальности, гениальности и души. На данный момент ее покупают и лицензируют.
                            Хорошо бы иметь генератор, у которого на входе параметры типа длительность, темп, стилистика и тп, а на выходе в меру однообразная музыка, на которую не обращают пристального внимания.
                            Дарю бизнес идею. :)
                              +1
                              Уже реализовано: www.jukedeck.com. Покупают для ТВ заставок как фон.
                              И это тоже: www.aiva.ai
                                0
                                В пятерочке играет такая. Это так ужасно звучит, что хочется свалить оттуда поскорее.
                                  0
                                  «Обидеть киберхудожника может каждый!» — где-то плачет сейчас нейросеть.
                                    0
                                    А мне РобоБоб прям очень зашёл :) С позволения автора утащу на рингтон.
                                0
                                А не посоветуете минимальный конфиг для обучения? Я потестил без GPU на VPS (Centos 7, python 2.7, 4Гб ОЗУ, 1 ядро 2.5 Ггц), и на первом чекпоинте вылетает Out of memory, а триальный Google Сloud сжег еще год назад…
                                  +2
                                  А на hdd осталось место? У меня часто именно оно заканчивалось и вылетало, когда система пытается сохранить очередной чекпоинт они до 1gb примерно разрастались насколько я помню. ОЗУ на виртуалке было 8гб вроде. 1 GPU проц. Без GPU будет увы долго-долго считать, сотни эпох будет сутки считать, даже на небольшом датасете, а еще периодически будет что-то падать, вам точно захочется поиграть с параметрами и разными наборами данных.

                                  github.com/tensorflow/magenta/tree/master/magenta/models/music_vae
                                    0
                                    Я все же подозреваю проблема была в памяти, т.к. при запуске обучения было свободно 40 Гб на диске, и 2 чекпоинта в настройках. Купил VPS по скидке на 16 Гб RAM и 4 ядра, завелось без проблем, потребляет 6 Гб RAM, но да, за 12 часов 30 мидишек прошли 1400 шагов. Подскажите плиз, не могу разобраться:
                                    1. Влияет ли на скорость/качество увеличение-уменьшение чекпоинтов, sampling_rate и batch_size?
                                    2. Сколько навскидку скушает денег на гугл облаке обучение одной тестовой модели с парой десятков миди?
                                    3. TPU же не поддерживается на данный момент?
                                    4. num_steps в примере указан 2 раза, первый = 1, второй = 5000. Это количество эпох, и применяется последнее указанное значение, первое можно не задавать?
                                    5. Чем отличаются hier-multiperf_vel_1bar_med и hier-multiperf_vel_1bar_big?
                                    6. С 1-го по 1400 шаг такая последовательность loss — 437-652-396-389-362-507-517-701-667-363-369-393-505-490-361, это нормально что значение не уменьшается, а болтается вверх-вниз, или я что-то неправильно сделал, или потому что без GPU?
                                    7. Можно ли прервать обучение, и затем запустить с последнего чекпоинта?
                                      +2
                                      1. По идее да. Увеличение лернинг рейт позволит быстрее (за меньшее количество эпох) прийти к точке схождения, но результат может быть менее точным, больше шансов ускакать в локальный минимум, т.к. там что-то типа градиентного спуска.
                                      С batch size тоже да, судя по:

                                      For example, if the default batch size of a config is too large for your GPU, you can reduce the batch size and learning rate by setting the flag as follows:
                                      --hparams=batch_size=32,learning_rate=0.0005
                                      Как уменьшение пакета дает ускорение не совсем понимаю, в моем понимании все равно весь тренинг сет должен быть пройден, но вот…

                                      2. Я вполне уложился в бесплатное время с 1 GPU штук 10 полноценных обучений. А там что-то типа 300 баксов бесплатно. Главное не забывать останавливать и отключать не используемые машины (я забывал). Если политика Google позволяет, может быть можно просто завести еще один аккаунт для таких тестовых проектов.

                                      3. Не видел упоминаний, т.е. скорее нет. Хотя по идее это же все на TensorFlow. TensorFlow TPU поддерживает, но возможно для этого придется разбираться в коде Magenta и что-то править. Для увлеченных натур.

                                      4. Да, это что-то копипастнулось. Параметр возьмется только один, последний.

                                      5. Размером энкодера, поищите там в коде строчку. Как это влияет на результат — неизвестно. В моем случае я особой разницы не заметил.

                                      6. Да, нормально, данных не так много оптимизация скачет.

                                      7. Да автоматом начинает с последнего сохраненного чекпоинта
                                        +1
                                        Как уменьшение пакета дает ускорение не совсем понимаю, в моем понимании все равно весь тренинг сет должен быть пройден, но вот…
                                        Во-первых, чем больше batch, тем более усреднено направление вектора градиентного спуска, так что при слишком большом batch сеть предпочитает более генерализованные усреднённые решения, которые сходятся медленнее. Во-вторых, с уменьшением размера batch'а их число в одной эпохе возрастает, т.е. итераций процесса оптимизации на одну эпоху будет просто количественно больше. Если LR считаем на итерацию, а не на эпоху, это выльется в изменение скорости обучения.
                                        0
                                        Огромное спасибо за ответы! Буду эксперементировать, еще очень порадовал набор Magenta Studio для аблетона, решает кучу задач. Еще забыл спросить, есть ли особая разница, тренировать полноценными midi треками со всеми инструментами, или разрезать на midi с однотипными инструментами? Т.е. отдельные модели гитар, басов, синтов, для одних и тех же треков.
                                          +2
                                          Если вы про MusicVAE — то разрезать на отдельные инструменты не стоит. Смысл именно в том, что сеть учится на последовательности сочетаний звучания всех инструментов одновременно. Если вы ей накидаете отдельных дорожек с басом — она нагенерит вам потом басовых соло. Я не разобрался до конца как в точности работает пайплайн, но по типам инструменты они отличают когда midi парсят. Т.е. что гитара, а что барабаны понимают и не путают.
                                    0
                                    пардон, не в ту ветку
                                      0
                                      В процессе тестирования trio_16bar возникли вопросы, можете ли подсказать:
                                      1. Возможно ли увеличить количество тактов модели? Я пробовал поставить 32 такта дедуктивным методом:
                                      configs.py
                                      trio_32bar_converter = data.TrioConverter(
                                          steps_per_quarter=4,
                                          slice_bars=32, #original: 16
                                          gap_bars=2)
                                      	
                                      CONFIG_MAP['hierdec-trio_32bar'] = Config(
                                          model=MusicVAE(
                                              lstm_models.BidirectionalLstmEncoder(),
                                              lstm_models.HierarchicalLstmDecoder(
                                                  lstm_models.SplitMultiOutLstmDecoder(
                                                      core_decoders=[
                                                          lstm_models.CategoricalLstmDecoder(),
                                                          lstm_models.CategoricalLstmDecoder(),
                                                          lstm_models.CategoricalLstmDecoder()],
                                                      output_depths=[
                                                          90,  # melody
                                                          90,  # bass
                                                          512,  # drums
                                                      ]),
                                                  level_lengths=[32, 32], #original: [16, 16]
                                                  disable_autoregression=True)),
                                          hparams=merge_hparams(
                                              lstm_models.get_default_hparams(),
                                              HParams(
                                                  batch_size=32*32, #original: 256
                                                  max_seq_len=32*32, #original: 256
                                                  z_size=1024, #original: 512
                                                  enc_rnn_size=[2048, 2048],
                                                  dec_rnn_size=[1024, 1024],
                                                  free_bits=32*32, #original: 256
                                                  max_beta=0.2,
                                              )),
                                          note_sequence_augmenter=None,
                                          data_converter=trio_32bar_converter,
                                          train_examples_path=None,
                                          eval_examples_path=None,
                                      )


                                      Но получаю ошибку при запуске обучения:
                                      InvalidArgumentError (see above for traceback): assertion failed: [512 512 512...]
                                      [[node Assert/Assert (defined at /usr/lib/python2.7/site-packages/magenta/models/music_vae/lstm_utils.py:305) = Assert[T=[DT_INT32], summarize=3, _device="/job:localhost/replica:0/task:0/device:CPU:0"](All, Minimum_1)]]

                                      2. Возможно ли добавить еще одну мелодию при генерации(или может сразу при обучении), чтобы на выходе получалось [melody, melody, bass, drums]?
                                      3. В чем основные различия моделей hier-trio и hierdec-trio? Долго смотрел на параметры, но не могу понять для каких целей лучше использовать одну и другую…
                                      4. Я увидел в параметрах конвертера steps_per_quarter, означает ли его присутствие что можно обучать модели в разных размерах?
                                      5. Если после обучения появилась новая пачка подходящих миди — можно ли дообучить модель новым .tfrecord, и если да, то стоит ли дообучать модель только с новыми треками, или желательно заново с полным комплектом?
                                        +1
                                        Первый пункт решился благодаря совету из гугл группы:
                                        configs.py
                                        trio_32bar_converter = data.TrioConverter(
                                            steps_per_quarter=4,
                                            slice_bars=32, #original: 16
                                            gap_bars=2)
                                        
                                        CONFIG_MAP['hier-trio_32bar'] = Config(
                                            model=MusicVAE(
                                                lstm_models.HierarchicalLstmEncoder(
                                                    lstm_models.BidirectionalLstmEncoder, [32, 16]),
                                                lstm_models.HierarchicalLstmDecoder(
                                                    lstm_models.SplitMultiOutLstmDecoder(
                                                        core_decoders=[
                                                            lstm_models.CategoricalLstmDecoder(),
                                                            lstm_models.CategoricalLstmDecoder(),
                                                            lstm_models.CategoricalLstmDecoder()],
                                                        output_depths=[
                                                            90,  # melody
                                                            90,  # bass
                                                            512,  # drums
                                                        ]),
                                                    level_lengths=[32, 16], #original: [16, 16]
                                                    disable_autoregression=True)),
                                            hparams=merge_hparams(
                                                lstm_models.get_default_hparams(),
                                                HParams(
                                                    batch_size=128, #original: 256
                                                    max_seq_len=32*16, #original: 16*16
                                                    z_size=512,
                                                    enc_rnn_size=[512], #original: 1024
                                                    dec_rnn_size=[512, 512], #original: 1024, 1024
                                                    free_bits=256,
                                                    max_beta=0.2,
                                                )),
                                            note_sequence_augmenter=None,
                                            data_converter=trio_32bar_converter,
                                            train_examples_path=None,
                                            eval_examples_path=None,
                                        )


                                        У меня 16 Гб ОЗУ и я попал в Out of memory на первом шаге, в этом случае может помочь снижение batch_size, и точно поможет снижение параметров enc_rnn_size и dec_rnn_size.
                                          0
                                          Думаю, что все возможно, но как я к сожалению не разбирался. Эксперименты, изучение кода и вопросы в гугл группе :) Буду очень признателен, если потом расскажете что получилось.
                                        0
                                        А есть что-нибудь такое, что бы что-то напел и определила мелодию, музыку, песню? Наподобие голосового набора текста.
                                          0
                                          Да. Там выше в комментариях было приложение Music Memos. Я думаю есть и аналоги

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

                                        Самое читаемое