Pull to refresh

Comments 46

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

Не сбрасывайте со счетов и талант, плюс способность не только анализировать, но и создавать что-то новое. Повторить или выдать компиляцию нескольких источник != создать. Разумеется, это не значит, что не надо пробовать, рано или поздно машина должна будет выдать что-то своё, притом не ужасное х)
Спасибо за статью!
Хотя мне больше понравился не достигнутый результат, а отступления от основной темы с рассказами о других проектах. Получился очень хороший обзор проектов по данной тематике.
Здорово! Спасибо за статью.
У меня есть мысли как заставить компьютер генерить хорошую музыку, но… я бы не хотел, что бы это случилось (хотя это обязательно случится — всё что может коммерциализироваться — коммерциализируется), спасибо — нам уже шахмат и го хватает. )
Впрочем возможно я попробую что-то сделать подобное ))) в связи с чем вопрос — чем лучше генерить миди? Имеется ввиду, чтобы можно было задать некие алгоритмы. Навскидку приходит в голову Lilypond («ru.wikipedia.org/wiki/LilyPond») — я могу писать алгоритм на любимом С++, и создавать текстовые файлы формата Лилипонда, но может еще что сделано интересное уже?
Тут кажется несколько вопросов в одном. Попробую на все ответить. Для того чтобы выводить результаты работы алгоритма в midi и обратно есть готовые библиотеки. Наверняка есть на C++, я пользовался Python там свои. В крайнем случае можно вообще написать самому, формат описан, но зачем тратить время, кто-то наверняка уже это сделал. Для записи «руками» партий музыки есть много программ, но как правило платных. Скажем для репетиций, изучения материала довольно популярная программа Guitar Pro, в ней так же можно создавать midi. Для полноценной студийной записи — различные аудиосеквенсоры типа ProTools, Ableton, Cubase и т.д. Если у вас есть midi интерфейс, например, midi клавиатура, то партии можно просто наиграть, а редактор сам превратит их в нотную запись. Ну, и наконец есть библиотеки с тысячами midi файлов типа music21 и безграничный интеренет, где столько всего лежит ими тоже можно пользоваться.
Для того чтобы выводить результаты работы алгоритма в midi и обратно есть готовые библиотеки.
Вот именно это я и имел ввиду. Например я хочу пассаж 16-тыми, хроматическую гамму от «До» 1-й октавы. Можно расковырять миди, но там много избыточного лично для меня.
Остальное я знаю/умею/пользуюсь.
UFO just landed and posted this here
Интересный результат! Расскажете про предобработку? Очистка данных — наше все!
Обратите внимание еще и на длительность ноты, ускорение, канал.
С длительностью думаю примерно понятно, с каналом — это видимо о том, что у каждого инструмента свой канал, звучит аккорд, а вот с ускорением — не совсем уловил?
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)
Да, вы правы, velocity MuisicVAE похоже игнорирует. Они затачивали свою сеть под обучение на 200к midi файлов самых разных стилей, предположу, что при таком объеме еще один параметр существенно усложнил бы обсчет. Судя по комментарию ниже, новый формат MPE даст в этом плане еще больше возможностей. Гугловским видеокартам будет чем заняться.
На данном этапе на мой взгляд интереснее «сотрудничество» ИИ/нейросетей и человека. Также как с призмой и подобными программами для перерисовки изображений, можно брать результат из нейросети и использовать его как идейную основу для собственной оригинальной работы. Для большинства людей придумать оригинальную концепцию гораздо сложнее чем воплотить ее технически. Применительно к музыке это могут быть «риффы», интересные сочетания аккордов, музыкальная тема, которую можно развить — все что может подтолкнуть творческий процесс. Ну да, бас и ударные можно уже сейчас менять нейросетью :P. Скажем в лоджике и гаражбэнд есть виртуальные ударники, а приложение Music Memos позволяет накладывать сгенерированные партии ударных и баса к собственным наброскам

