Path: blob/master/site/pt-br/tutorials/audio/music_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Gere músicas com uma RNN
Este tutorial mostra como gerar notas musicais usando uma rede neural recorrente simples (RNN). Você treinará um modelo usando uma coleção de arquivos MIDI de piano do dataset MAESTRO. Dada uma sequência de notas, seu modelo aprenderá a prever a próxima nota na sequência. Você pode gerar sequências mais longas ao chamar o modelo repetidamente.
Este tutorial contém o código completo para processar e criar arquivos MIDI. Para saber mais sobre como as RNNs funcionam, acesse o tutorial Geração de texto com uma RNN.
Configuração
Este tutorial usa a biblioteca pretty_midi
para criar e processar arquivos MIDI e pyfluidsynth
para gerar a reprodução de áudio no Colab.
Baixe o dataset Maestro
Esse dataset contém cerca de 1.200 arquivos MIDI.
Processe um arquivo MIDI
Primeiro, use pretty_midi
para processar um único arquivo MIDI e inspecionar o formato das notas. Se você quiser baixar o arquivo MIDI abaixo para reproduzir no seu computador, faça isso no Colab ao escrever files.download(sample_file)
.
Gere um objeto PrettyMIDI
para o arquivo MIDI de amostra.
Reproduza o arquivo de amostra. O widget de reprodução pode levar vários segundos para carregar.
Inspecione o arquivo MIDI. Que tipos de instrumentos são usados?
Extraia notas
Você usará três variáveis para representar uma nota ao treinar o modelo: pitch
, step
e duration
. O tom (pitch) é a qualidade perceptiva do som como um número de nota MIDI. step
é o tempo decorrido desde a nota anterior ou o início da faixa. duration
é o tempo que a nota tocará em segundos e a diferença entre os horários de término e início da nota.
Extraia as notas do arquivo MIDI de amostra.
Talvez seja mais fácil interpretar os nomes das notas em vez dos tons. Então, você pode usar a função abaixo para converter os valores de tom numéricos para nomes de notas. O nome mostra o tipo, acidente e número da oitava da nota (por exemplo, C#4).
Para visualizar a composição musical, plote o tom da nota, o início e o término na duração da faixa (ou seja, rolo de piano). Comece com as primeiras 100 notas
Plote as notas para a faixa inteira.
Confira a distribuição de cada variável das notas.
Crie um arquivo MIDI
Você pode gerar seu próprio arquivo MIDI a partir de uma lista de notas usando a função abaixo.
Reproduza o arquivo MIDI gerado e veja se há alguma diferença.
Como antes, você pode escrever files.download(example_file)
para baixar e reproduzir esse arquivo.
Crie o dataset de treinamento
Crie o dataset de treinamento ao extrair as notas dos arquivos MIDI. Você pode começar usando um pequeno número de arquivos e depois testar com mais. Isso pode levar alguns minutos.
Em seguida, crie um tf.data.Dataset
a partir das notas processadas.
Você treinará o modelo com lotes de sequências de notas. Cada exemplo consistirá em uma sequência de notas como as características de entrada e a próxima nota como o rótulo. Assim, o modelo será treinado para prever a próxima nota em uma sequência. Confira um diagrama descrevendo esse processo (e mais detalhes) em Classificação de texto com uma RNN.
É possível usar a função útil window com o tamanho seq_length
para criar as características e os rótulos nesse formato.
Defina a duração da sequência para cada exemplo. Teste diferentes durações (por exemplo, 50, 100 e 150) para encontrar a ideal para os dados ou use o ajuste de hiperparâmetros. O tamanho do vocabulário (vocab_size
) é definido como 128, representando todos os tons compatíveis com pretty_midi
.
The shape of the dataset is (100,1)
, meaning that the model will take 100 notes as input, and learn to predict the following note as output.
Agrupe os exemplos e configure o dataset para melhor desempenho.
Crie e treine o modelo
O modelo terá três saídas, uma para cada variável das notas. Para step
e duration
, você usará uma função de perda personalizada com base no erro quadrático médio, que incentiva o modelo a gerar valores não negativos.
Testando a função model.evaluate
, é possível ver que a perda de pitch
é significativamente maior que as perdas de step
e duration
. Observe que loss
é a perda total computada ao somar todas as outras perdas e, no momento, é dominada pela perda de pitch
.
Uma maneira de equilibrar isso seria usar o argumento loss_weights
para compilar:
Assim, loss
seria a soma ponderada das perdas individuais.
Treine o modelo.
Gere notas
Para gerar notas com o modelo, primeiro você precisa fornecer uma sequência inicial de notas. A função abaixo gera uma nota a partir de uma sequência.
Para o tom da nota, é extraída uma amostra da distribuição softmax das notas produzidas pelo modelo, e não é apenas escolhida a nota com maior probabilidade. Caso a nota mais provável fosse sempre escolhida, seriam geradas sequências repetitivas.
O parâmetro temperature
pode ser usado para controlar a aleatoriedade das notas geradas. Confira mais detalhes sobre a temperatura em Geração de texto com uma RNN.
Agora, gere algumas notas. Você pode brincar com a temperatura e a sequência inicial em next_notes
para ver o que acontece.
Você também pode baixar o arquivo de áudio ao adicionar as duas linhas abaixo:
Visualize as notas geradas.
Confira as distribuições de pitch
, step
e duration
.
Nos plots acima, você verá a mudança na distribuição das variáveis das notas. Como há um loop de feedback entre as saídas e as entradas, o modelo tende a gerar sequências semelhantes de saídas para reduzir a perda. Isso é especialmente relevante para step
e duration
, que usam a perda de EQM. Para pitch
, você pode aumentar a aleatoriedade com o aumento da temperature
em predict_next_note
.
Próximos passos
Este tutorial demonstrou a mecânica de usar uma RNN para gerar sequências de notas a partir de um dataset de arquivos MIDI. Para saber mais, acesse o tutorial relacionado Geração de texto com uma RNN, com diagramas e explicações adicionais.
Uma das alternativas ao uso de RNNs para gerar músicas é usar GANs. Em vez de gerar áudio, uma abordagem baseada em GAN consegue gerar uma sequência inteira em paralelo. A equipe Magenta fez um ótimo trabalho nessa abordagem com o GANSynth. Você também pode encontrar vários projetos de música e arte incríveis, além de código aberto, no site do projeto Magenta.