Os andróides sonham com punk elétrico? Como eu ensinei uma rede neural a escrever música

Nos cursos de aprendizado de máquina da Artezio, conheci um modelo de aprendizado capaz de fazer música. A música é uma parte essencial da minha vida, por muitos anos eu toquei em grupos (punk rock, reggae, hip hop, rock, etc.) e sou um ouvinte fanático.

Infelizmente, muitos grupos, dos quais eu era um grande fã na minha juventude, se separaram por várias razões. Ou eles não terminaram, mas o que estão gravando agora ... em geral, seria melhor se eles terminassem.

Fiquei curioso para saber se existe agora um modelo pronto para aprender nas faixas de um dos meus grupos favoritos e criar composições semelhantes. Como os próprios músicos não têm mais muito sucesso, talvez a rede neural possa lidar com eles?

Fonte

Estudando os modelos acabados, rapidamente me deparei com um artigo com uma visão geral das seis opções mais famosas. É, obviamente, sobre formatos de música digital. Pode ser visto no artigo que duas abordagens principais para geração de música podem ser distinguidas: com base no fluxo de áudio digitalizado (o som que ouvimos dos alto-falantes - áudio bruto, arquivos wav) e com base no trabalho com MIDI (notação musical).

Eu larguei as opções com áudio bruto, e é por isso.

  • Os resultados não são impressionantes - o uso desses modelos para música polifônica fornece um resultado muito específico. Isso é incomum, você pode criar pinturas interessantes, mas não é adequado para meus propósitos: soa estranho, mas eu queria ouvir algo semelhante ao original.

Fonte

Um bom exemplo de música de piano:


E com música orquestral ou rock, parece muito mais estranho:


Aqui, os caras tentaram processar o Black Metal e não apenas o áudio bruto.

  • Nas composições das minhas bandas favoritas, vários instrumentos soam - vocais, bateria, baixo, guitarra, sintetizadores. Cada instrumento soa junto com o resto. Estou procurando um modelo que atue da mesma maneira, ou seja, funcione não apenas com instrumentos individuais, mas também leve em consideração o som conjunto.

    Quando um músico precisa aprender uma parte de um instrumento de ouvido, ele tenta isolar o instrumento que precisa de todo o fluxo sonoro. Então ele repete o som até obter um resultado semelhante. A tarefa não é a mais fácil, mesmo para uma pessoa com boa audição - a música pode ser difícil, os instrumentos “se fundem”.

Fonte

Me deparei com ferramentas de software que tentavam resolver um problema semelhante. Existem vários projetos que fazem isso com base no aprendizado de máquina. Por exemplo, enquanto eu escrevia este texto, a Magenta lançou um novo instrumento, o Wave2Midi2Wave, capaz de "tirar" notas de piano e realisticamente "reproduzi-las". Existem outras ferramentas, embora, em geral, essa tarefa ainda não tenha sido resolvida.

Portanto, para aprender uma parte de um trabalho, é mais fácil fazer anotações prontas. Esta é a maneira mais fácil. É lógico supor que será mais fácil para as redes neurais trabalharem com a representação musical da música, onde cada instrumento é representado por uma faixa separada.

  • No caso do áudio bruto, o resultado é uma mistura de todos os instrumentos, as partes não podem ser carregadas individualmente no seqüenciador (editor de áudio), corrigidas, alteradas o som e assim por diante. Fico muito feliz se a rede neural compõe um sucesso, mas comete um erro em algumas notas - ao trabalhar com notas, posso corrigi-las facilmente, com o áudio bruto isso é quase impossível.

A notação musical também tem suas desvantagens. Não leva em conta a massa de nuances de desempenho. Quando se trata de MIDI, nem sempre se sabe quem são esses arquivos MIDI, quão próximos eles estão do original. Talvez o compilador tenha simplesmente cometido um erro, porque não é uma tarefa fácil "remover" o jogo.

Ao trabalhar com notas polifônicas, é necessário garantir que os instrumentos a qualquer momento estejam afinados. Além disso, é importante que a sequência desses momentos seja lógica do ponto de vista humano da música.

