Sur une partition de musique le temps est en X, donc de gauche à droite, la note (la fréquence) est donnée par la coordonnée Y, sur la partition.
Un spectrogramme, c’est la représentation graphique d’un son, qui utilise une approche similaire, mais à un niveau bien plus mathématique et physique.
Sur un spectrogramme d’une chanson, qui est une image (PNG, JPG…) chaque pixel donne trois informations :
- sa position X donne la coordonnée temporelle dans la chanson
- sa position Y donne la fréquence
- sa couleur « Z » donne l’intensité de cette fréquence Y à cet instant X.
On a donc une carte qui représente notre chanson.
Essayez là : https://lehollandaisvolant.net/tout/tools/spectrum/spectrograph.php
On peut y donner un fichier audio et ça joue l’audio en traçant le spectrogramme en direct.
Si c’est bien fait, le spectrogramme contient toutes les informations du fichier audio.
Quand je dis « bien fait », c’est une image assez nette pour tout représenter. Typiquement, pour un son d’une seconde, il faudrait quelque chose comme 20 000 px de haut et 44 100 px de long (20k étant chaque fréquence entre 0 et 20 kHz, et les 44 100 sont l’échantillonnage temporelle : le nombre de points de donnée audio, chaque seconde).
Évidemment pour une chanson de 3 minutes, ça fait un sacré fichier image. Mon outil ne permet pas cette précision, mais en théorie, ça serait possible.
Avec une telle image, on aurait toutes les informations de notre audio. Il suffirait d’en extraire la couleur pour chaque pixel, et de recréer la musique : les dB sont la couleur, les Y sont les Hz et les X l’instant auquel on joue cette note.
L’outil du lien fait exactement ça. Il analyse une image et produit le son correspondant.
On peut donc lui donner un spectrogramme d’une chanson, et il jouera la musique (avec une qualité lamentable, mais reconnaissable).
Mais pourquoi s’arrêter là ? On peut lui donner n’importe quelle image : une photo, un mème, un logo… un QRCode !
L’outil ne verra pas la différence, il va jouer la musique. Ça fera un son dissonant et horrible à écouter, mais du son. Ce son, réinjecté dans un spectrographe retracera l’image (là aussi, avec plus ou moins de fidélité, généralement juste assez pour être intelligible).
Certains fichier audio peuvent ainsi transporter des fréquences cachées par dessus la musique, qui ne se révèlent QUE dans un spectrographe.
On peut imaginer un outil qui met les informations spécifiquement sur certaines fréquences (les fréquences peu audibles, par exemple, ou alors des harmoniques de fréquences utilisées à cet instant, pour les masquer à l’oreille, mais qu’un ordinateur verra sans problème.
Il s’agit de stéganographie audio.
Bien-sûr, il faut que l’encodage soit fidèle, et le micro qui va capter ça également. Ceci arrive rarement : les encodeurs comme MP3 font tout pour optimiser l’encodage et ça passe précisément par la suppression des fréquences peu audibles, par exemple).
Enfin ceci n’est pas nouveau. Le son d’un vieux modem, les tiiiiii tuuu tirilililili tuuuuûûûût… là étaient des données transmises sur le réseau téléphonique, et qui sortaient par le haut parleur ou par le combiné.
En fait, même le son des touches de 0 à 9, plus * et # étaient une combinaison de fréquence uniques pour identifier la pression de ces touches : c’est le système DTMF (j’ai là également un outil). Théoriquement, dans ces vieux téléphones, l’on pouvait utiliser un générateur de fréquences sonores pour composer un numéro.
En tout cas, mon outil crée un fichier audio (un WAV) à partir d’une image quelconque. La musique est même jouée en direct. Si vous utilisez un téléphone où un autre ordinateur pas loin, avec un micro, et une application « spectrographe », vous y verrez l’image (là aussi, fortement distordue).
Astuce : mon outil fonctionne plutôt pas mal avec du texte blanc sur un fond noir. Créez une image toute noire avec « bonjour » en blanc dessus, par exemple et vous verrez.
Oh… et… si vous balancez une image entièrement blanche, alors toutes les fréquences seront autant représentées et à chaque instant. On aura un bruit « blanc ».
Note technique :
- mon outil met les images à l’échelle pour les limiter à 512 pixels de haut.
- attention au volume sonore produit si vous avez un casque.
- l’analyse de l’image peut prendre *beaucoup* de temps (Firefox est nettement plus rapide que Chrome, au passage).
En fait, je produit un tableau des dB et des fréquences à partir d’une version désaturée de l’image donnée (on a juste besoin de la luminosité). Ça c’est très rapide (0,5 secondes avec canvas). Ensuite, je balance ça dans un buffer audio à l’aide de l’API audio en JS. Ça aussi c’est très rapide (1,5 seconde avec deux boucles).
Par contre, pour faire le rendu du buffer, là ça prend un temps phénoménal (parfois une minute). Je ne sais pas pourquoi : l’API interne de rendu du buffer semble mal optimisé. Si quelqu’un a une idée.
Les données ainsi rendues sont converties en un fichier WAV (très rapide) qui est attaché au lecteur audio. Un clic droit sur le lecteur permet de télécharger le WAV.
Enfin, mais ça c’est juste pour la page : à la lecture du WAV, je réanalyse l’audio pour tracer le spectrogramme. Je pourrais recycler le buffer recalculé, mais ça sera très légèrement différent du WAV, et c’est pas ça qui consomme le plus de ressources.
Un outil simple, mais rare sur le net (j’en ai pas trouvé beaucoup), plein de contraintes techniques aussi pour arriver à un résultat pas trop mal.
Ainsi, je ne peux pas utiliser des images trop grandes car sinon les fréquences sont trop hautes et les haut-parleurs (ou l’encodeur) les filtre. Je dois aussi mettre assez d’espace entre chaque pixel (10 Hz en Y actuellement) pour que l’encodeur les sépare et que le micro qui capte l’image les restitue aussi.
Au final, sur une bande de 5 kHz, je peux balancer une image de 500 px. C’est ce que je fais. Je pourrais montrer jusqu’à 1000, mais après on monte à 10 kHz, et c’est la FFT et l’échantillonnage qu’il faut monter (à >20 kHz) et là ça va demander davantage de puissance de calcul, et surtout saturer de tous les côtés : affichage du canvas, fréquences audio, mémoire…
En bref, je suis pas mécontent de cet outil. C’était parfois un gros casse-tête (l’API Audio du JS est à chier, c’est une vraie usine à gaz) et ça demande un peu de maths aussi et beaucoup de tests pour savoir quels paramètres vont bien.
Enfin, un petit exemple de MP3 : https://lehollandaisvolant.net/files/hi6liyil.wav
Enjoy :)
— (
permalink)