-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdataset.py
More file actions
137 lines (120 loc) · 5.55 KB
/
dataset.py
File metadata and controls
137 lines (120 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/python3
import numpy as np
import torch
from torch import Tensor
from torch.utils.data import Dataset, DataLoader
import pickle
import os
import librosa
from feature_extraction import LFCC
from torch.utils.data.dataloader import default_collate
#lfcc = LFCC(320, 160, 512, 16000, 20, with_energy=False)
#wavform = torch.Tensor(np.expand_dims([0]*3200, axis=0))
#lfcc_silence = lfcc(wavform)
#silence_pad_value = lfcc_silence[:,0,:].unsqueeze(0)
class ASVspoof2019(Dataset):
def __init__(self, access_type, path_to_features, part='train', feature='LFCC', feat_len=750, pad_chop=True, padding='repeat', genuine_only=False):
super(ASVspoof2019, self).__init__()
self.access_type = access_type
self.path_to_features = path_to_features
self.part = part
self.ptf = os.path.join(path_to_features, self.part)
self.feat_len = feat_len
self.feature = feature
self.pad_chop = pad_chop
self.padding = padding
self.genuine_only = genuine_only
if self.access_type == 'LA':
self.tag = {"-": 0, "A01": 1, "A02": 2, "A03": 3, "A04": 4, "A05": 5, "A06": 6, "A07": 7, "A08": 8, "A09": 9,
"A10": 10, "A11": 11, "A12": 12, "A13": 13, "A14": 14, "A15": 15, "A16": 16, "A17": 17, "A18": 18,
"A19": 19}
elif self.access_type == 'PA':
self.tag = {"-": 0, "AA": 1, "AB": 2, "AC": 3, "BA": 4, "BB": 5, "BC": 6, "CA": 7, "CB": 8, "CC": 9}
else:
raise ValueError("Access type should be LA or PA!")
self.label = {"spoof": 1, "bonafide": 0}
self.all_files = librosa.util.find_files(os.path.join(self.ptf, self.feature), ext="pt")
if self.genuine_only:
assert self.access_type == "LA"
if self.part in ["train", "dev"]:
num_bonafide = {"train": 2580, "dev": 2548}
self.all_files = self.all_files[:num_bonafide[self.part]]
else:
res = []
for item in self.all_files:
if "bonafide" in item:
res.append(item)
self.all_files = res
assert len(self.all_files) == 7355
def __len__(self):
return len(self.all_files)
def __getitem__(self, idx):
filepath = self.all_files[idx]
basename = os.path.basename(filepath)
all_info = basename.split(".")[0].split("_")
assert len(all_info) == 6
featureTensor = torch.load(filepath)
if self.feature == "wav2vec2_largeraw":
#featureTensor = featureTensor.permute(0, 2, 1)
featureTensor = featureTensor.float()
this_feat_len = featureTensor.shape[1]
if self.pad_chop:
if this_feat_len > self.feat_len:
startp = np.random.randint(this_feat_len - self.feat_len)
featureTensor = featureTensor[:, startp:startp + self.feat_len, :]
if this_feat_len < self.feat_len:
if self.padding == 'zero':
featureTensor = padding_Tensor(featureTensor, self.feat_len)
elif self.padding == 'repeat':
featureTensor = repeat_padding_Tensor(featureTensor, self.feat_len)
elif self.padding == 'silence':
featureTensor = silence_padding_Tensor(featureTensor, self.feat_len)
else:
raise ValueError('Padding should be zero or repeat!')
else:
pass
#featureTensor = featureTensor.squeeze(dim=0)
filename = "_".join(all_info[1:4])
tag = self.tag[all_info[4]]
label = self.label[all_info[5]]
return featureTensor, filename, label
def collate_fn(self, samples):
return default_collate(samples)
class codecfake(Dataset):
def __init__(self, access_type, path_to_features, part='train', feature='LFCC', feat_len=750, pad_chop=True,
padding='repeat', genuine_only=False):
super(codecfake, self).__init__()
self.access_type = access_type
self.path_to_features = path_to_features
self.part = part
self.ptf = os.path.join(path_to_features, self.part)
self.feat_len = feat_len
self.feature = feature
self.pad_chop = pad_chop
self.padding = padding
self.genuine_only = genuine_only
self.label = {"fake": 1,"real": 0}
self.all_files = librosa.util.find_files(os.path.join(self.ptf, self.feature), ext="pt")
#self.all_files = os.listdir(os.path.join(self.ptf, self.feature))
#self.all_files = [os.path.join(self.ptf, self.feature, filename) for filename in os.listdir(os.path.join(self.ptf, self.feature)) if filename.endswith('.pt')]
def __len__(self):
return len(self.all_files)
def __getitem__(self, idx):
filepath = self.all_files[idx]
basename = os.path.basename(filepath)
all_info = basename.split('_')
# assert len(all_info) == 6
featureTensor = torch.load(filepath)
if self.feature == "wav2vec2_largeraw":
# featureTensor = featureTensor.permute(0, 2, 1)
featureTensor = featureTensor.float()
this_feat_len = featureTensor.shape[1]
filename = all_info[2]
#tag = self.tag[all_info[4]]
if all_info[-1].split('.')[0].isdigit():
label = eval(all_info[-1].split('.')[0])
else:
label = self.label[all_info[-1].split('.')[0]]
return featureTensor, filename, label
def collate_fn(self, samples):
return default_collate(samples)