【学习】Voxceleb数据下载和预处理

环境准备

使用conda创建虚拟环境,方便后续管理。

这里虚拟环境名为ECAPA,python版本为3.7.9

conda create -n ECAPA python=3.7.9

因为代码中使用了wget指令,而我本地环境是windows,所以这里需要下载wget(或者在linux下做后续操作)

wget1.21.3 windows 64位

下载完成得到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等文本,这里不做赘述。

posted @ 2022-07-02 10:02  小拳头呀  阅读(3039)  评论(6编辑  收藏  举报