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

43
22
oct.
2016
Audiovisuel

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 audio 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 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.

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 deux 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éhensible 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. la 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 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, 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é 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 greffons).

C’est en ce sens qu’a été développé 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 :

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, 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.

  • # À ne pas confondre avec le virus Bliss

    Posté par (page perso) . Évalué à 5 (+2/-0).

    Sans rapport avec le virus Bliss qui ciblait les systèmes GNU/Linux, en 1997 (deuxième virus visant ces systèmes après Staog). Cf https://fr.wikipedia.org/wiki/Bliss_%28virus%29

  • # Harmonie ?

    Posté par . Évalué à 10 (+9/-0).

    Pas d'analyse de la tonalité ?
    La transition est naturelle quand le morceau qui démarre est dans le même ton que le morceau précédent. Ou en modulant (tonalités voisines, relatif mineur par exemple).

    • [^] # Re: Harmonie ?

      Posté par . Évalué à 5 (+4/-0).

      Je ne suis pas expert en musicologie, du coup je ne connaissais pas. En revanche je sais de quel côté chercher pour une cinquième coordonnée ; merci :)

      • [^] # Re: Harmonie ?

        Posté par . Évalué à 3 (+1/-0).

        Mais si j'ai bien compris, l'objectif est de faire en sorte de rester dans le même "style" au changement de piste, pas d'assurer une transition douce entre deux morceaux (la formulation "les morceaux s’enchaînant naturellement" dans la dépêche est peut-être ambiguë à ce sujet).

        En d'autres termes, partant d'une chanson metal en La on passera plutôt à une chanson metal en Do qu'à une chanson pop en La.

        La prise en compte de l'harmonie est intéressante, mais je crois qu'elle sert un objectif un peu différent.

        • [^] # Re: Harmonie ?

          Posté par . Évalué à 3 (+2/-0).

          La prise en compte de l'harmonie est intéressante, mais je crois qu'elle sert un objectif un peu différent.

          C'est vrai mais cela peut être une piste intéressante à explorer pour les futures évolutions de la bibliothèque.

          Lorsque l'on conçoit une set list pour un concert, ou même lorsque l'on réfléchit à l'ordre des chansons sur un album c'est une information que l'on prend en compte. Le principe ayant était poussé à l'extrême sur l'album concept Le fil de Camille qui tournait autour de la note si restant en bourdon.

          Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.

        • [^] # Re: Harmonie ?

          Posté par . Évalué à 2 (+0/-0).

          Je ne suis pas expert en la matière non plus, mais je pense que c'est un peu plus complexe que de prendre la tierce majeur.
          Il faudrait analyser la gamme dans laquelle la fin de la chanson est jouée et se baser dessus.
          Il me semble que Chordata fait déjà une part du boulot si jamais.

          Et si ça peut te donner d'autres potentielles pistes d'évolution, j'imagine bien l'utilisation qui pourrait en être faite dans un logiciel comme "mixxx", où l'auto-dj est assez moyen (dans mes souvenirs du moins) : pas de changement de tempo/tonalité pour faire des transitions entre chansons.

          • [^] # Re: Harmonie ?

            Posté par . Évalué à 3 (+1/-0).

            Il faudrait analyser la gamme dans laquelle la fin de la chanson est jouée et se baser dessus.

            Peut-être, mais je ne connais pas beaucoup de styles de musique occidentale où on n'a pas tendance à finir sur la tonalité du morceau, même quand ça module (et il n'y a pas beaucoup de modulation en pop, rock, etc), ça revient à la tonalité de départ sur la fin.

            D'ailleurs, il faudrait peut-être que des spécialistes s'expriment là dessus, mais il me semble bien que classiquement, que si on ne termine pas par l'accord majeur de dominante, on n'enchaine pas forcément sur la nouvelle tonalité. Par exemple, dans les suites de Bach, on peut terminer sur une tierce picarde et enchainer sur une tonalité mineure ; inversement, les enchainements majeur/mineur se font sans transition particulière.

            Ceci dit, la règle générale en musique classique reste de suivre les règles de la modulation pour enchainer les morceaux, les transitions se font entre tonalités proches, ou éventuellement entre mode majeur et mode mineur dans la même tonalité (ce qui s'entend pas mal quand même).

      • [^] # Re: Harmonie ?

        Posté par . Évalué à 3 (+2/-0).

        Oui, en effet enchaîner entre deux morceaux de même tonalité ou de tonalité proche serait une excellente idée! Et même, pour évoluer au cours du temps et ne pas rester bloqué dans une tonalité toute la soirée, tu peux décider d'un "parcours" de tonalité. Par exemple un cycle de quinte (tu passes de do à sol puis à ré, etc…), ou d'autres modulations suivant l'effet que tu veux donner.
        Dans la musique occidentale, la tonalité t'est donnée par la tonique (première note de la gamme) et sa tierce (si la tierce est "petite", le morceau est en mode mineur, si elle grande, le morceau est en mode majeur).
        Pour détecter la tonique, c'est relativement facile: ce sera la note fondamentale du dernier accord du morceau. (Donc tu prends la fft et tu détecte le premier pic de ton spectre, par exemple). Ce sera aussi, dans 90% des cas au moins, la note fondamentale du premier accord du morceau.

        En tous cas c'est une super idée, je me suis souvent posée cette question!

        • [^] # Re: Harmonie ?

          Posté par . Évalué à 1 (+0/-0).

          On pourrait aussi trouver la tonique en analysant les notes du morceau (ou les 5-10 plus joués) car les écarts permettent de retrouver la tonique (les écarts doivent suivre ceux de la gamme de do).

  • # nomé jalussine

    Posté par . Évalué à -10 (+1/-21).

    ça me parait d'emblée complètement abracadabrant !!! On dirait les élucubrations d'un professeur Tournesol qui serait tombé dans la marmite de la pataphysique.

    • [^] # Re: nomé jalussine

      Posté par . Évalué à 3 (+2/-1).

      Moi ça me rappelle plutôt la scène d'introduction du "Cercle des poètes disparus", où on donne une méthode pour évaluer une œuvre, à base de valeurs, de calcul de diagonale ou je ne sais quoi :)

      Mais même si je reste circonspect sur le résultat de l'algorithme cité ici, je ne peux m'empêcher de penser un "et pourquoi pas ?"
      C'est en tâtonnant et en tentant des trucs parfois tordus qu'on avance finalement…

      • [^] # Re: nomé jalussine

        Posté par . Évalué à 4 (+3/-0).

        C'est en tâtonnant et en tentant des trucs parfois tordus qu'on avance finalement…

        On a ici une simple projection d'objets sur un espace vectoriel et utilisation de la norme associée.

        Ce n'est pas forcément la chose la plus intuitive qui soit pour un néophyte, mais c'est une des opérations les plus vites tentées quand on cherche à comparer des objets.

        • [^] # Re: nomé jalussine

          Posté par . Évalué à 1 (+0/-0). Dernière modification le 28/10/16 à 16:29.

          Oui en gros c'est la recherche d'extraction de caractéristiques (features en anglais) et en général on s'arrange à la fin pour avoir des valeurs numériques. Ensuite l'objet peut être représenté par la valeur de ses caractéristiques qui forme un vecteur. À partir de là on a toute une série de super algorithme à base d'algèbre linéaire (les mathématiques avec des vecteurs et matrices) qui on fait leur preuve ! (L'ordinateur est taillé pour ce genre de calcul, encore plus avec les cartes graphiques et leurs GPU).
          C'est aujourd'hui la base de la majorité des algorithmes d'Apprentissage automatique.

  • # MusicIP

    Posté par . Évalué à 4 (+3/-0).

    ça me rappelle MusicIP, un excellent logiciel disponible sous windows, Mac et Linux, créé en 2000 mais dont tout développement a cessé en 2008 à priori.

    Ce logiciel crée une empreinte de chaque morceau, stockée dans le tag ou dans une archive locale, qui permettait de retrouver des morceaux similaires, avec des critères règlables comme le style ou le genre du morceau (récupéré sur le tag), de manière à créer un mix, d'une taille réglable. L'analyse des morceaux pour la création de l'empreinte est relativement longue, mais il existait des serveurs qui stockaient des résultats d'analyses selon un ID calculé par MusicIP. Ce service était payant à l'origine. Les serveurs, appelés MusicDNS par leur créateur, ont cessé de répondre il y a 3 ou 4 ans de cela.
    En revanche, la génération de mix est rapide et donne des résultats souvent intéressants, qui peuvent mixer éventuellement des genres différents, comme le classique, le jazz ou la chanson, pour peu qu'ils soient similaires en "rythme". A vrai dire je ne sais absolument pas comment fonctionne ce logiciel.
    L'avantage de ce logiciel est qu'il était totalement autonome (pas besoin d'une base de données en ligne) et ne se basait pas sur l'auteur/titre donc fontionnait sur tout type de musique.
    Le code est à priori perdu ou en tout cas il n'a pas à ma connaissance été divulgué.

    Je m'en sers toujours avec bonheur en tant que plugin de l'excellent Logitech Media Server, autre logiciel plus ou moins à l'arrêt.
    Il y avait également echonest, un service en ligne, qui proposait une fonctionnalité similaire dans la finalité mais qui en fait utilisait une base de données centralisée pour la génération des listes de lectures. Il a été racheté récemment par Spotify, qui l'a arrêté, sans doute pour ne proposer que le service intégré dans son offre.
    Ce qui serait bien, ce serait de développer un plugin pour le logitech media server, qui pourrait remplacer feu MusicIP…

  • # une autre roue au carrosse?

    Posté par (page perso) . Évalué à 6 (+6/-0).

    Il existe plusieurs librairies d'analyse musicale qui contiennent des fonctionnalités qui (il me semble), sont bien plus avancées.

    Par exemple, celle que je maintiens depuis un peu plus d'une décade: https://aubio.org (détection de fréquence fondamentale, des attaques percussives ou non-percussives, des notes, analyse rythmique, …). aubio est activement développée, et disponible sur la plupart des distributions.

    Si je comprends bien, le projet bliss n'est pas vraiment consacrée à l'analyse musicale, mais surtout à l'étude des similarités entre deux titres. Il serait intéressant d'utiliser les fonctionnalités d'aubio pour améliorer la robustesse de cette étude.

  • # essentia

    Posté par (page perso) . Évalué à 2 (+1/-0).

    Lors de recherches sur la génération automatique de liste de lecture j'ai découvert l'existence de essentia qui propose des techniques avancées de MIR.

    Le projet Bliss a t'il l'intention d'utiliser d'autres espaces pour l'analyse des similarités ?

    http://essentia.upf.edu/home

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.