Привет, Хабр.
Это пост о том, как мы вывели нейронные сети в реальную жизнь. Если нравится прикладная роботика и инженерия, или любишь нейроночки, или мигаешь LEDом на Ардуине, то будет интересно. Впрочем, это история о том, как собрать множество разных компонентов и технологий в единое целое и сделать из этого представление. Детали под катом.
![image](https://habrastorage.org/r/w780q1/webt/6r/da/h5/6rdah5jsihwfqhkwbnw3ixpwkis.jpeg)
Полтора года назад мы делали проект, где использовали рекуррентные нейронные сети для генерации музыки. Тут описано, как это было. В этом году Eesti Kontsert (целевое учреждение, крупнейший организатор выступлений в стране) проводило серию концертов «Технология и Музыка» и нам было предложено сделать выступление в рамках этой серии. Мы — это группа MODULSHTEIN (Александр Жеделёв, Мартен Альтров и Алексей Семинихин), а также Александр Потужный, который занимался машинерией, и я, Александр Тавген, софт-архитектор из Playtech. Если в прошлом проекте все происходило внутри одной машины и сигналы от моделей отображались на семплы, то идея этого проекта — вывести сигналы наружу и подключить к живому инструменту. А поскольку модели мы используем для генерации ритма, то инструмент, на котором машина будет играть — это барабан.
Барабан, который мы будем использовать, это часть реквизита, оставшегося с аудио-визуального представления IDEM.
![image](https://habrastorage.org/r/w780q1/webt/eo/0q/px/eo0qpxpbkpgmonqzyan9jhd6cpw.jpeg)
Музыка, как и язык, особенно язык разговорный, обладает временной структурой. Это ритм, интервалы, динамика. Если моделировать музыкальную последовательность как поток неких символов, то для того, чтобы моделировать эту временную структуру, подходят рекуррентные нейронные сети. Известная статья Andrej Karpathy — это отличное введение в принципы, стоящие за рекуррентными нейронными сетями, и там есть отличные примеры. Чего стоит одна только сеть, натренированная на исходном коде Linux. Или модель, натренированная на речах Дональда Трампа.
Протокол MIDI идеально подходит для представления музыки в виде потока символов. Таким образом, нам необходимо преобразовывать сигналы MIDI во вход для моделей, и выход модели трансформировать обратно в MIDI. И тут на помощь приходит проект Magenta от Google, который был анонсирован в 2016 году.
По сути, Magenta предоставляет собой MIDI интерфейс для моделей TensorFlow. Создаются виртуальные MIDI порты для call-response, грубо говоря — входа и выхода. Можно запускать несколько параллельных портов. К каждой паре портов можно подсоединить модель TensorFlow. Так называемый bundle файл — это checkpoint тренинга и метаданные графа из TensorFlow. Так можно кратко описать процесс взаимодействия.
![image](https://habrastorage.org/r/w1560/webt/jx/wc/vr/jxwcvr-vhe-w5wjqci8issowvay.png)
В деталях я описывал это тут.
Но если в предыдущем проекте мы отображали сигналы 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](https://habrastorage.org/r/w1560/webt/yp/rf/l1/yprfl1iluf8t9xegkkevziz6snw.png)
Ну а дальше нужно доставать инструменты и начинать пробовать различные варианты конструкции.
Первый прототип надо было сделать для того, чтобы оценить возможные задержки и проблемы с синхронизацией.
Сигнал шел в Ардуино, где в зависимости от высоты ноты отображался на разные выходы. Для тестов я собрал классическую схему на базе MOSFET. MOSFET это грубо говоря транзистор, который позволяет управлять большими токами; подавая управляющий сигнал, можно открывать и закрывать транзистор.
![image](https://habrastorage.org/r/w1560/webt/ce/k7/ki/cek7kibqaamb8rh3jihrlbkdx7o.png)
Ну и какой Arduino проект без мигания LED. LED я поставил для того, чтобы в случае проблем понимать где они, идет ли сигнал из Arduino на вход MOSFET. В целом это выглядело так, котикам очень понравилось.
В целом не было существенных задержек и проблемы с подключением, но выяснились проблемы другого плана. Соленоиды не подходят для извлечения звука из нашего большого барабана, им не хватает силы удара. Сами соленоиды 5-вольтовые. Было решено поискать что-то помощнее. Следующий выбор — это моторы, которые используются в автомобильных замках. Они достаточно мощные, с хорошей тягой, и дешевые.
![image](https://habrastorage.org/r/w780q1/webt/mi/as/ei/miaseitze1tuqpfs54j2fn25mng.jpeg)
Но тут есть один момент. Мотор для двери автомобиля имеет не только ход вперед, но и ход назад. Чтобы им бить, нужно выполнять очень быстро движение вперед-пауза-назад, а для вперед-назад уже одним MOSFET не обойдешься, так как надо менять направление тока для мотора (H-Bridge), чтобы он двигался в обе стороны, поэтому я купил motor shield для Arduino, совместимый с Adafruit. Такого типа, только на одном чипе.
![image](https://habrastorage.org/r/w780q1/webt/ar/cm/us/arcmusz4kpaxvrkluvyqitwoiq8.jpeg)
Вот версия уже с моторным мостом и мотором от автомобильной двери.
Мигать LED на Ардуино это одно, но нам необходимо было построить систему, которая отыграет час концерта. И вот какие трудности имеются.
Поскольку моторы управляются музыкой, то из этого можно было бы сделать секс игрушки. Поставил свою любимую музыку, например Имперский марш, и…
Окончательную сборку и репетиции проводили в музыкальной студии Русского Театра Эстонии.
![image](https://habrastorage.org/r/w780q1/webt/r6/dw/16/r6dw16jc71deldtsvj2xq-eve78.jpeg)
Проблема репетиций с нейронной сетью еще и в том, что сама сеть недетерминирована. Взаимодействие происходит в режиме call-response, и каждый раз ответы сети будут разными — поэтому невозможно прорепетировать финальный вариант.
Для выступления мы также подготовили видеоряд. Изначально думали управлять видеопотоком тоже по MIDI, чтобы играть оверлеями и сводить видео, сгенерированное GAN — но мы не успевали сделать environment для второй машины и соединение с моделями. Поэтому видео для каждой части выступления было заранее пререндерено; использовались GAN и управление оверлеями. Все синхронизировалось с главным midi_clock.
Для лайва я использовал VDMX5, через которую шел видео поток.
![image](https://habrastorage.org/r/w1560/webt/s1/uj/iy/s1ujiy7yl6wfousryoukl3b5jnc.png)
Незадолго до выступления сделали презентацию на телевидении.
И было очень необычно видеть плакаты на концертном зале Эстония (это как Большой театр для Москвы).
![image](https://habrastorage.org/r/w780q1/webt/l5/s6/q3/l5s6q30ffawsvxyj5o9s0c7ermc.jpeg)
![image](https://habrastorage.org/r/w780q1/webt/7i/jg/vu/7ijgvu6ikt4zpkomjxbg-uvl3es.jpeg)
Само выступление проходило на сцене Sõltumatu Tantsu Lava, это небольшой зал (чуть больше 100 человек) в творческом квартале Теллискиви в комплексе Vaba Lava. Одна только установка и настройка всего оборудования заняла более 4 часов. Полностью подключились уже практически ночью.
И уже без света.
Зал был полон, несмотря на позднюю рекламу. Я находился сбоку сцены и контролировал видео поток. Сам концерт удался отлично — то, как работала модель, как шел звук и видео. Зрители говорили, что их отправило в трип где-то на 10-15 минуте. :) Все получилось очень атмосферно.
![image](https://habrastorage.org/r/w780q1/webt/6a/lw/op/6alwopplz4esh5qxenphpr6x_ia.jpeg)
![image](https://habrastorage.org/r/w780q1/webt/lr/6x/nj/lr6xnjzgdjyqp3l_xxie3tuidna.jpeg)
![image](https://habrastorage.org/r/w780q1/webt/rj/oi/qo/rjoiqo-u17u7gxgnjkc0njwvp0k.jpeg)
![image](https://habrastorage.org/r/w780q1/webt/8u/rq/iy/8urqiyhpr3psnroxqurgenmci2g.jpeg)
![image](https://habrastorage.org/r/w780q1/webt/mc/e8/qc/mce8qciyfb1i8rketo2zvrp_0ag.jpeg)
www.Audiokinetica.com
Aleksandr Tavgen – IT solution, software development
Aleksandr Potužnoi – technical support
Modulshtein:
www.Modulshtein.com
On Spotify
Aleksandr Žedeljov aka FAERSHTEIN– guitar, Ableton, analog synth
Marten Altrov – clarinet, bass clarinet
Aleksei Semenihhin aka DJ Bandit – Fx, Samples, Scratches
Это пост о том, как мы вывели нейронные сети в реальную жизнь. Если нравится прикладная роботика и инженерия, или любишь нейроночки, или мигаешь LEDом на Ардуине, то будет интересно. Впрочем, это история о том, как собрать множество разных компонентов и технологий в единое целое и сделать из этого представление. Детали под катом.
![image](https://habrastorage.org/webt/6r/da/h5/6rdah5jsihwfqhkwbnw3ixpwkis.jpeg)
Полтора года назад мы делали проект, где использовали рекуррентные нейронные сети для генерации музыки. Тут описано, как это было. В этом году Eesti Kontsert (целевое учреждение, крупнейший организатор выступлений в стране) проводило серию концертов «Технология и Музыка» и нам было предложено сделать выступление в рамках этой серии. Мы — это группа MODULSHTEIN (Александр Жеделёв, Мартен Альтров и Алексей Семинихин), а также Александр Потужный, который занимался машинерией, и я, Александр Тавген, софт-архитектор из Playtech. Если в прошлом проекте все происходило внутри одной машины и сигналы от моделей отображались на семплы, то идея этого проекта — вывести сигналы наружу и подключить к живому инструменту. А поскольку модели мы используем для генерации ритма, то инструмент, на котором машина будет играть — это барабан.
Барабан, который мы будем использовать, это часть реквизита, оставшегося с аудио-визуального представления IDEM.
![image](https://habrastorage.org/webt/eo/0q/px/eo0qpxpbkpgmonqzyan9jhd6cpw.jpeg)
Немного введения
Музыка, как и язык, особенно язык разговорный, обладает временной структурой. Это ритм, интервалы, динамика. Если моделировать музыкальную последовательность как поток неких символов, то для того, чтобы моделировать эту временную структуру, подходят рекуррентные нейронные сети. Известная статья Andrej Karpathy — это отличное введение в принципы, стоящие за рекуррентными нейронными сетями, и там есть отличные примеры. Чего стоит одна только сеть, натренированная на исходном коде Linux. Или модель, натренированная на речах Дональда Трампа.
Протокол MIDI идеально подходит для представления музыки в виде потока символов. Таким образом, нам необходимо преобразовывать сигналы MIDI во вход для моделей, и выход модели трансформировать обратно в MIDI. И тут на помощь приходит проект Magenta от Google, который был анонсирован в 2016 году.
По сути, Magenta предоставляет собой MIDI интерфейс для моделей TensorFlow. Создаются виртуальные MIDI порты для call-response, грубо говоря — входа и выхода. Можно запускать несколько параллельных портов. К каждой паре портов можно подсоединить модель TensorFlow. Так называемый bundle файл — это checkpoint тренинга и метаданные графа из TensorFlow. Так можно кратко описать процесс взаимодействия.
![image](https://habrastorage.org/webt/jx/wc/vr/jxwcvr-vhe-w5wjqci8issowvay.png)
В деталях я описывал это тут.
Но если в предыдущем проекте мы отображали сигналы 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](https://habrastorage.org/webt/yp/rf/l1/yprfl1iluf8t9xegkkevziz6snw.png)
Ну а дальше нужно доставать инструменты и начинать пробовать различные варианты конструкции.
Первый прототип надо было сделать для того, чтобы оценить возможные задержки и проблемы с синхронизацией.
Сигнал шел в Ардуино, где в зависимости от высоты ноты отображался на разные выходы. Для тестов я собрал классическую схему на базе MOSFET. MOSFET это грубо говоря транзистор, который позволяет управлять большими токами; подавая управляющий сигнал, можно открывать и закрывать транзистор.
![image](https://habrastorage.org/webt/ce/k7/ki/cek7kibqaamb8rh3jihrlbkdx7o.png)
Ну и какой Arduino проект без мигания LED. LED я поставил для того, чтобы в случае проблем понимать где они, идет ли сигнал из Arduino на вход MOSFET. В целом это выглядело так, котикам очень понравилось.
В целом не было существенных задержек и проблемы с подключением, но выяснились проблемы другого плана. Соленоиды не подходят для извлечения звука из нашего большого барабана, им не хватает силы удара. Сами соленоиды 5-вольтовые. Было решено поискать что-то помощнее. Следующий выбор — это моторы, которые используются в автомобильных замках. Они достаточно мощные, с хорошей тягой, и дешевые.
![image](https://habrastorage.org/webt/mi/as/ei/miaseitze1tuqpfs54j2fn25mng.jpeg)
Но тут есть один момент. Мотор для двери автомобиля имеет не только ход вперед, но и ход назад. Чтобы им бить, нужно выполнять очень быстро движение вперед-пауза-назад, а для вперед-назад уже одним MOSFET не обойдешься, так как надо менять направление тока для мотора (H-Bridge), чтобы он двигался в обе стороны, поэтому я купил motor shield для Arduino, совместимый с Adafruit. Такого типа, только на одном чипе.
![image](https://habrastorage.org/webt/ar/cm/us/arcmusz4kpaxvrkluvyqitwoiq8.jpeg)
Вот версия уже с моторным мостом и мотором от автомобильной двери.
А теперь об общей механике
Мигать LED на Ардуино это одно, но нам необходимо было построить систему, которая отыграет час концерта. И вот какие трудности имеются.
- Жесткость конструкции. Моторы достаточно мощные, и крепления, на которые они должны крепиться, должны выдержать вибрацию в течении часа.
Мы перепробовали 3 или 4 варианта конструкции, пока не нашли приемлемую. Сцепка с палочкой не должна быть жесткой, поскольку палочка должна иметь упругий отскок от барабана, а жесткая сцепка очень ухудшит звук. Мы использовали строительные стяжки.
- Сама механика удара. Она состояла из быстрого движения вперед, паузы и движения назад. Но насколько большими должны быть быть интервалы этого движения? Это можно выяснить только опытным путем. Причем интервалы зависели от места крепления палочки, отображенных нот. Мы определяли интервалы методом проб и ошибок. Чтобы было понятно, часть кода на Ардуино, отвечающая за удары, выглядела так.
- Все моторы разные. Сами моторы имеют механический привод и поэтому дают достаточно ощутимый шум. Но шум становится намного сильнее, стоит мотору отклонится от оси удара, и это увеличивает риск поломки мотора. Учитывая вибрацию и силы удара, мы опять упирались в жесткость конструкции. Александр Потужный сделал тут очень многое в части улучшения креплений.
- Сброс контроллера от паразитных помех. Поскольку вокруг будет множество устройств, кабелей, да и сами моторы дают шум.
Поскольку моторы управляются музыкой, то из этого можно было бы сделать секс игрушки. Поставил свою любимую музыку, например Имперский марш, и…
Сборка и репетиции
Окончательную сборку и репетиции проводили в музыкальной студии Русского Театра Эстонии.
![image](https://habrastorage.org/webt/r6/dw/16/r6dw16jc71deldtsvj2xq-eve78.jpeg)
Проблема репетиций с нейронной сетью еще и в том, что сама сеть недетерминирована. Взаимодействие происходит в режиме call-response, и каждый раз ответы сети будут разными — поэтому невозможно прорепетировать финальный вариант.
Музыкальная концепция
Для выступления мы также подготовили видеоряд. Изначально думали управлять видеопотоком тоже по MIDI, чтобы играть оверлеями и сводить видео, сгенерированное GAN — но мы не успевали сделать environment для второй машины и соединение с моделями. Поэтому видео для каждой части выступления было заранее пререндерено; использовались GAN и управление оверлеями. Все синхронизировалось с главным midi_clock.
Для лайва я использовал VDMX5, через которую шел видео поток.
![image](https://habrastorage.org/webt/s1/uj/iy/s1ujiy7yl6wfousryoukl3b5jnc.png)
Незадолго до выступления сделали презентацию на телевидении.
И было очень необычно видеть плакаты на концертном зале Эстония (это как Большой театр для Москвы).
![image](https://habrastorage.org/webt/l5/s6/q3/l5s6q30ffawsvxyj5o9s0c7ermc.jpeg)
![image](https://habrastorage.org/webt/7i/jg/vu/7ijgvu6ikt4zpkomjxbg-uvl3es.jpeg)
Выступление
Само выступление проходило на сцене Sõltumatu Tantsu Lava, это небольшой зал (чуть больше 100 человек) в творческом квартале Теллискиви в комплексе Vaba Lava. Одна только установка и настройка всего оборудования заняла более 4 часов. Полностью подключились уже практически ночью.
И уже без света.
Зал был полон, несмотря на позднюю рекламу. Я находился сбоку сцены и контролировал видео поток. Сам концерт удался отлично — то, как работала модель, как шел звук и видео. Зрители говорили, что их отправило в трип где-то на 10-15 минуте. :) Все получилось очень атмосферно.
![image](https://habrastorage.org/webt/6a/lw/op/6alwopplz4esh5qxenphpr6x_ia.jpeg)
![image](https://habrastorage.org/webt/lr/6x/nj/lr6xnjzgdjyqp3l_xxie3tuidna.jpeg)
![image](https://habrastorage.org/webt/rj/oi/qo/rjoiqo-u17u7gxgnjkc0njwvp0k.jpeg)
![image](https://habrastorage.org/webt/8u/rq/iy/8urqiyhpr3psnroxqurgenmci2g.jpeg)
![image](https://habrastorage.org/webt/mc/e8/qc/mce8qciyfb1i8rketo2zvrp_0ag.jpeg)
www.Audiokinetica.com
Aleksandr Tavgen – IT solution, software development
Aleksandr Potužnoi – technical support
Modulshtein:
www.Modulshtein.com
On Spotify
Aleksandr Žedeljov aka FAERSHTEIN– guitar, Ableton, analog synth
Marten Altrov – clarinet, bass clarinet
Aleksei Semenihhin aka DJ Bandit – Fx, Samples, Scratches