Кстати, сейчас миди не обязательно должно звучать так деревянно. С появлением MPE возможности передачи экспрессии выросли на порядок. Если дойдут руки, напишу статью с парой примеров
Насчет сотрудничества – инструменты beat blender и latent loop мне из-за этого и приглянулись.
Про MPE не знал, спасибо! Посмотрел вот тут www.midi.org/articles-old/midi-polyphonic-expression-mpe – видео выглядят очень прилично! Осталось дождаться широкого распространения формата в редакторах, контроллерах и синтах и будет на чем учить нейросети с развитым чувством прекрасного. Интересно было бы почитать поподробнее. Да и Music Memos кстати тоже вполне в своих рамках!
Мне кажется что пока та музыка, которую генерирует ИИ уровнем напоминает школьника, который впервые взял в руки какой-нибудь инструмент и сыграл первые несколько аккордов. Наверное когда ИИ обучится на большем количестве примеров будет что-то действительно годное, но пока что на троечку
UFO just landed and posted this here
Melodyne — отличный продукт для записи в студии, он отлично работает с одним голосом, неплохо работает на отдельно звучащей гитаре с аккордами, но он значительно хуже справится с несколькими инструментами звучащими одновременно. Ну, а с mp3 все еще сложнее, т.к. сжатие увы с потерями.
UFO just landed and posted this here
Тут и с цветом все не так просто — черный на зеленом распознает каждый человек, а красный вот уже нет. С mp3 — сведенный трек рок группы может иметь синтезаторы, гитары, бас, голос, и все это звучит на пересекающихся частотах. Думаю, что информация об обертонах совсем не помешает чтобы всю эту кашу разгрести, а mp3 не линейно выбрасывает часть частот при том может и основных, просто если они не слышны большинством слушателей, при чем это все от фрейма к фрейму еще меняется. Не знаю какие там алгоритмы распознавания используются, но думаю что уменьшение исходных данных имеет значение
UFO just landed and posted this here
Ну я собственно о том, что дополнительная информация может как раз помочь отличить гитару от баса, возможно это не принципиально, я могу только предположить как работает Мелодин. Востребованность этой информации зависит от алгоритма. Равно как и информация о цвете в зависимости от алгоритма (дальтоники вот не отличают — не совершенный алгоритм) может иметь значение, я к этому
В ряде областей требуется фоновая музыка в довольно больших количествах. В ней не нужно никакой индивидуальности, гениальности и души. На данный момент ее покупают и лицензируют.
Хорошо бы иметь генератор, у которого на входе параметры типа длительность, темп, стилистика и тп, а на выходе в меру однообразная музыка, на которую не обращают пристального внимания.
Дарю бизнес идею. :)
В пятерочке играет такая. Это так ужасно звучит, что хочется свалить оттуда поскорее.
«Обидеть киберхудожника может каждый!» — где-то плачет сейчас нейросеть.
А мне РобоБоб прям очень зашёл :) С позволения автора утащу на рингтон.
А не посоветуете минимальный конфиг для обучения? Я потестил без GPU на VPS (Centos 7, python 2.7, 4Гб ОЗУ, 1 ядро 2.5 Ггц), и на первом чекпоинте вылетает Out of memory, а триальный Google Сloud сжег еще год назад…
А на hdd осталось место? У меня часто именно оно заканчивалось и вылетало, когда система пытается сохранить очередной чекпоинт они до 1gb примерно разрастались насколько я помню. ОЗУ на виртуалке было 8гб вроде. 1 GPU проц. Без GPU будет увы долго-долго считать, сотни эпох будет сутки считать, даже на небольшом датасете, а еще периодически будет что-то падать, вам точно захочется поиграть с параметрами и разными наборами данных.

github.com/tensorflow/magenta/tree/master/magenta/models/music_vae
Я все же подозреваю проблема была в памяти, т.к. при запуске обучения было свободно 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. Можно ли прервать обучение, и затем запустить с последнего чекпоинта?
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. Да автоматом начинает с последнего сохраненного чекпоинта
Как уменьшение пакета дает ускорение не совсем понимаю, в моем понимании все равно весь тренинг сет должен быть пройден, но вот…
Во-первых, чем больше batch, тем более усреднено направление вектора градиентного спуска, так что при слишком большом batch сеть предпочитает более генерализованные усреднённые решения, которые сходятся медленнее. Во-вторых, с уменьшением размера batch'а их число в одной эпохе возрастает, т.е. итераций процесса оптимизации на одну эпоху будет просто количественно больше. Если LR считаем на итерацию, а не на эпоху, это выльется в изменение скорости обучения.
Огромное спасибо за ответы! Буду эксперементировать, еще очень порадовал набор Magenta Studio для аблетона, решает кучу задач. Еще забыл спросить, есть ли особая разница, тренировать полноценными midi треками со всеми инструментами, или разрезать на midi с однотипными инструментами? Т.е. отдельные модели гитар, басов, синтов, для одних и тех же треков.
Если вы про MusicVAE — то разрезать на отдельные инструменты не стоит. Смысл именно в том, что сеть учится на последовательности сочетаний звучания всех инструментов одновременно. Если вы ей накидаете отдельных дорожек с басом — она нагенерит вам потом басовых соло. Я не разобрался до конца как в точности работает пайплайн, но по типам инструменты они отличают когда midi парсят. Т.е. что гитара, а что барабаны понимают и не путают.
В процессе тестирования 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, и если да, то стоит ли дообучать модель только с новыми треками, или желательно заново с полным комплектом?
Первый пункт решился благодаря совету из гугл группы:
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.
Думаю, что все возможно, но как я к сожалению не разбирался. Эксперименты, изучение кода и вопросы в гугл группе :) Буду очень признателен, если потом расскажете что получилось.
А есть что-нибудь такое, что бы что-то напел и определила мелодию, музыку, песню? Наподобие голосового набора текста.
Да. Там выше в комментариях было приложение Music Memos. Я думаю есть и аналоги
Sign up to leave a comment.