音频(audio)信号中做数据增强(Data Augmentation)及部分代码实现

音频信号处理中,常用到数据增强的方法。一般而言,音频中的数据增强也是对音频的时频谱(spectrogram)进行增强的,时频谱本身也是一种图像,这使得音频中的数据增强与图像的数据增强有诸多相似之处。这里对一些资源进行了简单的总结。

1. 一些数据增强的代码

这里主要参考[1]。

1.1 相同类别增强(Same Class Augmentation)

相同类别的增强是简单将两个音频片段s1和s2,按照一定比例相加:

1
s_aug = alpha * s1 + (1-alpha) * s2

其中alph可以从平均分布[0, 1)中随机抽取。

python代码实现:

1
2
3
4
5
6
7
8
9
10
def same_class_augmentation(wave, class_dir):
""" Perform same class augmentation of the wave by loading a random segment
from the class_dir and additively combine the wave with that segment.
"""
sig_paths = glob.glob(os.path.join(class_dir, "*.wav"))
aug_sig_path = np.random.choice(sig_paths, 1, replace=False)[0]
(fs, aug_sig) = utils.read_wave_file(aug_sig_path)
alpha = np.random.rand()
wave = (1.0-alpha)*wave + alpha*aug_sig
return wave
1.2 噪声增强(Noise Augmentation)

噪声增强只是在增强信号之上增加一个随机噪声段,阻尼系数为0.4。

1
s_aug += (noise_seg * 0.4) for noise_seg in noise_segs

其中noise_segs是来自噪声段目录的三个随机选择的噪声段。

python代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
def noise_augmentation(wave, noise_dir):
""" Perform noise augmentation of the wave by loading three noise segments
from the noise_dir and add these on top of the wave with a dampening factor
of 0.4
"""
noise_paths = glob.glob(os.path.join(noise_dir, "*.wav"))
aug_noise_paths = np.random.choice(noise_paths, 3, replace=False)
dampening_factor = 0.4
for aug_noise_path in aug_noise_paths:
(fs, aug_noise) = utils.read_wave_file(aug_noise_path)
wave = wave + aug_noise*dampening_factor
return wave
1.3 时移增强(Time Shift Augmentation)

时移增强是通过沿时间轴滚动信号来随机移位信号。包裹着移动。

1
2
3
4
5
6
7
def time_shift_spectrogram(spectrogram):
""" Shift a spectrogram along the time axis in the spectral-domain at random
"""
nb_cols = spectrogram.shape[1]
nb_shifts = np.random.randint(0, nb_cols)

return np.roll(spectrogram, nb_shifts, axis=1)
1.4 音高变换增强(Pitch Shift Augmentation)

音高变化增量是围绕频率轴的±5%范围内的随机滚动。环绕式转换以保留所有信息。

1
2
3
4
5
6
7
8
9
def pitch_shift_spectrogram(spectrogram):
""" Shift a spectrogram along the frequency axis in the spectral-domain at
random
"""
nb_cols = spectrogram.shape[0]
max_shifts = nb_cols//20 # around 5% shift
nb_shifts = np.random.randint(-max_shifts, max_shifts)

return np.roll(spectrogram, nb_shifts, axis=0)

2. 一些数据增强的其他资料

Andrew Ng关于image中的data augmentation的讲解。Ng讲到主要是两方面。一个是图像的形状的变形,比如翻转、旋转、缩放等。另一个是RGB颜色的变化,比如加入一定的R或减少一定的G[2]。

现在一些开源框里也可以做数据增强了。这里分别是tensorflow[3]、keras[4]的实践。这里代码信实现非常简单,因为只用了他们的接口,传入参数,不需要自己写。其中[4]调用的接口是keras的[5]。而且这里的数据增强是针对图像的,只要是图像都可以使用。

前面的这些适用于图像,当然也是用音频的声谱图。这里有两个专门做音频数据增强的实践,一个是做了时移变换(Time shifting)、速度调整(Speed tuning)、混合背景音(Mix background noise)和音量调节(volume tuning)[6]。另一个也是做了增加白噪声(adding white noise)、移动音频(shifting the sound)、拉伸音频信号(stretching the sound)[7]。这两个有说明,有代码实践,而且都是专门针对音频处理的,值得一看。

有一个专门做音频数据增强的开源库,叫做muda[8],全称为A library for Musical Data Augmentation。做到音频增强,可以尝试使用此库。Salamon 2016年的一篇关于音频事件分类的论文中使用的数据增强就是使用此库做的[9]。

参考资料

  1. https://github.com/johnmartinsson/bird-species-classification/wiki/Data-Augmentation
  2. https://www.coursera.org/lecture/convolutional-neural-networks/data-augmentation-AYzbX?authMode=signup
  3. https://www.kaggle.com/dansbecker/data-augmentation
  4. https://absentm.github.io/2016/06/14/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B8%AD%E7%9A%84Data-Augmentation%E6%96%B9%E6%B3%95%E5%92%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0/
  5. https://keras.io/preprocessing/image/
  6. https://www.kaggle.com/haqishen/augmentation-methods-for-audio
  7. https://www.kaggle.com/CVxTz/audio-data-augmentation
  8. https://github.com/bmcfee/muda
  9. https://arxiv.org/abs/1608.04363
谢谢你!