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

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

image

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

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

image

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


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

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

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

image

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

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

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

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

image

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

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

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

image

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



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

Выступление


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


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


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

image

image

image

image


image

www.Audiokinetica.com

Aleksandr Tavgen – IT solution, software development
Aleksandr Potuznoi – technical support

Modulshtein:
www.Modulshtein.com

On Spotify

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

Комментарии (3)


  1. milssky
    11.08.2019 20:00
    +1

    Придираюсь, но все же. TIP120 — это не MOSFET, а составной транзистор.


    1. HomunCulus Автор
      11.08.2019 20:08

      Да, согласен. :)


  1. maverickcy
    11.08.2019 21:54

    Круто! Я тоже себе каоссилятор вчера приобрел, жутко неудобная штука оказалась!