Article un peu moins technique mais j’avais envie de me faire plaisir avec un sujet qui me touche : le piano. Je fais partie de ces gens qui après des années de solfège rechignent toujours à accepter de déchiffrer une partition et qui « trichent » donc en apprenant plutôt la chorégraphie des doigts sur le clavier via Synthesia. Mais du coup je suis dépendant de la générosité des contributeurs des plateformes de midi. Sauf qu’il arrive que certaines musiques pour différentes raisons ne puissent pas être trouvées sur une quelconque plateforme. Et n’ayant ni l’oreille ni la patience ni le talent pour transformer moi-même une musique que j’aime en fichier midi, je me suis dit qu’à l’aire de l’IA il y avait forcément déjà des solutions clé en main permettant de réaliser cette prouesse à notre place. Alors c’est partit pour automatiser cette partie en se servant de PyTorch.
Et pour les possesseurs de mac Intel, rassurez-vous : c’est mon cas aussi et faire tourner le projet sur le CPU marche parfaitement.
Setup son environnement
Tout d’abord il va vous falloir un environnement avec Python d’installé. Par dessus, si vous ne les avez pas déjà, ajoutez un wget et ffmpeg. Je vous mets les commandes macOS, sentez-vous libre de trouver leur équivalent sur les autres plateformes :
brew install python ffmpeg wget
À partir de là créez/rendez-vous dans votre répertoire de travail :
cd whateverfolderyouwantyourprojectin
mkdir piano-to-midi && cd piano-to-midi
Et on va pouvoir s’installer un petit environnement virtuel python pour installer le reste proprement :
python3 -m venv venv
source venv/bin/activate
Et à partir de là, on peut installer depuis pip torch ainsi que le repo torch qui nous intéresse :
pip install torch piano_transcription_inference
Parlons peu, parlons code
On va faire simple, on va demander le fichier d’entrée (un .mp3 donc) et le fichier de sortie (un .mid si vous avez suivi).
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
Et pour le traitement, on passe vraiment juste par l’utilisation classique du package :
from piano_transcription_inference import PianoTranscription, sample_rate, load_audio # À mettre en dessous du import sys du coup
[...]
audio, _ = load_audio(input_file, sr=sample_rate, mono=True)
transcriptor = PianoTranscription(device='cpu')
transcriptor.transcribe(audio, output_file)
Ici donc, on charge l’audio, on crée une instance de notre transcripteur (en précisant ici de tourner sur le cpu dans mon cas, sentez-vous libre d’adapter à votre machine) et on transcrit l’audio dans le fichier de sortie.
Le rendu et ce que ça vaut
Lancez désormais un petit :
python transcription.py mypianomusic.mp3 mymidifile.mid
Et normalement vous verrez piano_transcription_inference se télécharger, votre fichier se faire découper en segments et si tout se passe bien une fois chaque segment traité vous aurez un magnifique fichier midi dans votre dossier de travail.
Maintenant un avis honnête : c’est bluffant, MAIS.
La qualité de rendu sur un morceau « classique » est incroyable. Le package gère bien les accords complexes et dense, un rythme rapide, la virtuosité et la pédale. Honnêtement juste avec les instruments de base de Garageband, le rendu est très agréable. Mais seulement sur des morceaux « classiques », donc qui alternent les accords et les arpège de manière assez traditionnelle.
J’ai pu tester sur plusieurs musiques sur lesquelles j’ai été bluffé, mais pour challenger un peu le système j’ai tenté avec l’incroyable Firefly Mist de Sonic Librarian. Évidemment les effets spéciaux et les percussions créent forcément des interférences, mais il y a aussi parfois un son style guitare électrique très saturée qui sert de basse. Léger, mais qui je pense vient forcément perturber le système. Et la structure même du morceau rend forcément plus difficile la transcription, même si j’avoue qu’il s’est très bien débrouillé pour les parties plus « calmes » dans lesquelles on n’entend que le piano.
On repère bien sur cette capture (dans le rectangle noir) toute une zone où il a eu du mal à comprendre ce qui se passait.

Quelques fausses notes, quelques vides. Les passages avec des accords bien frappés et des notes très aigües sont un peu passés à la trape, la partie juste avant est excessivement chaotique. Et souvent des petites hallucinations comme visible ici :

En fait il faut prendre en compte l’entraînement du modèle. Et ici le modèle gère la virtuosité parce qu’il a été entraîné sur du Liszt, du Chopin, … Mais Firefly Mist sort un peu trop de ce sur quoi le modèle a été entraîné.
Bref, un modèle incroyable et qui marchera très bien tant que vous ne l’emmenez pas en dehors des sentiers battus. Prochaine étape maintenant : pouvoir passer un morceau plus complexe et orchestral et obtenir un « résumé » sous forme de solo piano dans un fichier midi.