Descobriu-se que não existem tantas soluções que possam funcionar com notas, e nem mesmo com um instrumento, mas com várias que soam ao mesmo tempo. Inicialmente, ignorei o projeto Magenta do Google TensorFlow, porque ele foi descrito como "não polifônico". Naquela época, a biblioteca MusicVAE ainda não havia sido publicada, então eu decidi pelo projeto BachBot.

Fonte

Bachbot


Descobriu-se que a solução para o meu problema já existe. Ouça o feliz aniversário sintonizado pelo BachBot e parecendo um coral de Bach.


O coral é uma música específica, composta por quatro vozes: soprano, viola, tenor e baixo. Cada um dos instrumentos pode produzir uma nota de cada vez. Aqui você tem que se aprofundar um pouco mais na música. Falaremos sobre música na dimensão de quatro quartos.

Em uma notação musical, uma nota possui dois indicadores - pitch (to, re, mi ...) e duração (inteiro, metade, oitavo, décimo sexto, trinta segundos). Consequentemente, uma nota inteira dura uma batida inteira, duas meias notas por batida inteira, dezesseis dezesseis semicolares por batida inteira.

Ao preparar os dados para o treinamento da rede neural, os criadores do BachBot levaram em consideração o seguinte:

  • para não derrubar o modelo com acordes de teclas diferentes, que juntas não soariam harmoniosas, todos os corais levavam à mesma tecla;
  • a rede neural deve ser fornecida com valores discretos, e a música é um processo contínuo, o que significa que a discretização é necessária. Um instrumento pode tocar uma nota longa e completa e o outro ao mesmo tempo alguns décimos sextos. Para resolver esse problema, todas as notas foram divididas em dezesseis. Em outras palavras, se uma quarta nota for encontrada nas notas, ela chega quatro vezes com a mesma décima sexta - a primeira vez com a bandeira que foi pressionada e as próximas três vezes com a bandeira que continua.

O formato dos dados é o seguinte - (tom, nova nota | continuação do som da nota antiga)

(56, Verdadeiro) # Soprano
(52, Falso) # Alt
(47, Falso) # Tenor
(38, Falso) # Baixo

Tendo conduzido todos os corais do conjunto de dados music21 popular por esse procedimento, os autores do BachBot descobriram que não existem muitas combinações de quatro combinações de notas nas corais (se você as trouxerem para a mesma tecla), embora pareça que poderia haver 128 x 128 x 128 x 128 (128 níveis de afinação usados ​​no midi). O tamanho de um dicionário condicional não é tão grande. Esta é uma observação curiosa, retornaremos a ela quando falarmos sobre o MusicVAE. Então, temos os corais de Bach gravados na forma de sequências de quatro.

Costuma-se dizer que a música é uma linguagem. Portanto, não é de surpreender que os criadores do BachBot tenham aplicado a tecnologia popular na PNL (Processamento de Linguagem Natural) à música, ou seja, eles treinaram a rede LSTM no conjunto de dados gerado e obtiveram um modelo que pode complementar um ou vários instrumentos ou até criar corais do zero. Ou seja, você define alt, tenor e baixo, e o BachBot adiciona a melodia soprano para você e, juntos, soa como Bach.

Aqui está outro exemplo:

Parece ótimo!

Você pode assistir a este vídeo com mais detalhes. Há uma análise interessante lá, coletada com base em uma pesquisa no site bachbot.com

Os usuários são incentivados a distinguir os corais originais de Bach da música criada pela rede neural. Os resultados mencionam que, se uma rede neural cria uma parte de baixo para todas as outras configurações, apenas metade dos usuários consegue distinguir corais criadas por uma rede neural das originais. Engraçado, mas a maioria dos especialistas em música fica confusa. Com outras ferramentas, as coisas estão um pouco melhores. Parece um insulto para mim como baixista - o violinista parece necessário por enquanto, mas é hora dos baixistas se atualizarem nas habilidades do drywall.


Magenta


Estudando o BachBot, descobri que ele estava incluído no projeto Magenta (Google TensorFlow). Decidi dar uma olhada mais de perto e descobri que, no âmbito da Magenta, vários modelos interessantes foram desenvolvidos, um dos quais é apenas dedicado ao trabalho com composições polifônicas. A Magenta criou suas maravilhosas ferramentas e até já lançou o plugin para o editor de áudio Ableton, o que é especialmente bom em termos de aplicação para músicos.

