Path: blob/master/site/es-419/tutorials/audio/music_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Generar música con una RNN
Este tutorial usa una sencilla red neuronal recurrente (RNN) para generar notas musicales. Usted entrenará un modelo usando una colección de archivos MIDI de piano del conjunto de datos MAESTRO. Su modelo aprenderá a predecir la siguiente nota de la secuencia, dada una secuencia de notas. Llame repetidamente al modelo para generar secuencias de notas más largas.
Este tutorial contiene el código completo para parsear y generar archivos MIDI. Consulte el tutorial Generación de texto con una RNN para saber más sobre cómo funcionan las RNN.
Preparación
Este tutorial usa la librería pretty_midi
para crear y parsear archivos MIDI, y pyfluidsynth
para generar la reproducción de audio en Colab.
Descargar el conjunto de datos Maestro
El conjunto de datos contiene unos 1200 archivos MIDI.
Procesar un archivo MIDI
Lo primero que hay que hacer es usar pretty_midi
para parsear un único archivo MIDI y comprobar el formato de las notas. Si quiere descargar el siguiente archivo MIDI para reproducirlo en su computadora, puede hacerlo con colab escribiendo files.download(sample_file)
.
Genere un objeto PrettyMIDI
para el archivo MIDI de muestra.
Reproduzca el archivo de muestra. El widget de reproducción puede tardar varios segundos en cargarse.
Inspeccione el archivo MIDI. ¿Qué instrumentos se usan?
Extraer notas
Cuando entrene el modelo, usará tres variables para representar una nota: pitch
, step
y duration
. Pitch (tono) es la calidad percibida del sonido como un número de nota MIDI. step
es el tiempo transcurrido desde la nota anterior o el inicio de la pista. duration
es cuánto tiempo se reproducirá la nota en segundos y es la diferencia entre su hora de finalización y la hora de inicio.
Extraiga las notas del archivo MIDI de muestra.
Quizá sea más fácil interpretar los nombres de las notas en lugar de los tonos, así que puede usar la siguiente función para convertir los valores numéricos de tono en nombres de nota. El nombre de la nota muestra el tipo de nota, su alteración y el número de octava (por ejemplo, C#4).
Para visualizar la pieza musical, dibuje el tono, el inicio y el final de las notas a lo largo de la pista (es decir, el teclado del piano). Empiece con las 100 primeras notas.
Dibuje las notas de toda la pista.
Verifique la distribución de cada variable de nota.
Crear un archivo MIDI
La siguiente función le permite crear su propio archivo MIDI a partir de una lista de notas.
Reproduzca el archivo MIDI generado y revise si hay alguna diferencia.
También aquí puede escribir files.download(example_file)
para descargar y reproducir este archivo.
Crear el conjunto de datos de entrenamiento
Cree el conjunto de datos de entrenamiento extrayendo notas de los archivos MIDI. Empiece con un pequeño número de archivos y luego experimente con más. Esto puede llevarle unos cuantos minutos.
Luego, cree un tf.data.Dataset
a partir de las notas parseadas.
Va a entrenar este modelo con lotes de secuencias de notas. Cada ejemplo tiene una secuencia de notas como elemento de entrada y la nota siguiente como la etiqueta. De este modo, el modelo se entrena para predecir la siguiente nota de una secuencia. Puede encontrar un diagrama que explica este proceso (y más detalles) en Clasificación de texto con una RNN.
Puede usar la práctica función window con tamaño seq_length
para crear las características y etiquetas en este formato.
Especifique la longitud de la secuencia para cada ejemplo. Experimente con distintas longitudes (por ejemplo, 50, 100, 150) para encontrar la que mejor se adapte a los datos, o use ajuste de hiperparámetros. El tamaño (vocab_size
) del vocabulario se establece en 128, lo que representa todos los tonos admitidos por pretty_midi
.
La forma del conjunto de datos es (100,1)
, de modo que el modelo toma 100 notas como entrada y aprende a predecir la siguiente nota como salida.
Procese los ejemplos por lotes y configure el conjunto de datos para enfocarse al rendimiento.
Cómo entrenar y crear su modelo
Hay tres salidas del modelo, una para cada variable de nota. Para step
y duration
se usará una función de pérdida personalizada basada en el error cuadrático medio para que el modelo produzca valores no negativos.
Si probamos la función model.evaluate
, veremos que la pérdida de pitch
es significativamente mayor que las pérdidas de step
y duration
. Observe que loss
es la pérdida total al sumar todas las demás pérdidas, y en este momento está dominada por la pérdida de pitch
.
Se puede compensar usando el argumento loss_weights
al compilar:
El loss
se convierte entonces en la suma ponderada de las pérdidas individuales.
Entrenar el modelo.
Generar notas
Para usar el modelo para generar notas, primero necesitará suministrar una secuencia inicial de notas. La siguiente función genera una nota a partir de una secuencia de notas.
Para el tono de la nota, tome una muestra de la distribución softmax de notas producidas por el modelo, en lugar de elegir simplemente la nota con mayor probabilidad. Si siempre se eligiera la nota con mayor probabilidad, se obtendrían secuencias repetitivas de notas.
El parámetro temperature
sirve para controlar qué tan aleatorias son las notas generadas. Puede encontrar más detalles sobre la temperatura en Generación de texto con una RNN.
Ahora genere algunas notas. Pruebe a jugar con la temperatura y la secuencia de inicio en next_notes
, a ver qué pasa.
Si quiere descargar el archivo de audio, añada las dos líneas siguientes:
Visualice las notas generadas.
Revisa las distribuciones de pitch{/código0},
step{/código1} y `duration{/código2}.```
Notará el cambio en la distribución de las variables de nota en los gráficos anteriores. Como existe un bucle de retroalimentación entre las salidas y las entradas del modelo, éste tiende a generar secuencias similares de salidas para reducir la pérdida, especialmente para step
y duration
, que usan la pérdida MSE. Para pitch
, puede aumentar la aleatoriedad aumentando la temperature
en predict_next_note
.
Siguientes pasos
Este tutorial muestra la mecánica de usar una RNN para generar secuencias de notas a partir de un conjunto de datos de archivos MIDI. Si quiere saber más, puede consultar el tutorial relacionado Generación de texto con una RNN, que tiene más diagramas y explicaciones.
Las GAN son una de las alternativas a las RNN para la generación de música. En lugar de generar audio, un enfoque basado en GAN puede generar una secuencia completa en paralelo. Es impresionante el trabajo realizado por el equipo de Magenta con GANSynth. También puede encontrar muchos proyectos musicales y artísticos maravillosos y código fuente abierto en el sitio web del proyecto Magenta.