目录
1、mixup
论文地址:https://arxiv.org/pdf/1710.09412.pdf
mixup通过以下方式构建虚拟的训练样本:
式中,(xi,yi)和(xj,yj)是从训练数据中随机抽取的两个样本,且λ∈[0,1]。因此,mixup通过结合先验知识,即特征向量的线性插值应导致相关标签的线性插值,来扩展训练分布。
代码实现:
2、SpecAugment
论文地址:https://arxiv.org/pdf/1904.08779.pdf
SpecAugment 是一种对输入音频的logmel谱图而不是对原始音频进行操作的增强方法。增强策略包括time wrapping、time masking和frequency masking。
(1)time wrapping:通过tensorflow的sparse_image_warp函数实现。time wrapping给模型性能带来的影响虽然很小,但仍然存在。time wrapping,考虑到任何预算限制,作为这项工作中讨论的最昂贵、影响最小的增强方法,应该是第一个被舍弃的。
(2)Frequency masking:掩蔽[f0,f0+f)的f个连续的mel频率通道,其中f从0到频率掩码参数F的均匀分布中选择,f0从[0,ν-f)中选择 。ν是mel频率通道的数量。
代码实现:
tensorflow
import tensorflow_io as tfio
time_mask = tfio.audio.time_mask(dbscale_mel_spectrogram, param=10)
pytorch
import torchaudio.transforms as T
torch.random.manual_seed(4)
spec = get_spectrogram()
masking = T.FrequencyMasking(freq_mask_param=80)
spec = masking(spec)
(3)Time masking:掩蔽[t0,t0+t)的t个连续的时间步,其中t从0到时间掩蔽参数t的均匀分布中选择,t0从[0,τ-t)中选择。
代码实现:
tensorflow
import tensorflow_io as tfio
freq_mask = tfio.audio.freq_mask(dbscale_mel_spectrogram, param=10)
pytorch
import torchaudio.transforms as T
torch.random.manual_seed(4)
spec = get_spectrogram()
masking = T.TimeMasking(time_mask_param=80)
spec = masking(spec)
参考地址:Audio Feature Augmentation — PyTorch Tutorials 1.11.0+cu102 documentation
https://www.tensorflow.org/io/tutorials/audio
下图显示了应用于单个输入的单个增强的示例
3、Filter Augment
论文地址:https://dcase.community/documents/challenge2021/technical_reports/DCASE2021_Nam_41_t4.pdf
Filter Augment考虑各种声学条件:不同的麦克风/扬声器、麦克风和扬声器之间的相对位置等。应用于mel谱图的Filter Augment算法的操作步骤如下所述。首先,算法随机选取n个频率边界。然后,它随机选择边界的频率,以便边界将整个频率范围分割为n+1个频带。最后,对每个确定的频带,随机选择与该频带对应的mel谱图振幅相乘的因子。频带数的范围和随机因子的dB范围预先确定为超参数设置。滤波器增强可以理解为将某些类型的滤波器应用于mel谱图,以描述随机分布的声学条件。
下图显示了logmel谱图上Filter Augment应用的一个示例,其中2 kHz以下和4.5 kHz以上频带中的振幅被放大,而2 kHz至4.5 kHz频带中的振幅被减小。
相关代码地址:FilterAugSED/data_aug.py at main · frednam93/FilterAugSED · GitHub
4、加入随机噪声
import numpy as np
def add_noise(data, noise_factor):
noise = np.random.randn(len(data))
augmented_data = data + noise_factor * noise
# Cast back to same data type
augmented_data = augmented_data.astype(type(data[0]))
return augmented_data
5、 time shift
import numpy as np
def time_shift(data, sampling_rate, shift_max, shift_direction):
shift = np.random.randint(sampling_rate * shift_max)
if shift_direction == 'right':
shift = -shift
elif self.shift_direction == 'both':
direction = np.random.randint(0, 2)
if direction == 1:
shift = -shift
augmented_data = np.roll(data, shift)
# Set to silence for heading/ tailing
if shift > 0:
augmented_data[:shift] = 0
else:
augmented_data[shift:] = 0
return augmented_data
6、pitch shift
import librosa
def pit_shift(data, sampling_rate, pitch_factor):
return librosa.effects.pitch_shift(data, sampling_rate, pitch_factor)
部分代码参考地址:音频数据增强_尚歌的博客-CSDN博客_音频数据增强