Meus favoritos: beat blender (cria variações em uma determinada parte da bateria) e
loops latentes (cria transições entre melodias).

A idéia principal da ferramenta MusicVAE, que eu decidi usar, é que os criadores tentaram combinar o modelo e o codificador automático variacional - VAE na rede LSTM.

Se você se lembra, em uma conversa sobre o Bach Bot, percebemos que o dicionário de acordes não consiste em 128x128x128x128 elementos, mas muito menos. Os criadores do MusicVAE também notaram isso e decidiram usar um espaço latente compactado.

A propósito, o que é típico, para treinar o MusicVAE, você não precisa traduzir as fontes em uma chave. A transposição não é necessária, suponho, porque o código-fonte ainda será convertido pelo codificador automático e as informações de tonalidade desaparecerão.

O VAE foi projetado de maneira a permitir que o decodificador recupere dados com eficiência do conjunto de dados de treinamento, enquanto o espaço latente representa uma distribuição suave dos recursos dos dados de entrada.

Este é um ponto muito importante. Isso possibilita a criação de objetos semelhantes e a interpolação logicamente significativa. No espaço original, temos 128x128x128x128 variantes de combinar o som de quatro notas, mas, na verdade, nem todas são usadas (elas soam agradáveis ​​ao ouvido humano). Um codificador automático variacional os transforma em um conjunto muito menor em um espaço oculto, e você pode criar operações matemáticas nesse espaço que tenham um significado significativo do ponto de vista do espaço original, por exemplo, os pontos vizinhos serão fragmentos musicais semelhantes.

Um bom exemplo é como adicionar óculos a uma foto usando um codificador automático neste artigo . Você pode ler mais sobre como o Muisc VAE funciona no site oficial da Magenta neste artigo . Também há um link para o arXiv.

Portanto, o instrumento é selecionado, resta usá-lo com meu objetivo original - criar novas músicas com base nas faixas já gravadas e avaliar o quanto isso soará como o som do grupo original. A Magenta não funciona no meu laptop Windows e há muito tempo calcula um modelo sem uma GPU. Depois de sofrer com máquinas virtuais, um contêiner de encaixe, etc., decidi usar a nuvem.

O Google fornece notebooks colab, onde você pode entrar em modelos Magenta. No entanto, no meu caso, não foi possível treinar o modelo, o processo travava o tempo todo devido a várias restrições - quantidade de memória disponível, interrupções de tempo limite, falta de uma linha de comando normal e direitos de root para instalar as bibliotecas necessárias. Hipoteticamente, existe até a oportunidade de usar a GPU, mas, repito, não consegui instalar o modelo e iniciá-lo.

Eu estava pensando em comprar um servidor e, ah, boa sorte, descobri que o Google fornece serviços de nuvem do Google Cloud com uma GPU, e mesmo há um período de teste gratuito. É verdade que, na Rússia, eles estão disponíveis oficialmente apenas para entidades legais, mas me deixaram entrar no modo de teste gratuito.

Então, criei uma máquina virtual no GoogleCloud com um módulo GPU, encontrei na Internet vários arquivos midi de um dos meus grupos favoritos e os enviei para a pasta midi na nuvem.

Instale o Magenta:

pip install magenta-gpu 

É ótimo que tudo isso possa ser instalado com uma equipe, pensei, mas ... erros. Parece que você precisa tocar na linha de comando, desculpe.

Observamos os erros: a biblioteca rtmidi não está instalada na máquina em nuvem, sem a qual o Magenta não funciona.

E, por sua vez, falha devido à falta do pacote libasound2-dev, e eu também não tenho privilégios de root.

Não é tão assustador:

 sudo su root apt-get install libasound2-dev 

Hooray, agora o pip install rtmidi é executado sem erros, assim como o pip install magenta-gpu.

Nós encontramos na Internet e baixamos os arquivos de origem na pasta midi. Eles soam algo assim .

Convertemos midi para um formato de dados com o qual a rede já pode trabalhar:

 convert_dir_to_note_sequences \ --input_dir=midi\ --hparams=sampling_rate=1000.0\ --output_file=notesequences_R2Midi.tfrecord \ --log=DEBUG \ --recursive 

