Представляем «Lucid Sonic Dreams»: синхронизируйте искусство GAN с музыкой с помощью нескольких строк кода Python!

Делаем генеративное аудиовизуальное искусство простым и настраиваемым

Генеративное искусство добилось значительных успехов за последние несколько лет. Достаточно взглянуть на бесчисленное количество произведений искусства, размещенных в Интернете (например, здесь и здесь), чтобы понять, что машины, возможно, сравнялись с человеком с точки зрения художественного мастерства. Последствия этого для художников, движущихся вперед, являются предметом обсуждения, но мы все можем согласиться с одним положительным моментом, заключающимся в том, что это открывает дверь к совершенно новым визуальным и слуховым переживаниям. Точно так же это делает создание искусства доступным даже для неподготовленных.

Таким образом, введите Lucid Sonic Dreams: пакет Python, который синхронизирует генеративное искусство с музыкой всего в нескольких строках кода!

Важные ссылки

Если вы хотите сразу перейти к делу и погрузиться в Lucid Sonic Dreams, вот все ссылки, которые вам понадобятся:

  • Репозиторий GitHub.
  • Учебная тетрадь по Google Colab, в которой подробно описаны все параметры, которые вы можете изменять, и приведены образцы шаблонов кода.
  • Аккаунт Lucid Sonic Dreams Instagram, содержащий короткие превью видеороликов, созданных с помощью этого пакета.
  • Мой YouTube канал, который содержит полнометражные видеоролики с работами, созданными с помощью этого пакета, вместе с другими моими музыкальными произведениями.

В противном случае, если вы хотите лучше понять, как работает пакет, а также увидеть несколько демонстраций в процессе, читайте дальше!

Как это работает

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

Как правило, генеративные изображения создаются с помощью класса фреймворков глубокого обучения, который называется Generative Adversarial Networks (GAN). Lucid Sonic Dreams по умолчанию использует архитектуру StyleGAN2-ADA, хотя это можно настроить, как вы увидите позже. Эти модели обучаются на наборах данных изображений, которые обычно соответствуют определенному стилю. После обучения модели могут выводить практически бесконечное количество изображений, которые соответствуют стилю изображений, на которых они обучаются. Этот репозиторий от Джастина Пинкни показывает образцы выходных данных из множества предварительно обученных моделей StyleGAN2 со стилями от Лица до Искусства, до… My Little Pony?

Все становится интересно, когда мы углубляемся в как создаются эти изображения. Модель получает входные данные - в случае StyleGAN2 вектор, содержащий 512 чисел - который определяет выходное изображение. Небольшие изменения входного вектора соответственно приведут к небольшим изменениям в выходном изображении. А теперь самое интересное: что, если мы получим звуковые волны из музыки, извлечем числовые значения (например, амплитуду) из этих звуковых волн и добавим их к значениям во входном векторе? Lucid Sonic Dreams делает это для каждого кадра видео, создавая искусство, которое пульсирует и трансформируется в музыку, которую он слышит.

Чтобы отдать должное, эта идея была вдохновлена ​​проектом Deep Music Visualizer Мэтта Сигельмана. Это аналогичная реализация Python, которая синхронизирует музыку с изображением, созданным BigGAN. В сети есть несколько других проектов, которые пытаются реализовать эту идею, но ни один (насколько мне известно) не поставляется в виде пакета Python и не является таким настраиваемым, как Lucid Sonic Dreams.

Во всяком случае, это был базовый обзор того, что происходит под капотом. Более подробная техническая информация будет рассмотрена в разделе «Параметры настройки» ниже!

Использование пакета

Lucid Sonic Dreams был специально разработан, чтобы быть простым в использовании и невероятно гибким. Все, что требуется, - это обычная установка pip…

pip install lucidsonicdreams

… За которыми следуют несколько строк кода Python:

И вот так, готово! Вот пример видео, созданного только с помощью этого блока кода; Я предлагаю посмотреть хотя бы первые полторы минуты, чтобы увидеть наращивание отдельных компонентов.

Смена стилей

Вы можете просмотреть доступные стили по умолчанию, просто запустив:

Это напечатает полный список имен стилей, из которого вы можете выбрать. Эти стили взяты из упомянутого ранее потрясающего хранилища Джастина Пинкни. Также можно передать свои собственные веса StyleGAN или полностью использовать другую архитектуру GAN - подробнее об этом позже.

Параметры настройки

