L'autre jour, un nouveau projet appelé Magenta de Google a ouvert sur Github. https://github.com/tensorflow/magenta
Magenta est un projet visant à générer de l'art et de la musique à l'aide d'un réseau neuronal.
Il vise à faire évoluer la créativité de l'apprentissage automatique et à devenir une communauté d'artistes et d'apprentissage automatique.
En tant que premier Magenta, un modèle du réseau neuronal récurrent (RNN) qui le compose a été publié. Il intègre une technique appelée LSTM (Long Short-Term Memory). Selon le site officiel de magenta (http://magenta.tensorflow.org/)
It’s purposefully a simple model, so don’t expect stellar music results. We’ll post more complex models soon. Il s'agit d'un modèle volontairement simplifié et vous ne pouvez pas vous attendre à faire de la musique exceptionnelle. Cependant, nous continuerons à publier des modèles plus complexes.
Il est donc préférable d'exécuter ce modèle en guise d'introduction.
Je suis dans un environnement Ubuntu. Vous avez besoin d'un Mac ou Linux car vous avez besoin de Tensorflow, qui n'est pas compatible avec Windows.
Clonez le magenta depuis Github et installez Tensorflow et l'outil de construction bazel.
Maintenant, construisons réellement le modèle de composition à partir d'ici.
Pour construire le modèle, vous avez besoin de données MIDI contenant la mélodie du morceau. Si vous ne disposez pas de données MIDI, il a été recommandé de les obtenir sur http://www.midiworld.com/files/142/. ~~ Il vaut mieux utiliser une seule donnée MIDI. Pour une raison quelconque, cela ne fonctionnait pas si je le faisais avec trois. ~~ (Il semble que certains fichiers MIDI peuvent être utilisés et d'autres ne peuvent pas être utilisés.) Cette fois, j'ai mis le fichier midi dans un répertoire appelé / tmp / midi
De là, vous pouvez construire un modèle de composition et créer du MIDI en tapant des commandes dans le terminal (Ctrl + Alt + T pour ubuntu). Le contenu est fait en Python, mais je ne joue pas vraiment avec le code.
Commencez par convertir le fichier MIDI au format tfrecord utilisé par Tensorflow
MIDI_DIRECTORY=/tmp/midi
SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord
bazel run //magenta/scripts:convert_midi_dir_to_note_sequences -- \
--midi_dir=$MIDI_DIRECTORY \
--output_file=$SEQUENCES_TFRECORD \
--recursive
Ensuite, générez deux fichiers tfrecord à partir du fichier tfrecord généré. Ces données sont divisées en données d'entraînement (données de train) et données d'évaluation (données d'évaluation). Seules les données d'entraînement sont utilisées cette fois.
SEQUENCES_TFRECORD=/tmp/notesequences.tfrecord
DATASET_DIR=/tmp/basic_rnn/sequence_examples
TRAIN_DATA=$DATASET_DIR/training_melodies.tfrecord
EVAL_DATA=$DATASET_DIR/eval_melodies.tfrecord
EVAL_RATIO=0.10
bazel run //magenta/models/basic_rnn:basic_rnn_create_dataset -- \
--input=$SEQUENCES_TFRECORD \
--output_dir=$DATASET_DIR \
--eval_ratio=$EVAL_RATIO
Nous allons apprendre RNN en utilisant les données de formation. num_training_steps est le nombre de formations, veuillez le réduire si cela prend trop à 20000. Ma machine n'était pas très bonne, alors je l'ai réglée sur 1000. Cependant, il semble que l'état RNN soit enregistré 10 fois chacun, même pendant l'apprentissage, il est donc possible de générer du MIDI.
bazel build //magenta/models/basic_rnn:basic_rnn_train
./bazel-bin/magenta/models/basic_rnn/basic_rnn_train --run_dir=/tmp/basic_rnn/logdir/run1 --sequence_example_file=$TRAIN_DATA --hparams='{"rnn_layer_sizes":[50]}' --num_training_steps=20000
Une fois cela fait, le modèle de composition était complet.
Maintenant, avant de générer enfin un fichier MIDI, nous devons préparer un autre fichier MIDI. Parce que RNN apprend le flux de la mélodie à partir de fichiers MIDI. En d'autres termes, j'apprends que "cette mélodie est devant, donc ce son ne viendra pas après". Par conséquent, s'il n'y a pas de mélodie devant elle, la mélodie qui la suit ne peut pas être créée. Vous avez besoin d'un fichier midi contenant cette mélodie. Cette fois, j'ai créé une mélodie d'une mesure et l'ai placée dans / tmp avec le nom primer.mid.
PRIMER_PATH=/tmp/primer.mid
bazel run //magenta/models/basic_rnn:basic_rnn_generate -- \
--run_dir=/tmp/basic_rnn/logdir/run1 \
--hparams='{"rnn_layer_sizes":[50]}' \
--output_dir=/tmp/basic_rnn/generated \
--num_outputs=10 \
--num_steps=128 \
--primer_midi=$PRIMER_PATH
Cette commande créera 16 fichiers midi dans / tmp / basic_rnn_generated. Chaque mélodie prime.mid est suivie d'une mélodie d'environ 4 mesures.
Voici la mélodie créée https://soundcloud.com/ig4osq8tqokz/magenta1
Cela ne s'est pas avéré être une très bonne mélodie. Cela peut dépendre de l'accompagnement, mais ...
La raison pour laquelle ce n'était pas bon ・ En premier lieu, le modèle est un tel gars -Le fichier MIDI utilisé comme données d'entraînement n'était pas bon (à cet égard, je n'ai pas utilisé le fichier MIDI contenant uniquement la mélodie) ・ Moins d'apprentissage
Cependant, je vais le faire avec soin pour le moment.
Il faut beaucoup de temps pour apprendre. Il faut 1 minute pour chaque morceau MIDI pour apprendre 10 fois. Peut-il être amélioré en utilisant le GPU (même si je ne l'ai pas en premier lieu)?