Określanie głośności AudioClip

10

Mam kod, który używa GetSpectrumDataAudioSource odtwarzającego utwór do stworzenia układu poziomu dla odtwarzacza. Chcę dodać funkcję, w której gracze mogą przesyłać własne utwory i odtwarzać poziomy utworzone na podstawie danych z tych utworów. Niestety podczas porównywania różnych plików audio napotkałem:

wprowadź opis zdjęcia tutaj

Jak widać, amplituda różni się drastycznie od klipu do klipu, tworząc poziomy, które są trywialne do ukończenia lub prawie niemożliwe. Chcę znaleźć sposób na określenie tej „głośności”, aby móc ją stonować lub wzmocnić mnożnikiem po uzyskaniu danych z utworu. Czy istnieje sposób na wyodrębnienie tych danych bez odtwarzania utworu?

Ogrodnik
źródło

Odpowiedzi:

9

Ręcznym sposobem na to jest użycie AudioClip.GetData, aby pobrać przykładowe dane do tablicy. Następnie przeglądaj dane i znajdź Root Mean Square, aby znaleźć „głośność” klipu audio.

Możesz także przeskalować całą tablicę, tak aby maksymalna wartość wynosiła 1,0f, i zapisać ją z powrotem w klipie audio za pomocą AudioClip.SetData . Nazywa się to normalizowaniem dźwięku i powoduje, że próbki mają najgłośniejszy punkt do maksymalnej głośności. Pamiętaj, że nie bierze to pod uwagę faktu, że jeśli Twoje klipy audio mają bardzo niski poziom głośności, ale mają bardzo wysokie piki. Istnieją do tego bardziej zaawansowane techniki (wymienione poniżej).

Domyślnie Unity automatycznie wykonuje normalizację. Jeśli więc nie dotknąłeś ustawień importu, ta operacja jest wykonywana automatycznie i nie musisz się o to martwić. Jeśli nadal masz problem, mimo że masz pewność, że dźwięk jest znormalizowany, prawdopodobnie musisz go skompresować za pomocą kompresji zakresu dynamicznego (uwaga: bardzo różni się od kompresji danych, nie ma nic wspólnego z rozmiarem pliku ani zużyciem pamięci), aby dopasuj swoje potrzeby do zewnętrznego oprogramowania.

Lasse
źródło
Niesamowita odpowiedź, przyjrzy się temu bardziej szczegółowo. Dziękuję Ci!
Ogrodnik
5
Maksymalna wartość nie zawsze jest najlepszą opcją (jak powiedziałeś). Bardzo bardzo krótkie głośne piki (te brzmią jak kliknięcia) nie wydają się tak głośne jak ciągły dźwięk. Jeśli chcesz postrzeganą głośność, musisz wyprostować wszystkie wartości, uśrednić to, a następnie wziąć pierwiastek kwadratowy. Robi to w ten sposób, co robi normalizacja, więc mam nadzieję, że jest do tego wbudowana Jedność.
Jezzamon
2
Głośność jest związana z energią dźwięku, a sposób jej ustalenia jest, jak wskazuje @Jezzamon, poprzez obliczenie pierwiastka kwadratowego (RMS). dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Zac Crites