Menentukan seberapa keras AudioClip

10

Saya memiliki beberapa kode yang digunakan GetSpectrumDatadari AudioSource yang memutar lagu untuk membuat tata letak level untuk dimainkan pemain. Saya ingin menambahkan fungsionalitas di mana para pemain dapat mengunggah lagu mereka sendiri dan memainkan level yang dibuat dengan data dari lagu-lagu ini. Sayangnya, ketika membandingkan berbagai file audio, saya menemukan ini:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, amplitudo berbeda secara drastis dari klip ke klip, kemudian menciptakan level yang sepele untuk diselesaikan atau hampir tidak mungkin. Saya ingin menemukan cara untuk menentukan "kenyaringan" ini sehingga saya dapat menurunkan atau memperkuatnya dengan pengganda setelah mendapatkan data dari lagu tersebut. Juga, apakah ada cara untuk mengekstrak data ini tanpa memutar lagunya?

Tukang kebun
sumber

Jawaban:

9

Cara manual untuk melakukannya adalah dengan menggunakan AudioClip.GetData untuk mendapatkan data sampel dalam array. Kemudian lewati data dan temukan Root Mean Square untuk menemukan "kenyaringan" dari klip audio.

Anda juga dapat mengatur skala seluruh array sehingga nilai maksimumnya adalah 1,0f dan menulisnya kembali ke klip audio dengan AudioClip.SetData . Ini disebut normalisasi audio , dan itu membuat sampel memiliki titik paling keras ke volume maksimal. Perhatikan bahwa ini tidak memperhitungkan bahwa jika klip audio Anda volume sangat rendah, tetapi memiliki puncak yang sangat tinggi. Ada teknik yang lebih maju untuk itu (disebutkan di bawah).

Unity juga melakukan normalisasi secara otomatis secara default. Jadi jika Anda belum menyentuh pengaturan impor, operasi ini dilakukan secara otomatis dan Anda tidak perlu khawatir. Jika Anda masih memiliki masalah meskipun Anda yakin audio dinormalisasi, maka Anda mungkin perlu mengompres audio dengan kompresi rentang dinamis (catatan: hal yang sangat berbeda dari kompresi data, tidak ada hubungannya dengan ukuran file atau penggunaan memori) untuk sesuai dengan kebutuhan Anda dengan perangkat lunak eksternal.

Lasse
sumber
Jawaban yang luar biasa, akan melihat semua ini dengan lebih detail. Terima kasih!
Gardener
5
Nilai maksimum tidak selalu merupakan opsi terbaik (seperti yang Anda katakan). Paku keras yang sangat sangat pendek (ini terdengar seperti klik) tidak terdengar sekeras suara yang terus menerus. Jika Anda ingin kenyaringan yang dirasakan, Anda perlu kuadrat semua nilai, rata-rata itu, dan kemudian ambil akar kuadrat. Melakukannya dengan cara ini adalah apa yang dilakukan normalisasi, jadi semoga ada Unity bawaan untuk itu.
Jezzamon
2
Loudness terkait dengan energi suara, dan cara menentukan ini adalah, seperti yang disiratkan @Jezzamon, dengan menghitung root-mean-square (RMS). dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Zac Crites