频谱增强SpecAugment: A Simple Data Augmentation Method for Automatic Speech Recognition

论文链接:

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




你可能感兴趣的:(频谱增强SpecAugment: A Simple Data Augmentation Method for Automatic Speech Recognition)