Entraîner une Intelligence artificielle à composer comme Beethoven.

Source: Deep Learning on Medium


Il y a deux semaines, nous nous sommes aventurés dans les deepfake, dans le cadre du cours d’Alban Leveau-Vallier sur les enjeux de l’IA à Sciences Po Paris. Cette semaine nous allons nous intéresser à la génération musicale en faisant générer à une IA des compositions similaire à un répertoire donné. On reste dans le domaine du deep learning pour cette expérience avec l’utilisation d’un Reccurent Neural Networks (RNN) soit en français Réseau de neurones récurrents, plus précisément un Long Short Term Memory (LSTM) network, un type de RNN capable de reconnaître et d’encoder des paternes longs, de comprendre la segmentation de jeux de données complexes et diversifiés. Pour la composition musicale, c’est très utile, car dans la plupart des genres musicaux il faut pouvoir apprécier des compositions dans un large ensemble pour en dégager des tendances. N’hésitez pas à me corriger en commentaire sur mes explications ce type de réseaux neuronaux, que je découvre à peine.

Vous y comprenez quelque chose ? Moi non plus.

C’est le célèbre youtuber Carykh qui m’a inspiré avec sa vidéo “Computer evolves to generate baroque music ! » Où il entraîne un modèle à composer de la musique à partir de partitions de Bach. La technique de Carykh semble cependant longue et laborieuse à reproduire et c’est évidemment le prix à payer lorsque l’on veut maîtriser toutes les étapes du processus. N’ayant pas ce temps, je me mets à parcourir différent repo sur Github qui facilitent un peu l’expérience. Je me décide pour celui-ci du génial Sigurour Skuli, dit Skuldur, dont j’avais déjà vu le travail de synthèse et d’optimisation fait sur la reconnaissance faciale (cf. facenet-face-recognition).

Le setup

Avant de commencer à jouer avec les différents outils mis à disposition, un nombre relativement important de librairies pour Python doivent être installées pour faire tourner notre réseau neuronal LSTM:

  • Keras , une API simplifiant les interactions avec Tensorflow pour entraîner le modèle puis générer la notation musicale finale.
  • Music21 , un outil qui va nous permettre de traduire notre dataset en notation muscale et de traduire l’outpout généré par le réseau neuronal en ce même notation musicale.
  • H5PY , pour stocker et manipuler de grandes quantités de données chiffrées.
  • Tensorflow, l’outil d’apprentissage automatique par excellence de Google.

Le dataset

Le programme est extrêmement simple à utiliser. Il suffit de lancer lstm.py pour entraîner le modèle après avoir placé nos données dans le dossier midi_songs. Les fichiers au format midi (Musical instrument interface) sont des fichiers encodant des instructions de rendu sonore, permettant de se focaliser sur les paramètres fondamentaux de la musique que sont la notation musicale, la hauteur, la nuance, le panoramique et le tempo sans se préoccuper de la signature sonore propre à l’instrument. Ils ne sont pas lisibles en tant que tel, mais doivent être utilisé avec une fonte sonore, une banque de son reproduisant toutes les notes d’un instrument donné. Ainsi avec un même fichier midi encodant la 9ème symphonie de Beethoven, on pourra aussi bien la faire jouer sur un Piano à queue que sur un orgue d’église.

Trouver rapidement une base de données homogène de fichier midi en musique classique est assez rapide sur internet si le compositeur recherché est connu. On trouve par exemple sur ce site 19 300 morceaux avec plus de 1000 compositeurs différents de classique. Je sélectionne parmi cette banque une soixantaine de compositions de Beethoven composées exclusivement pour le Piano, afin d’avoir une base de donnée relativement homogène.

Résoudre le problème de sauvegarde

