2011-04-17 4 views
3

J'ai un ensemble de fichiers mp3, dont certains ont des périodes de silence prolongées ou des intervalles de silence périodiques. Comment puis-je détecter cela par programmation?Extraire et analyser le son à partir de fichiers mp3

Je cherche une librairie en C++, ou de préférence en C#, qui me permettra d'examiner le contenu sonore de ces fichiers pour les silences.

EDIT: Je devrais élaborer ce que j'essaye d'accomplir. Je capture des commentaires sportifs en streaming en utilisant VLC et l'enregistre en mp3. Lorsqu'un jeu est retardé ou annulé, le commentaire de diffusion est remplacé par un message répétitif indiquant que le commentaire n'est pas disponible. En recherchant ces silences périodiques (ou silence total), je peux détecter s'il n'y a pas de commentaire et arrêter l'enregistrement en streaming

Pour cette raison je suis réticent à décompresser le mp3 car si cela signifiait que mon test pour ces silences serait très lent. A moins que je puisse décoder les 5 dernières minutes du fichier?

Merci Andrew

+0

Comment silencieux sont exactement ces silences? – orlp

+0

Ils viennent d'un ruisseau alors j'imagine qu'ils sont des silences "silencieux". –

Répondre

1

Je ne suis pas au courant d'une bibliothèque qui détecte le silence directement dans les données codées MP3, car ce ne est pas une tâche triviale pour détecter le silence sans d'abord décompresser. Heureusement, il est facile de trouver des bibliothèques qui décodent les fichiers MP3 et d'y accéder en tant que données PCM, et il est trivial de détecter le silence dans les données PCM. Voici une telle bibliothèque pour C# j'ai trouvé, mais je suis sûr qu'il y a des tonnes: http://www.robburke.net/mle/mp3sharp/

Une fois que vous décoderez les données, vous aurez une liste d'échantillons PCM. Dans la forme la plus basique, l'algorithme dont vous avez besoin pour détecter le silence est simplement d'analyser un petit morceau (peut être aussi petit que .25s ou autant que plusieurs secondes), et assurez-vous que la valeur absolue de chaque échantillon dans le morceau est en dessous d'un seuil. La valeur de seuil que vous utilisez détermine à quel point le son doit être "silencieux" pour être considéré comme du silence, et la taille du morceau détermine combien de temps le volume doit être inférieur au seuil pour être considéré comme silencieux. Il y a des améliorations à l'approche de base, comme l'utilisation de l'historisme (qui utilise essentiellement deux seuils, un pour la transition au silence, et un autre pour le passage au silence). Malheureusement, je ne connais pas de bibliothèque pour C++ ou C# qui implémente la détection de niveau, et rien ne monte immédiatement sur google, mais au moins pour la version simple son assez facile à coder

Modifier: En outre, cette bibliothèque semble intéressante: http://naudio.codeplex.com/

En outre, sans une véritable double question, les réponses ici seront utiles pour vous:

Detecting audio silence in WAV files using C#

+0

J'ai élaboré ma question ci-dessus qui rend cette solution moins favorable - mais je vous remercie pour la suggestion car je n'y avais pas pensé et il pourrait être ma seule option - AS –

+0

Ces gars sont capables de séparer les fichiers MP3 sans décodage, mais au fond de leur manuel ils disent que pour détecter le silence, ils doivent décoder. Encore, au moins, vous seriez en mesure d'utiliser cette méthode pour séparer un morceau du mp3, puis seulement décoder que http://mp3splt.sourceforge.net/mp3splt_page/ – bdk

+0

Est-ce que le commentaire est toujours du même site et toujours le même message? Si c'est le cas, ils peuvent juste diffuser un mp3 en boîte dans une boucle et vous pouvez tricher et faire juste une comparaison octet-by-byte du signal de streaming au commentaire connu – bdk

Questions connexes