Déterminer le volume d'un AudioClip

10

J'ai un code qui utilise GetSpectrumDataune source audio jouant une chanson pour créer une disposition de niveau pour le joueur à jouer. Je veux ajouter une fonctionnalité où les joueurs peuvent télécharger leurs propres chansons et jouer les niveaux créés avec les données de ces chansons. Malheureusement, lors de la comparaison de différents fichiers audio, j'ai rencontré ceci:

entrez la description de l'image ici

Comme vous pouvez le voir, l'amplitude diffère considérablement d'un clip à l'autre, créant par la suite des niveaux qui sont triviaux à compléter ou presque impossibles. Je veux trouver un moyen de déterminer cette "intensité" pour que je puisse l'atténuer ou l'amplifier avec un multiplicateur après avoir obtenu les données de la chanson. De plus, existe-t-il un moyen d'extraire ces données sans jouer la chanson?

Jardinier
la source

Réponses:

9

Une façon manuelle de le faire consiste à utiliser AudioClip.GetData pour obtenir les exemples de données dans un tableau. Parcourez ensuite les données et trouvez le Root Mean Square pour trouver le "volume" du clip audio.

Vous pouvez également mettre à l'échelle l'ensemble du tableau de sorte que la valeur maximale soit 1,0f et l'écrire de nouveau dans l' audioclip avec AudioClip.SetData . C'est ce qu'on appelle la normalisation audio , et cela fait que les échantillons ont le point le plus fort au volume maximum. Notez que cela ne tient pas compte du fait que si vos clips audio sont de très faible volume, mais ont des pics très élevés. Il existe des techniques plus avancées pour cela (notées ci-dessous).

Unity effectue également la normalisation automatiquement par défaut. Donc, si vous n'avez pas touché aux paramètres d'importation, cette opération se fait automatiquement et vous n'avez pas à vous en préoccuper. Si le problème persiste, même si vous êtes sûr que l'audio est normalisé, vous devrez probablement compresser l'audio avec une compression de plage dynamique (remarque: chose très différente de la compression de données, n'a rien à voir avec la taille des fichiers ou l'utilisation de la mémoire) pour adapter vos besoins avec un logiciel externe.

Lasse
la source
Une réponse géniale, examinera tout cela avec plus de détails. Je vous remercie!
Jardinier
5
La valeur maximale n'est pas toujours la meilleure option (comme vous l'avez dit). Des pointes bruyantes très très courtes (ces sons comme des clics) ne semblent pas aussi fortes qu'un son continu. Si vous voulez la sonie perçue, vous devez mettre toutes les valeurs au carré, faire la moyenne, puis prendre la racine carrée. Le faire de cette façon est ce que fait la normalisation, donc j'espère qu'il y a une unité intégrée.
Jezzamon
2
L'intensité sonore est liée à l'énergie sonore, et la façon de le déterminer est, comme l'indique @Jezzamon, en calculant la racine quadratique moyenne (RMS). dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Zac Crites