URL: https://linuxfr.org/news/sortie-de-la-bibliotheque-d-analyse-musicale-bliss-1-0 Title: Sortie de la bibliothèque d’analyse musicale Bliss 1.0 Authors: Polochon_street Davy Defaud, phyks, mathieui, palm123, claudex, Xavier Teyssier et Benoît Sibaud Date: 2016年10月06日T01:27:53+02:00 License: CC By-SA Tags: musique, bliss et leleleplayer Score: 43 Bliss a été présenté à la _Student DemoCup 2015_, sous la forme de [_leleleplayer_](http://student.opensourcesummit.paris/projet/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 audio et permettant, entre autres, la génération automatique de listes de lecture.  Développée et utilisable en _C_ à l’aide de [_ffmpeg_](http://ffmpeg.org/), [_fftw_](http://www.fftw.org/) et disposant de bibliothèques de liaison (_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. ---- [Page du projet Bliss](http://lelele.io/bliss.html) [Dépôt GitHub de Bliss](https://github.com/Polochon-street/bliss) [Dépôt GitHub de Blissify](https://github.com/Phyks/Blissify) ---- 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 :  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](https://fr.wikipedia.org/wiki/Similarit%C3%A9_cosinus) 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éhensible possible. Rapidement (le détail des différents scores est donné sur [la page de Bliss](http://lelele.io/bliss.html#details)), ces critères sont les suivants : * amplitude : à quel point le son est fort, _cf._ la capture ci‐dessous sous Audacity :  * 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 d’échantillons par _ffmpeg_. Actuellement, le morceau est stocké en mémoire vive sous sa forme décodée ; une étape prévue (mais non triviale) est de recoder Bliss en utilisant les mêmes algorithmes en diffusion (_streaming_), afin d’éviter d’occuper la mémoire vive 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 huit genres différents, à savoir : blues, musique classique, musique électronique, jazz, métal, 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 grappes (_clusters_) à partir de tous ces points à l’aide d’un algorithme des [k-moyennes](https://fr.wikipedia.org/wiki/K-moyennes), en ajoutant un genre à la fois : jazz _vs_ métal, puis jazz‐métal‐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é](http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html) 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 :  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 greffons). C’est en ce sens qu’a été développé [Blissify](https://github.com/phyks/blissify), une infrastructure fonctionnant autour de Bliss et censée 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`, pour calculer les valeurs nécessaires pour chaque fichier de votre bibliothèque musicale, vous pouvez lancer : ```bash cd ~/Musique; find . -type f -print0 | xargs -0 blissify ~/Musique ``` 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](https://github.com/Phyks/Blissify/tree/master/mpd), permettant [d’analyser directement sa bibliothèque musicale gérée par MPD](https://github.com/Phyks/Blissify#the-mpd-server-side-script) avec Bliss, puis de [créer des listes de lecture intelligentes à partir de la liste de lecture actuelle](https://github.com/Phyks/Blissify#the-mpd-client-side-script).