e comece a treinar

 music_vae_train \ --config=hier-multiperf_vel_1bar_med \ --run_dir=/home/RNCDtrain/ \ --num_steps=1 \ --checkpoints_to_keep=2 \ --hparams=sampling_rate=1000.0 \ --hparams=batch_size=32,learning_rate=0.0005 \ --num_steps=5000 \ --mode=train \ --examples_path=notesequences_R2Midi.tfrecord 

Mais uma vez o problema. O Tensorflow falha com um erro - felizmente, há alguns dias alguém já descreveu esse erro, e as fontes do Python podem ser corrigidas.

Entramos na pasta

 /usr/local/lib/python2.7/dist-packages/tensorflow_probability/python/distributions# 

e substitua a linha de importação, conforme descrito no bug no github.

Lança music_vae_train novamente e ... Viva! O treinamento se foi!

Fonte

hier-multiperf_vel_1bar_med - Eu uso um modelo polifônico (até 8 instrumentos) que produz uma medida cada.

Um parâmetro importante é checkpoints_to_keep = 2, a capacidade do disco nas nuvens é limitada, um dos problemas é que o processo de aprendizado é interrompido o tempo todo por causa do estouro do disco, os pontos de verificação são bastante pesados ​​- 0,6-1 gigabytes cada.

Em algum lugar nas 5000 eras, o erro começa a pular em torno de 40-70. Não sei se esse é um bom resultado ou não, mas parece que com um pouco de dados de treinamento, a rede será treinada novamente e não há sentido em desperdiçar o tempo das GPUs tão gentilmente fornecidas a mim gratuitamente nos data centers do Google. Passamos para a geração.

Por alguma razão, ao instalar o Magenta não instalou o arquivo de geração em si, tive que soltá-lo com as mãos na pasta para os outros:

 curl -o music_vae_generate.py https://raw.githubusercontent.com/tensorflow/magenta/master/magenta/models/music_vae/music_vae_generate.py 

Por fim, crie os fragmentos:

 music_vae_generate --config=hier-multiperf_vel_1bar_med --checkpoint_file=/home/RNCDtrain/train/ --mode=sample --num_outputs=32 --output_dir=/home/andrey_shagal/  --temperature=0.3 

config - tipo de geração, exatamente o mesmo que durante o treinamento - multitrack, 1 relógio
checkpoint_file - pasta onde obter o último arquivo com o modelo treinado
mode - sample - cria uma amostra (existe outra opção interpolar - cria uma medida de transição entre duas medidas)
num_outputs - quantas peças gerar
temperature - um parâmetro de randomização ao criar uma amostra, de 0 a 1. Em 0, o resultado é mais previsível, mais próximo da fonte, em 1 - Eu sou um artista, como eu o vejo.

Na saída, recebo 32 fragmentos por medida. Tendo iniciado o gerador várias vezes, ouço os fragmentos e colo o melhor em uma faixa: neurancid.mp3.


Então "eu passei este verão." Estou satisfeito Obviamente, é improvável que o rádio "Maximum" o leve à lista de reprodução, mas se você ouvir, realmente se parecerá com o grupo Rancid original. O som, é claro, é diferente da gravação em estúdio, mas trabalhamos principalmente com notas. Além disso, há espaço para ação - processar midi com vários plug-ins VST, regravar partes com músicos ao vivo ou esperar até que os caras do Wave2Midi2Wave cheguem às guitarras com uma sobrecarga.

Não há reclamações sobre as notas. Idealmente, eu gostaria que a rede neural criasse uma obra-prima ou pelo menos um sucesso para os 100 melhores da Billboard. Mas enquanto ela aprendeu a usar álcool e drogas de roqueiros , tocar toda a batida uma nota em oitavas (na verdade, não apenas, mas tenho orgulho de sua paternidade). transição de 20 para 22 segundos). Existem razões para isso e muito mais sobre elas.

  1. Pequena quantidade de dados.
  2. O modelo que usei produz fragmentos no tamanho de uma medida. No punk rock, como regra, poucos eventos ocorrem em uma única medida.
  3. As transições e melodias interessantes funcionam justamente no contexto dos riffs de afinação, transições de acordes para acordes e o codificador automático, juntamente com uma pequena quantidade de dados, parece ter perdido a maioria das músicas e até reduziu todos os riffs a dois acordes consoantes e vários atonais. Precisamos tentar um modelo que funcione com 16 compassos, é uma pena que apenas três vozes estejam disponíveis nele.

