Screenshot of OpenDataSynth

Pour fêter le 1er avril, notre collègue Jérémy Autran, ingénieur R&D chez OpenDataSoft, s’est amusé à créer des sons à partir de jeux de données. Découvrez comment l’idée lui est venue et surtout comment il s’y est pris pour développer OpenDataSynth !

C’est cette image, tweetée il y a quelques semaines par ma collègue Lise Guerriero qui a tout démarré.

Elle montre une évolution cyclique du nombre de tâches solaires observées depuis 1749. On peut voir que ce nombre monte et descend avec une périodicité d’une dizaine d’années. Ça m’a rappelé un oscillogramme d’une onde sonore, comme celle-ci.

J’ai obtenu cette forme d’onde en faisant le son “i”, et en enregistrant avec Audacity

Je me suis naturellement demandé quel son le jeu de données décomptant les tâches solaires produirait si on pouvait l’écouter. C’est comme ça que j’ai décidé de créer un synthétiseur numérique alimenté par des jeux de données.

Un synthétiseur numérique fonctionne en transformant un flux de nombres en son. Ainsi, il devrait être possible de transformer des données en son en utilisant la même technique : prendre un champ numérique intéressant, créer une forme d’ondes en écrivant les valeurs du champ dans une structure de données adéquate et demander à l’ordinateur de la lire. Obtenir des enregistrements est simple comme bonjour avec l’API OpenDataSoft: avec une requête, on obtient autant de données que nécessaire pour construire notre forme d’onde. Grâce à cela, nous pouvions donc écouter plus de 7000 jeux de données publics.

En utilisant ces outils ainsi que l’API Web Audio, j’ai pu créer un prototype dans mon navigateur en quelques minutes.

Pas si vite !

Seulement, voilà, ça n’a pas fonctionné comme je l’espérais : j’avais bien des sons, mais plutôt que des bruits intéressants, je n’obtenais que des claquements rapides. Qu’a-t-il bien pu se passer?

Il s’agissait en fait d’un problème de fréquence d’échantillonnage. En effet, l’audio représenté par modulation d’impulsion codée (PCM) utilise le plus souvent une fréquence d’échantillonnage de 44.1kHz. En d’autres termes, pour obtenir une seule seconde d’audio, il faut 44 100 valeurs. Puisque chaque échantillon est généré à partir d’un enregistrement d’un jeu de données, nous avions besoin d’un jeu d’une taille conséquente pour dépasser ne serait-ce que quelques dixièmes de seconde.

Un autre problème est également survenu : aucun retour visuel sur ce qui était lu ne m’était montré. Après avoir appuyé sur “play“, je n’avais donc aucun moyen de savoir quand la lecture était terminée.

Interpolation to fill the gaps in the waveform

Interpolation pour remplir les trous. Image par Dessy Daskalov

Pour régler ces problèmes, je me suis tourné vers l’open source. D’abord en utilisant smooth.js, une bibliothèque d’interpolation linéaire, pour générer plus d’un échantillon par enregistrement. En pratique, cela permet de remplir le trou entre deux échantillons avec des valeurs intermédiaires, afin de briser la dépendance entre la taille du jeu de données et la durée du clip audio. Après avoir essayé plusieurs valeurs, il est apparu que générer deux secondes d’audio, soit 88 200 échantillons, offrait les meilleurs résultats pour la plupart des jeux de données.

Wave form rendered by wavesurfer.js

Forme d’onde dessinée par wavesurfer.js

Pour mon problème de rendu visuel, j’ai décidé d’utiliser wavesurfer.js. Cette bibliothèque permet d’afficher visuellement une forme d’onde, de la jouer et, lors de la lecture, de montrer la progression en faisant défiler une tête de lecture sur la forme d’onde.

Armé de ces outils, je suis parvenu à créer une maquette que j’ai pu partager autour de moi.

De la maquette au produit

Capture d'écran des widgets en action

Les widgets en action

À ce stade, tout est fonctionnel mais l’ergonomie est lacunaire. Pour améliorer ceci j’ai fait usage de la superbe bibliothèque d’ODS-Widgets, qui m’a permis en deux coups de cuillère à pot de créer une interface de navigation digne de ce nom. Ces widgets m’ont permis d’accéder à une vue du catalogue, de générer une barre de recherche pour trouver des jeux de données et de générer des sélecteurs de champs pour l’écoute et le tri des valeurs. Bien qu’ils soient généralement utilisés au sein de la plateforme, lors de la création de pages de contenu, ils peuvent aussi être utilisés sur n’importe quelle page web. Ayant besoin d’intégrer smooth.js et wavesurfer.js, j’ai utilisé une page Github pour héberger le projet.

Bilan des comptes

J’ai créé, sur un coup de tête, un petit projet amusant permettant d’écouter les jeux de données du réseau de données OpenDataSoft. Pour ce faire j’ai utilisé la puissance des APIs OpenDataSoft et j’ai intégré à des outils open source les ODS-Widgets. En très peu de temps j’ai pu construire une maquette puis un mini produit capable d’offrir des heures de divertissement aux amoureux de la donnée. Vous pouvez l’essayer ici, et, si vous le désirez, consulter le code source.

Avez-vous trouvé un jeu de données aux sonorités exotiques ? Dites le nous sur twitter avec le hashtag #MakeDataSing. Mon jeu de données préféré est celui-ci, contenant la production de plusieurs pêcheries.


Valorisez-vos données en Open Data !

Vous souhaitez donner du sens à vos données ? Recevez votre guide gratuit maintenant et découvrez les 10 étapes essentielles pour bien amorcer votre projet Open Data.




Téléchargez le guide Open Data d'OpenDataSoft