Хабрахабр

Как мы музицировали с нейронными сетями v 2.0

Привет, Хабр.

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

Тут описано, как это было. image
Полтора года назад мы делали проект, где использовали рекуррентные нейронные сети для генерации музыки. Мы — это группа MODULSHTEIN (Александр Жеделёв, Мартен Альтров и Алексей Семинихин), а также Александр Потужный, который занимался машинерией, и я, Александр Тавген, софт-архитектор из Playtech. В этом году Eesti Kontsert (целевое учреждение, крупнейший организатор выступлений в стране) проводило серию концертов «Технология и Музыка» и нам было предложено сделать выступление в рамках этой серии. А поскольку модели мы используем для генерации ритма, то инструмент, на котором машина будет играть — это барабан. Если в прошлом проекте все происходило внутри одной машины и сигналы от моделей отображались на семплы, то идея этого проекта — вывести сигналы наружу и подключить к живому инструменту.

Барабан, который мы будем использовать, это часть реквизита, оставшегося с аудио-визуального представления IDEM.

image

Немного введения

Музыка, как и язык, особенно язык разговорный, обладает временной структурой. Это ритм, интервалы, динамика. Если моделировать музыкальную последовательность как поток неких символов, то для того, чтобы моделировать эту временную структуру, подходят рекуррентные нейронные сети. Известная статья Andrej Karpathy — это отличное введение в принципы, стоящие за рекуррентными нейронными сетями, и там есть отличные примеры. Чего стоит одна только сеть, натренированная на исходном коде Linux. Или модель, натренированная на речах Дональда Трампа.

Таким образом, нам необходимо преобразовывать сигналы MIDI во вход для моделей, и выход модели трансформировать обратно в MIDI. Протокол MIDI идеально подходит для представления музыки в виде потока символов. И тут на помощь приходит проект Magenta от Google, который был анонсирован в 2016 году.

Создаются виртуальные MIDI порты для call-response, грубо говоря — входа и выхода. По сути, Magenta предоставляет собой MIDI интерфейс для моделей TensorFlow. К каждой паре портов можно подсоединить модель TensorFlow. Можно запускать несколько параллельных портов. Так можно кратко описать процесс взаимодействия. Так называемый bundle файл — это checkpoint тренинга и метаданные графа из TensorFlow.

image

В деталях я описывал это тут.

То есть все можно представить как-то так: Tensorflow-Magenta-MIDI-Serial-Microcontroller-Actuators. Но если в предыдущем проекте мы отображали сигналы MIDI, идущие от моделей на сэмплы, то в этот раз нам надо выводить их наружу и подключать к моторам. Первый три шага уже были сделаны и все внимание досталось последним трем звеньям.

Самый простой вариант — это взять Arduino-совместимую платформу, хотя подойдет любой ATMega-based контроллер. Прежде чем думать, как преобразовывать и посылать сигналы из машины, необходимо выбрать микроконтроллер, который будет получать сигналы и управлять актуаторами.

Есть открытый проект hairless-midiserial projectgus.github.io/hairless-midiserial, который позволяет конвертировать MIDI для Serial устройств, причем как на вход, так и на выход. Arduino умеет читать Serial по USB, и задача сводилась к конвертации MIDI сигналов в протокол серийного порта. Удобство MIDI в целом заключается в том, что можно очень гибко управлять и соединять различные устройства.

image

Ну а дальше нужно доставать инструменты и начинать пробовать различные варианты конструкции.

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

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

image

LED я поставил для того, чтобы в случае проблем понимать где они, идет ли сигнал из Arduino на вход MOSFET. Ну и какой Arduino проект без мигания LED. В целом это выглядело так, котикам очень понравилось.

В целом не было существенных задержек и проблемы с подключением, но выяснились проблемы другого плана. Соленоиды не подходят для извлечения звука из нашего большого барабана, им не хватает силы удара. Сами соленоиды 5-вольтовые. Было решено поискать что-то помощнее. Следующий выбор — это моторы, которые используются в автомобильных замках. Они достаточно мощные, с хорошей тягой, и дешевые.

