Petit programme "anti-bruit" - Divers - Programmation
Marsh Posté le 29-08-2015 à 23:05:41
OULA.
Oui, tu peux faire ca avec JS.
Non, tu ne le feras pas avec JS.
Maintenant ca reste possible bien sur, en python aussi, voila un exemple en JS:
https://wiki.mozilla.org/Audio_Data_API
Il faut que tu es accès aux samples data pour faire cela (quelque soit le language, la technique ou autre).
Tu as plusieurs soucis partant de là:
- C'est pas vraiment uniformisé encore...
- Si t'es en server side (genre node.js), déjà plus facile car tu n'as qu'un seul système à t'occuper...
- Le JS reste souvent trop lent pour faire ca de façon convenable, càd ca marchera, mais si tu veux faire un serveur a partir de là, ca sera trop lent face -par exemple- à du C/C++ avec libmad ( http://sourceforge.net/projects/mad/files/libmad/ ), en embarqué dans un casque bose par exemple, les ressources étant très limité ca n'est là encore pas une bonne idée.
Si tu veux maintenant faire du noise cancelling, ce que tu as là, est valable dans un monde "parfait", cad le bruit que tu obtiens est annulé face au bruit que tu as de l'autre côté.
Le monde parfait bien sur n'existe pas, et l'audio qui plus est ne se satisfait pas de l'approximation. Et le noise cancelling se satisfait VRAIMENT pas de l'approximation...
Je vais tenter d'expliquer grosso merdo une technique parmi plusieurs pour faire du noise cancelling. Je suppose que t'es dans un casque bose ou autre (cad le micro qui choppe le noise et la source qui émet la musique sont très proche):
- Le bruit que tu vas avoir avec le micro "noise cancelling", va avoir une partie de l'enceinte "son" + un delta en millisecondes (le temps que la vibration de la source "son" arrive au micro du noise).
- Tu dois avoir un système temps réel, au sens électronique: la réponse que redonne le système "noise cancelling" (cad micro, traitement, et émission de la courbe inverse), doit se faire de façon constante, dans un temps définissable, constant, et connu.
Toute la qualité d'un tel système repose sur le fait que ce delta de traitement, est le plus proche de 0, de telle sorte que le noise soit efficacement annulé, sinon tu auras un décallage, qui en réalité génèrera plus de bruit qu'autre chose.
Partant de là, plusieurs soucis:
- Utiliser l'amplitude (les samples data), c'est pas bon, car le sample data que tu obtiens du micro a une partie du son "originel", si tu le traites comme tel, tu risques de créer des distorsions parfaitement audible chez l'auditeur (tu vas lui enlever une partie de la musique après tout...).
- Imaginons un bruit très court, et très fort. Si ton noise cancelling est pas assez rapide, tu vas alors générer des harmoniques lorsque le son s'arrête. Je vais pas détailler trop cette partie là, de toute façon tu vas vite le comprendre...
- Tu as un dernier soucis: comment gérer la compression de l'ensemble: en ajoutant du son, même "invisible", tu vas forcément réduire les autres sons, il faut souvent faire des pieds et des mains pour retrouver quelque chose d'acceptable de ce côté.
Là c'est à ce moment que la "magie" cad les différences entre les différents algos possibles est:
- la FFT: https://en.wikipedia.org/wiki/Fast_Fourier_transform
Tu FFT le son de la source, et tu FFT le son du micro "noise", en connaissant quelques caractéristiques de ton produit sur la propagation du son qu'il a, tu peux alors extraire certaines parties, en enlever d'autres, et recomposer le signal normalement déjà "plus proche du noise réel" que du mix "noise + source".
=> c'est probablement l'une des plus facile à faire
=> typiquement tu soustrait la source modulo un facteur d'amoindrissement (ton casque ne propage pas tout à plein volume), et tu recomposes le signal "noise" qui sera normalement plus pur et débarassé du son venant de la source.
- Une version plus "puissante" serait d'utiliser les wavelet transforms, plus adaptée à des traitement "aléatoires" souvent.
- Sachant que tu dois recomposer le signal final, le plus précisément, un tour du côté de McAulay-Quatieri me parait idéal, je commencerai par là: https://www.clear.rice.edu/elec301/ [...] thod2.html
Mais les FFT, il est facile de trouver des codes prêt à l'emploi, alors que Wavelet ou McAulay-Quatieri souvent tu dois passer par la case code, et elle est pas forcément évidente hein
Dernier mot:
Dans certains cas le noise est plus facile à traiter, si ta source par exemple vient d'un vinyle, il y ait de bonne chances que le noise soit indus par l'électricité, en connaissant la fréquence (par exemple 50Hz en France), tu peux te contenter d'un filtre sur cette fréquence donnée.
Les softs genre audacity & co souvent implémentent juste ce genre de techniques...
PS: bonne chance, c'est très technique si tu veux parvenir à un système qui a réellement une chance dans une application réelle, mais le jeux en vaut la chandelle
Marsh Posté le 29-08-2015 à 07:53:26
Bonjour,
J'ai peu d'expérience en programmation, juste un peu de Python pour la résolution de problèmes scientifiques (intégration ou ce genre de choses), et j'apprends actuellement Javascript non seulement parce que j'en ai besoin en développement web, mais aussi parce que c'est un langage que l'on retrouve utilisé de plus en plus pour de nombreuses applications.
Pour m'entraîner, j'aimerais essayer de faire un petit programme qui me paraît simple, mais je ne sais pas par où commencer. J'aimerais que mon programme prenne en entrée un fichier audio duquel il lirait l'amplitude, et qu'il renvoie un autre fichier audio qui corresponde à l'opposée de cette amplitude. Ainsi, les deux fichiers joués en même temps s'annuleraient.
Est-ce que je peux faire ça avec Javascript ? (Beaucoup de programmeurs expérimentés me disent qu'on peut tout faire avec Js) Par où je commence ? Notamment, quel type de fichier audio peut-être facilement lu ? Où trouver l'information sur l'amplitude ? Si ça ne marche pas avec Javascript, quel langage pourrait être utilisé ?
Merci d'avance