【学习】Voxceleb数据下载和预处理
环境准备
使用conda创建虚拟环境,方便后续管理。
这里虚拟环境名为ECAPA
,python版本为3.7.9
conda create -n ECAPA python=3.7.9
因为代码中使用了wget
指令,而我本地环境是windows,所以这里需要下载wget
(或者在linux下做后续操作)
下载完成得到wget.exe后,将其放在C:\Windows\System32\
路径下
安装依赖
这里使用txt文本批量安装
# requirements.txt内容
torch>=1.7.0
torchaudio>=0.7.0
numpy
scipy
scikit-learn
tqdm
pyyaml
soundfile
安装指令
pip install -r requirements.txt
数据预处理
此处的预处理指数据下载、修改格式、批量命名、划分训练集。
下载开源数据集musan和噪音rirs_noise
部分提取
-
args中存储了musan和噪音rirs的所在路径,fname为文件的名称,target传入文件解压后的存储位置
-
def part_extract(args, fname, target): print('Extracting %s'%fname) with ZipFile(fname, 'r') as zf: for infile in zf.namelist(): if any([infile.startswith(x) for x in target]): zf.extract(infile,args['save_path'])
全部提取
-
args中存储了待解压文件所在路径,fname为文件的名称
-
def full_extract(args, fname): print('Extracting %s'%fname) if fname.endswith(".tar.gz"): with tarfile.open(fname, "r:gz") as tar: tar.extractall(args['save_path']) elif fname.endswith(".zip"): with ZipFile(fname, 'r') as zf: zf.extractall(args['save_path'])
划分数据集musan
-
def split_musan(args): files = glob.glob('%s/musan/*/*/*.wav'%args.save_path) audlen = 16000*5 audstr = 16000*3 for idx,file in enumerate(files): fs,aud = wavfile.read(file) writedir = os.path.splitext(file.replace('/musan/','/musan_split/'))[0] os.makedirs(writedir) for st in range(0,len(aud)-audlen,audstr): wavfile.write(writedir+'/%05d.wav'%(st/fs),fs,aud[st:st+audlen]) print(idx,file)
-
下载并处理vox数据集
-
链接:https://pan.baidu.com/s/1Mx3Ps9IyL-bxfesGFvv5fQ
提取码:8qxb -
这里包含了vox1和vox2,并独立压缩成了zip,使用时需要分别解压
-
如果是官网下载的压缩文件,可以用下面的代码合并再解压
-
save_path = "F:/ECAPA-TDNN数据集所需/vox2测试集" infile = "vox2_dev_aaca*" outfile = "vox2_dev_aaca.zip" ## Concatenate files out = subprocess.call('cat %s/%s > %s/%s' %(save_path,infile,save_path,outfile), shell=True) "type vox2_dev_aaca* > vox2_dev_aaca.zip" print('Checksum successful %s.'%outfile) out = subprocess.call('rm %s/%s' %(save_path,infile), shell=True)
-
得到zip的完整压缩包后(会执行比较久),直接解压即可。
-
格式转换
做声学领域的研究,基本使用的文件格式为wav,所以这里将得到的m4a文件(vox2为109万条)批量转换为wav(大约是原大小的三倍),因为空间占用比较大,所以这里写的代码是可以手动选择需转换的文件,方便操作。
# save_path为vox文件的根目录,pathid为需转换的说话人id
def convert(save_path,pathid):
# 指定文件加下,aac中的所有m4a文件名称
path = '%s/aac/%s/*/*.m4a' % (save_path,pathid)
# print(path)
files = glob.glob(path)
files.sort()
# print(files)
print('Converting files from AAC to WAV')
for fname in tqdm(files):
# 将转换后的文件存储至D盘vox_wav
outfile = fname.replace('.m4a','.wav')
# print(outfile)
# 利用转换时的名称做一个完整的标签list
# getList('all_list.txt', outfile, pathid)
out = subprocess.call('ffmpeg -y -i %s -ac 1 -vn -acodec pcm_s16le -ar 16000 %s -loglevel quiet' %(fname,outfile), shell=True)
if out != 0:
raise ValueError('Conversion failed %s.'%fname)
break
转换后的wav文件仍旧存储到了原m4a文件路径(m4a未删除)
之后即可手动生成train_list、eval_list等文本,这里不做赘述。