Несмотря на то, что пакет чрезвычайно прост в использовании с настройками по умолчанию, на самом деле он имеет множество параметров - на самом деле более 30 - которые можно настраивать! В Учебном пособии по Google Colab эти параметры перечислены во всех подробностях. Однако в этой статье мы рассмотрим только основные компоненты, которыми манипулирует музыка, и наиболее важные параметры, которые ими управляют.

В этом пакете музыка управляет 3 основными визуальными компонентами: Пульс, Движение и Класс. Пульс буквально означает, как визуальные эффекты «пульсируют» ударными элементами музыки. Математически этот импульс является результатом временного добавления амплитуды звуковых волн к входному вектору (то есть вектор возвращается в нормальное состояние в следующем видеокадре). Между тем, движение относится к скорости, с которой визуальные эффекты трансформируются. Математически это результат кумулятивного добавления амплитуды к входному вектору (т.е. все, что добавлено, остается там).

Компонент Класс - интересный. Это относится к меткам объектов на сгенерированных изображениях. В стиле, обученном на изображениях WikiArt, например, существует 167 классов, в том числе Ван Гог, Да Винчи, Абстрактная живопись и другие. Они контролируются высотой звука - в частности, 12 музыкальных высот соответствуют 12 различным классам. Индивидуальные амплитуды этих шагов влияют на числа, передаваемые второму входному вектору (вектор классов), который определяет объекты, генерируемые моделью. Эта идея была взята из упомянутого ранее проекта Deep Music Visualizer!

Чтобы понять, какие параметры наиболее важны, давайте рассмотрим весь конвейер генерации видео. Сначала инициализируются входные векторы и интерполируются между ними. Это служит «базовым движением» видео. Параметр speed_fpm контролирует скорость этого движения, где «FPM» означает «кадров в минуту» - по сути, количество векторов, инициализируемых в минуту. Для каждого последующего кадра параметры pulse_react, motion_react и class_react контролировать, насколько каждый компонент обрабатывается звуком.

После того, как модель сгенерирует изображения из этих векторов, изображения проходят через стек эффектов, которые также реагируют на музыку. По умолчанию в пакете есть эффекты «контраста» и «вспышки», которые синхронизируются с ударными элементами звука. Их можно переключать, задав параметры Contrast_strength и flash_strength. Также можно создавать свои собственные эффекты - подробнее об этом позже.

Вот пример кода, который настраивает некоторые из этих параметров. Обратите внимание, как speed_fpm = 0, что делает его таким, чтобы во время тихих частей песни не было движения.

Использование собственных весов StyleGAN

Если вы обучили свой собственный StyleGAN или случайно столкнулись с весами модели в Интернете, вы можете передать путь к файлу этим весам в качестве значения параметра style. Я лично рад видеть, какие генеративные художники со своими весами моделей в конечном итоге создадут с этим пакетом!

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

Использование изолированных аудиодорожек

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

Вот код, который я использовал для визуализации музыкальной дорожки, которую написал сам. Я использовал изолированную дорожку перкуссии для управления Pulse и изолированную дорожку «синтезаторных аккордов» для управления Class.

Создание собственных эффектов

В дополнение к встроенным эффектам контрастности и вспышки, Lucid Sonic Dreams также позволяет создавать свои собственные реактивные пользовательские эффекты. Для этого просто создайте функцию, которая принимает как минимум 3 параметра - массив, который относится к изображению, к которому применяется эффект; сила, который определяет, насколько он реагирует на музыку; и амплитуда, которая относится к громкости музыки в любой момент времени. После этого передайте эту настраиваемую функцию объекту EffectsGenerator. Вот довольно экспериментальная визуализация, в которой используется эффект водоворота scikit-image:

Использование других архитектур GAN

Если вы предпочитаете использовать другую архитектуру GAN, Lucid Sonic Dreams позволяет вам это сделать. Просто определите функцию, которая принимает пакеты векторов шума и векторов классов (массивы NumPy) в качестве входных данных и выводит пакет изображений подушки. На самом деле этой функции даже не нужно использовать GAN - это может быть любая функция, преобразующая входные векторы в изображения.

Следующий код воспроизводит вышеупомянутый Deep Music Visualizer путем создания изображений с использованием реализации BigGAN PyTorch. Это гораздо более сложный блок кода, который использует некоторые дополнительные параметры. Обратите внимание, что для этого необходимо сначала запустить pip install pytorch_pretrained_biggan.

И все! Тем, кто планирует опробовать этот пакет, я с нетерпением жду возможности увидеть твое волшебство.