fffiloni's picture
Upload 290 files
1eabf9f verified
'''
two-stems separation
'''
import os
from pathlib import Path
import uuid
import subprocess
import time
import shutil
import datetime
def traverse_dir(
root_dir,
extension,
amount=None,
str_include=None,
str_exclude=None,
is_pure=False,
is_sort=False,
is_ext=True):
file_list = []
cnt = 0
for root, _, files in os.walk(root_dir):
for file in files:
if file.endswith(extension):
# path
mix_path = os.path.join(root, file)
pure_path = mix_path[len(root_dir)+1:] if is_pure else mix_path
# amount
if (amount is not None) and (cnt == amount):
if is_sort:
file_list.sort()
return file_list
# check string
if (str_include is not None) and (str_include not in pure_path):
continue
if (str_exclude is not None) and (str_exclude in pure_path):
continue
if not is_ext:
ext = pure_path.split('.')[-1]
pure_path = pure_path[:-(len(ext)+1)]
file_list.append(pure_path)
cnt += 1
if is_sort:
file_list.sort()
return file_list
if __name__ == '__main__':
path_rootdir = '../audiocraft/dataset/example/full'
st_idx, ed_idx = 0, None
ext_src = 'mp3'
ext_dst = 'wav'
# list files
filelist = traverse_dir(
path_rootdir,
extension='mp3',
str_include='',
is_sort=True)
num_file = len(filelist)
if ed_idx is None:
ed_idx = num_file
print(' [i] num files:', num_file)
# make tmpdir for demucs
tmp_dir = os.path.join('tmp', str(uuid.uuid4()).split('-')[0])
print('tmp_dir:', tmp_dir)
if os.path.exists(tmp_dir):
shutil.rmtree(tmp_dir)
os.makedirs(tmp_dir)
# start running
for i in range(st_idx, ed_idx):
print(f'==={i}/{num_file} [{st_idx} - {ed_idx}]====================')
start_time = time.time()
# path
srcfile = filelist[i]
print(srcfile)
srcfile_dir = os.path.dirname(srcfile)
source_folder = os.path.join(tmp_dir, 'htdemucs', 'full')
path_src_vocals = os.path.join(source_folder, f'vocals.{ext_dst}')
path_src_no_vocals = os.path.join(source_folder, f'no_vocals.{ext_dst}')
path_dst_vocals = os.path.join(srcfile_dir, f'vocals.{ext_dst}')
path_dst_no_vocals = os.path.join(srcfile_dir, f'no_vocal.{ext_dst}')
if os.path.exists(path_dst_no_vocals):
print('[o] existed')
continue
# source separation
cmd_list = [
'demucs',
'--two-stems=vocals',
f'{srcfile}',
'-o',
f'{tmp_dir}'
]
if ext_dst == 'mp3':
print('[i] save in mp3 format')
cmd_list.append('--mp3')
subprocess.run(cmd_list)
# copy from tmp to dst
shutil.copy2(path_src_vocals, path_dst_vocals)
shutil.copy2(path_src_no_vocals, path_dst_no_vocals)
# end
end_time = time.time()
runtime = end_time - start_time
print('testing time:', str(datetime.timedelta(seconds=runtime))+'\n')
shutil.rmtree(tmp_dir)