#python #audio #librosa
#python #Аудио #librosa
Вопрос:
У меня есть несколько волновых файлов, некоторые из них небольшого объема, а другие большого объема.
Я хочу «нормализовать» амплитуду звука.
(Например, функция «Нормализовать», которую имеет какое-либо приложение для секвенсора звука. Увеличение громкости до максимального значения достигает 0 дБ.)
Например, в библиотеке librosa есть librosa.util.normalize, однако я не уверен, что это то, что я имел в виду.
Я хочу выровнять громкость звука, есть ли какая-нибудь практика?
Ответ №1:
Найдите максимальный пик (положительный или отрицательный, поэтому используйте abs) в любом канале. Например, в 16-битном файле представьте, что вы нашли 25000. Вычислите отношение этого значения относительно максимума в 16-битном диапазоне со знаком и инвертируйте его :
ratio = 32767.0 / 25000 #(equivalent to 1 / (25000 / 32767.0))
Теперь повторите все выборки и умножьте их на инвертированное соотношение, чтобы 25000 стало 32767 :
for(sample in samples):
sample = round(sample * ratio)
Эта операция называется «нормализация» или «оптимизация» в зависимости от программного обеспечения.
Комментарии:
1.Большое вам спасибо !!. Бит, как я могу сначала найти максимальный пик из сэмплов?
(y,sr) = librosa.load(out_file,sr=44100,mono=False)
print(y[1])
[-3.0517578e-05 -3.0517578e-05 0.0000000e 00 ... -1.0467529e-02 -1.0253906e-02 -1.0070801e-02]
…2. Librosa, похоже, работает с float32, поэтому значения выборки должны варьироваться от -1.0 до 1.0. Кроме того, принцип тот же: вы должны максимизировать абсолютное значение, которое приведет к значению от 0 до 1. Затем инвертированный коэффициент равен 1, деленному на это значение. Обратите также внимание, что если максимальный пик равен 1.0, вы ничего не можете сделать, поскольку волна уже нормализована.
3.Большое вам спасибо. Это работает.
(y,sr) = librosa.load(out_file,sr=44100,mono=False)
max_peak = np.max(np.abs(y))
ratio = 1 / max_peak
y = y * ratio