Bir AudioClip'in ne kadar yüksek olduğunu belirleme


10

GetSpectrumDataMüzik çalar oynamak için bir düzey düzeni oluşturmak için bir şarkı çalmaya bir AudioSource kullanan bazı kod var . Oyuncuların kendi şarkılarını yükleyebilecekleri ve bu şarkılardaki verilerle oluşturulan seviyeleri çalabilecekleri bir işlev eklemek istiyorum. Ne yazık ki, farklı ses dosyalarını karşılaştırırken aşağıdakilerle karşılaştım:

resim açıklamasını buraya girin

Gördüğünüz gibi, genlik klipten klibe büyük ölçüde farklıdır, daha sonra tamamlanması önemsiz veya neredeyse imkansız seviyeler oluşturur. Bu "ses şiddetini" belirlemenin bir yolunu bulmak istiyorum, böylece şarkıdan veri aldıktan sonra onu tonlayabilir veya bir çarpanla yükseltebilirim. Ayrıca, bu verileri şarkı çalmadan çıkarmanın bir yolu var mı?

Yanıtlar:


9

Bunu yapmanın el ile bir yolu , bir dizideki örnek verileri almak için AudioClip.GetData kullanmaktır . Ardından veriler arasında dolaşın ve ses klibinin "ses şiddetini" bulmak için Kök Ortalama Karesini bulun.

Daha sonra, tüm diziyi maksimum değer 1.0f olacak şekilde ölçeklendirebilir ve AudioClip.SetData ile ses klibine geri yazabilirsiniz . Buna sesi normalleştirme denir ve örneklerin maksimum ses yüksekliğine sahip olmasını sağlar. Bu, ses kliplerinizin çok düşük hacimli, ancak çok yüksek zirvelere sahip olduğunu dikkate almadığını unutmayın. Bunun için daha gelişmiş teknikler vardır (aşağıda belirtilmiştir).

Unity ayrıca varsayılan olarak otomatikleştirme normalleştiriyor. Bu nedenle, içe aktarma ayarlarına dokunmadıysanız, bu işlem otomatik olarak yapılır ve endişelenmenize gerek yoktur. Sesin normalleştirildiğinden emin olmanıza rağmen hala sorun yaşıyorsanız, muhtemelen sesi dinamik aralık sıkıştırma ile sıkıştırmanız gerekir (not: veri sıkıştırmasından çok farklı bir şey, dosya boyutları veya bellek kullanımı ile ilgisi yoktur) harici yazılım ile ihtiyaçlarınızı karşılayın.


Müthiş cevap, tüm bunları daha ayrıntılı olarak inceleyecek. Teşekkür ederim!
Bahçıvan

5
Maksimum değer her zaman en iyi seçenek değildir (dediğin gibi). Çok kısa kısa ani yükselmeler (tıklamalar gibi bu sesler) sürekli bir ses kadar yüksek görünmüyor. Algılanan ses şiddetini istiyorsanız, tüm değerleri karelemeniz, ortalamanız ve ardından kare kökü almanız gerekir. Bu şekilde yapmak normalleşmenin yaptığı şeydir, umarım bunun için yerleşik bir Birlik vardır.
Jezzamon

2
Yüksek ses, ses enerjisiyle ilgilidir ve bunu belirlemenin yolu, @Jezzamon'un işaret ettiği gibi, ortalama karekök (RMS) hesaplamaktır. dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Zac Crites
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.