Oi Habr.
Este post é sobre como trouxemos redes neurais para a vida real. Se você gosta de robótica e engenharia aplicada, ou gosta de neurônios, ou pisca um LED no Arduin, será interessante. No entanto, esta é uma história sobre como montar muitos componentes e tecnologias diferentes em um único todo e criar uma idéia disso. Detalhes sob o corte.

Há um ano e meio, fizemos um projeto em que usamos redes neurais recorrentes para gerar música. Descreve como foi. Este ano, Eesti Kontsert (a instituição-alvo, o maior organizador de apresentações do país) realizou uma série de shows "Tecnologia e Música" e fomos convidados a fazer uma apresentação nessa série. Somos o grupo
MODULSHTEIN (Alexander Zhedelev, Marten Altrov e Alexey Seminikhin) , bem como Alexander Potuzhny, que estava envolvido em engenharia mecânica, e eu, Alexander Tavgen, arquiteto de software da Playtech. Se no projeto anterior tudo aconteceu dentro de uma máquina e os sinais dos modelos foram exibidos em amostras, a idéia deste projeto é trazer os sinais para fora e conectá-los a um instrumento ao vivo. E como usamos modelos para gerar ritmo, o instrumento no qual a máquina tocará é um tambor.
O tambor que usaremos faz parte dos acessórios deixados na apresentação audiovisual do
IDEM .

Uma pequena introdução
A música, como a linguagem, especialmente a linguagem falada, tem uma estrutura temporária. Este é o ritmo, intervalos, dinâmica. Se simularmos uma sequência musical como uma corrente de certos símbolos, então, para simular essa estrutura temporal, redes neurais recorrentes são adequadas. O famoso
artigo de Andrej Karpathy é uma ótima introdução aos princípios por trás das redes neurais recorrentes e há ótimos exemplos. Qual é a única rede treinada no código fonte do Linux? Ou um
modelo treinado nos discursos de Donald Trump.O protocolo MIDI é ideal para representar a música como um fluxo de caracteres. Portanto, precisamos converter os sinais MIDI na entrada dos modelos e transformar a saída do modelo novamente em MIDI. E então o projeto Magenta do Google vem em socorro, anunciado em 2016.
Em essência, o Magenta fornece uma interface MIDI para os modelos TensorFlow. As portas MIDI virtuais são criadas para atender chamadas, grosso modo - entrada e saída. Você pode executar várias portas paralelas. Você pode conectar um modelo TensorFlow a cada par de portas. O chamado arquivo de pacote configurável é o ponto de verificação de treinamento e os metadados do gráfico do TensorFlow. Assim, você pode descrever brevemente o processo de interação.

Eu descrevi isso em detalhes
aqui .
Mas se no projeto anterior exibimos sinais MIDI vindos dos modelos para as amostras, desta vez precisamos trazê-los para fora e conectá-los aos motores. Ou seja, tudo pode ser representado de alguma forma assim: Atuadores de microcontroladores em série Tensorflow-Magenta-MIDI. Os três primeiros passos já foram dados e toda a atenção foi dada nos últimos três links.
Antes de pensar em como converter e enviar sinais da máquina, você precisa selecionar um microcontrolador que receba sinais e controle os atuadores. A opção mais fácil é usar uma plataforma compatível com Arduino, embora qualquer controlador baseado em ATMega seja adequado.
O Arduino pode ler Serial via USB, e a tarefa era converter sinais MIDI em protocolo de porta serial. Existe um projeto aberto hairless-midiserial
projectgus.imtqy.com/hairless-midiserial , que permite converter MIDI em dispositivos seriais, tanto para entrada quanto para saída. A conveniência do MIDI como um todo é que você pode controlar e conectar dispositivos de maneira muito flexível.

Bem, você precisa obter as ferramentas e começar a tentar várias opções de design.
O primeiro protótipo teve que ser realizado para avaliar possíveis atrasos e problemas com a sincronização.
O sinal foi para o Arduino, onde, dependendo da altura das notas, foi exibido em diferentes saídas. Para os testes, montei um circuito clássico baseado em MOSFET. O MOSFET é aproximadamente um transistor que permite controlar altas correntes; dando um sinal de controle, você pode abrir e fechar o transistor.

Bem, que tipo de projeto do Arduino é sem LED piscando. Defino o LED para que, em caso de problemas, entenda onde eles estão, se o sinal do Arduino vai para a entrada MOSFET. Em geral, parecia assim, os gatos realmente gostaram.
Em geral, não houve atrasos significativos e problemas de conexão, mas os problemas de um plano diferente foram esclarecidos. Os solenóides não são adequados para extrair o som do nosso grande tambor, eles não têm a força do impacto. Os próprios solenóides de 5 volts. Foi decidido procurar algo mais poderoso. A próxima opção são os motores usados nas fechaduras dos carros. Eles são poderosos o suficiente, com boa tração e baratos.

