论文链接:
https://arxiv.org/pdf/1904.08779.pdf
SpecAugment是一种log梅尔声谱层面上的数据增强方法,可以将模型训练的过拟合问题转化为欠拟合问题,以便通过大网络和长时训练策略来缓解欠拟合问题,提升语音识别效果
模型:
输入特征:Fbank特征
声谱增强:将log梅尔声谱的时域和频域看作二维图像,时间片长度为τ,频域长度ν
时间扭曲,穿过图像中心的水平直线上,(W,τ-W)范围内的随机点,向左或向右平移w距离,
时间掩蔽,沿时间轴方向的范围内的连续时间步进行掩蔽,其中,t服从 [0,T]均匀分布
频率掩蔽,沿频域轴方向的范围内的连续频率通道进行掩蔽,其中, 服从[0,F]均匀分布
该方案非常简单,但却非常有效。可直接使用到当前的端到端模型上。不使用 LM 的情况下,在 LibriSpeech test-clean 数据集上 WER(Word Error Rate) 2.8%。使用 LM ,WER 进一步提升到 2.5%。
log梅尔声谱增强能够将模型训练的过拟合问题转化为欠拟合问题,从而可以通过大模型和长时训练予以缓解
numpy实现:
import random
import numpy as np
def spec_augment(
mel_spectrogram,
freq_mask_num=2,
time_mask_num=3,
freq_mask_rate=0.3,
time_mask_rate=0.05,
max_mask_time_len=100):
tau = mel_spectrogram.shape[0]
v = mel_spectrogram.shape[1]
warped_mel_spectrogram = mel_spectrogram
freq_masking_para = int(v * freq_mask_rate)
time_masking_para = min(int(tau * time_mask_rate), max_mask_time_len)
# Step 1 : Frequency masking
if freq_mask_num > 0:
for _ in range(freq_mask_num):
f = np.random.uniform(low=0.0, high=freq_masking_para)
f = int(f)
f0 = random.randint(0, v-f)
warped_mel_spectrogram[:, f0:f0+f] = 0
# Step 2 : Time masking
if time_mask_num > 0:
for _ in range(time_mask_num):
t = np.random.uniform(low=0.0, high=time_masking_para)
t = int(t)
t0 = random.randint(0, tau-t)
warped_mel_spectrogram[t0:t0+t, :] = 0
return warped_mel_spectrogram