Определение громкости аудиоклипа

10

У меня есть некоторый код, который использует GetSpectrumDataAudioSource, воспроизводящий песню, чтобы создать макет уровня для проигрывателя. Я хочу добавить функциональность, где игроки могут загружать свои собственные песни и воспроизводить уровни, созданные на основе данных из этих песен. К сожалению, при сравнении разных аудио файлов я столкнулся с этим:

введите описание изображения здесь

Как вы можете видеть, амплитуда резко отличается от клипа к клипу, создавая впоследствии уровни, тривиальные или почти невозможные. Я хочу найти способ определить эту «громкость», чтобы я мог уменьшить ее или усилить с помощью множителя после получения данных из песни. Кроме того, есть ли способ извлечь эти данные без воспроизведения песни?

Садовник
источник

Ответы:

9

Ручной способ сделать это - использовать AudioClip.GetData для получения данных примера в массиве. Затем переберите данные и найдите квадрат среднего значения, чтобы найти «громкость» аудиоклипа.

Затем вы также можете масштабировать весь массив так, чтобы максимальное значение было равно 1.0f, и записать его обратно в аудиоклип с помощью AudioClip.SetData . Это называется нормализацией звука , и сэмплы имеют самую громкую точку максимальной громкости. Обратите внимание, что это не учитывает, что если ваши аудиоклипы имеют очень низкую громкость, но имеют очень высокие пики. Для этого есть более продвинутые методы (отмечено ниже).

Unity также по умолчанию выполняет нормализацию автоматически. Поэтому, если вы не коснулись настроек импорта, эта операция выполняется автоматически, и вам не нужно об этом беспокоиться. Если проблема сохраняется, даже если вы уверены, что звук нормализован, вам, вероятно, потребуется сжать звук с помощью сжатия динамического диапазона (примечание: это очень отличается от сжатия данных, не имеет ничего общего с размерами файлов или использованием памяти), чтобы соответствовать вашим потребностям с внешним программным обеспечением.

Лассе
источник
Удивительный ответ, рассмотрим все это более подробно. Спасибо!
Садовник
5
Максимальное значение не всегда лучший вариант (как вы сказали). Очень очень короткие громкие пики (эти звуки похожи на щелчки) не кажутся такими же громкими, как непрерывный звук. Если вам нужна воспринимаемая громкость, вам нужно возвести в квадрат все значения, усреднить их, а затем взять квадратный корень. Делать это таким образом - это то, что делает нормализация, так что, надеюсь, для этого есть встроенное Unity.
Джезамон
2
Громкость связана со звуковой энергией, и, как намекает @Jezzamon, способ определения этого заключается в вычислении среднеквадратичного значения (RMS). dsp.stackexchange.com/questions/2951/loudness-of-pcm-stream
Зак Крит