model-code / clean /audio /shiftyspeech /data_utils.py
deepsafe's picture
Add stripped inference-only model code mirror
9e14838 verified
Raw History Blame Contribute Delete
7.56 kB
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