Mas há um ponto. O motor da porta do carro não tem apenas um avanço, mas também um avanço. Para vencê-los, é necessário executar um movimento muito rápido de pausa para frente e para trás, mas, para frente e para trás, você não pode executar apenas um MOSFET, pois é necessário alterar a direção atual do motor (
ponte H ) para que ele se mova nas duas direções, então comprei escudo do motor para Arduino, compatível com Adafruit. Este tipo, apenas em um chip.

Aqui está a versão já com uma ponte de motor e um motor de uma porta de carro.
E agora sobre mecânica geral
Os LEDs piscando no Arduino são uma coisa, mas tivemos que construir um sistema que tocasse a hora do show. E aqui estão as dificuldades.
- Rigidez de um design. Os motores são potentes o suficiente e as montagens nas quais devem ser montados devem suportar vibrações por uma hora.

Tentamos 3 ou 4 opções de design até encontrar uma aceitável. O engate com o bastão não deve ser rígido, pois o bastão deve ter uma recuperação elástica do tambor, e um engate rígido degradará bastante o som. Usamos betonilhas de construção.
- A mecânica do próprio impacto. Consistia em movimento rápido para frente, pausa e movimento para trás. Mas qual deve ser o tamanho dos intervalos desse movimento? Isso só pode ser determinado empiricamente. Além disso, os intervalos dependiam do local de fixação do manche, as notas exibidas. Determinamos os intervalos por tentativa e erro. Para deixar claro, a parte do código do Arduino responsável pelos golpes era assim.

- Todos os motores são diferentes. Os próprios motores possuem acionamento mecânico e, portanto, emitem um ruído bastante perceptível. Mas o ruído se torna muito mais forte se o motor se desviar do eixo do impacto, e isso aumenta o risco de quebra do motor. Dadas as forças de vibração e impacto, repousamos novamente na rigidez da estrutura. Alexander Potuzhny fez muito aqui em termos de melhoria de jogos.
- Redefina o controlador contra interferência espúria. Como haverá muitos dispositivos, cabos ao redor e os próprios motores emitem ruído.
Como os motores são movidos pela música, seria possível fazer brinquedos sexuais com isso. Ele encenou sua música favorita, como a Marcha Imperial, e ...
Montagem e ensaio
A montagem final e os ensaios foram realizados no estúdio de música do Teatro Russo da Estônia.

O problema com os ensaios com uma rede neural também é que a própria rede não é determinística. A interação ocorre no modo de resposta à chamada e cada vez que a rede responder será diferente - portanto, é impossível ensaiar a versão final.
Conceito de música
Para a apresentação, também preparamos um vídeo. Inicialmente, pensamos em controlar o fluxo de vídeo via MIDI também para reproduzir sobreposições e reduzir o vídeo gerado pelo GAN - mas não conseguimos criar um ambiente para a segunda máquina e conectar-se aos modelos. Portanto, o vídeo para cada parte da performance foi pré-renderizado; GAN e gerenciamento de sobreposição foram utilizados. Tudo sincronizado com o midi_clock principal.
Para o live, usei o VDMX5, através do qual o fluxo de vídeo passou.

Pouco antes da apresentação, eles fizeram uma apresentação na televisão.
E era muito incomum ver pôsteres na sala de concertos da Estônia (isso é como o Teatro Bolshoi de Moscou).


Desempenho
A performance em si ocorreu no palco do Sõltumatu Tantsu Lava, este é um pequeno salão (pouco mais de 100 pessoas) no bairro criativo de Telliskivi, no complexo de Vaba Lava. A instalação e configuração de todo o equipamento levou mais de 4 horas. Totalmente conectado já quase à noite.
E já sem luz.
O salão estava cheio, apesar da publicidade tardia. Eu estava do lado do palco e controlava o fluxo de vídeo. O show em si foi um grande sucesso - como o modelo funcionou, como o som e o vídeo foram. A platéia disse que eles foram enviados para a viagem em algum lugar em 10 a 15 minutos. :) Tudo acabou muito atmosférico.




www.Audiokinetica.comAleksandr Tavgen - solução de TI, desenvolvimento de software
Aleksandr Potužnoi - suporte técnico
Modulshtein:
www.Modulshtein.comNo spotifyAleksandr Žedeljov tcp FAERSHTEIN - violão, Ableton, sintetizador analógico
Marten Altrov - clarinete, clarinete baixo
Aleksei Semenihhin, também conhecido como DJ Bandit - Fx, Amostras, Arranhões