在处理音频样本时,往往我们的音频样本由于录制设备,环境,人发音的音量大小的不同影响,会造成音频响度不统一,分布在一个不同的响度值域上。为了让语音模型更好的学习音频特征,就有必要对音频的响度进行归一化处理,控制在一定的响度值域。
代码实现如下:
# -*- coding: utf-8 -*-
# date:2024
# Author: DataBall
# function: 音频响度归一化
import librosa
import soundfile as sf
import pyloudnorm as pyln
import numpy as np
def get_audio_loudness(voice,sr):
# 计算音频的响度(以分贝为单位)
meter = pyln.Meter(sr)
loudness = meter.integrated_loudness(voice)
return loudness
def change_audio_loudness(voice,sr,origin_loudness,target_loudness,path_out):
# 归一化音频到目标响度
normalized_wav = pyln.normalize.loudness(voice,origin_loudness,target_loudness)
# 如果归一化后的音频振幅超过1,需要进一步归一化
if np.abs(normalized_wav).max() > 1.0:
normalized_wav = normalized_wav / np.abs(normalized_wav).max()
# 保存归一化后的音频
sf.write(path_out, normalized_wav, sr)
print("保存归一化后的音频:{}".format(path_out))
if __name__ == "__main__":
path_audio_origin = 'audio/m_16.wav'
y, sr = librosa.load(path_audio_origin, sr=None) # 加载音频文件,返回音频数据和采样率
print("音频采样率:{}".format(sr))
origin_loudness = get_audio_loudness(y,sr)
print("原音频响度 : {:.5f}".format(origin_loudness))
target_loudness = -20 # 目标响度
path_audio_out = "audio/normalized_audio.wav"
change_audio_loudness(y,sr,origin_loudness,target_loudness,path_audio_out)
#---------------------- 读取修改后的音频的响度信息
y2, sr2 = librosa.load(path_audio_out, sr=None)
loudness2 = get_audio_loudness(y2,sr2)
print("调整后音频响度 loudness: {:.5f}".format(loudness2))
对于的运行log如下:
音频采样率:16000
原音频响度 : -35.06912
保存归一化后的音频:audio/normalized_audio.wav
调整后音频响度 loudness: -20.00000
助力快速掌握数据集的信息和使用方式。
数据也可如此美好!