import os import random from random import randrange import librosa import numpy as np import torch import torch.nn as nn from RawBoost import ( ISD_additive_noise, LnL_convolutive_noise, SSI_additive_noise, normWav, ) from torch import Tensor from torch.utils.data import Dataset __author__ = "Hemlata Tak" __email__ = "tak@eurecom.fr" def genSpoof_list(dir_meta, is_train=False, is_eval=False): d_meta = {} file_list = [] with open(dir_meta, "r") as f: l_meta = f.readlines() if is_train: for line in l_meta: key, label = line.strip().split() file_list.append(key) d_meta[key] = 1 if label == "bonafide" else 0 return d_meta, file_list elif is_eval: for line in l_meta: key, _ = line.strip().split(" ") file_list.append(key) return file_list else: for line in l_meta: key, label = line.strip().split() file_list.append(key) d_meta[key] = 1 if label == "bonafide" else 0 return d_meta, file_list def pad(x, max_len=64600): x_len = x.shape[0] if x_len >= max_len: return x[:max_len] # need to pad num_repeats = int(max_len / x_len) + 1 padded_x = np.tile(x, (1, num_repeats))[:, :max_len][0] return padded_x class Dataset_ASVspoof2019_train(Dataset): def __init__(self, args, metafile, algo): """self.list_IDs : list of strings (each string: utt key), self.labels: dictionary (key: utt key, value: label integer)""" self.uttpath_labels = [] with open(metafile, "r") as f: for line in f: items = line.strip().split() lb = 1 if items[-1] == "bonafide" else 0 self.uttpath_labels.append((items[0], lb)) self.algo = algo self.args = args self.cut = 64600 # take ~4 sec audio (64600 samples) def __len__(self): return len(self.uttpath_labels) def __getitem__(self, index): path, target = self.uttpath_labels[index] X, fs = librosa.load(path, sr=16000) Y = process_Rawboost_feature(X, fs, self.args, self.algo) X_pad = pad(Y, self.cut) x_inp = Tensor(X_pad) return x_inp, target class Dataset_ASVspoof2021_eval(Dataset): def __init__(self, list_IDs): """self.list_IDs : list of strings (each string: utt key),""" self.list_IDs = list_IDs self.cut = 64600 # take ~4 sec audio (64600 samples) def __len__(self): return len(self.list_IDs) def __getitem__(self, index): utt_id = self.list_IDs[index] X, fs = librosa.load(utt_id, sr=16000) X_pad = pad(X, self.cut) x_inp = Tensor(X_pad) return x_inp, utt_id # --------------RawBoost data augmentation algorithms---------------------------## def process_Rawboost_feature(feature, sr, args, algo): # Data process by Convolutive noise (1st algo) if algo == 1: feature = LnL_convolutive_noise( feature, args.N_f, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, args.minBiasLinNonLin, args.maxBiasLinNonLin, sr, ) # Data process by Impulsive noise (2nd algo) elif algo == 2: feature = ISD_additive_noise(feature, args.P, args.g_sd) # Data process by coloured additive noise (3rd algo) elif algo == 3: feature = SSI_additive_noise( feature, args.SNRmin, args.SNRmax, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, sr, ) # Data process by all 3 algo. together in series (1+2+3) elif algo == 4: feature = LnL_convolutive_noise( feature, args.N_f, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, args.minBiasLinNonLin, args.maxBiasLinNonLin, sr, ) feature = ISD_additive_noise(feature, args.P, args.g_sd) feature = SSI_additive_noise( feature, args.SNRmin, args.SNRmax, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, sr, ) # Data process by 1st two algo. together in series (1+2) elif algo == 5: feature = LnL_convolutive_noise( feature, args.N_f, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, args.minBiasLinNonLin, args.maxBiasLinNonLin, sr, ) feature = ISD_additive_noise(feature, args.P, args.g_sd) # Data process by 1st and 3rd algo. together in series (1+3) elif algo == 6: feature = LnL_convolutive_noise( feature, args.N_f, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, args.minBiasLinNonLin, args.maxBiasLinNonLin, sr, ) feature = SSI_additive_noise( feature, args.SNRmin, args.SNRmax, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, sr, ) # Data process by 2nd and 3rd algo. together in series (2+3) elif algo == 7: feature = ISD_additive_noise(feature, args.P, args.g_sd) feature = SSI_additive_noise( feature, args.SNRmin, args.SNRmax, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, sr, ) # Data process by 1st two algo. together in Parallel (1||2) elif algo == 8: feature1 = LnL_convolutive_noise( feature, args.N_f, args.nBands, args.minF, args.maxF, args.minBW, args.maxBW, args.minCoeff, args.maxCoeff, args.minG, args.maxG, args.minBiasLinNonLin, args.maxBiasLinNonLin, sr, ) feature2 = ISD_additive_noise(feature, args.P, args.g_sd) feature_para = feature1 + feature2 feature = normWav(feature_para, 0) # normalized resultant waveform # original data without Rawboost processing else: feature = feature return feature