image

Мотор для двери автомобиля имеет не только ход вперед, но и ход назад. Но тут есть один момент. Такого типа, только на одном чипе. Чтобы им бить, нужно выполнять очень быстро движение вперед-пауза-назад, а для вперед-назад уже одним MOSFET не обойдешься, так как надо менять направление тока для мотора (H-Bridge), чтобы он двигался в обе стороны, поэтому я купил motor shield для Arduino, совместимый с Adafruit.

image

Вот версия уже с моторным мостом и мотором от автомобильной двери.

А теперь об общей механике

Мигать LED на Ардуино это одно, но нам необходимо было построить систему, которая отыграет час концерта. И вот какие трудности имеются.

  1. Жесткость конструкции. Моторы достаточно мощные, и крепления, на которые они должны крепиться, должны выдержать вибрацию в течении часа.

    image

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

  2. Сама механика удара. Она состояла из быстрого движения вперед, паузы и движения назад. Но насколько большими должны быть быть интервалы этого движения? Это можно выяснить только опытным путем. Причем интервалы зависели от места крепления палочки, отображенных нот. Мы определяли интервалы методом проб и ошибок. Чтобы было понятно, часть кода на Ардуино, отвечающая за удары, выглядела так.

    image

  3. Все моторы разные. Сами моторы имеют механический привод и поэтому дают достаточно ощутимый шум. Но шум становится намного сильнее, стоит мотору отклонится от оси удара, и это увеличивает риск поломки мотора. Учитывая вибрацию и силы удара, мы опять упирались в жесткость конструкции. Александр Потужный сделал тут очень многое в части улучшения креплений.
  4. Сброс контроллера от паразитных помех. Поскольку вокруг будет множество устройств, кабелей, да и сами моторы дают шум.

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

Сборка и репетиции

Окончательную сборку и репетиции проводили в музыкальной студии Русского Театра Эстонии.

image

Проблема репетиций с нейронной сетью еще и в том, что сама сеть недетерминирована. Взаимодействие происходит в режиме call-response, и каждый раз ответы сети будут разными — поэтому невозможно прорепетировать финальный вариант.

Музыкальная концепция

Для выступления мы также подготовили видеоряд. Изначально думали управлять видеопотоком тоже по MIDI, чтобы играть оверлеями и сводить видео, сгенерированное GAN — но мы не успевали сделать environment для второй машины и соединение с моделями. Поэтому видео для каждой части выступления было заранее пререндерено; использовались GAN и управление оверлеями. Все синхронизировалось с главным midi_clock.

Для лайва я использовал VDMX5, через которую шел видео поток.

image

Незадолго до выступления сделали презентацию на телевидении.

И было очень необычно видеть плакаты на концертном зале Эстония (это как Большой театр для Москвы).

image

image

Выступление

Само выступление проходило на сцене Sõltumatu Tantsu Lava, это небольшой зал (чуть больше 100 человек) в творческом квартале Теллискиви в комплексе Vaba Lava. Одна только установка и настройка всего оборудования заняла более 4 часов. Полностью подключились уже практически ночью.

И уже без света.

Зал был полон, несмотря на позднюю рекламу. Я находился сбоку сцены и контролировал видео поток. Сам концерт удался отлично — то, как работала модель, как шел звук и видео. Зрители говорили, что их отправило в трип где-то на 10-15 минуте. 🙂 Все получилось очень атмосферно.

image

image

image

image

image

Audiokinetica.com www.

Aleksandr Tavgen – IT solution, software development
Aleksandr Potužnoi – technical support

Modulshtein.com Modulshtein:
www.

On Spotify

Aleksandr Žedeljov aka FAERSHTEIN– guitar, Ableton, analog synth
Marten Altrov – clarinet, bass clarinet
Aleksei Semenihhin aka DJ Bandit – Fx, Samples, Scratches

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть