一、音量增强
音量增强,顾名思义就是音量的调大和调小,通过对音量进行增强可以使得模型更好的泛化。防止数据只有小音量时,当有大音量传入时模型不能很好的进行识别。
下面是我对音量增强生成频谱图进行可视化的结果
上面的一个图片是音量增强前的频谱图,下面是音量增加50dB(分贝)的结果。由图可知音量的增加使得频谱图更亮。
#对音量增强进行可视化
import os
from pydub import AudioSegment
import numpy as np
import librosa
import librosa.display
import matplotlib.pyplot as plt# 音频路径
audio_path = ""
output_path = ""# 创建输出目录
os.makedirs(output_path, exist_ok=True)def volume_boost(audio, gain_db):"""音量增强"""return audio + gain_dbdef plot_combined_spectrogram(original_samples, boosted_samples, sample_rate, title, output_file):"""绘制原始和增强后的频谱图在同一张图片中"""# 转换为浮点型并归一化original_samples = original_samples.astype(np.float32) / np.max(np.abs(original_samples))boosted_samples = boosted_samples.astype(np.float32) / np.max(np.abs(boosted_samples))# 使用 librosa 计算频谱S_original = librosa.feature.melspectrogram(y=original_samples, sr=sample_rate, hop_length=256)S_original_db = librosa.power_to_db(S_original, ref=np.max)S_boosted = librosa.feature.melspectrogram(y=boosted_samples, sr=sample_rate, hop_length=256)S_boosted_db = librosa.power_to_db(S_boosted, ref=np.max)# 绘制频谱图fig, axs = plt.subplots(2, 1, figsize=(12, 8), constrained_layout=True)# 原始频谱图librosa.display.specshow(S_original_db, sr=sample_rate, hop_length=256, x_axis='time', y_axis='hz', cmap='magma', ax=axs[0])axs[0].set_title(f"原始音频频谱: {title}")axs[0].set_ylabel("频率 (Hz)")axs[0].set_xlabel("时间 (s)")# 增强后频谱图librosa.display.specshow(S_boosted_db, sr=sample_rate, hop_length=256, x_axis='time', y_axis='hz', cmap='magma', ax=axs[1])axs[1].set_title(f"音量增强后频谱: {title}")axs[1].set_ylabel("频率 (Hz)")axs[1].set_xlabel("时间 (s)")# 保存图片plt.savefig(output_file)plt.close()# 遍历目录中的音频文件
for file_name in os.listdir(audio_path):if file_name.endswith(".wav"):file_path = os.path.join(audio_path, file_name)audio = AudioSegment.from_file(file_path)# 获取原始音频的时域数据original_samples = np.array(audio.get_array_of_samples())sample_rate = audio.frame_rate# 音量增强audio_volume_boosted = volume_boost(audio, gain_db=50)volume_boosted_samples = np.array(audio_volume_boosted.get_array_of_samples())# 保存原始和增强后频谱图到同一张图片combined_spectrum_file = os.path.join(output_path, f"{file_name}_combined_spectrum.png")plot_combined_spectrogram(original_samples, volume_boosted_samples, sample_rate, file_name, combined_spectrum_file)print(f"保存频谱图到: {combined_spectrum_file}")
二、EQ增强
EQ增强,首先应该了解什么是EQ?
EQ,全称Equalizer,中文称为均衡器,也常简称为“均衡”或“均衡调节”。它是一种音频处理工具,通过对不同频率段的音量进行独立增强或削弱,以达到改善或修饰声音色彩、平衡音色的作用。
通俗的讲:想象声音是一张由低音、中音、高音组成的图片。EQ就像调节图片每个色调的明暗,可以让低音更浑厚、高音更明亮、中音更突出,或者把某些不需要的频段衰减掉让声音更清晰。
下面图是EQ增强前的频谱图和对低频5000hz进行了20dB的增益的频谱图,发现在高频的亮度有明显的提升。
下面图是EQ增强前的频谱图和对低频1000hz进行了-20dB的增益的频谱图,发现亮度有明显的下降。
#对EQ增强进行可视化
import os
from pydub import AudioSegment
import numpy as np
import librosa
import librosa.display
import matplotlib.pyplot as plt
import scipy.signalaudio_path = ""
output_path = ""os.makedirs(output_path, exist_ok=True)def db_to_linear(gain_db):"""dB增益转线性倍数"""return 10 ** (gain_db / 20)def apply_eq(samples, sample_rate, eq_settings):"""简易EQ增强,对多个频段峰值调节:param samples: 一维int16/float音频数据:param sample_rate: 采样率:param eq_settings: [{'freq': center_freq, 'gain_db': gain, 'q': Q}, ...]:return: 增强后样本(int16)"""y = samples.astype(float)for eq in eq_settings:f0 = eq['freq']gain_db = eq['gain_db']Q = eq.get('q', 1.0)# 设计二阶峰值滤波器b, a = scipy.signal.iirpeak(w0=f0/(sample_rate/2), Q=Q)filtered = scipy.signal.lfilter(b, a, y)linear_gain = db_to_linear(gain_db)y += (linear_gain - 1) * filtered# 防止溢出并转换回int16y = np.clip(y, -32768, 32767)return y.astype(np.int16)def plot_combined_spectrogram(original_samples, boosted_samples, sample_rate, title, output_file):"""绘制原始和增强后的频谱图在同一张图片中"""# 转换为浮点型并归一化original_samples = original_samples.astype(np.float32) / np.max(np.abs(original_samples))boosted_samples = boosted_samples.astype(np.float32) / np.max(np.abs(boosted_samples))# 使用 librosa 计算频谱S_original = librosa.feature.melspectrogram(y=original_samples, sr=sample_rate, hop_length=256)S_original_db = librosa.power_to_db(S_original, ref=np.max)S_boosted = librosa.feature.melspectrogram(y=boosted_samples, sr=sample_rate, hop_length=256)S_boosted_db = librosa.power_to_db(S_boosted, ref=np.max)# 绘制频谱图fig, axs = plt.subplots(2, 1, figsize=(12, 8), constrained_layout=True)# 原始频谱图librosa.display.specshow(S_original_db, sr=sample_rate, hop_length=256, x_axis='time', y_axis='hz', cmap='magma', ax=axs[0])axs[0].set_title(f"原始音频频谱: {title}")axs[0].set_ylabel("频率 (Hz)")axs[0].set_xlabel("时间 (s)")# 增强后频谱图librosa.display.specshow(S_boosted_db, sr=sample_rate, hop_length=256, x_axis='time', y_axis='hz', cmap='magma', ax=axs[1])axs[1].set_title(f"EQ增强后频谱: {title}")axs[1].set_ylabel("频率 (Hz)")axs[1].set_xlabel("时间 (s)")# 保存图片plt.savefig(output_file)plt.close()eq_settings = [{'freq': 1000, 'gain_db': -20, 'q': 1.0},
]for file_name in os.listdir(audio_path):if file_name.endswith(".wav"):file_path = os.path.join(audio_path, file_name)audio = AudioSegment.from_file(file_path)original_samples = np.array(audio.get_array_of_samples())sample_rate = audio.frame_rateeq_samples = apply_eq(original_samples, sample_rate, eq_settings)combined_spectrum_file = os.path.join(output_path, f"{file_name}_eq_combined_spectrum.png")plot_combined_spectrogram(original_samples, eq_samples, sample_rate, file_name, combined_spectrum_file)print(f"保存频谱图到: {combined_spectrum_file}")
EQ增强和普通音量增强的区别
音量增强:是所有频率都等比例放大(比如整体变大声)。
EQ增强:只针对某些频率增强或削弱(如只让高频变大声、低频变安静),整体音量未必变化很大,而是“音色、清晰度”变化。
三、RIR增强
RIR增强,首先应该了解什么是RIR?
举个例子:
比如你录一段“你好”,在干净录音棚是很干净的,没有任何回声。
你把这段语音和一个会议室的RIR做卷积,这段录音就像是在会议室里说的,带有真实的混响、空间感。
如果用浴室的RIR,那就像你在浴室说话,回声很大。
————————————————————————————后续会更新