Sortie de la bibliothèque Bliss 1.0 d’analyse musicale

Bliss a été présenté à la Student DemoCup 2015, sous la forme de leleleplayer, qui servait à en illustrer les possibilités. En effet, Bliss est une bibliothèque d’analyse de morceaux musicaux pouvant s’intégrer facilement à divers lecteurs audios et permettant, entre autres, la génération automatique de listes de lecture.

logo de Bliss

Développée et utilisable en C à l’aide de ffmpeg, fftw et disposant de bindings Python, Bliss permet la création de listes de lecture « intelligentes » (comprendre: les morceaux s’enchaînant naturellement) après une phase d’analyse de l’audiothèque.
Pour les utilisateurs de MPD, une première implémentation de Bliss, Blissify, permet de générer automatiquement une liste de lecture en partant du dernier morceau joué, un peu comme les radios de Grooveshark.

Sommaire

Fonctionnalités

Bliss permet de calculer pour chaque chanson quatre « coordonnées » à partir du fichier audio. La caractéristique de chaque coordonnée est détaillée dans la partie « sous le capot » ci-dessous; une fois ces quatre valeurs obtenues, la génération de listes de lecture est possible en calculant les distances euclidiennes entre les morceaux dans cet espace de dimension 4 et en jouant les plus proches les unes après les autres, comme illustré ci-dessous dans une réduction à 3 dimensions:
graphe des distances entre 2 points dans l'espace

La fonctionnalité principale de Bliss est donc bl_analyze prenant en argument un nom de fichier audio, et retournant un vecteur de dimension 4.

Pour calculer les distances entre les chansons et choisir la chanson suivante la plus proche, on peut utiliser :

  • bl_distance(vecteur_chanson1, vecteur_chanson2) qui permet ensuite de calculer la distance entre deux chansons à partir des vecteurs calculés précédemment.
  • bl_cosine_similarity(vecteur_chanson1, vecteur_chanson2) qui est une autre méthode permettant d’évaluer la similarité entre deux chansons.

Ainsi, n’importe quel lecteur audio peut utiliser cette bibliothèque pour composer des listes de lecture à partir d’un morceau : il suffit d’analyser toutes les chansons à l’aide de bl_analyze, de stocker le résultat pour chaque chanson, puis de mettre à la suite les chansons suffisamment proches (en général, une distance inférieure à 8 et une similarité cosinus supérieure à 0.85 donnent de bons résultats) pour obtenir une playlist.

Sous le capot

Contrairement aux listes de lectures générées par Spotify ou Deezer, qui font probablement un usage conséquent du machine-learning, les différents critères utilisés par Bliss se veulent le plus compréhensibles possible. Rapidement (le détail des différents scores est donné sur la page de Bliss), ces critères sont les suivants:

  • Amplitude : à quel point le son est fort, cf capture ci-dessous sous Audacity :

audacity sur PinK Floyd et Dragonforce

  • Fréquence : à quel point le morceau est en moyenne aigu ou grave.
  • Attaque : le pourcentage d’attaques dans un morceau, c’est-à-dire le moment où le son passe du silence à un niveau élevé.
  • Tempo : une estimation du nombre de battements par minute (BPM) du morceau, pour estimer sa « rapidité ».

Ces critères se veulent le plus complémentaire possible. Ils sont calculés une fois que le morceau est décodé en un tableau de samples par ffmpeg. Actuellement, le morceau est stocké en RAM sous sa forme décodée ; une étape prévue (mais non triviale) est de recoder Bliss en utilisant les mêmes algorithmes en streaming, afin d’éviter d’occuper la RAM sur des morceaux en très haute qualité.

Performances

Trouver une méthode d’évaluation pour quelque chose de subjectif comme la similitude entre des chansons n’est pas chose aisée, aussi celle que je vais décrire ci-dessous n’évalue pas exactement ce pourquoi Bliss a été créé, mais permet toutefois de donner une idée des performances de Bliss. Si vous avez des idées, n’hésitez pas à le mentionner dans les commentaires !

Nous avons donc catégorisé 310 morceaux en 8 genres différents, à savoir : blues, musique classique, musique électronique, jazz, metal, rock progressif, rap et swing. Nous avons ensuite calculé les coordonnées de chaque morceau à l’aide de Bliss, puis nous avons cherché à former des clusters à partir de tous ces points à l’aide d’un algorithme des K-moyennes, en ajoutant un genre à la fois : jazz vs metal, puis jazz/metal/swing, etc.

Nous avons ensuite réalisé la même chose, mais cette fois avec des coordonnées aléatoires pour chaque morceau : nous avions ainsi deux jeux de résultats à comparer.
Nous avons enfin calculé la pureté du partitionnement, à savoir le ratio d’éléments convenablement triés sur le nombre total d’éléments. Les résultats obtenus sont les suivants :
résultats

Bliss fait donc 30 à 50% mieux que de l’aléatoire. Il faut tout de même garder à l’esprit que cette métrique est arbitraire et ne peut donc pas qualifier de façon définitive un algorithme de traitement musical; cela est tout de même donné à titre indicatif.

Implémentations existantes

Au-delà de leleleplayer, qui a été développé comme une interface pour Bliss mais dont l’ergonomie reste pour l’instant perfectible, il est très facile d’utiliser Bliss avec votre lecteur audio préféré (tant que celui-ci est extensible par des plugins).

C’est en ce sens qu’a été développé Blissify, un framework fonctionnant autour de Bliss et censé faciliter l’utilisation de Bliss dans votre lecteur audio préféré. Il fournit un exécutable, blissify qui va calculer et stocker les valeurs retournées par Bliss pour chaque fichier musical de l’audiothèque. Typiquement, si votre bibliothèque musicale se trouve dans ~/Musique, vous pouvez lancer

cd ~/Musique; find . -type f -print0 | xargs -0 blissify ~/Musique

pour calculer les valeurs nécessaires pour chaque fichier de votre bibliothèque musicale. Toutes ces valeurs seront alors stockées dans une base SQLite stockée dans $XDG_DATA_HOME/blissify/db.sqlite3.

Blissify fournit également une implémentation basique de Bliss pour MPD permettant d’analyser directement sa bibliothèque musicale gérée par MPD avec Bliss, puis de créer des listes de lecture intelligentes à partir de la liste de lecture actuelle.

Lire les commentaires

(Source: LinuxFr.org : les dépêches)
Logo