Spaces:
Runtime error
Runtime error
| ''' | |
| 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) |