Entrei em contato com os desenvolvedores, eles recomendaram tentar reduzir a dimensão do espaço latente, porque treinaram sua rede em 200.000 trilhas e eu treinei em 15. Não consegui o efeito visível de reduzir o espaço-z, mas ainda há algo para mexer.

A propósito, monotonia e monotonia está longe de ser sempre um sinal de menos. De rituais xamanísticos a festas techno, como você sabe, um passo. Devemos tentar treinar o modelo em algo assim - rave, techno, dub, reggae, contras de hip-hop. Certamente, há uma chance de criar algo agradavelmente zumbi. Encontrei cerca de 20 músicas de Bob Marley no midi e, voilá, um loop muito legal:


Acima das partes midi são regravadas com baixo ao vivo e guitarras, processadas por sintetizadores VST para tornar o fragmento mais suculento. No original, a rede emitiu apenas notas. Se você tocá-los com um midi player padrão, soa assim:


Certamente, se você criar vários desenhos de bateria temáticos básicos, iniciá-los no beat blender + partes básicas de baixo e sintetizadores com um loop latente (havia mais sobre eles), é bem possível executar um algoritmo para o rádio techno que criará continuamente novas faixas ou mesmo uma faixa sem fim. Buzz eterno!

O MusicVAE também oferece a oportunidade de treinar a rede para gerar fragmentos de trio de 16 barras - bateria, baixo e chumbo. Também é bastante interessante. Dados de entrada - arquivos midi multipista - o sistema se divide em triplos em todas as combinações possíveis e depois treina o modelo. Essa rede requer significativamente mais recursos, mas o resultado é imediatamente 16 ciclos! Impossível resistir. Tentei imaginar como um grupo que toca algo entre Rancid e NOFX poderia soar, carregando para o treinamento sobre um número igual de faixas de cada grupo:


Também existem peças midi regravadas ao vivo. Midi padrão como este:


Interessante! Definitivamente, é melhor que o meu primeiro grupo! E, a propósito, esse mesmo modelo nos dá um jazz livre decente:


Os problemas que encontrei:

  1. Falta de uma posição boa e conveniente que reduza o tempo necessário para aguardar o treinamento. O modelo funciona apenas no Linux, o treinamento é longo, sem uma GPU por muito tempo, e o tempo todo eu quero tentar alterar os parâmetros e ver o que acontece. Por exemplo, um servidor em nuvem com um processador GPU de 100 épocas para o modelo "trio de 16 ciclos" contou 8 horas.
  2. Um problema típico de aprendizado de máquina é a falta de dados. Apenas 15 arquivos midi - é muito pequeno para entender música. A rede neural, ao contrário de mim na minha juventude, não ouviu 6 álbuns do Rancid antes dos buracos, não fui a shows, esse resultado foi obtido de 15 faixas midi desconhecidas para quem está longe do original. Agora, se você ficar com o guitarrista com sensores e captar todos os sons de todas as notas ... Vamos ver como a idéia do Wave2Midi2Wave se desenvolve. Talvez em alguns anos seja possível recusar notas para resolver esse problema.
  3. O músico deve cair claramente no ritmo, mas não perfeitamente. No meio da semana, não há dinâmica nas notas (por exemplo, na bateria), todas são executadas no mesmo volume, exatamente em um clique (como dizem os músicos, ou seja, exatamente na batida), mesmo que você as diversifique aleatoriamente, a música começa a soar mais animado e mais agradável. Novamente, o Wave2Midi2Wave já está lidando com esse problema.

Agora você tem uma idéia das possibilidades da IA ​​na criação de músicas e minhas preferências musicais. Qual papel você acha que a IA espera no processo criativo no futuro? Uma máquina pode criar música em pé de igualdade ou até melhor que um ser humano para ser assistente no processo criativo? Ou a inteligência artificial se tornará famosa no campo musical apenas pelos artesanatos primitivos.

Source: https://habr.com/ru/post/pt439546/


All Articles