Si le premier entraînement semble fonctionner sans problème, je me heurte à un problème de taille lorsque je l’arrête pour la première fois : le programme n’est pas prévu pour continuer à entraîner un modèle déjà sauvegardé. Devant utiliser mon ordinateur pour d’autre programmes exigeant en ressource en parallèle, il m’est impossible d’entraîner suffisamment le modèle en une seule et unique session quand j’observe qu’une seule Epoch (c’est-à-dire le temps pris pour s’entrainer une fois sur l’ensemble de la base de données) dure plus d’une trentaine de minute, et qu’il faudra en faire au moins une centaine. Heureusement, il suffit de modifier quelques lignes de code dans le fichier source en ajoutant notamment model = load_model() et model.save() . En ouvrant le programme, je suis fasciné de voir à quel point, il est court, clair et lisible. Si vous avez quelques bases en Python, je vous recommande d’aller le voir par vous-même, vous serez surpris.

A peine 126 lignes de code !

Maintenant, on peut non seulement diviser l’entraînement en autant de sessions que l’on veut, mais on peut aussi tester la qualité du modèle en cours de route et suivre son évolution. Là encore, c’est très simple Skuldur nous a rendu la vie facile, puisqu’il suffit d’exécuter predict.py (voir le code ici). Durant les entraînements je remarque que c’est cette fois le processeur qui est poussé à bout et non pas la carte graphique comme c’était le cas pour créer les deepfakes.

Convertir les fichiers midi en son

Le fichier final crée par notre modèle est un fichier midi, pour le lire on doit donc lui associer une fonte sonore. Je choisis celui d’une marque bien connu de piano acoustique, Steinway & Sons, que vous pouvez télécharger ici. Ayant peu d’expérience dans le montage sonore je choisis un logiciel libre simplifié, LMMS pour encoder le fichier audio.

Ce genre d’interface donne vraiment envie de s’y connaitre en montage song.

2 heures d’entraînement : une abomination

L’extrait est très désagréable à écouter, seules quelque rares accords harmonieux se perdent au milieu d’un océan de dissonances. Le rythme n’est pas constant, et on ne note absolument aucune ressemblance avec le style de Beethoven.

30 heures d’entraînement : à peine audible

Il y a moins de dissonances même si elles sont toujours présentes. On voit apparaître une petite harmonie entre quelques. Cependant, le rythme est extrêmement saccadé, les pauses sont mal placées et le tout manque de continuité. La musique commence légèrement à ressembler au style de Beethoven, même si on est encore très loin de quelque chose de satisfaisant.

50 heures d’entraînement : un pianiste ivre qui tente de composer du Beethoven

Un résultat commence à se dessiner. Si de nombreuses saccades subsistes, ainsi que des notes parasites (souvent une note ou accord inutilement doublé), une harmonie générale existe. Le paterne de trois notes dans les basses ressemble à certaines sonates funèbres de Beethoven telles que le premier mouvement de la sonate au clair de lune.

Entraîner plus longtemps le modèle le fait régresser Je suis encore une fois déçu du résultat final, mes attentes sont toujours trop optimistes. Le plus frustrant est sans doute de ne pas savoir si la limitation vient des paramètres que j’ai utilisé, de la puissance de ma configuration ou du choix des données utilisées.

Conclusions

Aujourd’hui, les professionnels sont clairement capables de créer des sons différentiables d’une composition humaine de qualité. De nombreux tests ont notamment été effectués à partir des compositions de Bach, tant son style basé sur la technique du contrepoint est reconnaissable, en voici un exemple particulièrement réussi. Mes résultats sont donc très loin de ce qui se fait de mieux, mais il est toujours intéressant d’essayer de reproduire soit même ce genre d’expérience, car cela nous pousse à nous interroger un minimum ce qui se passe en coulisse. Cela m’a aussi donné l’envie d’aller plus loin dans ce domaine particulier de la génération musicale par ordinateur, car en tant que musicien amateur ce genre de test me questionne sur les fondements même de la création artistique. Par exemple, on peut se demander si l’IA va rester cantonner à la création d’œuvre s’inspirant d’un style donné et délimité ou si elle sera capable de produire des innovations musicales en rupture avec ce qui existe déjà.