diff --git a/UVR.py b/UVR.py index 9f79473..6f40e3b 100644 --- a/UVR.py +++ b/UVR.py @@ -1,5 +1,7 @@ # GUI modules import os +import glob +from re import T import pyperclip import natsort from gc import freeze @@ -21,9 +23,14 @@ from PIL import Image from PIL import ImageTk import pickle # Save Data from pathlib import Path - -# Other Modules - +import hashlib +import wget +import time +import ctypes +import trace +import zipfile +import traceback +import torch # Pathfinding import pathlib import sys @@ -40,8 +47,12 @@ import inference_MDX import inference_v5 import inference_v5_ensemble import inference_demucs +import lib_v5.filelist +import shutil +import importlib +import urllib.request +import pyAesCrypt from __version__ import VERSION - from win32api import GetSystemMetrics try: @@ -50,6 +61,31 @@ try: except: pass +class KThread(threading.Thread): + def __init__(self, *args, **keywords): + threading.Thread.__init__(self, *args, **keywords) + self.killed = False + def start(self): + self.__run_backup = self.run + self.run = self.__run + threading.Thread.start(self) + def __run(self): + sys.settrace(self.globaltrace) + self.__run_backup() + self.run = self.__run_backup + def globaltrace(self, frame, why, arg): + if why == 'call': + return self.localtrace + else: + return None + def localtrace(self, frame, why, arg): + if self.killed: + if why == 'line': + raise SystemExit() + return self.localtrace + def kill(self): + self.killed = True + # Change the current working directory to the directory # this file sits in if getattr(sys, 'frozen', False): @@ -62,24 +98,209 @@ else: os.chdir(base_path) # Change the current working directory to the base path +demucs_v3_repo_folder_path = 'models/Demucs_Models/v3_repo' +if not os.path.isdir(demucs_v3_repo_folder_path): + os.mkdir(demucs_v3_repo_folder_path) + +try: + shutil.move("models/Demucs_Models/5d2d6c55-db83574e.th", "models/Demucs_Models/v3_repo/5d2d6c55-db83574e.th") + shutil.move("models/Demucs_Models/7fd6ef75-a905dd85.th", "models/Demucs_Models/v3_repo/7fd6ef75-a905dd85.th") + shutil.move("models/Demucs_Models/14fc6a69-a89dd0ee.th", "models/Demucs_Models/v3_repo/14fc6a69-a89dd0ee.th") + shutil.move("models/Demucs_Models/83fc094f-4a16d450.th", "models/Demucs_Models/v3_repo/83fc094f-4a16d450.th") + shutil.move("models/Demucs_Models/464b36d7-e5a9386e.th", "models/Demucs_Models/v3_repo/464b36d7-e5a9386e.th") + shutil.move("models/Demucs_Models/a1d90b5c-ae9d2452.th", "models/Demucs_Models/v3_repo/a1d90b5c-ae9d2452.th") + shutil.move("models/Demucs_Models/cfa93e08-61801ae1.th", "models/Demucs_Models/v3_repo/cfa93e08-61801ae1.th") + shutil.move("models/Demucs_Models/e51eebcc-c1b80bdd.th", "models/Demucs_Models/v3_repo/e51eebcc-c1b80bdd.th") + shutil.move("models/Demucs_Models/ebf34a2d.th", "models/Demucs_Models/v3_repo/ebf34a2d.th") + shutil.move("models/Demucs_Models/ebf34a2db.th", "models/Demucs_Models/v3_repo/ebf34a2db.th") + print('Demucs v3 models have been moved to the correct directory.') +except: + pass + +try: + srcdir = "models/Demucs_Models/v3_repo" + dstdir = "models/Demucs_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.yaml'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + shutil.copy2(pathname, dstdir) +except: + pass + +try: + srcdir = "models/Demucs_Models" + dstdir = "models/Demucs_Models/v3_repo" + + for basename in os.listdir(srcdir): + if basename.endswith('.yaml'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + shutil.copy2(pathname, dstdir) +except: + pass + +try: + srcdir = "models/Demucs_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) +except: + pass + +try: + srcdir = "models/Main_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) +except: + pass + +try: + srcdir = "models/MDX_Net_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) +except: + pass + +try: + with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'w') as f: + f.write('No Model\nNo Model\n') +except: + pass + +try: + srcdir = "models/Demucs_Models/v3_repo" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) +except: + pass + +try: + os.rename("models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth", "models/Main_Models/MGM_HIGHEND_v4.pth") + os.rename("models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth", "models/Main_Models/MGM_LOWEND_A_v4.pth") + os.rename("models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth", "models/Main_Models/MGM_LOWEND_B_v4.pth") + os.rename("models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth", "models/Main_Models/MGM_MAIN_v4.pth") + +except: + pass + +try: + os.rename("models/MDX_Net_Models/UVR_MDXNET_9703.onnx", "models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx") + os.rename("models/MDX_Net_Models/UVR_MDXNET_9682.onnx", "models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx") + os.rename("models/MDX_Net_Models/UVR_MDXNET_9662.onnx", "models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx") +except: + pass + #Images -instrumentalModels_dir = os.path.join(base_path, 'models') banner_path = os.path.join(base_path, 'img', 'UVR-banner.png') -efile_path = os.path.join(base_path, 'img', 'file.png') -stop_path = os.path.join(base_path, 'img', 'stop.png') -help_path = os.path.join(base_path, 'img', 'help.png') -gen_opt_path = os.path.join(base_path, 'img', 'gen_opt.png') -mdx_opt_path = os.path.join(base_path, 'img', 'mdx_opt.png') -vr_opt_path = os.path.join(base_path, 'img', 'vr_opt.png') -demucs_opt_path = os.path.join(base_path, 'img', 'demucs_opt.png') -ense_opt_path = os.path.join(base_path, 'img', 'ense_opt.png') -user_ens_opt_path = os.path.join(base_path, 'img', 'user_ens_opt.png') credits_path = os.path.join(base_path, 'img', 'credits.png') +demucs_opt_path = os.path.join(base_path, 'img', 'demucs_opt.png') +download_path = os.path.join(base_path, 'img', 'download.png') +efile_path = os.path.join(base_path, 'img', 'file.png') +ense_opt_path = os.path.join(base_path, 'img', 'ense_opt.png') +gen_opt_path = os.path.join(base_path, 'img', 'gen_opt.png') +help_path = os.path.join(base_path, 'img', 'help.png') +instrumentalModels_dir = os.path.join(base_path, 'models') +key_path = os.path.join(base_path, 'img', 'key.png') +mdx_opt_path = os.path.join(base_path, 'img', 'mdx_opt.png') +stop_path = os.path.join(base_path, 'img', 'stop.png') +user_ens_opt_path = os.path.join(base_path, 'img', 'user_ens_opt.png') +vr_opt_path = os.path.join(base_path, 'img', 'vr_opt.png') + +try: + with open('uvr_patch_version.txt', 'r') as file : + patch_version = file.read() + os.remove(f'{patch_version}.exe') +except: + pass DEFAULT_DATA = { + 'agg': 10, + 'aiModel': 'MDX-Net', + 'algo': 'Instrumentals (Min Spec)', + 'appendensem': False, + 'audfile': True, + 'aud_mdx': True, + 'autocompensate': True, + 'break': False, + 'channel': 64, + 'chunks': 'Auto', + 'chunks_d': 'Full', + 'compensate': 1.03597672895, + 'demucs_only': False, + 'demucs_stems': 'All Stems', + 'DemucsModel': 'mdx_extra', + 'demucsmodel': False, + 'DemucsModel_MDX': 'UVR_Demucs_Model_1', + 'demucsmodel_sel_VR': 'UVR_Demucs_Model_1', + 'demucsmodelVR': False, + 'dim_f': 2048, + 'ensChoose': 'Multi-AI Ensemble', 'exportPath': '', + 'flactype': 'PCM_16', + 'gpu': False, 'inputPaths': [], + 'inst_only': False, + 'inst_only_b': False, + 'lastDir': None, + 'margin': 44100, + 'mdx_ensem': 'MDX-Net: UVR-MDX-NET Main', + 'mdx_ensem_b': 'No Model', + 'mdx_only_ensem_a': 'MDX-Net: UVR-MDX-NET Main', + 'mdx_only_ensem_b': 'MDX-Net: UVR-MDX-NET 1', + 'mdx_only_ensem_c': 'No Model', + 'mdx_only_ensem_d': 'No Model', + 'mdx_only_ensem_e': 'No Model', + 'mdxnetModel': 'UVR-MDX-NET Main', + 'mdxnetModeltype': 'Vocals (Custom)', + 'mixing': 'Default', + 'modeldownload': 'No Model Selected', + 'modeldownload_mdx': 'No Model Selected', + 'modeldownload_demucs': 'No Model Selected', + 'modeldownload_type': 'VR Arc', + 'modelFolder': False, + 'modelInstrumentalLabel': '', + 'ModelParams': 'Auto', + 'mp3bit': '320k', + 'n_fft_scale': 6144, + 'noise_pro_select': 'Auto Select', + 'noise_reduc': True, + 'noisereduc_s': '3', + 'non_red': False, + 'nophaseinst': False, + 'normalize': False, + 'output_image': False, + 'overlap': 0.25, + 'overlap_b': 0.25, + 'postprocess': False, + 'save': True, 'saveFormat': 'Wav', + 'selectdownload': 'VR Arc', + 'segment': 'None', + 'settest': False, + 'shifts': 2, + 'shifts_b': 2, + 'split_mode': True, + 'tta': False, + 'useModel': 'instrumental', + 'voc_only': False, + 'voc_only_b': False, 'vr_ensem': '2_HP-UVR', 'vr_ensem_a': '1_HP-UVR', 'vr_ensem_b': '2_HP-UVR', @@ -89,66 +310,19 @@ DEFAULT_DATA = { 'vr_ensem_mdx_a': 'No Model', 'vr_ensem_mdx_b': 'No Model', 'vr_ensem_mdx_c': 'No Model', - 'mdx_ensem': 'UVR-MDX-NET Main', - 'mdx_ensem_b': 'No Model', - 'demucsmodel_sel_VR': 'UVR_Demucs_Model_1', - 'gpu': False, - 'postprocess': False, - 'tta': False, - 'save': True, - 'output_image': False, - 'window_size': '512', - 'agg': 10, - 'modelFolder': False, - 'modelInstrumentalLabel': '', - 'aiModel': 'MDX-Net', - 'algo': 'Instrumentals (Min Spec)', - 'demucs_stems': 'All Stems', - 'ensChoose': 'Multi-AI Ensemble', - 'useModel': 'instrumental', - 'lastDir': None, - 'break': False, - #Advanced Options - 'appendensem': False, - 'demucs_only': False, - 'split_mode': True, - 'normalize': False, - #MDX-Net - 'demucsmodel': False, - 'demucsmodelVR': False, - 'non_red': False, - 'noise_reduc': True, - 'nophaseinst': False, - 'voc_only': False, - 'inst_only': False, - 'voc_only_b': False, - 'inst_only_b': False, - 'audfile': True, - 'autocompensate': True, - 'chunks': 'Auto', - 'chunks_d': 'Full', - 'n_fft_scale': 6144, - 'segment': 'None', - 'dim_f': 2048, - 'noise_pro_select': 'Auto Select', + + 'vr_multi_USER_model_param_1': 'Auto', + 'vr_multi_USER_model_param_2': 'Auto', + 'vr_multi_USER_model_param_3': 'Auto', + 'vr_multi_USER_model_param_4': 'Auto', + 'vr_basic_USER_model_param_1': 'Auto', + 'vr_basic_USER_model_param_2': 'Auto', + 'vr_basic_USER_model_param_3': 'Auto', + 'vr_basic_USER_model_param_4': 'Auto', + 'vr_basic_USER_model_param_5': 'Auto', + 'wavtype': 'PCM_16', - 'flactype': 'PCM_16', - 'mp3bit': '320k', - 'overlap': 0.25, - 'shifts': 2, - 'overlap_b': 0.25, - 'shifts_b': 2, - 'margin': 44100, - 'channel': 64, - 'compensate': 1.03597672895, - 'mdxnetModeltype': 'Vocals (Custom)', - 'noisereduc_s': '3', - 'mixing': 'Default', - 'mdxnetModel': 'UVR-MDX-NET Main', - 'DemucsModel': 'mdx_extra', - 'DemucsModel_MDX': 'UVR_Demucs_Model_1', - 'ModelParams': 'Auto', - 'settest': False, + 'window_size': '512', } def open_image(path: str, size: tuple = None, keep_aspect: bool = True, rotate: int = 0) -> ImageTk.PhotoImage: @@ -192,6 +366,13 @@ def save_data(data): with open('data.pkl', 'wb') as data_file: pickle.dump(data, data_file) +def load_data_alt(): + + save_data(data=DEFAULT_DATA) + + return load_data() + + def load_data() -> dict: """ Loads saved pkl file and returns the stored data @@ -237,7 +418,6 @@ def drop(event, accept_mode: str = 'files'): root.inputPaths = path root.update_inputPaths() dnddir = os.path.dirname(path[0]) - print('dnddir ', str(dnddir)) else: # Invalid accept mode return @@ -340,6 +520,10 @@ class MainWindow(TkinterDnD.Tk): size=(20, 20)) self.help_img = open_image(path=help_path, size=(20, 20)) + self.download_img = open_image(path=download_path, + size=(30, 30)) + self.key_img = open_image(path=key_path, + size=(30, 30)) if GetSystemMetrics(1) >= 900: self.gen_opt_img = open_image(path=gen_opt_path, size=(900, 826)) @@ -388,114 +572,396 @@ class MainWindow(TkinterDnD.Tk): self.instrumentalLabel_to_path = defaultdict(lambda: '') self.lastInstrumentalModels = [] + self.lastInstrumentalModels_ensem = [] + self.lastmdx_demuc_ensem = [] self.MDXLabel_to_path = defaultdict(lambda: '') self.lastMDXModels = [] self.ModelParamsLabel_to_path = defaultdict(lambda: '') self.lastModelParams = [] self.DemucsLabel_to_path = defaultdict(lambda: '') self.lastDemucsModels = [] - self.DemucsLabel_to_path_MDX = defaultdict(lambda: '') - self.lastDemucsModels_MDX = [] + self.ModelParamsLabel_ens_to_path = defaultdict(lambda: '') + self.lastModelParams_ens = [] # -Tkinter Value Holders- data = load_data() - # Paths - self.inputPaths = data['inputPaths'] - self.inputPathop_var = tk.StringVar(value=data['inputPaths']) - self.exportPath_var = tk.StringVar(value=data['exportPath']) - self.saveFormat_var = tk.StringVar(value=data['saveFormat']) - self.vrensemchoose_var = tk.StringVar(value=data['vr_ensem']) - self.vrensemchoose_a_var = tk.StringVar(value=data['vr_ensem_a']) - self.vrensemchoose_b_var = tk.StringVar(value=data['vr_ensem_b']) - self.vrensemchoose_c_var = tk.StringVar(value=data['vr_ensem_c']) - self.vrensemchoose_d_var = tk.StringVar(value=data['vr_ensem_d']) - - self.vrensemchoose_e_var = tk.StringVar(value=data['vr_ensem_e']) - self.vrensemchoose_mdx_a_var = tk.StringVar(value=data['vr_ensem_mdx_a']) - self.vrensemchoose_mdx_b_var = tk.StringVar(value=data['vr_ensem_mdx_b']) - self.vrensemchoose_mdx_c_var = tk.StringVar(value=data['vr_ensem_mdx_c']) - self.mdxensemchoose_var = tk.StringVar(value=data['mdx_ensem']) - self.mdxensemchoose_b_var = tk.StringVar(value=data['mdx_ensem_b']) - self.demucsmodel_sel_VR_var = tk.StringVar(value=data['demucsmodel_sel_VR']) - #Advanced Options - self.appendensem_var = tk.BooleanVar(value=data['appendensem']) - self.demucs_only_var = tk.BooleanVar(value=data['demucs_only']) - self.split_mode_var = tk.BooleanVar(value=data['split_mode']) - self.normalize_var = tk.BooleanVar(value=data['normalize']) - # Processing Options - self.gpuConversion_var = tk.BooleanVar(value=data['gpu']) - self.postprocessing_var = tk.BooleanVar(value=data['postprocess']) - self.tta_var = tk.BooleanVar(value=data['tta']) - self.save_var = tk.BooleanVar(value=data['save']) - self.outputImage_var = tk.BooleanVar(value=data['output_image']) - # MDX-NET Specific Processing Options - self.demucsmodel_var = tk.BooleanVar(value=data['demucsmodel']) - self.demucsmodelVR_var = tk.BooleanVar(value=data['demucsmodelVR']) - self.non_red_var = tk.BooleanVar(value=data['non_red']) - self.nophaseinst_var = tk.BooleanVar(value=data['nophaseinst']) - self.noisereduc_var = tk.BooleanVar(value=data['noise_reduc']) - self.chunks_var = tk.StringVar(value=data['chunks']) - self.chunks_d_var = tk.StringVar(value=data['chunks_d']) - self.noisereduc_s_var = tk.StringVar(value=data['noisereduc_s']) - self.mixing_var = tk.StringVar(value=data['mixing']) #dropdown - # Models - self.instrumentalModel_var = tk.StringVar(value=data['modelInstrumentalLabel']) - # Model Test Mode - self.modelFolder_var = tk.BooleanVar(value=data['modelFolder']) - # Constants - self.winSize_var = tk.StringVar(value=data['window_size']) - self.agg_var = tk.StringVar(value=data['agg']) - self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale']) - self.segment_var = tk.StringVar(value=data['segment']) - self.dim_f_var = tk.StringVar(value=data['dim_f']) - self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select']) - self.wavtype_var = tk.StringVar(value=data['wavtype']) - self.flactype_var = tk.StringVar(value=data['flactype']) - self.mp3bit_var = tk.StringVar(value=data['mp3bit']) - self.overlap_var = tk.StringVar(value=data['overlap']) - self.shifts_var = tk.StringVar(value=data['shifts']) - self.overlap_b_var = tk.StringVar(value=data['overlap_b']) - self.shifts_b_var = tk.StringVar(value=data['shifts_b']) - - self.channel_var = tk.StringVar(value=data['channel']) - self.margin_var = tk.StringVar(value=data['margin']) - self.compensate_var = tk.StringVar(value=data['compensate']) - self.mdxnetModeltype_var = tk.StringVar(value=data['mdxnetModeltype']) - # Instrumental or Vocal Only - self.voc_only_var = tk.BooleanVar(value=data['voc_only']) - self.inst_only_var = tk.BooleanVar(value=data['inst_only']) - self.voc_only_b_var = tk.BooleanVar(value=data['voc_only_b']) - self.inst_only_b_var = tk.BooleanVar(value=data['inst_only_b']) - self.audfile_var = tk.BooleanVar(value=data['audfile']) - self.autocompensate_var = tk.BooleanVar(value=data['autocompensate']) - self.settest_var = tk.BooleanVar(value=data['settest']) - # Choose Conversion Method - self.aiModel_var = tk.StringVar(value=data['aiModel']) + data_alt = load_data_alt() + + try: + self.agg_var = tk.StringVar(value=data['agg']) + except: + self.agg_var = tk.StringVar(value=data_alt['agg']) + try: + self.aiModel_var = tk.StringVar(value=data['aiModel']) + except: + self.aiModel_var = tk.StringVar(value=data_alt['aiModel']) + try: + self.algo_var = tk.StringVar(value=data['algo']) + except: + self.algo_var = tk.StringVar(value=data_alt['algo']) + try: + self.appendensem_var = tk.BooleanVar(value=data['appendensem']) + except: + self.appendensem_var = tk.BooleanVar(value=data_alt['appendensem']) + try: + self.audfile_var = tk.BooleanVar(value=data['audfile']) + except: + self.audfile_var = tk.BooleanVar(value=data_alt['audfile']) + try: + self.aud_mdx_var = tk.BooleanVar(value=data['aud_mdx']) + except: + self.aud_mdx_var = tk.BooleanVar(value=data_alt['aud_mdx']) + try: + self.autocompensate_var = tk.BooleanVar(value=data['autocompensate']) + except: + self.autocompensate_var = tk.BooleanVar(value=data_alt['autocompensate']) + try: + self.channel_var = tk.StringVar(value=data['channel']) + except: + self.channel_var = tk.StringVar(value=data_alt['channel']) + try: + self.chunks_d_var = tk.StringVar(value=data['chunks_d']) + except: + self.chunks_d_var = tk.StringVar(value=data_alt['chunks_d']) + try: + self.chunks_var = tk.StringVar(value=data['chunks']) + except: + self.chunks_var = tk.StringVar(value=data_alt['chunks']) + try: + self.compensate_var = tk.StringVar(value=data['compensate']) + except: + self.compensate_var = tk.StringVar(value=data_alt['compensate']) + try: + self.demucs_only_var = tk.BooleanVar(value=data['demucs_only']) + except: + self.demucs_only_var = tk.BooleanVar(value=data_alt['demucs_only']) + try: + self.demucs_stems_var = tk.StringVar(value=data['demucs_stems']) + except: + self.demucs_stems_var = tk.StringVar(value=data_alt['demucs_stems']) + try: + self.DemucsModel_MDX_var = tk.StringVar(value=data['DemucsModel_MDX']) + except: + self.DemucsModel_MDX_var = tk.StringVar(value=data_alt['DemucsModel_MDX']) + try: + self.demucsmodel_sel_VR_var = tk.StringVar(value=data['demucsmodel_sel_VR']) + except: + self.demucsmodel_sel_VR_var = tk.StringVar(value=data_alt['demucsmodel_sel_VR']) + try: + self.demucsmodel_var = tk.BooleanVar(value=data['demucsmodel']) + except: + self.demucsmodel_var = tk.BooleanVar(value=data_alt['demucsmodel']) + try: + self.DemucsModel_var = tk.StringVar(value=data['DemucsModel']) + except: + self.DemucsModel_var = tk.StringVar(value=data_alt['DemucsModel']) + try: + self.demucsmodelVR_var = tk.BooleanVar(value=data['demucsmodelVR']) + except: + self.demucsmodelVR_var = tk.BooleanVar(value=data_alt['demucsmodelVR']) + try: + self.dim_f_var = tk.StringVar(value=data['dim_f']) + except: + self.dim_f_var = tk.StringVar(value=data_alt['dim_f']) + try: + self.ensChoose_var = tk.StringVar(value=data['ensChoose']) + except: + self.ensChoose_var = tk.StringVar(value=data_alt['ensChoose']) + try: + self.exportPath_var = tk.StringVar(value=data['exportPath']) + except: + self.exportPath_var = tk.StringVar(value=data_alt['exportPath']) + try: + self.flactype_var = tk.StringVar(value=data['flactype']) + except: + self.flactype_var = tk.StringVar(value=data_alt['flactype']) + try: + self.gpuConversion_var = tk.BooleanVar(value=data['gpu']) + except: + self.gpuConversion_var = tk.BooleanVar(value=data_alt['gpu']) + try: + self.inputPathop_var = tk.StringVar(value=data['inputPaths']) + except: + self.inputPathop_var = tk.StringVar(value=data_alt['inputPaths']) + try: + self.inputPaths = data['inputPaths'] + except: + self.inputPaths = data_alt['inputPaths'] + try: + self.inst_only_b_var = tk.BooleanVar(value=data['inst_only_b']) + except: + self.inst_only_b_var = tk.BooleanVar(value=data_alt['inst_only_b']) + try: + self.inst_only_var = tk.BooleanVar(value=data['inst_only']) + except: + self.inst_only_var = tk.BooleanVar(value=data_alt['inst_only']) + try: + self.instrumentalModel_var = tk.StringVar(value=data['modelInstrumentalLabel']) + except: + self.instrumentalModel_var = tk.StringVar(value=data_alt['modelInstrumentalLabel']) + try: + self.margin_var = tk.StringVar(value=data['margin']) + except: + self.margin_var = tk.StringVar(value=data_alt['margin']) + try: + self.mdx_only_ensem_a_var = tk.StringVar(value=data['mdx_only_ensem_a']) + except: + self.mdx_only_ensem_a_var = tk.StringVar(value=data_alt['mdx_only_ensem_a']) + try: + self.mdx_only_ensem_b_var = tk.StringVar(value=data['mdx_only_ensem_b']) + except: + self.mdx_only_ensem_b_var = tk.StringVar(value=data_alt['mdx_only_ensem_b']) + try: + self.mdx_only_ensem_c_var = tk.StringVar(value=data['mdx_only_ensem_c']) + except: + self.mdx_only_ensem_c_var = tk.StringVar(value=data_alt['mdx_only_ensem_c']) + try: + self.mdx_only_ensem_d_var = tk.StringVar(value=data['mdx_only_ensem_d']) + except: + self.mdx_only_ensem_d_var = tk.StringVar(value=data_alt['mdx_only_ensem_d']) + try: + self.mdx_only_ensem_e_var = tk.StringVar(value=data['mdx_only_ensem_e']) + except: + self.mdx_only_ensem_e_var = tk.StringVar(value=data_alt['mdx_only_ensem_e']) + try: + self.mdxensemchoose_b_var = tk.StringVar(value=data['mdx_ensem_b']) + except: + self.mdxensemchoose_b_var = tk.StringVar(value=data_alt['mdx_ensem_b']) + try: + self.mdxensemchoose_var = tk.StringVar(value=data['mdx_ensem']) + except: + self.mdxensemchoose_var = tk.StringVar(value=data_alt['mdx_ensem']) + try: + self.mdxnetModel_var = tk.StringVar(value=data['mdxnetModel']) + except: + self.mdxnetModel_var = tk.StringVar(value=data_alt['mdxnetModel']) + try: + self.mdxnetModeltype_var = tk.StringVar(value=data['mdxnetModeltype']) + except: + self.mdxnetModeltype_var = tk.StringVar(value=data_alt['mdxnetModeltype']) + try: + self.mixing_var = tk.StringVar(value=data['mixing']) + except: + self.mixing_var = tk.StringVar(value=data_alt['mixing']) + try: + self.modeldownload_type_var = tk.StringVar(value=data['modeldownload_type']) + except: + self.modeldownload_type_var = tk.StringVar(value=data_alt['modeldownload_type']) + try: + self.modeldownload_var = tk.StringVar(value=data['modeldownload']) + except: + self.modeldownload_var = tk.StringVar(value=data_alt['modeldownload']) + try: + self.modeldownload_mdx_var = tk.StringVar(value=data['modeldownload_mdx']) + except: + self.modeldownload_mdx_var = tk.StringVar(value=data_alt['modeldownload_mdx']) + try: + self.modeldownload_demucs_var = tk.StringVar(value=data['modeldownload_demucs']) + except: + self.modeldownload_demucs_var = tk.StringVar(value=data_alt['modeldownload_demucs']) + try: + self.modelFolder_var = tk.BooleanVar(value=data['modelFolder']) + except: + self.modelFolder_var = tk.BooleanVar(value=data_alt['modelFolder']) + try: + self.ModelParams_var = tk.StringVar(value=data['ModelParams']) + except: + self.ModelParams_var = tk.StringVar(value=data_alt['ModelParams']) + try: + self.mp3bit_var = tk.StringVar(value=data['mp3bit']) + except: + self.mp3bit_var = tk.StringVar(value=data_alt['mp3bit']) + try: + self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale']) + except: + self.n_fft_scale_var = tk.StringVar(value=data_alt['n_fft_scale']) + try: + self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select']) + except: + self.noise_pro_select_var = tk.StringVar(value=data_alt['noise_pro_select']) + try: + self.noisereduc_s_var = tk.StringVar(value=data['noisereduc_s']) + except: + self.noisereduc_s_var = tk.StringVar(value=data_alt['noisereduc_s']) + try: + self.noisereduc_var = tk.BooleanVar(value=data['noise_reduc']) + except: + self.noisereduc_var = tk.BooleanVar(value=data_alt['noise_reduc']) + try: + self.non_red_var = tk.BooleanVar(value=data['non_red']) + except: + self.non_red_var = tk.BooleanVar(value=data_alt['non_red']) + try: + self.nophaseinst_var = tk.BooleanVar(value=data['nophaseinst']) + except: + self.nophaseinst_var = tk.BooleanVar(value=data_alt['nophaseinst']) + try: + self.normalize_var = tk.BooleanVar(value=data['normalize']) + except: + self.normalize_var = tk.BooleanVar(value=data_alt['normalize']) + try: + self.outputImage_var = tk.BooleanVar(value=data['output_image']) + except: + self.outputImage_var = tk.BooleanVar(value=data_alt['output_image']) + try: + self.overlap_b_var = tk.StringVar(value=data['overlap_b']) + except: + self.overlap_b_var = tk.StringVar(value=data_alt['overlap_b']) + try: + self.overlap_var = tk.StringVar(value=data['overlap']) + except: + self.overlap_var = tk.StringVar(value=data_alt['overlap']) + try: + self.postprocessing_var = tk.BooleanVar(value=data['postprocess']) + except: + self.postprocessing_var = tk.BooleanVar(value=data_alt['postprocess']) + try: + self.save_var = tk.BooleanVar(value=data['save']) + except: + self.save_var = tk.BooleanVar(value=data_alt['save']) + try: + self.saveFormat_var = tk.StringVar(value=data['saveFormat']) + except: + self.saveFormat_var = tk.StringVar(value=data_alt['saveFormat']) + try: + self.selectdownload_var = tk.StringVar(value=data['selectdownload']) + except: + self.selectdownload_var = tk.StringVar(value=data_alt['selectdownload']) + try: + self.segment_var = tk.StringVar(value=data['segment']) + except: + self.segment_var = tk.StringVar(value=data_alt['segment']) + try: + self.settest_var = tk.BooleanVar(value=data['settest']) + except: + self.settest_var = tk.BooleanVar(value=data_alt['settest']) + try: + self.shifts_b_var = tk.StringVar(value=data['shifts_b']) + except: + self.shifts_b_var = tk.StringVar(value=data_alt['shifts_b']) + try: + self.shifts_var = tk.StringVar(value=data['shifts']) + except: + self.shifts_var = tk.StringVar(value=data_alt['shifts']) + try: + self.split_mode_var = tk.BooleanVar(value=data['split_mode']) + except: + self.split_mode_var = tk.BooleanVar(value=data_alt['split_mode']) + try: + self.tta_var = tk.BooleanVar(value=data['tta']) + except: + self.tta_var = tk.BooleanVar(value=data_alt['tta']) + try: + self.voc_only_b_var = tk.BooleanVar(value=data['voc_only_b']) + except: + self.voc_only_b_var = tk.BooleanVar(value=data_alt['voc_only_b']) + try: + self.voc_only_var = tk.BooleanVar(value=data['voc_only']) + except: + self.voc_only_var = tk.BooleanVar(value=data_alt['voc_only']) + try: + self.vrensemchoose_a_var = tk.StringVar(value=data['vr_ensem_a']) + except: + self.vrensemchoose_a_var = tk.StringVar(value=data_alt['vr_ensem_a']) + try: + self.vrensemchoose_b_var = tk.StringVar(value=data['vr_ensem_b']) + except: + self.vrensemchoose_b_var = tk.StringVar(value=data_alt['vr_ensem_b']) + try: + self.vrensemchoose_c_var = tk.StringVar(value=data['vr_ensem_c']) + except: + self.vrensemchoose_c_var = tk.StringVar(value=data_alt['vr_ensem_c']) + try: + self.vrensemchoose_d_var = tk.StringVar(value=data['vr_ensem_d']) + except: + self.vrensemchoose_d_var = tk.StringVar(value=data_alt['vr_ensem_d']) + try: + self.vrensemchoose_e_var = tk.StringVar(value=data['vr_ensem_e']) + except: + self.vrensemchoose_e_var = tk.StringVar(value=data_alt['vr_ensem_e']) + try: + self.vr_multi_USER_model_param_1 = tk.StringVar(value=data['vr_multi_USER_model_param_1']) + except: + self.vr_multi_USER_model_param_1 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_1']) + try: + self.vr_multi_USER_model_param_2 = tk.StringVar(value=data['vr_multi_USER_model_param_2']) + except: + self.vr_multi_USER_model_param_2 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_2']) + try: + self.vr_multi_USER_model_param_3 = tk.StringVar(value=data['vr_multi_USER_model_param_3']) + except: + self.vr_multi_USER_model_param_3 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_3']) + try: + self.vr_multi_USER_model_param_4 = tk.StringVar(value=data['vr_multi_USER_model_param_4']) + except: + self.vr_multi_USER_model_param_4 = tk.StringVar(value=data_alt['vr_multi_USER_model_param_4']) + try: + self.vr_basic_USER_model_param_1 = tk.StringVar(value=data['vr_basic_USER_model_param_1']) + except: + self.vr_basic_USER_model_param_1 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_1']) + try: + self.vr_basic_USER_model_param_2 = tk.StringVar(value=data['vr_basic_USER_model_param_2']) + except: + self.vr_basic_USER_model_param_2 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_2']) + try: + self.vr_basic_USER_model_param_3 = tk.StringVar(value=data['vr_basic_USER_model_param_3']) + except: + self.vr_basic_USER_model_param_3 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_3']) + try: + self.vr_basic_USER_model_param_4 = tk.StringVar(value=data['vr_basic_USER_model_param_4']) + except: + self.vr_basic_USER_model_param_4 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_4']) + try: + self.vr_basic_USER_model_param_5 = tk.StringVar(value=data['vr_basic_USER_model_param_5']) + except: + self.vr_basic_USER_model_param_5 = tk.StringVar(value=data_alt['vr_basic_USER_model_param_5']) + try: + self.vrensemchoose_mdx_a_var = tk.StringVar(value=data['vr_ensem_mdx_a']) + except: + self.vrensemchoose_mdx_a_var = tk.StringVar(value=data_alt['vr_ensem_mdx_a']) + try: + self.vrensemchoose_mdx_b_var = tk.StringVar(value=data['vr_ensem_mdx_b']) + except: + self.vrensemchoose_mdx_b_var = tk.StringVar(value=data_alt['vr_ensem_mdx_b']) + try: + self.vrensemchoose_mdx_c_var = tk.StringVar(value=data['vr_ensem_mdx_c']) + except: + self.vrensemchoose_mdx_c_var = tk.StringVar(value=data_alt['vr_ensem_mdx_c']) + try: + self.vrensemchoose_var = tk.StringVar(value=data['vr_ensem']) + except: + self.vrensemchoose_var = tk.StringVar(value=data_alt['vr_ensem']) + try: + self.wavtype_var = tk.StringVar(value=data['wavtype']) + except: + self.wavtype_var = tk.StringVar(value=data_alt['wavtype']) + try: + self.winSize_var = tk.StringVar(value=data['window_size']) + except: + self.winSize_var = tk.StringVar(value=data_alt['window_size']) + try: + self.lastDir = data['lastDir'] + except: + self.lastDir = data_alt['lastDir'] + self.last_aiModel = self.aiModel_var.get() - # Choose Conversion Method - self.algo_var = tk.StringVar(value=data['algo']) self.last_algo = self.aiModel_var.get() - self.demucs_stems_var = tk.StringVar(value=data['demucs_stems']) - # Choose Ensemble - self.ensChoose_var = tk.StringVar(value=data['ensChoose']) self.last_ensChoose = self.ensChoose_var.get() - # Choose MDX-NET Model - self.mdxnetModel_var = tk.StringVar(value=data['mdxnetModel']) - self.DemucsModel_var = tk.StringVar(value=data['DemucsModel']) - self.DemucsModel_MDX_var = tk.StringVar(value=data['DemucsModel_MDX']) - self.ModelParams_var = tk.StringVar(value=data['ModelParams']) - self.last_mdxnetModel = self.mdxnetModel_var.get() - # Other - self.inputPathsEntry_var = tk.StringVar(value='') - self.lastDir = data['lastDir'] # nopep8 + self.download_progress_var = tk.StringVar(value='') + self.download_progress_bar_var = tk.StringVar(value='') + self.download_progress_bar_zip_var = tk.IntVar(value=0) + self.download_stop_var = tk.StringVar(value='') self.progress_var = tk.IntVar(value=0) + + self.last_mdxnetModel = self.mdxnetModel_var.get() + self.inputPathsEntry_var = tk.StringVar(value='') + # Font pyglet.font.add_file('lib_v5/fonts/centurygothic/GOTHIC.TTF') self.font = tk.font.Font(family='Century Gothic', size=10) self.fontRadio = tk.font.Font(family='Century Gothic', size=8) # --Widgets-- self.create_widgets() - self.configure_widgets() self.bind_widgets() self.place_widgets() @@ -503,6 +969,25 @@ class MainWindow(TkinterDnD.Tk): self.update_states() self.update_loop() + global space_fill_wide + global space_medium_l + global space_medium + global space_small + global space_tiny + global download_code_file + global user_code_file + global download_code_temp_dir + + download_code_file = 'lib_v5/filelists/download_codes/user_code_download.txt' + user_code_file = 'lib_v5/filelists/download_codes/user_code.txt' + download_code_temp_dir = 'lib_v5/filelists/download_codes/temp' + + space_fill_wide = ' '*32 + space_medium_l = ' '*20 + space_medium = ' '*17 + space_small = ' '*10 + space_tiny = ' '*5 + # -Widget Methods- def create_widgets(self): @@ -520,7 +1005,7 @@ class MainWindow(TkinterDnD.Tk): command=self.start_conversion) self.stop_Button = ttk.Button(master=self, image=self.stop_img, - command=self.restart) + command=self.stop_inf) self.settings_Button = ttk.Button(master=self, image=self.help_img, command=self.settings) @@ -541,21 +1026,28 @@ class MainWindow(TkinterDnD.Tk): background='#0e0e0f',fg='#898b8e', font=('Century Gothic', 11),borderwidth=0) #self.command_Text.write(f'Ultimate Vocal Remover [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]\n') - self.command_Text.write(f'Ultimate Vocal Remover v{VERSION} [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]\n') - - - def configure_widgets(self): - """Change widget styling and appearance""" - - #ttk.Style().configure('TCheckbutton', background='#0e0e0f', - # font=self.font, foreground='#d4d4d4') - #ttk.Style().configure('TRadiobutton', background='#0e0e0f', - # font=("Century Gothic", "11", "bold"), foreground='#d4d4d4') - #ttk.Style().configure('T', font=self.font, foreground='#d4d4d4') - - #s = ttk.Style() - #s.configure('TButton', background='blue', foreground='black', font=('Century Gothic', '9', 'bold'), relief="groove") + global current_version + global update_signal_url + + update_signal_url = "https://raw.githubusercontent.com/TRvlvr/application_data/main/update_patches.txt" + + with open('uvr_patch_version.txt', 'r') as file : + current_version = file.read() + + try: + url = update_signal_url + file = urllib.request.urlopen(url) + for line in file: + patch_name = line.decode("utf-8") + if patch_name == current_version: + label_set = '' + else: + label_set = f"New Update Found: {patch_name}\n\nClick the update button in the \"Settings\" menu to download and install!" + except: + label_set = " " + + self.command_Text.write(f'Ultimate Vocal Remover v5.4.0 [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]\n\n{label_set}') def bind_widgets(self): """Bind widgets to the drag & drop mechanic""" @@ -699,7 +1191,7 @@ class MainWindow(TkinterDnD.Tk): background='#0e0e0f', font=self.font, foreground='#13a4c9', borderwidth=0, command=self.custom_ensemble) self.options_ensChoose_Optionmenu = ttk.OptionMenu(self.options_Frame, self.ensChoose_var, - None, 'Multi-AI Ensemble', 'Basic VR Ensemble', 'Vocal Models', 'Manual Ensemble') + None, 'Multi-AI Ensemble', 'Basic VR Ensemble', 'Basic MD Ensemble', 'Manual Ensemble') # Choose Agorithim self.options_algo_Label = tk.Label(master=self.options_Frame, @@ -812,9 +1304,9 @@ class MainWindow(TkinterDnD.Tk): ) # Demucs Model VR - self.options_demucsmodelVR_Checkbutton = ttk.Checkbutton(master=self.options_Frame, - text='Demucs Model', - variable=self.demucsmodelVR_var, + self.options_postpro_Checkbutton = ttk.Checkbutton(master=self.options_Frame, + text='Post-Process', + variable=self.postprocessing_var, ) # Split Mode @@ -1014,7 +1506,7 @@ class MainWindow(TkinterDnD.Tk): #---VR Architecture Specific--- #Post-Process - self.options_demucsmodelVR_Checkbutton.place(x=35, y=21, width=0, height=5, + self.options_postpro_Checkbutton.place(x=35, y=21, width=0, height=5, relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) #Save Image # self.options_image_Checkbutton.place(x=35, y=21, width=0, height=5, @@ -1081,6 +1573,18 @@ class MainWindow(TkinterDnD.Tk): self.compensate_var.trace_add('write', lambda *args: self.update_states()) + self.selectdownload_var.trace_add('write', + lambda *args: self.update_states()) + + self.modeldownload_var.trace_add('write', + lambda *args: self.update_states()) + + self.modeldownload_mdx_var.trace_add('write', + lambda *args: self.update_states()) + + self.modeldownload_demucs_var.trace_add('write', + lambda *args: self.update_states()) + # Opening filedialogs def open_file_filedialog(self): """Make user select music files""" @@ -1102,7 +1606,6 @@ class MainWindow(TkinterDnD.Tk): dnd = 'no' self.update_inputPaths() nondnd = os.path.dirname(paths[0]) - print('last dir', self.lastDir) def open_export_filedialog(self): """Make user select a folder to export the converted files in""" @@ -1137,8 +1640,11 @@ class MainWindow(TkinterDnD.Tk): if sys.platform == "win32": os.startfile(filename) except: - filename = str(self.lastDir) - + tbs = str(self.inputPathsEntry_var.get()) + head, sep, tail = tbs.partition(';') + in_path=os.path.dirname(head) + filename = str(in_path) + if sys.platform == "win32": os.startfile(filename) @@ -1211,12 +1717,81 @@ class MainWindow(TkinterDnD.Tk): raise TypeError('This error should not occur.') # -Run the algorithm- - threading.Thread(target=inference.main, + + global inf + inf = KThread(target=inference.main, kwargs={ # Paths - 'input_paths': input_paths, + 'agg': agg, + 'algo': self.algo_var.get(), + 'appendensem': self.appendensem_var.get(), + 'audfile': self.audfile_var.get(), + 'aud_mdx': self.aud_mdx_var.get(), + 'autocompensate': self.autocompensate_var.get(), + 'break': False, + 'button_widget_mdx_model_set': self.conversion_Button, + 'button_widget': self.conversion_Button, + 'channel': self.channel_var.get(), + 'chunks': chunks, + 'chunks_d': self.chunks_d_var.get(), + 'compensate': self.compensate_var.get(), + 'demucs_only': self.demucs_only_var.get(), + 'demucs_stems': self.demucs_stems_var.get(), + 'DemucsModel': self.DemucsModel_var.get(), + 'demucsmodel': self.demucsmodel_var.get(), + 'DemucsModel_MDX': self.DemucsModel_MDX_var.get(), + 'demucsmodel_sel_VR': self.demucsmodel_sel_VR_var.get(), + 'demucsmodelVR': self.demucsmodelVR_var.get(), + 'dim_f': self.dim_f_var.get(), + 'ensChoose': ensChoose, 'export_path': export_path, + 'flactype': self.flactype_var.get(), + 'gpu': 0 if self.gpuConversion_var.get() else -1, + 'input_paths': input_paths, + 'inst_menu': self.options_instrumentalModel_Optionmenu, + 'inst_only': self.inst_only_var.get(), + 'inst_only_b': self.inst_only_b_var.get(), + 'instrumentalModel': instrumentalModel_path, + 'margin': self.margin_var.get(), + 'mdx_ensem': self.mdxensemchoose_var.get(), + 'mdx_ensem_b': self.mdxensemchoose_b_var.get(), + 'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(), + 'mdx_only_ensem_b': self.mdx_only_ensem_b_var.get(), + 'mdx_only_ensem_c': self.mdx_only_ensem_c_var.get(), + 'mdx_only_ensem_d': self.mdx_only_ensem_d_var.get(), + 'mdx_only_ensem_e': self.mdx_only_ensem_e_var.get(), + 'mdxnetModel': mdxnetModel, + 'mdxnetModeltype': self.mdxnetModeltype_var.get(), + 'mixing': mixing, + 'modelFolder': self.modelFolder_var.get(), + 'ModelParams': self.ModelParams_var.get(), + 'mp3bit': self.mp3bit_var.get(), + 'n_fft_scale': self.n_fft_scale_var.get(), + 'noise_pro_select': self.noise_pro_select_var.get(), + 'noise_reduc': self.noisereduc_var.get(), + 'noisereduc_s': noisereduc_s, + 'non_red': self.non_red_var.get(), + 'nophaseinst': self.nophaseinst_var.get(), + 'normalize': self.normalize_var.get(), + 'output_image': self.outputImage_var.get(), + 'overlap': self.overlap_var.get(), + 'overlap_b': self.overlap_b_var.get(), + 'postprocess': self.postprocessing_var.get(), + 'progress_var': self.progress_var, + 'save': self.save_var.get(), 'saveFormat': self.saveFormat_var.get(), + 'selectdownload': self.selectdownload_var.get(), + 'segment': self.segment_var.get(), + 'settest': self.settest_var.get(), + 'shifts': self.shifts_var.get(), + 'shifts_b': self.shifts_b_var.get(), + 'split_mode': self.split_mode_var.get(), + 'text_widget': self.command_Text, + 'tta': self.tta_var.get(), + 'useModel': 'instrumental', # Always instrumental + 'voc_only': self.voc_only_var.get(), + 'voc_only_b': self.voc_only_b_var.get(), + 'vocalModel': '', # Always not needed 'vr_ensem': self.vrensemchoose_var.get(), 'vr_ensem_a': self.vrensemchoose_a_var.get(), 'vr_ensem_b': self.vrensemchoose_b_var.get(), @@ -1226,77 +1801,52 @@ class MainWindow(TkinterDnD.Tk): 'vr_ensem_mdx_a': self.vrensemchoose_mdx_a_var.get(), 'vr_ensem_mdx_b': self.vrensemchoose_mdx_b_var.get(), 'vr_ensem_mdx_c': self.vrensemchoose_mdx_c_var.get(), - 'mdx_ensem': self.mdxensemchoose_var.get(), - 'mdx_ensem_b': self.mdxensemchoose_b_var.get(), - 'demucsmodel_sel_VR': self.demucsmodel_sel_VR_var.get(), - # Processing Options - 'gpu': 0 if self.gpuConversion_var.get() else -1, - 'postprocess': self.postprocessing_var.get(), - 'appendensem': self.appendensem_var.get(), - 'demucs_only': self.demucs_only_var.get(), - 'split_mode': self.split_mode_var.get(), - 'normalize': self.normalize_var.get(), - 'tta': self.tta_var.get(), - 'save': self.save_var.get(), - 'output_image': self.outputImage_var.get(), - 'algo': self.algo_var.get(), - 'demucs_stems': self.demucs_stems_var.get(), - # Models - 'instrumentalModel': instrumentalModel_path, - 'vocalModel': '', # Always not needed - 'useModel': 'instrumental', # Always instrumental - # Model Folder - 'modelFolder': self.modelFolder_var.get(), - # Constants - 'window_size': window_size, - 'agg': agg, - 'break': False, - 'ensChoose': ensChoose, - 'mdxnetModel': mdxnetModel, - 'DemucsModel': self.DemucsModel_var.get(), - 'DemucsModel_MDX': self.DemucsModel_MDX_var.get(), - 'ModelParams': self.ModelParams_var.get(), - # Other Variables (Tkinter) - 'window': self, - 'text_widget': self.command_Text, - 'button_widget': self.conversion_Button, - 'inst_menu': self.options_instrumentalModel_Optionmenu, - 'progress_var': self.progress_var, - # MDX-Net Specific - 'demucsmodel': self.demucsmodel_var.get(), - 'demucsmodelVR': self.demucsmodelVR_var.get(), - 'non_red': self.non_red_var.get(), - 'nophaseinst': self.nophaseinst_var.get(), - 'noise_reduc': self.noisereduc_var.get(), - 'voc_only': self.voc_only_var.get(), - 'inst_only': self.inst_only_var.get(), - 'voc_only_b': self.voc_only_b_var.get(), - 'inst_only_b': self.inst_only_b_var.get(), - 'audfile': self.audfile_var.get(), - 'autocompensate': self.autocompensate_var.get(), - 'settest': self.settest_var.get(), - 'chunks': chunks, - 'chunks_d': self.chunks_d_var.get(), - 'noisereduc_s': noisereduc_s, - 'mixing': mixing, - 'n_fft_scale': self.n_fft_scale_var.get(), - 'segment': self.segment_var.get(), - 'dim_f': self.dim_f_var.get(), - 'noise_pro_select': self.noise_pro_select_var.get(), + 'vr_multi_USER_model_param_1': self.vr_multi_USER_model_param_1.get(), + 'vr_multi_USER_model_param_2': self.vr_multi_USER_model_param_2.get(), + 'vr_multi_USER_model_param_3': self.vr_multi_USER_model_param_3.get(), + 'vr_multi_USER_model_param_4': self.vr_multi_USER_model_param_4.get(), + 'vr_basic_USER_model_param_1': self.vr_basic_USER_model_param_1.get(), + 'vr_basic_USER_model_param_2': self.vr_basic_USER_model_param_2.get(), + 'vr_basic_USER_model_param_3': self.vr_basic_USER_model_param_3.get(), + 'vr_basic_USER_model_param_4': self.vr_basic_USER_model_param_4.get(), + 'vr_basic_USER_model_param_5': self.vr_basic_USER_model_param_5.get(), 'wavtype': self.wavtype_var.get(), - 'flactype': self.flactype_var.get(), - 'mp3bit': self.mp3bit_var.get(), - 'overlap': self.overlap_var.get(), - 'shifts': self.shifts_var.get(), - 'overlap_b': self.overlap_b_var.get(), - 'shifts_b': self.shifts_b_var.get(), - 'margin': self.margin_var.get(), - 'channel': self.channel_var.get(), - 'compensate': self.compensate_var.get(), - 'mdxnetModeltype': self.mdxnetModeltype_var.get(), + 'window': self, + 'window_size': window_size, }, daemon=True - ).start() + ) + + inf.start() + + def stop_inf(self): + + confirm = tk.messagebox.askyesno(title='Confirmation', + message='You are about to stop all active processes.\n\nAre you sure you wish to continue?') + + # if self.aiModel_var.get() == 'VR Architecture': + # inference = inference_v5 + # elif self.aiModel_var.get() == 'Ensemble Mode': + # inference = inference_v5_ensemble + # elif self.aiModel_var.get() == 'MDX-Net': + # inference = inference_MDX + # elif self.aiModel_var.get() == 'Demucs v3': + # inference = inference_demucs + + if confirm: + inf.kill() + button_widget = self.conversion_Button + button_widget.configure(state=tk.NORMAL) + text = self.command_Text + text.write('\n\nProcess stopped by user.') + torch.cuda.empty_cache() + importlib.reload(inference_v5) + importlib.reload(inference_v5_ensemble) + importlib.reload(inference_MDX) + importlib.reload(inference_demucs) + self.progress_var.set(0) + else: + pass # Models def update_inputPaths(self): @@ -1308,7 +1858,6 @@ class MainWindow(TkinterDnD.Tk): # Empty Selection text = '' self.inputPathsEntry_var.set(text) - def update_loop(self): @@ -1322,11 +1871,22 @@ class MainWindow(TkinterDnD.Tk): Loop through every VR model (.pth) in the models directory and add to the select your model list """ - temp_instrumentalModels_dir = os.path.join(instrumentalModels_dir, 'Main_Models') # nopep8 + temp_DemucsModels_dir = os.path.join(instrumentalModels_dir, 'Demucs_Models') + new_DemucsModels = os.listdir(temp_DemucsModels_dir) + + temp_MDXModels_dir = os.path.join(instrumentalModels_dir, 'MDX_Net_Models') # nopep8 + new_MDXModels = os.listdir(temp_MDXModels_dir) + + newmodels = [new_DemucsModels, new_MDXModels] - # Main models + temp_instrumentalModels_dir = os.path.join(instrumentalModels_dir, 'Main_Models') # nopep8 new_InstrumentalModels = os.listdir(temp_instrumentalModels_dir) + if new_InstrumentalModels != self.lastInstrumentalModels_ensem: + + with open('lib_v5/filelists/ensemble_list/vr_en_list.txt', 'w') as f: + f.write('No Model\nNo Model\n') + if new_InstrumentalModels != self.lastInstrumentalModels: self.instrumentalLabel_to_path.clear() self.options_instrumentalModel_Optionmenu['menu'].delete(0, 'end') @@ -1340,17 +1900,31 @@ class MainWindow(TkinterDnD.Tk): self.lastInstrumentalModels = new_InstrumentalModels #print(self.instrumentalLabel_to_path) + if new_InstrumentalModels != self.lastInstrumentalModels_ensem: + + for file_name_vr in natsort.natsorted(new_InstrumentalModels): + if file_name_vr.endswith(".pth"): + b = [".pth"] + for char in b: + file_name_vr = file_name_vr.replace(char, "") + + vr_list_en = file_name_vr + + with open('lib_v5/filelists/ensemble_list/vr_en_list.txt', 'a') as f: + f.write("{}\n".format(vr_list_en)) + + self.lastInstrumentalModels_ensem = new_InstrumentalModels + """ Loop through every MDX-Net model (.onnx) in the models directory and add to the select your model list """ - - temp_MDXModels_dir = os.path.join(instrumentalModels_dir, 'MDX_Net_Models') # nopep8 - - # MDX-Net - new_MDXModels = os.listdir(temp_MDXModels_dir) - if new_MDXModels != self.lastMDXModels: + if newmodels != self.lastmdx_demuc_ensem: + with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'w') as f: + f.write('No Model\nNo Model\n') + + if new_MDXModels != self.lastMDXModels or newmodels != self.lastmdx_demuc_ensem: self.MDXLabel_to_path.clear() self.options_mdxnetModel_Optionmenu['menu'].delete(0, 'end') for file_name_1 in natsort.natsorted(new_MDXModels): @@ -1387,62 +1961,154 @@ class MainWindow(TkinterDnD.Tk): for char in i: file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Karaoke") - i = ["UVR_MDXNET_Main"] - for char in i: + j = ["UVR_MDXNET_Main"] + for char in j: file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Main") self.options_mdxnetModel_Optionmenu['menu'].add_radiobutton(label=file_name_1, command=tk._setit(self.mdxnetModel_var, file_name_1)) + + mdx_list_en = file_name_1 + + self.ensemfiles = mdx_list_en + + with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'a') as f: + f.write("MDX-Net: {}\n".format(mdx_list_en)) + + self.lastMDXModels = new_MDXModels - - + """ Loop through every Demucs model (.th, .pth) in the models directory and add to the select your model list """ try: - temp_DemucsModels_dir = os.path.join(instrumentalModels_dir, 'Demucs_Models') # nopep8 - new_DemucsModels = os.listdir(temp_DemucsModels_dir) - - if new_DemucsModels != self.lastDemucsModels: - #print(new_MDXModels) + if new_DemucsModels != self.lastDemucsModels or newmodels != self.lastmdx_demuc_ensem: self.DemucsLabel_to_path.clear() self.options_DemucsModel_Optionmenu['menu'].delete(0, 'end') for file_name_2 in natsort.natsorted(new_DemucsModels): - if file_name_2.endswith(('.yaml')): + if file_name_2.endswith(('.yaml', '.ckpt', '.gz', 'tasnet-beb46fac.th', 'tasnet_extra-df3777b2.th', + 'demucs48_hq-28a1282c.th', 'demucs-e07c671f.th', 'demucs_extra-3646af93.th', 'demucs_unittest-09ebc15f.th', + 'tasnet.th', 'tasnet_extra.th', 'demucs.th', 'demucs_extra.th', 'light.th', 'light_extra.th')): + #Demucs v3 Models b = [".yaml"] for char in b: - file_name_2 = file_name_2.replace(char, "") + file_name_2 = file_name_2.replace(char, "") + #Demucs v2 Models + c = ["tasnet-beb46fac.th"] + for char in c: + file_name_2 = file_name_2.replace(char, "Tasnet v2") + d = ["tasnet_extra-df3777b2.th"] + for char in d: + file_name_2 = file_name_2.replace(char, "Tasnet_extra v2") + e = ["demucs48_hq-28a1282c.th"] + for char in e: + file_name_2 = file_name_2.replace(char, "Demucs48_hq v2") + f = ["demucs-e07c671f.th"] + for char in f: + file_name_2 = file_name_2.replace(char, "Demucs v2") + g = ["demucs_extra-3646af93.th"] + for char in g: + file_name_2 = file_name_2.replace(char, "Demucs_extra v2") + n = ["demucs_unittest-09ebc15f.th"] + for char in n: + file_name_2 = file_name_2.replace(char, "Demucs_unittest v2") + #Demucs v1 Models + h = ["tasnet.th"] + for char in h: + file_name_2 = file_name_2.replace(char, "Tasnet v1") + i = ["tasnet_extra.th"] + for char in i: + file_name_2 = file_name_2.replace(char, "Tasnet_extra v1") + j = ["demucs.th"] + for char in j: + file_name_2 = file_name_2.replace(char, "Demucs v1") + k = ["demucs_extra.th"] + for char in k: + file_name_2 = file_name_2.replace(char, "Demucs_extra v1") + l = ["light.th"] + for char in l: + file_name_2 = file_name_2.replace(char, "Light v1") + m = ["light_extra.th"] + for char in m: + file_name_2 = file_name_2.replace(char, "Light_extra v1") self.options_DemucsModel_Optionmenu['menu'].add_radiobutton(label=file_name_2, command=tk._setit(self.DemucsModel_var, file_name_2)) + + demucs_list_en = file_name_2 + + with open('lib_v5/filelists/ensemble_list/mdx_demuc_en_list.txt', 'a') as f: + f.writelines("Demucs: {}\n".format(demucs_list_en)) + self.lastDemucsModels = new_DemucsModels + except: pass try: - temp_DemucsModels_MDX_dir = os.path.join(instrumentalModels_dir, 'Demucs_Models') # nopep8 - new_DemucsModels_MDX = os.listdir(temp_DemucsModels_MDX_dir) - - if new_DemucsModels_MDX != self.lastDemucsModels_MDX: + if new_DemucsModels != self.lastDemucsModels or newmodels != self.lastmdx_demuc_ensem: #print(new_MDXModels) - self.DemucsLabel_MDX_to_path.clear() + self.DemucsLabel_to_path.clear() self.options_DemucsModel_MDX_Optionmenu['menu'].delete(0, 'end') - for file_name_3 in natsort.natsorted(new_DemucsModels_MDX): - if file_name_3.endswith(('.yaml')): + for file_name_3 in natsort.natsorted(new_DemucsModels): + if file_name_3.endswith(('.yaml', '.ckpt', '.gz', 'tasnet-beb46fac.th', 'tasnet_extra-df3777b2.th', + 'demucs48_hq-28a1282c.th', 'demucs-e07c671f.th', 'demucs_extra-3646af93.th', 'demucs_unittest-09ebc15f.th', + 'tasnet.th', 'tasnet_extra.th', 'demucs.th', 'demucs_extra.th', 'light.th', 'light_extra.th')): + #Demucs v3 Models b = [".yaml"] for char in b: - file_name_3 = file_name_3.replace(char, "") + file_name_3 = file_name_3.replace(char, "") + #Demucs v2 Models + c = ["tasnet-beb46fac.th"] + for char in c: + file_name_3 = file_name_3.replace(char, "Tasnet v2") + d = ["tasnet_extra-df3777b2.th"] + for char in d: + file_name_3 = file_name_3.replace(char, "Tasnet_extra v2") + e = ["demucs48_hq-28a1282c.th"] + for char in e: + file_name_3 = file_name_3.replace(char, "Demucs48_hq v2") + f = ["demucs-e07c671f.th"] + for char in f: + file_name_3 = file_name_3.replace(char, "Demucs v2") + g = ["demucs_extra-3646af93.th"] + for char in g: + file_name_3 = file_name_3.replace(char, "Demucs_extra v2") + n = ["demucs_unittest-09ebc15f.th"] + for char in n: + file_name_3 = file_name_3.replace(char, "Demucs_unittest v2") + #Demucs v1 Models + h = ["tasnet.th"] + for char in h: + file_name_3 = file_name_3.replace(char, "Tasnet v1") + i = ["tasnet_extra.th"] + for char in i: + file_name_3 = file_name_3.replace(char, "Tasnet_extra v1") + j = ["demucs.th"] + for char in j: + file_name_3 = file_name_3.replace(char, "Demucs v1") + k = ["demucs_extra.th"] + for char in k: + file_name_3 = file_name_3.replace(char, "Demucs_extra v1") + l = ["light.th"] + for char in l: + file_name_3 = file_name_3.replace(char, "Light v1") + m = ["light_extra.th"] + for char in m: + file_name_3 = file_name_3.replace(char, "Light_extra v1") + self.options_DemucsModel_MDX_Optionmenu['menu'].add_radiobutton(label=file_name_3, command=tk._setit(self.DemucsModel_MDX_var, file_name_3)) - self.lastDemucsModels_MDX = new_DemucsModels_MDX + + self.lastDemucsModels = new_DemucsModels + except: pass - """ Loop through every model param (.json) in the models directory and add to the select your model list @@ -1453,7 +2119,6 @@ class MainWindow(TkinterDnD.Tk): new_ModelParams = os.listdir(temp_ModelParams_dir) if new_ModelParams != self.lastModelParams: - #print(new_MDXModels) self.ModelParamsLabel_to_path.clear() self.options_ModelParams_Optionmenu['menu'].delete(0, 'end') for file_name_3 in natsort.natsorted(new_ModelParams): @@ -1464,7 +2129,50 @@ class MainWindow(TkinterDnD.Tk): self.lastModelParams = new_ModelParams except: pass - + + + + try: + temp_ModelParams_dir = 'lib_v5\modelparams' # nopep8 + new_ModelParams = os.listdir(temp_ModelParams_dir) + + if new_ModelParams != self.lastModelParams_ens: + self.ModelParamsLabel_ens_to_path.clear() + self.options_ModelParams_a_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_b_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_c_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_d_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_1_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_2_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_3_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_4_Optionmenu['menu'].delete(0, 'end') + self.options_ModelParams_5_Optionmenu['menu'].delete(0, 'end') + for file_name_3 in natsort.natsorted(new_ModelParams): + if file_name_3.endswith(('.json', 'Auto')): + + self.options_ModelParams_a_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_multi_USER_model_param_1, file_name_3)) + self.options_ModelParams_b_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_multi_USER_model_param_2, file_name_3)) + self.options_ModelParams_c_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_multi_USER_model_param_3, file_name_3)) + self.options_ModelParams_d_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_multi_USER_model_param_4, file_name_3)) + self.options_ModelParams_1_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_basic_USER_model_param_1, file_name_3)) + self.options_ModelParams_2_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_basic_USER_model_param_2, file_name_3)) + self.options_ModelParams_3_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_basic_USER_model_param_3, file_name_3)) + self.options_ModelParams_4_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_basic_USER_model_param_4, file_name_3)) + self.options_ModelParams_5_Optionmenu['menu'].add_radiobutton(label=file_name_3, + command=tk._setit(self.vr_basic_USER_model_param_5, file_name_3)) + self.lastModelParams_ens = new_ModelParams + except: + pass + + self.lastmdx_demuc_ensem = [new_DemucsModels, new_MDXModels] def update_states(self): """ @@ -1517,41 +2225,39 @@ class MainWindow(TkinterDnD.Tk): relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # Forget widgets - self.options_ensChoose_Label.place_forget() - self.options_ensChoose_Optionmenu.place_forget() - self.options_instrumentalModel_Label.place_forget() - self.options_instrumentalModel_Optionmenu.place_forget() - self.options_save_Checkbutton.configure(state=tk.DISABLED) - self.options_save_Checkbutton.place_forget() - self.options_demucsmodelVR_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodelVR_Checkbutton.place_forget() - self.options_tta_Checkbutton.configure(state=tk.DISABLED) - self.options_tta_Checkbutton.place_forget() - # self.options_image_Checkbutton.configure(state=tk.DISABLED) - # self.options_image_Checkbutton.place_forget() - self.options_winSize_Label.place_forget() - self.options_winSize_Optionmenu.place_forget() self.options_agg_Label.place_forget() self.options_agg_Optionmenu.place_forget() self.options_algo_Label.place_forget() self.options_algo_Optionmenu.place_forget() - self.options_DemucsModel_Label.place_forget() - self.options_DemucsModel_Optionmenu.place_forget() self.options_demucs_stems_Label.place_forget() self.options_demucs_stems_Optionmenu.place_forget() - self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_b_Checkbutton.place_forget() + self.options_DemucsModel_Label.place_forget() + self.options_DemucsModel_Optionmenu.place_forget() + self.options_ensChoose_Label.place_forget() + self.options_ensChoose_Optionmenu.place_forget() self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) self.options_inst_only_b_Checkbutton.place_forget() self.options_inst_only_b_Checkbutton.place_forget() + self.options_instrumentalModel_Label.place_forget() + self.options_instrumentalModel_Optionmenu.place_forget() self.options_overlap_b_Label.place_forget() self.options_overlap_b_Optionmenu.place_forget() + self.options_postpro_Checkbutton.configure(state=tk.DISABLED) + self.options_postpro_Checkbutton.place_forget() + self.options_save_Checkbutton.configure(state=tk.DISABLED) + self.options_save_Checkbutton.place_forget() + self.options_segment_Label.place_forget() + self.options_segment_Optionmenu.place_forget() self.options_shifts_b_Label.place_forget() self.options_shifts_b_Optionmenu.place_forget() self.options_split_Checkbutton.configure(state=tk.DISABLED) self.options_split_Checkbutton.place_forget() - self.options_segment_Label.place_forget() - self.options_segment_Optionmenu.place_forget() + self.options_tta_Checkbutton.configure(state=tk.DISABLED) + self.options_tta_Checkbutton.place_forget() + self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_b_Checkbutton.place_forget() + self.options_winSize_Label.place_forget() + self.options_winSize_Optionmenu.place_forget() elif self.aiModel_var.get() == 'VR Architecture': @@ -1588,8 +2294,8 @@ class MainWindow(TkinterDnD.Tk): self.options_tta_Checkbutton.place(x=35, y=21, width=0, height=5, relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) #Post-Process - self.options_demucsmodelVR_Checkbutton.configure(state=tk.NORMAL) - self.options_demucsmodelVR_Checkbutton.place(x=35, y=21, width=0, height=5, + self.options_postpro_Checkbutton.configure(state=tk.NORMAL) + self.options_postpro_Checkbutton.place(x=35, y=21, width=0, height=5, relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) #Save Image # self.options_image_Checkbutton.configure(state=tk.NORMAL) @@ -1600,42 +2306,42 @@ class MainWindow(TkinterDnD.Tk): self.options_modelFolder_Checkbutton.place(x=35, y=21, width=0, height=5, relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) #Forget Widgets - self.options_ensChoose_Label.place_forget() - self.options_ensChoose_Optionmenu.place_forget() - self.options_chunks_Label.place_forget() - self.options_chunks_Optionmenu.place_forget() - self.options_noisereduc_s_Label.place_forget() - self.options_noisereduc_s_Optionmenu.place_forget() - self.options_mdxnetModel_Label.place_forget() - self.options_mdxnetModel_Optionmenu.place_forget() self.options_algo_Label.place_forget() self.options_algo_Optionmenu.place_forget() - self.options_save_Checkbutton.configure(state=tk.DISABLED) - self.options_save_Checkbutton.place_forget() - self.options_non_red_Checkbutton.configure(state=tk.DISABLED) - self.options_non_red_Checkbutton.place_forget() - self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) - self.options_noisereduc_Checkbutton.place_forget() - self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodel_Checkbutton.place_forget() - self.options_non_red_Checkbutton.configure(state=tk.DISABLED) - self.options_non_red_Checkbutton.place_forget() - self.options_DemucsModel_Label.place_forget() - self.options_DemucsModel_Optionmenu.place_forget() + self.options_chunks_Label.place_forget() + self.options_chunks_Optionmenu.place_forget() self.options_demucs_stems_Label.place_forget() self.options_demucs_stems_Optionmenu.place_forget() - self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_b_Checkbutton.place_forget() + self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) + self.options_demucsmodel_Checkbutton.place_forget() + self.options_DemucsModel_Label.place_forget() + self.options_DemucsModel_Optionmenu.place_forget() + self.options_ensChoose_Label.place_forget() + self.options_ensChoose_Optionmenu.place_forget() self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) self.options_inst_only_b_Checkbutton.place_forget() + self.options_mdxnetModel_Label.place_forget() + self.options_mdxnetModel_Optionmenu.place_forget() + self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) + self.options_noisereduc_Checkbutton.place_forget() + self.options_noisereduc_s_Label.place_forget() + self.options_noisereduc_s_Optionmenu.place_forget() + self.options_non_red_Checkbutton.configure(state=tk.DISABLED) + self.options_non_red_Checkbutton.configure(state=tk.DISABLED) + self.options_non_red_Checkbutton.place_forget() + self.options_non_red_Checkbutton.place_forget() self.options_overlap_b_Label.place_forget() self.options_overlap_b_Optionmenu.place_forget() + self.options_save_Checkbutton.configure(state=tk.DISABLED) + self.options_save_Checkbutton.place_forget() + self.options_segment_Label.place_forget() + self.options_segment_Optionmenu.place_forget() self.options_shifts_b_Label.place_forget() self.options_shifts_b_Optionmenu.place_forget() self.options_split_Checkbutton.configure(state=tk.DISABLED) self.options_split_Checkbutton.place_forget() - self.options_segment_Label.place_forget() - self.options_segment_Optionmenu.place_forget() + self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_b_Checkbutton.place_forget() elif self.aiModel_var.get() == 'Demucs v3': #Keep for Ensemble & VR Architecture Mode @@ -1682,47 +2388,47 @@ class MainWindow(TkinterDnD.Tk): self.options_inst_only_b_Checkbutton.place(x=35, y=21, width=0, height=5, relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) - #Instrumental Only + #Split Mode self.options_split_Checkbutton.configure(state=tk.NORMAL) self.options_split_Checkbutton.place(x=35, y=21, width=0, height=5, relx=1/3, rely=8/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # Forget Widgets - self.options_save_Checkbutton.configure(state=tk.DISABLED) - self.options_save_Checkbutton.place_forget() - self.options_demucsmodelVR_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodelVR_Checkbutton.place_forget() - self.options_tta_Checkbutton.configure(state=tk.DISABLED) - self.options_tta_Checkbutton.place_forget() # self.options_image_Checkbutton.configure(state=tk.DISABLED) # self.options_image_Checkbutton.place_forget() - self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodel_Checkbutton.place_forget() - self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) - self.options_noisereduc_Checkbutton.place_forget() - self.options_non_red_Checkbutton.configure(state=tk.DISABLED) - self.options_non_red_Checkbutton.place_forget() - self.options_voc_only_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_Checkbutton.place_forget() - self.options_inst_only_Checkbutton.configure(state=tk.DISABLED) - self.options_inst_only_Checkbutton.place_forget() - self.options_noisereduc_s_Label.place_forget() - self.options_noisereduc_s_Optionmenu.place_forget() - self.options_mdxnetModel_Label.place_forget() - self.options_mdxnetModel_Optionmenu.place_forget() - self.options_winSize_Label.place_forget() - self.options_winSize_Optionmenu.place_forget() self.options_agg_Label.place_forget() self.options_agg_Optionmenu.place_forget() - self.options_ensChoose_Label.place_forget() - self.options_ensChoose_Optionmenu.place_forget() - self.options_instrumentalModel_Label.place_forget() - self.options_instrumentalModel_Optionmenu.place_forget() self.options_algo_Label.place_forget() self.options_algo_Optionmenu.place_forget() - self.options_modelFolder_Checkbutton.place_forget() self.options_chunks_Label.place_forget() self.options_chunks_Optionmenu.place_forget() + self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) + self.options_demucsmodel_Checkbutton.place_forget() + self.options_ensChoose_Label.place_forget() + self.options_ensChoose_Optionmenu.place_forget() + self.options_inst_only_Checkbutton.configure(state=tk.DISABLED) + self.options_inst_only_Checkbutton.place_forget() + self.options_instrumentalModel_Label.place_forget() + self.options_instrumentalModel_Optionmenu.place_forget() + self.options_mdxnetModel_Label.place_forget() + self.options_mdxnetModel_Optionmenu.place_forget() + self.options_modelFolder_Checkbutton.place_forget() + self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) + self.options_noisereduc_Checkbutton.place_forget() + self.options_noisereduc_s_Label.place_forget() + self.options_noisereduc_s_Optionmenu.place_forget() + self.options_non_red_Checkbutton.configure(state=tk.DISABLED) + self.options_non_red_Checkbutton.place_forget() + self.options_postpro_Checkbutton.configure(state=tk.DISABLED) + self.options_postpro_Checkbutton.place_forget() + self.options_save_Checkbutton.configure(state=tk.DISABLED) + self.options_save_Checkbutton.place_forget() + self.options_tta_Checkbutton.configure(state=tk.DISABLED) + self.options_tta_Checkbutton.place_forget() + self.options_voc_only_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_Checkbutton.place_forget() + self.options_winSize_Label.place_forget() + self.options_winSize_Optionmenu.place_forget() elif self.aiModel_var.get() == 'Ensemble Mode': if self.ensChoose_var.get() == 'Manual Ensemble': @@ -1737,55 +2443,55 @@ class MainWindow(TkinterDnD.Tk): self.options_ensChoose_Optionmenu.place(x=0, y=19, width=0, height=7, relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) # Forget Widgets - self.options_save_Checkbutton.configure(state=tk.DISABLED) - self.options_save_Checkbutton.place_forget() - self.options_demucsmodelVR_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodelVR_Checkbutton.place_forget() - self.options_tta_Checkbutton.configure(state=tk.DISABLED) - self.options_tta_Checkbutton.place_forget() - self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) - self.options_modelFolder_Checkbutton.place_forget() # self.options_image_Checkbutton.configure(state=tk.DISABLED) # self.options_image_Checkbutton.place_forget() - self.options_gpu_Checkbutton.configure(state=tk.DISABLED) - self.options_gpu_Checkbutton.place_forget() - self.options_voc_only_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_Checkbutton.place_forget() - self.options_inst_only_Checkbutton.configure(state=tk.DISABLED) - self.options_inst_only_Checkbutton.place_forget() - self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodel_Checkbutton.place_forget() - self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) - self.options_noisereduc_Checkbutton.place_forget() - self.options_non_red_Checkbutton.configure(state=tk.DISABLED) - self.options_non_red_Checkbutton.place_forget() - self.options_chunks_Label.place_forget() - self.options_chunks_Optionmenu.place_forget() - self.options_noisereduc_s_Label.place_forget() - self.options_noisereduc_s_Optionmenu.place_forget() - self.options_mdxnetModel_Label.place_forget() - self.options_mdxnetModel_Optionmenu.place_forget() - self.options_winSize_Label.place_forget() - self.options_winSize_Optionmenu.place_forget() self.options_agg_Label.place_forget() self.options_agg_Optionmenu.place_forget() - self.options_DemucsModel_Label.place_forget() - self.options_DemucsModel_Optionmenu.place_forget() + self.options_chunks_Label.place_forget() + self.options_chunks_Optionmenu.place_forget() self.options_demucs_stems_Label.place_forget() self.options_demucs_stems_Optionmenu.place_forget() - self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_b_Checkbutton.place_forget() + self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) + self.options_demucsmodel_Checkbutton.place_forget() + self.options_DemucsModel_Label.place_forget() + self.options_DemucsModel_Optionmenu.place_forget() + self.options_gpu_Checkbutton.configure(state=tk.DISABLED) + self.options_gpu_Checkbutton.place_forget() self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) self.options_inst_only_b_Checkbutton.place_forget() self.options_inst_only_b_Checkbutton.place_forget() + self.options_inst_only_Checkbutton.configure(state=tk.DISABLED) + self.options_inst_only_Checkbutton.place_forget() + self.options_mdxnetModel_Label.place_forget() + self.options_mdxnetModel_Optionmenu.place_forget() + self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) + self.options_modelFolder_Checkbutton.place_forget() + self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) + self.options_noisereduc_Checkbutton.place_forget() + self.options_noisereduc_s_Label.place_forget() + self.options_noisereduc_s_Optionmenu.place_forget() + self.options_non_red_Checkbutton.configure(state=tk.DISABLED) + self.options_non_red_Checkbutton.place_forget() self.options_overlap_b_Label.place_forget() self.options_overlap_b_Optionmenu.place_forget() + self.options_postpro_Checkbutton.configure(state=tk.DISABLED) + self.options_postpro_Checkbutton.place_forget() + self.options_save_Checkbutton.configure(state=tk.DISABLED) + self.options_save_Checkbutton.place_forget() + self.options_segment_Label.place_forget() + self.options_segment_Optionmenu.place_forget() self.options_shifts_b_Label.place_forget() self.options_shifts_b_Optionmenu.place_forget() self.options_split_Checkbutton.configure(state=tk.DISABLED) self.options_split_Checkbutton.place_forget() - self.options_segment_Label.place_forget() - self.options_segment_Optionmenu.place_forget() + self.options_tta_Checkbutton.configure(state=tk.DISABLED) + self.options_tta_Checkbutton.place_forget() + self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_b_Checkbutton.place_forget() + self.options_voc_only_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_Checkbutton.place_forget() + self.options_winSize_Label.place_forget() + self.options_winSize_Optionmenu.place_forget() elif self.ensChoose_var.get() == 'Multi-AI Ensemble': @@ -1839,35 +2545,114 @@ class MainWindow(TkinterDnD.Tk): self.options_save_Checkbutton.place(x=35, y=3, width=0, height=5, relx=2/3, rely=9/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # Forget Widgets - self.options_demucsmodelVR_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodelVR_Checkbutton.place_forget() - self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) - self.options_modelFolder_Checkbutton.place_forget() # self.options_image_Checkbutton.configure(state=tk.DISABLED) # self.options_image_Checkbutton.place_forget() + self.options_algo_Label.place_forget() + self.options_algo_Optionmenu.place_forget() + self.options_demucs_stems_Label.place_forget() + self.options_demucs_stems_Optionmenu.place_forget() + self.options_DemucsModel_Label.place_forget() + self.options_DemucsModel_Optionmenu.place_forget() + self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_inst_only_b_Checkbutton.place_forget() + self.options_inst_only_b_Checkbutton.place_forget() + self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) + self.options_modelFolder_Checkbutton.place_forget() self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) self.options_noisereduc_Checkbutton.place_forget() self.options_non_red_Checkbutton.configure(state=tk.DISABLED) self.options_non_red_Checkbutton.place_forget() - self.options_algo_Label.place_forget() - self.options_algo_Optionmenu.place_forget() - self.options_DemucsModel_Label.place_forget() - self.options_DemucsModel_Optionmenu.place_forget() - self.options_demucs_stems_Label.place_forget() - self.options_demucs_stems_Optionmenu.place_forget() - self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_b_Checkbutton.place_forget() - self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) - self.options_inst_only_b_Checkbutton.place_forget() - self.options_inst_only_b_Checkbutton.place_forget() self.options_overlap_b_Label.place_forget() self.options_overlap_b_Optionmenu.place_forget() + self.options_postpro_Checkbutton.configure(state=tk.DISABLED) + self.options_postpro_Checkbutton.place_forget() + self.options_segment_Label.place_forget() + self.options_segment_Optionmenu.place_forget() self.options_shifts_b_Label.place_forget() self.options_shifts_b_Optionmenu.place_forget() self.options_split_Checkbutton.configure(state=tk.DISABLED) self.options_split_Checkbutton.place_forget() + self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_b_Checkbutton.place_forget() + elif self.ensChoose_var.get() == 'Basic MD Ensemble': + # Choose Ensemble + self.options_ensChoose_Label.place(x=0, y=19, width=0, height=-10, + relx=0, rely=6/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) + self.options_ensChoose_Optionmenu.place(x=0, y=19, width=0, height=7, + relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) + # MDX-chunks + self.options_chunks_Label.place(x=12, y=0, width=0, height=-10, + relx=2/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_chunks_Optionmenu.place(x=71, y=-2, width=-118, height=7, + relx=2/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + # MDX-noisereduc_s + self.options_noisereduc_s_Label.place(x=15, y=0, width=0, height=-10, + relx=1/3, rely=2/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_noisereduc_s_Optionmenu.place(x=71, y=-2, width=-118, height=7, + relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + #GPU Conversion + self.options_gpu_Checkbutton.configure(state=tk.NORMAL) + self.options_gpu_Checkbutton.place(x=35, y=21, width=0, height=5, + relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + #Vocals Only + self.options_voc_only_Checkbutton.configure(state=tk.NORMAL) + self.options_voc_only_Checkbutton.place(x=35, y=21, width=0, height=5, + relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + #Instrumental Only + self.options_inst_only_Checkbutton.configure(state=tk.NORMAL) + self.options_inst_only_Checkbutton.place(x=35, y=21, width=0, height=5, + relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + # MDX-demucs Model + self.options_demucsmodel_Checkbutton.configure(state=tk.NORMAL) + self.options_demucsmodel_Checkbutton.place(x=35, y=21, width=0, height=5, + relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + + # Split Mode + self.options_split_Checkbutton.configure(state=tk.NORMAL) + self.options_split_Checkbutton.place(x=35, y=21, width=0, height=5, + relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + + #Ensemble Save Outputs + self.options_save_Checkbutton.configure(state=tk.NORMAL) + self.options_save_Checkbutton.place(x=35, y=21, width=0, height=5, + relx=2/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + + # Forget widgets + # self.options_image_Checkbutton.configure(state=tk.DISABLED) + # self.options_image_Checkbutton.place_forget() + self.options_agg_Label.place_forget() + self.options_agg_Optionmenu.place_forget() + self.options_algo_Label.place_forget() + self.options_algo_Optionmenu.place_forget() + self.options_demucs_stems_Label.place_forget() + self.options_demucs_stems_Optionmenu.place_forget() + self.options_DemucsModel_Label.place_forget() + self.options_DemucsModel_Optionmenu.place_forget() + self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_inst_only_b_Checkbutton.place_forget() + self.options_inst_only_b_Checkbutton.place_forget() + self.options_instrumentalModel_Label.place_forget() + self.options_instrumentalModel_Optionmenu.place_forget() + self.options_mdxnetModel_Label.place_forget() + self.options_mdxnetModel_Optionmenu.place_forget() + self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) + self.options_modelFolder_Checkbutton.place_forget() + self.options_non_red_Checkbutton.configure(state=tk.DISABLED) + self.options_non_red_Checkbutton.place_forget() + self.options_overlap_b_Label.place_forget() + self.options_overlap_b_Optionmenu.place_forget() + self.options_postpro_Checkbutton.configure(state=tk.DISABLED) + self.options_postpro_Checkbutton.place_forget() self.options_segment_Label.place_forget() self.options_segment_Optionmenu.place_forget() + self.options_shifts_b_Label.place_forget() + self.options_shifts_b_Optionmenu.place_forget() + self.options_tta_Checkbutton.configure(state=tk.DISABLED) + self.options_tta_Checkbutton.place_forget() + self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_b_Checkbutton.place_forget() + self.options_winSize_Label.place_forget() + self.options_winSize_Optionmenu.place_forget() else: # Choose Ensemble self.options_ensChoose_Label.place(x=0, y=19, width=0, height=-10, @@ -1901,8 +2686,8 @@ class MainWindow(TkinterDnD.Tk): self.options_tta_Checkbutton.place(x=35, y=21, width=0, height=5, relx=2/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) #Post-Process - self.options_demucsmodelVR_Checkbutton.configure(state=tk.NORMAL) - self.options_demucsmodelVR_Checkbutton.place(x=35, y=21, width=0, height=5, + self.options_postpro_Checkbutton.configure(state=tk.NORMAL) + self.options_postpro_Checkbutton.place(x=35, y=21, width=0, height=5, relx=2/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) #Save Image # self.options_image_Checkbutton.configure(state=tk.NORMAL) @@ -1915,39 +2700,38 @@ class MainWindow(TkinterDnD.Tk): #Forget Widgets self.options_algo_Label.place_forget() self.options_algo_Optionmenu.place_forget() - self.options_instrumentalModel_Label.place_forget() - self.options_instrumentalModel_Optionmenu.place_forget() self.options_chunks_Label.place_forget() self.options_chunks_Optionmenu.place_forget() - self.options_noisereduc_s_Label.place_forget() - self.options_noisereduc_s_Optionmenu.place_forget() - self.options_mdxnetModel_Label.place_forget() - self.options_mdxnetModel_Optionmenu.place_forget() - self.options_modelFolder_Checkbutton.place_forget() - self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) - self.options_noisereduc_Checkbutton.place_forget() - self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) - self.options_demucsmodel_Checkbutton.place_forget() - self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) - self.options_non_red_Checkbutton.place_forget() - self.options_non_red_Checkbutton.configure(state=tk.DISABLED) - self.options_DemucsModel_Label.place_forget() - self.options_DemucsModel_Optionmenu.place_forget() self.options_demucs_stems_Label.place_forget() self.options_demucs_stems_Optionmenu.place_forget() - self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) - self.options_voc_only_b_Checkbutton.place_forget() + self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) + self.options_demucsmodel_Checkbutton.place_forget() + self.options_DemucsModel_Label.place_forget() + self.options_DemucsModel_Optionmenu.place_forget() self.options_inst_only_b_Checkbutton.configure(state=tk.DISABLED) self.options_inst_only_b_Checkbutton.place_forget() self.options_inst_only_b_Checkbutton.place_forget() + self.options_instrumentalModel_Label.place_forget() + self.options_mdxnetModel_Label.place_forget() + self.options_mdxnetModel_Optionmenu.place_forget() + self.options_modelFolder_Checkbutton.configure(state=tk.DISABLED) + self.options_modelFolder_Checkbutton.place_forget() + self.options_noisereduc_Checkbutton.configure(state=tk.DISABLED) + self.options_noisereduc_Checkbutton.place_forget() + self.options_noisereduc_s_Label.place_forget() + self.options_noisereduc_s_Optionmenu.place_forget() + self.options_non_red_Checkbutton.configure(state=tk.DISABLED) + self.options_non_red_Checkbutton.place_forget() self.options_overlap_b_Label.place_forget() self.options_overlap_b_Optionmenu.place_forget() + self.options_segment_Label.place_forget() + self.options_segment_Optionmenu.place_forget() self.options_shifts_b_Label.place_forget() self.options_shifts_b_Optionmenu.place_forget() self.options_split_Checkbutton.configure(state=tk.DISABLED) self.options_split_Checkbutton.place_forget() - self.options_segment_Label.place_forget() - self.options_segment_Optionmenu.place_forget() + self.options_voc_only_b_Checkbutton.configure(state=tk.DISABLED) + self.options_voc_only_b_Checkbutton.place_forget() if self.inst_only_var.get() == True: @@ -2118,14 +2902,43 @@ class MainWindow(TkinterDnD.Tk): except: pass + if self.selectdownload_var.get() == 'VR Arc': + #self.modeldownload_var.clear() + self.modeldownload_mdx_var.set('No Model Selected') + self.modeldownload_demucs_var.set('No Model Selected') + try: + self.downloadmodelOptions.configure(state=tk.NORMAL) + self.downloadmodelOptions_mdx.configure(state=tk.DISABLED) + self.downloadmodelOptions_demucs.configure(state=tk.DISABLED) + except: + pass + if self.selectdownload_var.get() == 'MDX-Net': + #self.modeldownload_mdx_var.set('Full Model Pack') + self.modeldownload_var.set('No Model Selected') + self.modeldownload_demucs_var.set('No Model Selected') + try: + self.downloadmodelOptions.configure(state=tk.DISABLED) + self.downloadmodelOptions_demucs.configure(state=tk.DISABLED) + self.downloadmodelOptions_mdx.configure(state=tk.NORMAL) + except: + pass + if self.selectdownload_var.get() == 'Demucs': + #self.modeldownload_demucs_var.set('Demucs v3: mdx') + self.modeldownload_var.set('No Model Selected') + self.modeldownload_mdx_var.set('No Model Selected') + try: + self.downloadmodelOptions_demucs.configure(state=tk.NORMAL) + self.downloadmodelOptions.configure(state=tk.DISABLED) + self.downloadmodelOptions_mdx.configure(state=tk.DISABLED) + except: + pass + if self.demucs_only_var.get() == True: self.demucsmodel_var.set(True) self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED) elif self.demucs_only_var.get() == False: self.options_demucsmodel_Checkbutton.configure(state=tk.NORMAL) - - self.update_inputPaths() def deselect_models(self): @@ -2164,10 +2977,17 @@ class MainWindow(TkinterDnD.Tk): subprocess.Popen(f'python "{__file__}"', shell=True) exit() else: + self.settings() pass + + def shutdown(self): + """ + Shuts down the application after asking for confirmation + """ + exit() def open_newModel_filedialog(self): - """Let user paste an MDX-Net model to use for the vocal seperation""" + """Let user paste an MDX-Net model to use for the vocal Separation""" filename = 'models\MDX_Net_Models' @@ -2177,14 +2997,173 @@ class MainWindow(TkinterDnD.Tk): opener = "open" if sys.platform == "darwin" else "xdg-open" subprocess.call([opener, filename]) + + def delete_temps(self): + try: + for basename in os.listdir(download_code_temp_dir): + if basename.endswith('.aes'): + pathname = os.path.join(download_code_temp_dir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + + except: + pass + + try: + + for basename in os.listdir(download_code_temp_dir): + if basename.endswith('.txt'): + pathname = os.path.join(download_code_temp_dir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + except: + pass + + try: + srcdir = "models/Demucs_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + except: + pass + + try: + srcdir = "models/Demucs_Models/v3_repo" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + except: + pass + + try: + srcdir = "models/Main_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + except: + pass + + try: + srcdir = "models/MDX_Net_Models" + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + except: + pass + + try: + srcdir = os.path.dirname(os.path.realpath(__file__)) + + for basename in os.listdir(srcdir): + if basename.endswith('.tmp'): + pathname = os.path.join(srcdir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + except: + pass + + def reset_to_defaults(self): + self.agg_var.set(10) + self.algo_var.set('Instrumentals (Min Spec)') + self.appendensem_var.set(False) + self.audfile_var.set(True) + self.aud_mdx_var.set(True), + self.autocompensate_var.set(True) + self.channel_var.set(64) + self.chunks_var.set('Auto') + self.chunks_d_var.set('Full') + self.compensate_var.set(1.03597672895) + self.demucs_only_var.set(False) + self.demucs_stems_var.set('All Stems') + self.DemucsModel_var.set('mdx_extra') + self.demucsmodel_var.set(False) + self.DemucsModel_MDX_var.set('UVR_Demucs_Model_1') + self.demucsmodel_sel_VR_var.set('UVR_Demucs_Model_1') + self.demucsmodelVR_var.set(False) + self.dim_f_var.set(2048) + self.flactype_var.set('PCM_16') + self.gpuConversion_var.set(False) + self.inst_only_var.set(False) + self.inst_only_b_var.set(False) + self.margin_var.set(44100) + self.mdxensemchoose_var.set('MDX-Net: UVR-MDX-NET Main') + self.mdxensemchoose_b_var.set('No Model') + self.mdx_only_ensem_a_var.set('MDX-Net: UVR-MDX-NET Main') + self.mdx_only_ensem_b_var.set('MDX-Net: UVR-MDX-NET 1') + self.mdx_only_ensem_c_var.set('No Model') + self.mdx_only_ensem_d_var.set('No Model') + self.mdx_only_ensem_e_var.set('No Model') + self.mdxnetModel_var.set('UVR-MDX-NET Main') + self.mdxnetModeltype_var.set('Vocals (Custom)') + self.mixing_var.set('Default') + self.modelFolder_var.set(False) + self.instrumentalModel_var.set('') + self.ModelParams_var.set('Auto') + self.mp3bit_var.set('320k') + self.n_fft_scale_var.set(6144) + self.noise_pro_select_var.set('Auto Select') + self.noisereduc_var.set(True) + self.noisereduc_s_var.set(3) + self.non_red_var.set(False) + self.nophaseinst_var.set(False) + self.normalize_var.set(False) + self.outputImage_var.set(False) + self.overlap_var.set(0.25) + self.overlap_b_var.set(0.25) + self.postprocessing_var.set(False) + self.save_var.set(True) + self.saveFormat_var.set('Wav') + self.segment_var.set(None) + self.settest_var.set(False) + self.shifts_var.set(2) + self.shifts_b_var.set(2) + self.split_mode_var.set(True) + self.tta_var.set(False) + self.voc_only_var.set(False) + self.voc_only_b_var.set(False) + self.vrensemchoose_var.set('2_HP-UVR') + self.vrensemchoose_a_var.set('1_HP-UVR') + self.vrensemchoose_b_var.set('2_HP-UVR') + self.vrensemchoose_c_var.set('No Model') + self.vrensemchoose_d_var.set('No Model') + self.vrensemchoose_e_var.set('No Model') + self.vrensemchoose_mdx_a_var.set('No Model') + self.vrensemchoose_mdx_b_var.set('No Model') + self.vrensemchoose_mdx_c_var.set('No Model') + self.vr_multi_USER_model_param_1.set('Auto') + self.vr_multi_USER_model_param_2.set('Auto') + self.vr_multi_USER_model_param_3.set('Auto') + self.vr_multi_USER_model_param_4.set('Auto') + self.vr_basic_USER_model_param_1.set('Auto') + self.vr_basic_USER_model_param_2.set('Auto') + self.vr_basic_USER_model_param_3.set('Auto') + self.vr_basic_USER_model_param_4.set('Auto') + self.vr_basic_USER_model_param_5.set('Auto') + self.wavtype_var.set('PCM_16') + self.winSize_var.set('512') + + + def advanced_vr_options(self): """ Open Advanced VR Options - """ + """ + top=Toplevel(self) - top.geometry("600x500") - window_height = 600 + window_height = 630 window_width = 500 top.title("Advanced VR Options") @@ -2198,6 +3177,8 @@ class MainWindow(TkinterDnD.Tk): y_cordinate = int((screen_height/2) - (window_height/2)) top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + top.attributes("-topmost", True) # change title bar icon top.iconbitmap('img\\UVR-Icon-v2.ico') @@ -2224,7 +3205,7 @@ class MainWindow(TkinterDnD.Tk): frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=30) - l0=Label(frame0,text="Advanced VR Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Advanced VR Options",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0.grid(row=0,column=0,padx=0,pady=10) l0=tk.Label(frame0, text='Window Size (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9') @@ -2250,20 +3231,32 @@ class MainWindow(TkinterDnD.Tk): l0=ttk.Checkbutton(frame0, text='Save Output Image(s) of Spectrogram(s)', variable=self.outputImage_var) l0.grid(row=8,column=0,padx=0,pady=0) - l0=ttk.Checkbutton(frame0, text='Post-Process', variable=self.postprocessing_var) + l0=ttk.Checkbutton(frame0, text='Demucs Model', variable=self.demucsmodelVR_var) l0.grid(row=9,column=0,padx=0,pady=0) + def clear_cache(): + cachedir = "lib_v5/filelists/model_cache/vr_param_cache" + + for basename in os.listdir(cachedir): + if basename.endswith('.txt'): + pathname = os.path.join(cachedir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + + l0=ttk.Button(frame0,text='Clear Auto-Set Cache', command=clear_cache) + l0.grid(row=10,column=0,padx=0,pady=5) + l0=ttk.Button(frame0,text='Open VR Models Folder', command=self.open_Modelfolder_vr) - l0.grid(row=10,column=0,padx=0,pady=10) + l0.grid(row=11,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win) - l0.grid(row=11,column=0,padx=0,pady=0) + l0.grid(row=12,column=0,padx=0,pady=5) def close_win_self(): top.destroy() l0=ttk.Button(frame0,text='Close Window', command=close_win_self) - l0.grid(row=12,column=0,padx=0,pady=10) + l0.grid(row=13,column=0,padx=0,pady=5) self.ModelParamsLabel_to_path = defaultdict(lambda: '') self.lastModelParams = [] @@ -2271,46 +3264,41 @@ class MainWindow(TkinterDnD.Tk): frame0=Frame(tab2, highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=30) - l0=tk.Label(frame0,text='\nDemucs Model\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') - l0.grid(row=1,column=0,padx=0,pady=0) + l0=tk.Label(frame0,text='Demucs Model',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=1,column=0,padx=0,pady=5) l0=ttk.OptionMenu(frame0, self.demucsmodel_sel_VR_var, None, 'UVR_Demucs_Model_1', 'UVR_Demucs_Model_2', 'UVR_Demucs_Model_Bag') - l0.grid(row=2,column=0,padx=0,pady=0) + l0.grid(row=2,column=0,padx=0,pady=5) l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources and increase processing times)', font=("Century Gothic", "9"), foreground='#13a4c9') - l0.grid(row=3,column=0,padx=0,pady=10) + l0.grid(row=3,column=0,padx=0,pady=5) l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center') - l0.grid(row=4,column=0,padx=0,pady=0) + l0.grid(row=4,column=0,padx=0,pady=5) l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9') - l0.grid(row=5,column=0,padx=0,pady=10) + l0.grid(row=5,column=0,padx=0,pady=5) l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center') - l0.grid(row=6,column=0,padx=0,pady=0) + l0.grid(row=6,column=0,padx=0,pady=5) l0=tk.Label(frame0, text='Segment', font=("Century Gothic", "9"), foreground='#13a4c9') - l0.grid(row=7,column=0,padx=0,pady=10) + l0.grid(row=7,column=0,padx=0,pady=5) l0=ttk.Entry(frame0, textvariable=self.segment_var, justify='center') - l0.grid(row=8,column=0,padx=0,pady=0) + l0.grid(row=8,column=0,padx=0,pady=5) l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var) - l0.grid(row=9,column=0,padx=0,pady=10) - - self.DemucsLabel_MDX_to_path = defaultdict(lambda: '') - self.lastDemucsModels_MDX = [] + l0.grid(row=9,column=0,padx=0,pady=5) self.update_states() - - + def advanced_demucs_options(self): """ Open Advanced Demucs Options """ top= Toplevel(self) - top.geometry("750x500") window_height = 750 window_width = 500 @@ -2325,6 +3313,8 @@ class MainWindow(TkinterDnD.Tk): y_cordinate = int((screen_height/2) - (window_height/2)) top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + top.attributes("-topmost", True) # change title bar icon top.iconbitmap('img\\UVR-Icon-v2.ico') @@ -2347,7 +3337,7 @@ class MainWindow(TkinterDnD.Tk): frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=30) - l0=Label(frame0,text="Advanced Demucs Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Advanced Demucs Options",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0.grid(row=0,column=0,padx=0,pady=10) l0=tk.Label(frame0, text='Chunks (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9') @@ -2395,14 +3385,12 @@ class MainWindow(TkinterDnD.Tk): l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0.grid(row=14,column=0,padx=0,pady=0) - def advanced_mdx_options(self): """ Open Advanced MDX Options """ top= Toplevel(self) - top.geometry("740x550") window_height = 740 window_width = 550 @@ -2417,6 +3405,8 @@ class MainWindow(TkinterDnD.Tk): y_cordinate = int((screen_height/2) - (window_height/2)) top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + top.attributes("-topmost", True) # change title bar icon top.iconbitmap('img\\UVR-Icon-v2.ico') @@ -2447,7 +3437,7 @@ class MainWindow(TkinterDnD.Tk): frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=30) - l0=Label(frame0,text="Advanced MDX-Net Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Advanced MDX-Net Options",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0.grid(row=0,column=0,padx=0,pady=10) l0=tk.Label(frame0, text='Chunks (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9') @@ -2540,10 +3530,10 @@ class MainWindow(TkinterDnD.Tk): frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=30) - l0=tk.Label(frame0, text='Stem Type', font=("Century Gothic", "9"), foreground='#13a4c9') + l0=tk.Label(frame0, text=f'{space_small}Stem Type{space_small}', font=("Century Gothic", "9"), foreground='#13a4c9') l0.grid(row=1,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals (Default)', 'Other (Default)', 'Bass (Default)', 'Drums (Default)', 'Vocals (Custom)', 'Other (Custom)', 'Bass (Custom)', 'Drums (Custom)') + l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals (Custom)', 'Instrumental (Custom)', 'Other (Custom)', 'Bass (Custom)', 'Drums (Custom)') l0.grid(row=2,column=0,padx=0,pady=10) l0=tk.Label(frame0, text='N_FFT Scale', font=("Century Gothic", "9"), foreground='#13a4c9') @@ -2578,26 +3568,43 @@ class MainWindow(TkinterDnD.Tk): self.options_dim_f_Entry l0.grid(row=6,column=1,padx=0,pady=0) - self.DemucsLabel_MDX_to_path = defaultdict(lambda: '') - self.lastDemucsModels_MDX = [] + l0=ttk.Checkbutton(frame0, text='Auto-Set', variable=self.aud_mdx_var) + l0.grid(row=7,column=0,padx=0,pady=10) + + + def clear_cache(): + cachedir = "lib_v5/filelists/hashes/mdx_model_cache" + + for basename in os.listdir(cachedir): + if basename.endswith('.json'): + pathname = os.path.join(cachedir, basename) + if os.path.isfile(pathname): + os.remove(pathname) + + l0=ttk.Button(frame0, text='Clear Auto-Set Cache', command=clear_cache) + + l0.grid(row=8,column=0,padx=0,pady=10) + + self.DemucsLabel_to_path = defaultdict(lambda: '') + self.lastmdx_demuc_ensem = [] self.update_states() - def custom_ensemble(self): """ Open Ensemble Custom """ top= Toplevel(self) - top.geometry("800x680") window_height = 680 - window_width = 800 + window_width = 900 top.title("Customize Ensemble") top.resizable(False, False) # This code helps to disable windows from resizing + top.attributes("-topmost", True) + screen_width = top.winfo_screenwidth() screen_height = top.winfo_screenheight() @@ -2616,171 +3623,321 @@ class MainWindow(TkinterDnD.Tk): tabControl = ttk.Notebook(top) tab1 = ttk.Frame(tabControl) + tab2 = ttk.Frame(tabControl) + tab3 = ttk.Frame(tabControl) tabControl.add(tab1, text ='Ensemble Options') + tabControl.add(tab2, text ='More Options') + tabControl.add(tab3, text ='VR Model Param Settings') tabControl.pack(expand = 1, fill ="both") tab1.grid_rowconfigure(0, weight=1) tab1.grid_columnconfigure(0, weight=1) + + tab2.grid_rowconfigure(0, weight=1) + tab2.grid_columnconfigure(0, weight=1) + + tab3.grid_rowconfigure(0, weight=1) + tab3.grid_columnconfigure(0, weight=1) + + mdx_demuc_en = '' + mdx_demuc_en = lib_v5.filelist.get_mdx_demucs_en_list(mdx_demuc_en) + mdx_demuc_en_list = mdx_demuc_en + + vr_en = '' + vr_en = lib_v5.filelist.get_vr_en_list(vr_en) + vr_en_list = vr_en frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=30) - l0=Label(frame0,text="Multi-AI Ensemble Options",font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4") + mdx_only_ensem_a = self.mdx_only_ensem_a_var.get() + mdx_only_ensem_b = self.mdx_only_ensem_b_var.get() + mdx_only_ensem_c = self.mdx_only_ensem_c_var.get() + mdx_only_ensem_d = self.mdx_only_ensem_d_var.get() + mdx_only_ensem_e = self.mdx_only_ensem_e_var.get() + mdxensemchoose_b = self.mdxensemchoose_b_var.get() + mdxensemchoose = self.mdxensemchoose_var.get() + vrensemchoose_a = self.vrensemchoose_a_var.get() + vrensemchoose_b = self.vrensemchoose_b_var.get() + vrensemchoose_c = self.vrensemchoose_c_var.get() + vrensemchoose_d = self.vrensemchoose_d_var.get() + vrensemchoose_e = self.vrensemchoose_e_var.get() + vrensemchoose_mdx_a = self.vrensemchoose_mdx_a_var.get() + vrensemchoose_mdx_b = self.vrensemchoose_mdx_b_var.get() + vrensemchoose_mdx_c = self.vrensemchoose_mdx_c_var.get() + vrensemchoose = self.vrensemchoose_var.get() + + l0=tk.Label(frame0,text="Multi-AI Ensemble Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") l0.grid(row=1,column=0,padx=20,pady=10) - l0=tk.Label(frame0,text='MDX-Net or Demucs Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0=tk.Label(frame0,text=f"{space_small}MDX-Net or Demucs Model 1{space_small}\n",font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=2,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.mdxensemchoose_var, None, 'UVR-MDX-NET Main', 'UVR-MDX-NET 1', 'UVR-MDX-NET 2', 'UVR-MDX-NET 3', - 'UVR-MDX-NET Karaoke', 'Demucs UVR Model 1', 'Demucs UVR Model 2', 'Demucs mdx_extra', 'Demucs mdx_extra_q') + l0=ttk.OptionMenu(frame0, self.mdxensemchoose_var, *mdx_demuc_en_list) l0.grid(row=3,column=0,padx=0,pady=0) l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=4,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.mdxensemchoose_b_var, None, 'No Model', 'UVR-MDX-NET Main', 'UVR-MDX-NET 1', 'UVR-MDX-NET 2', 'UVR-MDX-NET 3', - 'UVR-MDX-NET Karaoke', 'Demucs UVR Model 1', 'Demucs UVR Model 2', 'Demucs mdx_extra', 'Demucs mdx_extra_q') + l0=ttk.OptionMenu(frame0, self.mdxensemchoose_b_var, *mdx_demuc_en_list) l0.grid(row=5,column=0,padx=0,pady=0) - + l0=tk.Label(frame0,text='\nVR Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=6,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_var, *vr_en_list) l0.grid(row=7,column=0,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=8,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_a_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_a_var, *vr_en_list) l0.grid(row=9,column=0,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=10,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_b_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_b_var, *vr_en_list) l0.grid(row=11,column=0,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=12,column=0,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_c_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_mdx_c_var, *vr_en_list) l0.grid(row=13,column=0,padx=0,pady=0) - l0=Label(frame0,text="Basic VR Ensemble Options",font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Basic VR Ensemble Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") l0.grid(row=1,column=1,padx=20,pady=10) - l0=tk.Label(frame0,text='VR Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0=tk.Label(frame0,text=f'{space_medium}VR Model 1{space_medium}\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=2,column=1,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_a_var, None, '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_a_var, *vr_en_list) l0.grid(row=3,column=1,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=4,column=1,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_b_var, None, '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_b_var, *vr_en_list) l0.grid(row=5,column=1,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=6,column=1,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_c_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_c_var, *vr_en_list) l0.grid(row=7,column=1,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=8,column=1,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_d_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_d_var, *vr_en_list) l0.grid(row=9,column=1,padx=0,pady=0) l0=tk.Label(frame0,text='\nVR Model 5\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') l0.grid(row=10,column=1,padx=0,pady=0) - l0=ttk.OptionMenu(frame0, self.vrensemchoose_e_var, None, 'No Model', '1_HP-UVR', '2_HP-UVR', '3_HP-Vocal-UVR', - '4_HP-Vocal-UVR', '5_HP-Karaoke-UVR', '6_HP-Karaoke-UVR', '7_HP2-UVR', '8_HP2-UVR', - '9_HP2-UVR', '10_SP-UVR-2B-32000-1', '11_SP-UVR-2B-32000-2', '12_SP-UVR-3B-44100', '13_SP-UVR-4B-44100-1', - '14_SP-UVR-4B-44100-2', '15_SP-UVR-MID-44100-1', '16_SP-UVR-MID-44100-2', - 'MGM_MAIN_v4', 'MGM_HIGHEND_v4', 'MGM_LOWEND_A_v4', 'MGM_LOWEND_B_v4') + l0=ttk.OptionMenu(frame0, self.vrensemchoose_e_var, *vr_en_list) l0.grid(row=11,column=1,padx=0,pady=0) + l0=tk.Label(frame0,text="Basic MD Ensemble Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") + l0.grid(row=1,column=2,padx=20,pady=10) + + l0=tk.Label(frame0,text=f'{space_small}MDX-Net or Demucs Model 1{space_small}\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=2,column=2,padx=0,pady=0) + + l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_a_var, *mdx_demuc_en_list) + l0.grid(row=3,column=2,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=4,column=2,padx=0,pady=0) + + l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_b_var, *mdx_demuc_en_list) + l0.grid(row=5,column=2,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=6,column=2,padx=0,pady=0) + + l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_c_var, *mdx_demuc_en_list) + l0.grid(row=7,column=2,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=8,column=2,padx=0,pady=0) + + l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_d_var, *mdx_demuc_en_list) + l0.grid(row=9,column=2,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nMDX-Net or Demucs Model 5\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=10,column=2,padx=0,pady=0) + + l0=ttk.OptionMenu(frame0, self.mdx_only_ensem_e_var, *mdx_demuc_en_list) + l0.grid(row=11,column=2,padx=0,pady=0) + def close_win_self(): top.destroy() l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0.grid(row=13,column=1,padx=20,pady=0) - l0=Label(frame0,text="Additional Options",font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4") - l0.grid(row=1,column=2,padx=0,pady=10) + l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win) + l0.grid(row=13,column=2,padx=20,pady=0) + + self.mdx_only_ensem_a_var.set(mdx_only_ensem_a) + self.mdx_only_ensem_b_var.set(mdx_only_ensem_b) + self.mdx_only_ensem_c_var.set(mdx_only_ensem_c) + self.mdx_only_ensem_d_var.set(mdx_only_ensem_d) + self.mdx_only_ensem_e_var.set(mdx_only_ensem_e) + self.mdxensemchoose_b_var.set(mdxensemchoose_b) + self.mdxensemchoose_var.set(mdxensemchoose) + self.vrensemchoose_a_var.set(vrensemchoose_a) + self.vrensemchoose_b_var.set(vrensemchoose_b) + self.vrensemchoose_c_var.set(vrensemchoose_c) + self.vrensemchoose_d_var.set(vrensemchoose_d) + self.vrensemchoose_e_var.set(vrensemchoose_e) + self.vrensemchoose_mdx_a_var.set(vrensemchoose_mdx_a) + self.vrensemchoose_mdx_b_var.set(vrensemchoose_mdx_b) + self.vrensemchoose_mdx_c_var.set(vrensemchoose_mdx_c) + self.vrensemchoose_var.set(vrensemchoose) + + frame0=Frame(tab2, highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=30) + + l0=tk.Label(frame0,text="Additional Options",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") + l0.grid(row=1,column=1,padx=0,pady=10) l0=ttk.Checkbutton(frame0, text='Append Ensemble Name to Final Output', variable=self.appendensem_var) - l0.grid(row=2,column=2,padx=0,pady=0) + l0.grid(row=2,column=1,padx=0,pady=5) l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog) - l0.grid(row=3,column=2,padx=0,pady=0) + l0.grid(row=3,column=1,padx=0,pady=5) - l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win) - l0.grid(row=4,column=2,padx=0,pady=0) - - l0=tk.Label(frame0,text='Additional VR Architecture Options',font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4") - l0.grid(row=5,column=2,padx=0,pady=0) + l0=tk.Label(frame0,text='Additional VR Architecture Options',font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") + l0.grid(row=5,column=1,padx=0,pady=5) l0=ttk.Checkbutton(frame0, text='Post-Process', variable=self.postprocessing_var) - l0.grid(row=6,column=2,padx=0,pady=0) + l0.grid(row=6,column=1,padx=0,pady=5) l0=ttk.Checkbutton(frame0, text='Save Output Image(s) of Spectrogram(s)', variable=self.outputImage_var) - l0.grid(row=7,column=2,padx=0,pady=0) + l0.grid(row=7,column=1,padx=0,pady=5) - l0=tk.Label(frame0,text='Additional Demucs v3 Options',font=("Century Gothic", "10", "bold", "underline"), justify="center", fg="#f4f4f4") - l0.grid(row=8,column=2,padx=0,pady=0) + l0=tk.Label(frame0,text='Additional Demucs Options',font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") + l0.grid(row=8,column=1,padx=0,pady=5) l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources)', font=("Century Gothic", "9"), foreground='#13a4c9') - l0.grid(row=9,column=2,padx=0,pady=0) + l0.grid(row=9,column=1,padx=0,pady=5) l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center') - l0.grid(row=10,column=2,padx=0,pady=0) + l0.grid(row=10,column=1,padx=0,pady=5) l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9') - l0.grid(row=11,column=2,padx=0,pady=0) + l0.grid(row=11,column=1,padx=0,pady=5) l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center') - l0.grid(row=12,column=2,padx=0,pady=0) + l0.grid(row=12,column=1,padx=0,pady=5) l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var) - l0.grid(row=13,column=2,padx=0,pady=0) + l0.grid(row=13,column=1,padx=0,pady=0) + + frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=30) + + def set_auto(): + self.vr_multi_USER_model_param_1.set('Auto') + self.vr_multi_USER_model_param_2.set('Auto') + self.vr_multi_USER_model_param_3.set('Auto') + self.vr_multi_USER_model_param_4.set('Auto') + self.vr_basic_USER_model_param_1.set('Auto') + self.vr_basic_USER_model_param_2.set('Auto') + self.vr_basic_USER_model_param_3.set('Auto') + self.vr_basic_USER_model_param_4.set('Auto') + self.vr_basic_USER_model_param_5.set('Auto') + + l0=tk.Label(frame0,text="Multi-AI Ensemble VR Model Params",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") + l0.grid(row=1,column=0,padx=20,pady=10) + + l0=tk.Label(frame0,text='\nVR Model 1\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=2,column=0,padx=0,pady=0) + + self.options_ModelParams_a_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_1) + + self.options_ModelParams_a_Optionmenu + l0.grid(row=3,column=0,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=4,column=0,padx=0,pady=0) + + self.options_ModelParams_b_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_2) + + self.options_ModelParams_b_Optionmenu + l0.grid(row=5,column=0,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=6,column=0,padx=0,pady=0) + + self.options_ModelParams_c_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_3) + + self.options_ModelParams_c_Optionmenu + l0.grid(row=7,column=0,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=8,column=0,padx=0,pady=0) + + self.options_ModelParams_d_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_multi_USER_model_param_4) + + self.options_ModelParams_d_Optionmenu + l0.grid(row=9,column=0,padx=0,pady=0) + + l0=ttk.Button(frame0,text='Set All to Auto', command=set_auto) + l0.grid(row=11,column=0,padx=0,pady=0) + + l0=tk.Label(frame0,text="Basic VR Ensemble Model Params",font=("Century Gothic", "11", "underline"), justify="center", fg="#f4f4f4") + l0.grid(row=1,column=1,padx=20,pady=10) + + l0=tk.Label(frame0,text=f'{space_medium}VR Model 1{space_medium}\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=2,column=1,padx=0,pady=0) + + self.options_ModelParams_1_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_1) + + self.options_ModelParams_1_Optionmenu + l0.grid(row=3,column=1,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 2\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=4,column=1,padx=0,pady=0) + + self.options_ModelParams_2_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_2) + + self.options_ModelParams_2_Optionmenu + l0.grid(row=5,column=1,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 3\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=6,column=1,padx=0,pady=0) + + self.options_ModelParams_3_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_3) + + self.options_ModelParams_3_Optionmenu + l0.grid(row=7,column=1,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 4\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=8,column=1,padx=0,pady=0) + + self.options_ModelParams_4_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_4) + + self.options_ModelParams_4_Optionmenu + l0.grid(row=9,column=1,padx=0,pady=0) + + l0=tk.Label(frame0,text='\nVR Model 5\n',font=("Century Gothic", "9"), justify="center", foreground='#13a4c9') + l0.grid(row=10,column=1,padx=0,pady=0) + + self.options_ModelParams_5_Optionmenu = l0=ttk.OptionMenu(frame0, self.vr_basic_USER_model_param_5) + + self.options_ModelParams_5_Optionmenu + l0.grid(row=11,column=1,padx=0,pady=0) + + self.ModelParamsLabel_ens_to_path = defaultdict(lambda: '') + self.lastModelParams_ens = [] + + self.update_states() def help(self): """ @@ -2788,21 +3945,20 @@ class MainWindow(TkinterDnD.Tk): """ top= Toplevel(self) if GetSystemMetrics(1) >= 900: - top.geometry("1080x810") window_height = 810 window_width = 1080 elif GetSystemMetrics(1) <= 720: - top.geometry("930x640") window_height = 640 window_width = 930 else: - top.geometry("930x670") window_height = 670 window_width = 930 top.title("UVR Help Guide") top.resizable(False, False) # This code helps to disable windows from resizing + top.attributes("-topmost", True) + screen_width = top.winfo_screenwidth() screen_height = top.winfo_screenheight() @@ -2828,7 +3984,6 @@ class MainWindow(TkinterDnD.Tk): tab6 = ttk.Frame(tabControl) tab7 = ttk.Frame(tabControl) tab8 = ttk.Frame(tabControl) - tab9 = ttk.Frame(tabControl) tabControl.add(tab1, text ='General') tabControl.add(tab2, text ='VR Architecture') @@ -2838,7 +3993,6 @@ class MainWindow(TkinterDnD.Tk): tabControl.add(tab6, text ='Manual Ensemble') tabControl.add(tab7, text ='More Info') tabControl.add(tab8, text ='Credits') - tabControl.add(tab9, text ='Updates') tabControl.pack(expand = 1, fill ="both") @@ -2850,9 +4004,6 @@ class MainWindow(TkinterDnD.Tk): tab8.grid_rowconfigure(0, weight=1) tab8.grid_columnconfigure(0, weight=1) - tab9.grid_rowconfigure(0, weight=1) - tab9.grid_columnconfigure(0, weight=1) - tk.Button(tab1, image=self.gen_opt_img, borderwidth=0, command=close_win).grid(column = 0, row = 0, padx = 87, @@ -2888,13 +4039,13 @@ class MainWindow(TkinterDnD.Tk): frame0.grid(row=0,column=0,padx=0,pady=30) if GetSystemMetrics(1) >= 900: - l0=Label(frame0,text="Notes",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Notes",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=1,column=0,padx=20,pady=10) - l0=Label(frame0,text="UVR is 100% free and open-source but MIT licensed.\nAll the models provided as part of UVR were trained by its core developers.\nPlease credit the core UVR developers if you choose to use any of our models or code for projects unrelated to UVR.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="UVR is 100% free and open-source but MIT licensed.\nAll the models provided as part of UVR were trained by its core developers.\nPlease credit the core UVR developers if you choose to use any of our models or code for projects unrelated to UVR.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") l0.grid(row=2,column=0,padx=10,pady=7) - l0=Label(frame0,text="Resources",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Resources",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=3,column=0,padx=20,pady=7, sticky=N) link = Label(frame0, text="Ultimate Vocal Remover (Official GitHub)",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2902,7 +4053,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/Anjok07/ultimatevocalremovergui")) - l0=Label(frame0,text="You can find updates, report issues, and give us a shout via our official GitHub.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="You can find updates, report issues, and give us a shout via our official GitHub.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") l0.grid(row=5,column=0,padx=10,pady=7) link = Label(frame0, text="SoX - Sound eXchange",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2910,7 +4061,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download")) - l0=Label(frame0,text="UVR relies on SoX for Noise Reduction. It's automatically included via the UVR installer but not the developer build.\nIf you are missing SoX, please download it via the link and extract the SoX archive to the following directory - lib_v5/sox",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="UVR relies on SoX for Noise Reduction. It's automatically included via the UVR installer but not the developer build.\nIf you are missing SoX, please download it via the link and extract the SoX archive to the following directory - lib_v5/sox",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") l0.grid(row=7,column=0,padx=10,pady=7) link = Label(frame0, text="FFmpeg",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2918,7 +4069,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://www.wikihow.com/Install-FFmpeg-on-Windows")) - l0=Label(frame0,text="UVR relies on FFmpeg for processing non-wav audio files.\nIt's automatically included via the UVR installer but not the developer build.\nIf you are missing FFmpeg, please see the installation guide via the link provided.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="UVR relies on FFmpeg for processing non-wav audio files.\nIt's automatically included via the UVR installer but not the developer build.\nIf you are missing FFmpeg, please see the installation guide via the link provided.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") l0.grid(row=9,column=0,padx=10,pady=7) link = Label(frame0, text="X-Minus AI",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2926,7 +4077,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://x-minus.pro/ai")) - l0=Label(frame0,text="Many of the models provided are also on X-Minus.\nThis resource primarily benefits users without the computing resources to run the GUI or models locally.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Many of the models provided are also on X-Minus.\nThis resource primarily benefits users without the computing resources to run the GUI or models locally.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") l0.grid(row=11,column=0,padx=10,pady=7) link = Label(frame0, text="Official UVR Patreon",font=("Century Gothic", "14", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2934,7 +4085,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://www.patreon.com/uvr")) - l0=Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!\nOfficial UVR Patreons will receive VIP access to additional models as well as pre-releases.",font=("Century Gothic", "13"), justify="center", fg="#F6F6F7") l0.grid(row=13,column=0,padx=10,pady=7) frame0=Frame(tab8,highlightbackground='red',highlightthicknes=0) @@ -2942,22 +4093,22 @@ class MainWindow(TkinterDnD.Tk): #inside frame0 - l0=Label(frame0,text="Core UVR Developers",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Core UVR Developers",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=0,column=0,padx=20,pady=5, sticky=N) - l0=Label(frame0,image=self.credits_img,font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,image=self.credits_img,font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") l0.grid(row=1,column=0,padx=10,pady=5) - l0=Label(frame0,text="Anjok07\nAufr33",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Anjok07\nAufr33",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") l0.grid(row=2,column=0,padx=10,pady=5) - l0=Label(frame0,text="Special Thanks",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Special Thanks",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=4,column=0,padx=20,pady=10) - l0=Label(frame0,text="DilanBoskan",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="DilanBoskan",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") l0.grid(row=5,column=0,padx=10,pady=5) - l0=Label(frame0,text="Your contributions at the start of this project were essential to the success of UVR. Thank you!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Your contributions at the start of this project were essential to the success of UVR. Thank you!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=6,column=0,padx=0,pady=0) link = Label(frame0, text="Tsurumeso",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2965,7 +4116,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/tsurumeso/vocal-remover")) - l0=Label(frame0,text="Developed the original VR Architecture AI code.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Developed the original VR Architecture AI code.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=8,column=0,padx=0,pady=0) link = Label(frame0, text="Kuielab & Woosung Choi",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2973,13 +4124,13 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/kuielab")) - l0=Label(frame0,text="Developed the original MDX-Net AI code.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Developed the original MDX-Net AI code.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=10,column=0,padx=0,pady=0) - l0=Label(frame0,text="Bas Curtiz",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Bas Curtiz",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") l0.grid(row=11,column=0,padx=10,pady=5) - l0=Label(frame0,text="Designed the official UVR logo, icon, banner, splash screen, and interface.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Designed the official UVR logo, icon, banner, splash screen, and interface.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=12,column=0,padx=0,pady=0) link = Label(frame0, text="Adefossez & Demucs",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9", cursor="hand2") @@ -2987,71 +4138,29 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/facebookresearch/demucs")) - l0=Label(frame0,text="Core developer of Facebook's Demucs Music Source Separation.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Core developer of Facebook's Demucs Music Source Separation.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=14,column=0,padx=0,pady=0) - l0=Label(frame0,text="Audio Separation Discord Community",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Audio Separation Discord Community",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") l0.grid(row=15,column=0,padx=10,pady=5) - l0=Label(frame0,text="Thank you for the support!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Thank you for the support!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=16,column=0,padx=0,pady=0) - l0=Label(frame0,text="CC Karokee & Friends Discord Community",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="CC Karokee & Friends Discord Community",font=("Century Gothic", "13", "bold"), justify="center", fg="#13a4c9") l0.grid(row=17,column=0,padx=10,pady=5) - l0=Label(frame0,text="Thank you for the support!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Thank you for the support!",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=18,column=0,padx=0,pady=0) - frame0=Frame(tab9,highlightbackground='red',highlightthicknes=0) - frame0.grid(row=0,column=0,padx=0,pady=30) - - l0=Label(frame0,text="Update Details",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=1,column=0,padx=20,pady=10) - - l0=Label(frame0,text="Installing Model Expansion Pack",font=("Century Gothic", "13", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=2,column=0,padx=0,pady=0) - - l0=Label(frame0,text="1. Download the model expansion pack via the provided link below.\n2. Once the download has completed, click the \"Open Models Directory\" button below.\n3. Extract the \'Main Models\' folder within the downloaded archive to the opened \"models\" directory.\n4. Without restarting the application, you will now see the new models appear under the VR Architecture model selection list.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4") - l0.grid(row=3,column=0,padx=0,pady=0) - - link = Label(frame0, text="Model Expansion Pack",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") - link.grid(row=4,column=0,padx=10,pady=10) - link.bind("", lambda e: - callback("https://github.com/Anjok07/ultimatevocalremovergui/releases/tag/v5.2.0")) - - l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog) - l0.grid(row=5,column=0,padx=0,pady=0) - - l0=Label(frame0,text="\n\nBackward Compatibility",font=("Century Gothic", "13", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=6,column=0,padx=0,pady=0) - - l0=Label(frame0,text="The v4 Models are fully compatible with this GUI. \n1. If you already have them on your system, click the \"Open Models Directory\" button below. \n2. Place the files with extension \".pth\" into the \"Main Models\" directory. \n3. Now they will automatically appear in the VR Architecture model selection list.\n Note: The v2 models are not compatible with this GUI.\n",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4") - l0.grid(row=7,column=0,padx=0,pady=0) - - l0=ttk.Button(frame0,text='Open Models Directory', command=self.open_Modelfolder_filedialog) - l0.grid(row=8,column=0,padx=0,pady=0) - - l0=Label(frame0,text="\n\nInstalling Future Updates",font=("Century Gothic", "13", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=9,column=0,padx=0,pady=0) - - l0=Label(frame0,text="New updates and patches for this application can be found on the official UVR Releases GitHub page (link below).\nAny new update instructions will likely require the use of the \"Open Application Directory\" button below.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4") - l0.grid(row=10,column=0,padx=0,pady=0) - - link = Label(frame0, text="UVR Releases GitHub Page",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") - link.grid(row=11,column=0,padx=10,pady=10) - link.bind("", lambda e: - callback("https://github.com/Anjok07/ultimatevocalremovergui/releases")) - - l0=ttk.Button(frame0,text='Open Application Directory', command=self.open_appdir_filedialog) - l0.grid(row=12,column=0,padx=0,pady=0) else: - l0=Label(frame0,text="Notes",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Notes",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=1,column=0,padx=5,pady=5) - l0=Label(frame0,text="UVR is 100% free and open-source but MIT licensed.\nPlease credit the core UVR developers if you choose to use any of our models or code for projects unrelated to UVR.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="UVR is 100% free and open-source but MIT licensed.\nPlease credit the core UVR developers if you choose to use any of our models or code for projects unrelated to UVR.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=2,column=0,padx=5,pady=5) - l0=Label(frame0,text="Resources",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Resources",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=3,column=0,padx=5,pady=5, sticky=N) link = Label(frame0, text="Ultimate Vocal Remover (Official GitHub)",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3059,7 +4168,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/Anjok07/ultimatevocalremovergui")) - l0=Label(frame0,text="You can find updates, report issues, and give us a shout via our official GitHub.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="You can find updates, report issues, and give us a shout via our official GitHub.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=5,column=0,padx=5,pady=5) link = Label(frame0, text="SoX - Sound eXchange",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3067,7 +4176,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download")) - l0=Label(frame0,text="UVR relies on SoX for Noise Reduction. It's automatically included via the UVR installer but not the developer build.\nIf you are missing SoX, please download it via the link and extract the SoX archive to the following directory - lib_v5/sox",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="UVR relies on SoX for Noise Reduction. It's automatically included via the UVR installer but not the developer build.\nIf you are missing SoX, please download it via the link and extract the SoX archive to the following directory - lib_v5/sox",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=7,column=0,padx=5,pady=5) link = Label(frame0, text="FFmpeg",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3075,7 +4184,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://www.wikihow.com/Install-FFmpeg-on-Windows")) - l0=Label(frame0,text="UVR relies on FFmpeg for processing non-wav audio files.\nIf you are missing FFmpeg, please see the installation guide via the link provided.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="UVR relies on FFmpeg for processing non-wav audio files.\nIf you are missing FFmpeg, please see the installation guide via the link provided.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=9,column=0,padx=5,pady=5) link = Label(frame0, text="X-Minus AI",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3083,7 +4192,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://x-minus.pro/ai")) - l0=Label(frame0,text="Many of the models provided are also on X-Minus.\nThis resource primarily benefits users without the computing resources to run the GUI or models locally.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Many of the models provided are also on X-Minus.\nThis resource primarily benefits users without the computing resources to run the GUI or models locally.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=11,column=0,padx=5,pady=5) link = Label(frame0, text="Official UVR Patreon",font=("Century Gothic", "11", "underline"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3091,7 +4200,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://www.patreon.com/uvr")) - l0=Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="If you wish to support and donate to this project, click the link above and become a Patreon!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=13,column=0,padx=5,pady=5) frame0=Frame(tab8,highlightbackground='red',highlightthicknes=0) @@ -3099,22 +4208,22 @@ class MainWindow(TkinterDnD.Tk): #inside frame0 - l0=Label(frame0,text="Core UVR Developers",font=("Century Gothic", "12", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Core UVR Developers",font=("Century Gothic", "12", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=0,column=0,padx=20,pady=5, sticky=N) - l0=Label(frame0,image=self.credits_img,font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,image=self.credits_img,font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") l0.grid(row=1,column=0,padx=5,pady=5) - l0=Label(frame0,text="Anjok07\nAufr33",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Anjok07\nAufr33",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") l0.grid(row=2,column=0,padx=5,pady=5) - l0=Label(frame0,text="Special Thanks",font=("Century Gothic", "10", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Special Thanks",font=("Century Gothic", "10", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=4,column=0,padx=20,pady=10) - l0=Label(frame0,text="DilanBoskan",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="DilanBoskan",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") l0.grid(row=5,column=0,padx=5,pady=5) - l0=Label(frame0,text="Your contributions at the start of this project were essential to the success of UVR. Thank you!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Your contributions at the start of this project were essential to the success of UVR. Thank you!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=6,column=0,padx=0,pady=0) link = Label(frame0, text="Tsurumeso",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3122,7 +4231,7 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/tsurumeso/vocal-remover")) - l0=Label(frame0,text="Developed the original VR Architecture AI code.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Developed the original VR Architecture AI code.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=8,column=0,padx=0,pady=0) link = Label(frame0, text="Kuielab & Woosung Choi",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3130,13 +4239,13 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/kuielab")) - l0=Label(frame0,text="Developed the original MDX-Net AI code.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Developed the original MDX-Net AI code.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=10,column=0,padx=0,pady=0) - l0=Label(frame0,text="Bas Curtiz",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Bas Curtiz",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") l0.grid(row=11,column=0,padx=5,pady=5) - l0=Label(frame0,text="Designed the official UVR logo, icon, banner, splash screen, and interface.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Designed the official UVR logo, icon, banner, splash screen, and interface.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=12,column=0,padx=0,pady=0) link = Label(frame0, text="Adefossez & Demucs",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9", cursor="hand2") @@ -3144,73 +4253,56 @@ class MainWindow(TkinterDnD.Tk): link.bind("", lambda e: callback("https://github.com/facebookresearch/demucs")) - l0=Label(frame0,text="Core developer of Facebook's Demucs Music Source Separation.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="Core developer of Facebook's Demucs Music Source Separation.",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=14,column=0,padx=0,pady=0) - l0=Label(frame0,text="Audio Separation and CC Karokee & Friends Discord Communities",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Audio Separation and CC Karokee & Friends Discord Communities",font=("Century Gothic", "11", "bold"), justify="center", fg="#13a4c9") l0.grid(row=15,column=0,padx=5,pady=5) - l0=Label(frame0,text="Thank you for the support!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") - l0.grid(row=16,column=0,padx=0,pady=0) + l0=tk.Label(frame0,text="Thank you for the support!",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0.grid(row=16,column=0,padx=0,pady=0) - frame0=Frame(tab9,highlightbackground='red',highlightthicknes=0) - frame0.grid(row=0,column=0,padx=0,pady=30) - - l0=Label(frame0,text="Update Details",font=("Century Gothic", "12", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=1,column=0,padx=20,pady=5) - - l0=Label(frame0,text="Installing Model Expansion Pack",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=2,column=0,padx=0,pady=0) - - l0=Label(frame0,text="1. Download the model expansion pack via the provided link below.\n2. Once the download has completed, click the \"Open Models Directory\" button below.\n3. Extract the \'Main Models\' folder within the downloaded archive to the opened \"models\" directory.\n4. Without restarting the application, you will now see the new models appear under the VR Architecture model selection list.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4") - l0.grid(row=3,column=0,padx=0,pady=0) - - link = Label(frame0, text="Model Expansion Pack",font=("Century Gothic", "10", "bold"), justify="center", fg="#13a4c9", cursor="hand2") - link.grid(row=4,column=0,padx=5,pady=5) - link.bind("", lambda e: - callback("https://github.com/Anjok07/ultimatevocalremovergui/releases/tag/v5.2.0")) - - l0=Button(frame0,text='Open Models Directory',font=("Century Gothic", "8"), command=self.open_Modelfolder_filedialog, justify="left", wraplength=1000, bg="black", relief="ridge") - l0.grid(row=5,column=0,padx=0,pady=0) - - l0=Label(frame0,text="\nBackward Compatibility",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=6,column=0,padx=0,pady=0) - - l0=Label(frame0,text="The v4 Models are fully compatible with this GUI. \n1. If you already have them on your system, click the \"Open Models Directory\" button below. \n2. Place the files with extension \".pth\" into the \"Main Models\" directory. \n3. Now they will automatically appear in the VR Architecture model selection list.\n Note: The v2 models are not compatible with this GUI.\n",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4") - l0.grid(row=7,column=0,padx=0,pady=0) - - l0=Button(frame0,text='Open Models Directory',font=("Century Gothic", "8"), command=self.open_Modelfolder_filedialog, justify="left", wraplength=1000, bg="black", relief="ridge") - l0.grid(row=8,column=0,padx=0,pady=0) - - l0=Label(frame0,text="\nInstalling Future Updates",font=("Century Gothic", "11", "bold"), justify="center", fg="#f4f4f4") - l0.grid(row=9,column=0,padx=0,pady=0) - - l0=Label(frame0,text="New updates and patches for this application can be found on the official UVR Releases GitHub page (link below).\nAny new update instructions will likely require the use of the \"Open Application Directory\" button below.",font=("Century Gothic", "11"), justify="center", fg="#f4f4f4") - l0.grid(row=10,column=0,padx=0,pady=0) - - link = Label(frame0, text="UVR Releases GitHub Page",font=("Century Gothic", "10", "bold"), justify="center", fg="#13a4c9", cursor="hand2") - link.grid(row=11,column=0,padx=5,pady=5) - link.bind("", lambda e: - callback("https://github.com/Anjok07/ultimatevocalremovergui/releases")) - - l0=Button(frame0,text='Open Application Directory',font=("Century Gothic", "8"), command=self.open_appdir_filedialog, justify="left", wraplength=1000, bg="black", relief="ridge") - l0.grid(row=12,column=0,padx=0,pady=0) - - - def settings(self): + def settings(self, choose=False): """ Open Settings """ + + self.delete_temps() + + update_var = tk.StringVar(value='') + update_button_var = tk.StringVar(value='Check for Updates') + + try: + url_u = update_signal_url + file = urllib.request.urlopen(url_u) + for line in file: + patch_name = line.decode("utf-8") + if patch_name == current_version: + update_var.set('UVR Version Current') + update_button_var.set('Check for Updates') + else: + label_set_a = f"Update Found: {patch_name}" + update_var.set(str(label_set_a)) + update_button_var.set('Click Here to Update') + relf="ridge" + except: + relf="flat" + update_button_var.set('Check for Updates') + update_var.set('') + + update_set_var = tk.StringVar(value='UVR Version Current') + top= Toplevel(self) - top.geometry("600x500") - window_height = 600 + window_height = 750 window_width = 500 top.title("Settings Guide") top.resizable(False, False) # This code helps to disable windows from resizing + top.attributes("-topmost", True) + screen_width = top.winfo_screenwidth() screen_height = top.winfo_screenheight() @@ -3221,41 +4313,140 @@ class MainWindow(TkinterDnD.Tk): # change title bar icon top.iconbitmap('img\\UVR-Icon-v2.ico') + + def askyesorno(): + """ + Ask to Update + """ + + top_dialoge= Toplevel() + + window_height = 250 + window_width = 370 + + top_dialoge.title("Update Found") + + top_dialoge.resizable(False, False) # This code helps to disable windows from resizing + + top_dialoge.lift() + + top_dialoge.attributes("-topmost", True) + + top.attributes("-topmost", False) + + screen_width = top_dialoge.winfo_screenwidth() + screen_height = top_dialoge.winfo_screenheight() + + x_cordinate = int((screen_width/2) - (window_width/2)) + y_cordinate = int((screen_height/2) - (window_height/2)) + + top_dialoge.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + # change title bar icon + top_dialoge.iconbitmap('img\\UVR-Icon-v2.ico') + + tabControl = ttk.Notebook(top_dialoge) + + tabControl.pack(expand = 1, fill ="both") + + tabControl.grid_rowconfigure(0, weight=1) + tabControl.grid_columnconfigure(0, weight=1) + + def no(): + top.attributes("-topmost", True) + top_dialoge.destroy() + + def yes(): + download_update() + top.attributes("-topmost", True) + top_dialoge.destroy() + + frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=0) + + l0=tk.Label(frame0, text='Update Found', font=("Century Gothic", "13", "underline"), foreground='#13a4c9') + l0.grid(row=0,column=0,padx=0,pady=10) + + l0=tk.Label(frame0, text='Are you sure you want to continue?\n\nThe application will need to be restarted.\n', font=("Century Gothic", "11"), foreground='#13a4c9') + l0.grid(row=1,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, text='Yes', command=yes) + + l0.grid(row=2,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, text='No', command=no) + + l0.grid(row=3,column=0,padx=0,pady=5) + + def check_updates(): + + url = "https://raw.githubusercontent.com/TRvlvr/application_data/main/update_patches.txt" + file = urllib.request.urlopen(url) + for line in file: + patch_name = line.decode("utf-8") + + if patch_name == current_version: + update_var.set('UVR Version Current') + else: + label_set = f"Update Found: {patch_name}" + update_var.set(str(label_set)) + update_set_var.set(str(label_set)) + + askyesorno() + + + def change_event(): + self.delete_temps() + try: + stop_thread() + except: + pass + try: + top_code.destroy() + except: + pass + top.destroy() def close_win_custom_ensemble(): - top.destroy() + change_event() self.custom_ensemble() def close_win_advanced_mdx_options(): - top.destroy() + change_event() self.advanced_mdx_options() def close_win_advanced_demucs_options(): - top.destroy() + change_event() self.advanced_demucs_options() def close_win_advanced_vr_options(): - top.destroy() + change_event() self.advanced_vr_options() def close_win_error_log(): - top.destroy() + change_event() self.error_log() def close_win_help(): - top.destroy() + change_event() self.help() def close_win(): + change_event() + + def restart(): top.destroy() + self.restart() tabControl = ttk.Notebook(top) tab1 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl) + tab3 = ttk.Frame(tabControl) tabControl.add(tab1, text ='Settings Guide') tabControl.add(tab2, text ='Audio Format Settings') + tabControl.add(tab3, text ='Download Center') tabControl.pack(expand = 1, fill ="both") @@ -3264,47 +4455,68 @@ class MainWindow(TkinterDnD.Tk): tab2.grid_rowconfigure(0, weight=1) tab2.grid_columnconfigure(0, weight=1) + + tab3.grid_rowconfigure(0, weight=1) + tab3.grid_columnconfigure(0, weight=1) + + if choose: + tabControl.select(tab3) frame0=Frame(tab1,highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=0) - l0=Label(frame0,text="Main Menu",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Main Menu",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0.grid(row=0,column=0,padx=0,pady=10) l0=ttk.Button(frame0,text="Ensemble Customization Options", command=close_win_custom_ensemble) - l0.grid(row=1,column=0,padx=20,pady=5) + l0.grid(row=1,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text="Advanced MDX-Net Options", command=close_win_advanced_mdx_options) - l0.grid(row=2,column=0,padx=20,pady=5) + l0.grid(row=2,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text="Advanced Demucs Options", command=close_win_advanced_demucs_options) - l0.grid(row=3,column=0,padx=20,pady=5) + l0.grid(row=3,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text="Advanced VR Options", command=close_win_advanced_vr_options) - l0.grid(row=4,column=0,padx=20,pady=5) + l0.grid(row=4,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text="Open Help Guide", command=close_win_help) - l0.grid(row=5,column=0,padx=20,pady=5) + l0.grid(row=5,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text='Open Error Log', command=close_win_error_log) - l0.grid(row=6,column=0,padx=20,pady=5) + l0.grid(row=6,column=0,padx=0,pady=5) - l0=Label(frame0,text="Additional Options",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Additional Options",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0.grid(row=7,column=0,padx=0,pady=10) l0=ttk.Checkbutton(frame0, text='Settings Test Mode', variable=self.settest_var) l0.grid(row=8,column=0,padx=0,pady=0) + l0=ttk.Button(frame0,text='Reset All Settings to Default', command=self.reset_to_defaults) + l0.grid(row=9,column=0,padx=0,pady=5) + l0=ttk.Button(frame0,text='Open Application Directory', command=self.open_appdir_filedialog) - l0.grid(row=9,column=0,padx=20,pady=5) + l0.grid(row=10,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0,text='Restart Application', command=restart) + l0.grid(row=11,column=0,padx=0,pady=5) l0=ttk.Button(frame0,text='Close Window', command=close_win) - l0.grid(row=10,column=0,padx=20,pady=5) + l0.grid(row=12,column=0,padx=0,pady=5) + + l0=tk.Label(frame0,text="Application Updates",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") + l0.grid(row=13,column=0,padx=0,pady=10) + + l0=ttk.Button(frame0,text=update_button_var.get(), command=check_updates) + l0.grid(row=14,column=0,padx=0,pady=5) + + l0=tk.Label(frame0,textvariable=update_var,font=("Century Gothic", "12"), justify="center", relief=relf, fg="#13a4c9") + l0.grid(row=15,column=0,padx=0,pady=5) frame0=Frame(tab2,highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=0) - l0=Label(frame0,text="Audio Format Settings",font=("Century Gothic", "13", "bold", "underline"), justify="center", fg="#13a4c9") + l0=tk.Label(frame0,text="Audio Format Settings",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0.grid(row=0,column=0,padx=0,pady=10) l0=tk.Label(frame0, text='Wav Type', font=("Century Gothic", "9"), foreground='#13a4c9') @@ -3322,22 +4534,1422 @@ class MainWindow(TkinterDnD.Tk): l0=ttk.Checkbutton(frame0, text='Normalize Outputs\n(Prevents clipping)', variable=self.normalize_var) l0.grid(row=7,column=0,padx=0,pady=10) + frame0=Frame(tab3,highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=0) + l0=tk.Label(frame0,text="Application Download Center",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") + l0.grid(row=0,column=0,padx=20,pady=10) + + def user_code(): + """ + Input Code + """ + + okVar = tk.IntVar() + + try: + with open(user_code_file, "r") as f: + code_read = f.read() + user_code_var = tk.StringVar(value=code_read) + except: + user_code_var = tk.StringVar(value='') + + try: + with open(download_code_file, "r") as f: + code_download_read = f.read() + user_code_download_var = tk.StringVar(value=code_download_read) + except: + user_code_download_var = tk.StringVar(value='') + + global top_code + + top_code= Toplevel() + + window_height = 300 + window_width = 300 + + top_code.title("User Download Codes") + + top_code.resizable(False, False) # This code helps to disable windows from resizing + + top_code.attributes("-topmost", True) + + top.attributes("-topmost", False) + + screen_width = top_code.winfo_screenwidth() + screen_height = top_code.winfo_screenheight() + + x_cordinate = int((screen_width/2) - (window_width/2)) + y_cordinate = int((screen_height/2) - (window_height/2)) + + top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + # change title bar icon + top_code.iconbitmap('img\\UVR-Icon-v2.ico') + + tabControl = ttk.Notebook(top_code) + + tabControl.pack(expand = 1, fill ="both") + + tabControl.grid_rowconfigure(0, weight=1) + tabControl.grid_columnconfigure(0, weight=1) + + frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=0) + + def write_code(): + with open(user_code_file, 'w') as f: + user_type_code = user_code_var.get() + f.write(str(user_type_code)) + with open(download_code_file, 'w') as f: + user_download_code = user_code_download_var.get() + f.write(str(user_download_code)) + top_code.destroy() + if user_type_code == 'VIP': + refresh_list_vip() + elif user_type_code == 'Developer': + refresh_list_dev() + else: + refresh_list() + + def quit(): + top.attributes("-topmost", True) + top_code.destroy() + + l0=tk.Label(frame0, text=f'User Download Codes', font=("Century Gothic", "11", "underline"), foreground='#13a4c9') + l0.grid(row=0,column=0,padx=0,pady=10) + + l0=tk.Label(frame0, text=f'{space_medium}User Code{space_medium}', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=1,column=0,padx=0,pady=5) + + l0=ttk.Entry(frame0, textvariable=user_code_var, justify='center') + + l0.grid(row=2,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text=f'Download Code', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=3,column=0,padx=0,pady=5) + + l0=ttk.Entry(frame0, textvariable=user_code_download_var, justify='center') + + l0.grid(row=4,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, text='Confirm', command=write_code) + + l0.grid(row=5,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, text='Cancel', command=quit) + + l0.grid(row=6,column=0,padx=0,pady=5) + + def download_code(): + """ + Input Download Code + """ + + try: + with open(download_code_file, "r") as f: + code_download_read = f.read() + user_code_download_var = tk.StringVar(value=code_download_read) + except: + user_code_download_var = tk.StringVar(value='') + + top_code= Toplevel() + + window_height = 300 + window_width = 410 + + top_code.title("Invalid Download Code") + + top_code.resizable(False, False) # This code helps to disable windows from resizing + + top_code.attributes("-topmost", True) + + top.attributes("-topmost", False) + + screen_width = top_code.winfo_screenwidth() + screen_height = top_code.winfo_screenheight() + + x_cordinate = int((screen_width/2) - (window_width/2)) + y_cordinate = int((screen_height/2) - (window_height/2)) + + top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + # change title bar icon + top_code.iconbitmap('img\\UVR-Icon-v2.ico') + + tabControl = ttk.Notebook(top_code) + + tabControl.pack(expand = 1, fill ="both") + + tabControl.grid_rowconfigure(0, weight=1) + tabControl.grid_columnconfigure(0, weight=1) + + frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=0) + + def write_code_p(): + with open(download_code_file, 'w') as f: + user_download_code = user_code_download_var.get() + f.write(str(user_download_code)) + download_model() + top_code.destroy() + + def quit(): + top.attributes("-topmost", True) + top_code.destroy() + + l0=tk.Label(frame0, text=f'Invalid Download Code', font=("Century Gothic", "11", "underline"), foreground='#13a4c9') + l0.grid(row=0,column=0,padx=0,pady=10) + + l0=tk.Label(frame0, text=f'Provide the correct code below or make another selection.\n', font=("Century Gothic", "10"), foreground='#13a4c9') + l0.grid(row=1,column=0,padx=0,pady=0) + + l0=tk.Label(frame0, text=f'Download Code', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=2,column=0,padx=0,pady=5) + + l0=ttk.Entry(frame0, textvariable=user_code_download_var, justify='center') + + l0.grid(row=3,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, text='Confirm', command=write_code_p) + + l0.grid(row=4,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, text='Cancel', command=quit) + + l0.grid(row=5,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text=f"{space_fill_wide}Select Download{space_fill_wide}", font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=1,column=0,padx=0,pady=10) + + def download_progress_bar(current, total, width=80): + + progress = ('%s' % (100 * current // total)) + + self.download_progress_bar_zip_var.set(int(progress)) + + self.download_progress_var.set(progress + ' %') + + def change_state_complete(): + download_button.configure(state=tk.NORMAL) + self.downloadmodelOptions.configure(state=tk.NORMAL) + self.downloadmodelOptions_mdx.configure(state=tk.NORMAL) + self.downloadmodelOptions_demucs.configure(state=tk.NORMAL) + stop_button.configure(state=tk.DISABLED) + self.download_stop_var.set(space_small) + self.download_progress_bar_var.set('Download Complete') + self.delete_temps() + + def change_state_locked(): + download_button.configure(state=tk.NORMAL) + self.downloadmodelOptions.configure(state=tk.NORMAL) + self.downloadmodelOptions_mdx.configure(state=tk.NORMAL) + self.downloadmodelOptions_demucs.configure(state=tk.NORMAL) + stop_button.configure(state=tk.DISABLED) + self.download_stop_var.set(space_small) + self.download_progress_bar_var.set('Invalid Download Code') + self.delete_temps() + + + def change_state_already_found(): + download_button.configure(state=tk.NORMAL) + self.downloadmodelOptions.configure(state=tk.NORMAL) + self.downloadmodelOptions_mdx.configure(state=tk.NORMAL) + self.downloadmodelOptions_demucs.configure(state=tk.NORMAL) + stop_button.configure(state=tk.DISABLED) + self.download_stop_var.set(space_small) + self.download_progress_bar_var.set('Download Stopped') + self.delete_temps() + + def change_state_failed(): + download_button.configure(state=tk.NORMAL) + self.downloadmodelOptions.configure(state=tk.NORMAL) + self.downloadmodelOptions_mdx.configure(state=tk.NORMAL) + self.downloadmodelOptions_demucs.configure(state=tk.NORMAL) + stop_button.configure(state=tk.DISABLED) + self.download_stop_var.set(space_small) + self.download_progress_bar_var.set('Download Failed') + self.delete_temps() + + def download_model(): + self.delete_temps() + + def begin_download_model(): + + if not self.modeldownload_var.get() == 'No Model Selected': + model = self.modeldownload_var.get() + self.download_progress_bar_var.set('Downloading...') + elif not self.modeldownload_mdx_var.get() == 'No Model Selected': + model = self.modeldownload_mdx_var.get() + self.download_progress_bar_var.set('Downloading...') + elif not self.modeldownload_demucs_var.get() == 'No Model Selected': + model = self.modeldownload_demucs_var.get() + self.download_progress_bar_var.set('Downloading...') + elif not update_set_var.get() == 'UVR Version Current': + model = update_set_var.get() + self.download_progress_bar_var.set('Downloading Update...') + else: + self.download_progress_bar_var.set('No Model Selected') + + return + + self.downloadmodelOptions.configure(state=tk.DISABLED) + self.downloadmodelOptions_mdx.configure(state=tk.DISABLED) + self.downloadmodelOptions_demucs.configure(state=tk.DISABLED) + download_button.configure(state=tk.DISABLED) + stop_button.configure(state=tk.NORMAL) + self.download_stop_var.set('Stop Download') + + if model == 'Demucs v3: mdx': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx') + + url_1 = links[0] + url_2 = links[1] + url_3 = links[2] + url_4 = links[3] + url_5 = links[4] + self.download_progress_bar_var.set('Downloading Model 1/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/0d19c1c6-0f06f20e.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_1, 'models/Demucs_Models/v3_repo/0d19c1c6-0f06f20e.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 2/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/7ecf8ec1-70f50cc9.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_2, 'models/Demucs_Models/v3_repo/7ecf8ec1-70f50cc9.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 3/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/c511e2ab-fe698775.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_3, 'models/Demucs_Models/v3_repo/c511e2ab-fe698775.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 4/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/7d865c68-3d5dd56b.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_4, 'models/Demucs_Models/v3_repo/7d865c68-3d5dd56b.th', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/v3_repo/mdx.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/mdx.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/mdx.yaml', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + if model == 'Demucs v3: mdx_q': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx_q') + + url_1 = links[0] + url_2 = links[1] + url_3 = links[2] + url_4 = links[3] + url_5 = links[4] + self.download_progress_bar_var.set('Downloading Model 1/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/6b9c2ca1-3fd82607.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_1, 'models/Demucs_Models/v3_repo/6b9c2ca1-3fd82607.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 2/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/b72baf4e-8778635e.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_2, 'models/Demucs_Models/v3_repo/b72baf4e-8778635e.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 3/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/42e558d4-196e0e1b.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_3, 'models/Demucs_Models/v3_repo/42e558d4-196e0e1b.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 4/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/305bc58f-18378783.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_4, 'models/Demucs_Models/v3_repo/305bc58f-18378783.th', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/v3_repo/mdx_q.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx_q.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/mdx_q.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/mdx_q.yaml', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + + + if model == 'Demucs v3: mdx_extra': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx_extra') + + url_1 = links[0] + url_2 = links[1] + url_3 = links[2] + url_4 = links[3] + url_5 = links[4] + self.download_progress_bar_var.set('Downloading Model 1/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/e51eebcc-c1b80bdd.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_1, 'models/Demucs_Models/v3_repo/e51eebcc-c1b80bdd.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 2/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/a1d90b5c-ae9d2452.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_2, 'models/Demucs_Models/v3_repo/a1d90b5c-ae9d2452.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 3/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/5d2d6c55-db83574e.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_3, 'models/Demucs_Models/v3_repo/5d2d6c55-db83574e.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 4/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/cfa93e08-61801ae1.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_4, 'models/Demucs_Models/v3_repo/cfa93e08-61801ae1.th', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/v3_repo/mdx_extra.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx_extra.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/mdx_extra.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/mdx_extra.yaml', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v3: mdx_extra_q': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: mdx_extra_q') + + url_1 = links[0] + url_2 = links[1] + url_3 = links[2] + url_4 = links[3] + url_5 = links[4] + self.download_progress_bar_var.set('Downloading Model 1/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/83fc094f-4a16d450.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_1, 'models/Demucs_Models/v3_repo/83fc094f-4a16d450.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 2/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/464b36d7-e5a9386e.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_2, 'models/Demucs_Models/v3_repo/464b36d7-e5a9386e.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 3/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/14fc6a69-a89dd0ee.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_3, 'models/Demucs_Models/v3_repo/14fc6a69-a89dd0ee.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 4/4...') + if os.path.isfile('models/Demucs_Models/v3_repo/7fd6ef75-a905dd85.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_4, 'models/Demucs_Models/v3_repo/7fd6ef75-a905dd85.th', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/v3_repo/mdx_extra_q.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/v3_repo/mdx_extra_q.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/mdx_extra_q.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/mdx_extra_q.yaml', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v3: UVR Models': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v3: UVR Models') + + url_1 = links[0] + url_2 = links[1] + url_3 = links[2] + url_4 = links[3] + url_5 = links[4] + self.download_progress_bar_var.set('Downloading Model 1/2...') + if os.path.isfile('models/Demucs_Models/v3_repo/ebf34a2d.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_1, 'models/Demucs_Models/v3_repo/ebf34a2d.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model 2/2...') + if os.path.isfile('models/Demucs_Models/v3_repo/ebf34a2db.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_2, 'models/Demucs_Models/v3_repo/ebf34a2db.th', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model...') + if os.path.isfile('models/Demucs_Models/v3_repo/UVR_Demucs_Model_1.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_3, 'models/Demucs_Models/v3_repo/UVR_Demucs_Model_1.yaml', bar=download_progress_bar) + self.download_progress_bar_var.set('Downloading Model...') + if os.path.isfile('models/Demucs_Models/v3_repo/UVR_Demucs_Model_2.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_4, 'models/Demucs_Models/v3_repo/UVR_Demucs_Model_2.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/v3_repo/UVR_Demucs_Model_Bag.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/v3_repo/UVR_Demucs_Model_Bag.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/UVR_Demucs_Model_1.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_3, 'models/Demucs_Models/UVR_Demucs_Model_1.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/UVR_Demucs_Model_2.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_4, 'models/Demucs_Models/UVR_Demucs_Model_2.yaml', bar=download_progress_bar) + if os.path.isfile('models/Demucs_Models/UVR_Demucs_Model_Bag.yaml'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url_5, 'models/Demucs_Models/UVR_Demucs_Model_Bag.yaml', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v2: demucs': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs') + + url = links + if os.path.isfile('models/Demucs_Models/demucs-e07c671f.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/demucs-e07c671f.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + if model == 'Demucs v2: demucs_extra': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs_extra') + + url = links + if os.path.isfile('models/Demucs_Models/demucs_extra-3646af93.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/demucs_extra-3646af93.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v2: demucs48_hq': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs48_hq') + + url = links + if os.path.isfile('models/Demucs_Models/demucs48_hq-28a1282c.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/demucs48_hq-28a1282c.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v2: tasnet': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: tasnet') + + url = links + if os.path.isfile('models/Demucs_Models/tasnet-beb46fac.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/tasnet-beb46fac.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v2: tasnet_extra': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: tasnet_extra') + + url = links + + if os.path.isfile('models/Demucs_Models/tasnet_extra-df3777b2.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/tasnet_extra-df3777b2.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v2: demucs_unittest': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v2: demucs_unittest') + + url = links + if os.path.isfile('models/Demucs_Models/demucs_unittest-09ebc15f.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/demucs_unittest-09ebc15f.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v1: demucs': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: demucs') + + url = links + if os.path.isfile('models/Demucs_Models/demucs.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/demucs.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v1: demucs_extra': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: demucs_extra') + + url = links + if os.path.isfile('models/Demucs_Models/demucs_extra.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/demucs_extra.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v1: light': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: light') + + url = links + if os.path.isfile('models/Demucs_Models/light.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/light.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v1: light_extra': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: light_extra') + + url = links + if os.path.isfile('models/Demucs_Models/light_extra.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/light_extra.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v1: tasnet': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: tasnet') + + url = links + if os.path.isfile('models/Demucs_Models/tasnet.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/tasnet.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'Demucs v1: tasnet_extra': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='Demucs v1: tasnet_extra') + url = links + if os.path.isfile('models/Demucs_Models/tasnet_extra.th'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Demucs_Models/tasnet_extra.th', bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'VR Arch Model Pack v5: HP2 Models': + try: + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='model_repo') + url = f"{links}uvr_v5_hp2_models.zip" + if os.path.isfile('models/Main_Models/uvr_v5_hp2_models.zip'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Main_Models/uvr_v5_hp2_models.zip', bar=download_progress_bar) + with zipfile.ZipFile('models/Main_Models/uvr_v5_hp2_models.zip', 'r') as zip_ref: + zip_ref.extractall('models/Main_Models') + os.remove('models/Main_Models/uvr_v5_hp2_models.zip') + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if model == 'VR Arch Model Pack v4: Main Models': + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='model_repo') + url = f"{links}uvr_v4_models.zip" + try: + if os.path.isfile('models/Main_Models/4_models.zip'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Main_Models/4_models.zip', bar=download_progress_bar) + with zipfile.ZipFile('models/Main_Models/4_models.zip', 'r') as zip_ref: + zip_ref.extractall('models/Main_Models') + os.remove('models/Main_Models/4_models.zip') + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + if model == 'VR Arch Model Pack v5: SP Models': + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='model_repo') + url = f"{links}uvr_v5_sp_models.zip" + try: + if os.path.isfile('models/Main_Models/uvr_v5_sp_models.zip'): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, 'models/Main_Models/uvr_v5_sp_models.zip', bar=download_progress_bar) + with zipfile.ZipFile('models/Main_Models/uvr_v5_sp_models.zip', 'r') as zip_ref: + zip_ref.extractall('models/Main_Models') + os.remove('models/Main_Models/uvr_v5_sp_models.zip') + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if 'VR Arch Single Model v5:' in model or 'VR Arch Single Model v4:' in model: + + if 'VR Arch Single Model v5:' in model: + model_name = model + head, sep, tail = model_name.partition('VR Arch Single Model v5: ') + model_name = tail + if 'VR Arch Single Model v4:' in model: + model_name = model + head, sep, tail = model_name.partition('VR Arch Single Model v4: ') + model_name = tail + if 'VR Arch Single Model v4:' in model: + model_name = model + head, sep, tail = model_name.partition('VR Arch Single Model v4: ') + model_name = tail + + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='single_model_repo') + m_url = f"{links}{model_name}.pth" + url = m_url + + try: + if os.path.isfile(f"models/Main_Models/{model_name}.pth"): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, f"models/Main_Models/{model_name}.pth", bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if 'MDX-Net Model: ' in model: + + model_name = model + head, sep, tail = model_name.partition('MDX-Net Model: ') + model_name = tail + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='single_model_repo') + m_url = f"{links}{model_name}.onnx" + + #print(m_url) + url = m_url + + try: + if os.path.isfile(f"models/MDX_Net_Models/{model_name}.onnx"): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(url, f"models/MDX_Net_Models/{model_name}.onnx", bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + + if 'MDX-Net Model VIP:' in model: + + model_name = model + head, sep, tail = model_name.partition('MDX-Net Model VIP: ') + model_name = tail + + url_code = f"https://github.com/TRvlvr/application_data/raw/main/filelists/aes_vip/{model_name}.txt.aes" + + encrypted_file_code_vip = f"lib_v5/filelists/download_codes/temp/{model_name}.aes" + file_code_vip = f"lib_v5/filelists/download_codes/temp/{model_name}.txt" + + try: + wget.download(url_code, encrypted_file_code_vip, bar=download_progress_bar) + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + + with open(download_code_file, "r") as f: + user_download_code_read = f.read() + + bufferSize = 128 * 1024 + password = user_download_code_read + + try: + pyAesCrypt.decryptFile(encrypted_file_code_vip, file_code_vip, password, bufferSize) + except: + try: + url_v_key = f"https://github.com/TRvlvr/application_data/raw/main/filelists/aes_dev/vip_key.txt.aes" + wget.download(url_v_key, 'lib_v5/filelists/download_codes/temp/vip_key.aes', bar=download_progress_bar) + pyAesCrypt.decryptFile('lib_v5/filelists/download_codes/temp/vip_key.aes', + 'lib_v5/filelists/download_codes/temp/vip_key.txt', password, bufferSize) + + with open('lib_v5/filelists/download_codes/temp/vip_key.txt', "r") as f: + vip_code_read = f.read() + + password = vip_code_read + + pyAesCrypt.decryptFile(encrypted_file_code_vip, file_code_vip, password, bufferSize) + except: + download_code() + change_state_locked() + return + + with open(file_code_vip, "r") as f: + link=f.read() + + m_url = link + + try: + if os.path.isfile(f"models/MDX_Net_Models/{model_name}.onnx"): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(m_url, f"models/MDX_Net_Models/{model_name}.onnx", bar=download_progress_bar) + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + + if 'Developer Pack:' in model: + + pack_name = model + head, sep, tail = pack_name.partition('Developer Pack: ') + pack_name = tail + + url_code = f"https://github.com/TRvlvr/application_data/raw/main/filelists/aes_dev/{pack_name}.txt.aes" + + #print(url_code) + + encrypted_file_code = f"lib_v5/filelists/download_codes/temp/{pack_name}.aes" + file_code = f"lib_v5/filelists/download_codes/temp/{pack_name}.txt" + + try: + wget.download(url_code, encrypted_file_code, bar=download_progress_bar) + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + with open(download_code_file, "r") as f: + user_download_code_read = f.read() + + bufferSize = 128 * 1024 + password = user_download_code_read + # encrypt + + try: + pyAesCrypt.decryptFile(encrypted_file_code, file_code, password, bufferSize) + except: + download_code() + change_state_locked() + return + + with open(file_code, "r") as f: + link=f.read() + + m_url = link + + try: + if os.path.isfile(f"models/MDX_Net_Models/{pack_name}.zip"): + self.download_progress_var.set('File already exists') + change_state_already_found() + pass + else: + wget.download(m_url, f"models/MDX_Net_Models/{pack_name}.zip", bar=download_progress_bar) + with zipfile.ZipFile(f'models/MDX_Net_Models/{pack_name}.zip', 'r') as zip_ref: + zip_ref.extractall('models/MDX_Net_Models') + try: + os.remove(f'models/MDX_Net_Models/{pack_name}.zip') + except: + pass + change_state_complete() + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + if 'Update Found:' in model: + pack_name = model + head, sep, tail = pack_name.partition('Update Found: ') + pack_name = tail + cwd_path = os.path.dirname(os.path.realpath(__file__)) + #print('cwd_path ', cwd_path) + + links = [] + links = lib_v5.filelist.get_download_links(links, downloads='app_patch') + url_link = f"{links}{pack_name}.exe" + #print(url_link) + top.attributes("-topmost", False) + try: + if os.path.isfile(f"{cwd_path}/{pack_name}.exe"): + self.download_progress_var.set('File already exists') + subprocess.Popen(f"{cwd_path}/{pack_name}.exe") + else: + wget.download(url_link, f"{cwd_path}/{pack_name}.exe", bar=download_progress_bar) + subprocess.Popen(f"{cwd_path}/{pack_name}.exe") + except Exception as e: + short_error = f'{e}' + change_state_failed() + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + + self.update_states() + + global th + + th = KThread(target=begin_download_model) + th.start() + + def stop_thread(): + th.kill() + download_button.configure(state=tk.NORMAL) + self.downloadmodelOptions.configure(state=tk.NORMAL) + self.downloadmodelOptions_mdx.configure(state=tk.NORMAL) + self.downloadmodelOptions_demucs.configure(state=tk.NORMAL) + stop_button.configure(state=tk.DISABLED) + self.download_stop_var.set(space_small) + self.update_states() + self.download_progress_bar_var.set('Download Stopped') + self.delete_temps() + + + def download_update(): + self.modeldownload_var.set('No Model Selected') + self.modeldownload_mdx_var.set('No Model Selected') + self.modeldownload_demucs_var.set('No Model Selected') + tabControl.select(tab3) + download_model() + + vr_download_list_file = "lib_v5/filelists/download_lists/vr_download_list.txt" + mdx_download_list_file = "lib_v5/filelists/download_lists/mdx_download_list.txt" + demucs_download_list_file = "lib_v5/filelists/download_lists/demucs_download_list.txt" + + vr_download_list_temp_file = "lib_v5/filelists/download_lists/temp/vr_download_list.txt" + mdx_download_list_temp_file = "lib_v5/filelists/download_lists/temp/mdx_download_list.txt" + demucs_download_list_temp_file = "lib_v5/filelists/download_lists/temp/demucs_download_list.txt" + + mdx_new_hashes = "lib_v5/filelists/hashes/mdx_new_hashes.txt" + mdx_new_inst_hashes = "lib_v5/filelists/hashes/mdx_new_inst_hashes.txt" + mdx_original_hashes = "lib_v5/filelists/hashes/mdx_original_hashes.txt" + download_links_file = "lib_v5/filelists/download_lists/download_links.json" + + mdx_new_hashes_temp = "lib_v5/filelists/hashes/temp/mdx_new_hashes.txt" + mdx_new_inst_hashes_temp = "lib_v5/filelists/hashes/temp/mdx_new_inst_hashes.txt" + mdx_original_hashes_temp = "lib_v5/filelists/hashes/temp/mdx_original_hashes.txt" + download_links_file_temp = "lib_v5/filelists/download_lists/temp/download_links.json" + + def move_lists_from(): + shutil.move(vr_download_list_file, vr_download_list_temp_file) + shutil.move(mdx_download_list_file, mdx_download_list_temp_file) + shutil.move(demucs_download_list_file, demucs_download_list_temp_file) + shutil.move(mdx_new_hashes, mdx_new_hashes_temp) + shutil.move(mdx_new_inst_hashes, mdx_new_inst_hashes_temp) + shutil.move(mdx_original_hashes, mdx_original_hashes_temp) + shutil.move(download_links_file, download_links_file_temp) + + def move_lists_back(): + shutil.move(vr_download_list_temp_file, vr_download_list_file) + shutil.move(mdx_download_list_temp_file, mdx_download_list_file) + shutil.move(demucs_download_list_temp_file, demucs_download_list_file) + shutil.move(mdx_new_hashes_temp, mdx_new_hashes) + shutil.move(mdx_new_inst_hashes_temp, mdx_new_inst_hashes) + shutil.move(mdx_original_hashes_temp, mdx_original_hashes) + shutil.move(download_links_file_temp, download_links_file) + + def remove_lists_temp(): + os.remove(vr_download_list_temp_file) + os.remove(mdx_download_list_temp_file) + os.remove(demucs_download_list_temp_file) + os.remove(mdx_new_hashes_temp) + os.remove(mdx_new_inst_hashes_temp) + os.remove(mdx_original_hashes_temp) + os.remove(download_links_file_temp) + + def refresh_download_list_only(): + download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json" + def begin_refresh_list(): + try: + url_1 = download_links + shutil.move(download_links_file, download_links_file_temp) + wget.download(url_1, download_links_file, bar=download_progress_bar) + os.remove(download_links_file_temp) + except Exception as e: + try: + shutil.move(download_links_file_temp, download_links_file) + except: + pass + + rlg = KThread(target=begin_refresh_list) + rlg.start() + + def refresh_list(): + download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json" + def begin_refresh_list(): + try: + url_1 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/gen_vr_download_list.txt' + url_2 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/gen_mdx_download_list.txt' + url_3 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/gen_demucs_download_list.txt' + url_4 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_hashes.txt' + url_5 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_inst_hashes.txt' + url_6 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_original_hashes.txt' + url_7 = download_links + move_lists_from() + wget.download(url_1, vr_download_list_file, bar=download_progress_bar) + wget.download(url_2, mdx_download_list_file, bar=download_progress_bar) + wget.download(url_3, demucs_download_list_file, bar=download_progress_bar) + wget.download(url_4, mdx_new_hashes, bar=download_progress_bar) + wget.download(url_5, mdx_new_inst_hashes, bar=download_progress_bar) + wget.download(url_6, mdx_original_hashes, bar=download_progress_bar) + wget.download(url_7, download_links_file, bar=download_progress_bar) + remove_lists_temp() + self.download_progress_bar_var.set('Download list\'s refreshed!') + top.destroy() + self.settings(choose=True) + except Exception as e: + short_error = f'{e}' + self.download_progress_bar_var.set('Refresh failed') + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + try: + move_lists_back() + except: + pass + + rlg = KThread(target=begin_refresh_list) + rlg.start() + + def refresh_list_vip(): + download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json" + def begin_refresh_list_vip(): + try: + url_1 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/vip_vr_download_list.txt' + url_2 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/vip_mdx_download_list.txt' + url_3 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/vip_demucs_download_list.txt' + url_4 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_hashes.txt' + url_5 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_inst_hashes.txt' + url_6 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_original_hashes.txt' + url_7 = download_links + move_lists_from() + wget.download(url_1, vr_download_list_file, bar=download_progress_bar) + wget.download(url_2, mdx_download_list_file, bar=download_progress_bar) + wget.download(url_3, demucs_download_list_file, bar=download_progress_bar) + wget.download(url_4, mdx_new_hashes, bar=download_progress_bar) + wget.download(url_5, mdx_new_inst_hashes, bar=download_progress_bar) + wget.download(url_6, mdx_original_hashes, bar=download_progress_bar) + wget.download(url_7, download_links_file, bar=download_progress_bar) + remove_lists_temp() + self.download_progress_bar_var.set('VIP: Download list\'s refreshed!') + top.destroy() + self.settings(choose=True) + except Exception as e: + short_error = f'{e}' + self.download_progress_bar_var.set('Refresh failed') + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + try: + move_lists_back() + except: + pass + + rlv = KThread(target=begin_refresh_list_vip) + rlv.start() + + vr_download_list_dev = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/dev_vr_download_list.txt' + mdx_download_list_dev = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/dev_mdx_download_list.txt' + demucs_download_list_dev = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/dev_demucs_download_list.txt' + + def refresh_list_dev(): + download_links = "https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/download_lists/download_links.json" + def begin_refresh_list_dev(): + try: + url_1 = vr_download_list_dev + url_2 = mdx_download_list_dev + url_3 = demucs_download_list_dev + url_4 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_hashes.txt' + url_5 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_new_inst_hashes.txt' + url_6 = 'https://raw.githubusercontent.com/TRvlvr/application_data/main/filelists/hashes/mdx_original_hashes.txt' + url_7 = download_links + move_lists_from() + wget.download(url_1, vr_download_list_file, bar=download_progress_bar) + wget.download(url_2, mdx_download_list_file, bar=download_progress_bar) + wget.download(url_3, demucs_download_list_file, bar=download_progress_bar) + wget.download(url_4, mdx_new_hashes, bar=download_progress_bar) + wget.download(url_5, mdx_new_inst_hashes, bar=download_progress_bar) + wget.download(url_6, mdx_original_hashes, bar=download_progress_bar) + wget.download(url_7, download_links_file, bar=download_progress_bar) + remove_lists_temp() + self.download_progress_bar_var.set('Developer: Download list\'s refreshed!') + top.destroy() + self.settings(choose=True) + except Exception as e: + short_error = f'{e}' + self.download_progress_bar_var.set('Refresh failed') + if '[Errno 11001] getaddrinfo failed' in short_error: + self.download_progress_var.set('No Internet Connection Detected') + else: + self.download_progress_var.set(short_error) + try: + move_lists_back() + except: + pass + + rld = KThread(target=begin_refresh_list_dev) + rld.start() + + vr_list = '' + vr_list = lib_v5.filelist.get_vr_download_list(vr_list) + vr_download_list = vr_list + + mdx_list = '' + mdx_list = lib_v5.filelist.get_mdx_download_list(mdx_list) + mdx_download_list = mdx_list + + demucs_list = '' + demucs_list = lib_v5.filelist.get_demucs_download_list(demucs_list) + demucs_download_list = demucs_list + + ach_radio = l0=ttk.Radiobutton(frame0, text='VR Arch', variable=self.selectdownload_var, value='VR Arc') + l0.grid(row=3,column=0,padx=0,pady=5) + + self.downloadmodelOptions = l0=ttk.OptionMenu(frame0, self.modeldownload_var, *vr_download_list) + l0.grid(row=4,column=0,padx=0,pady=5) + + mdx_radio = l0=ttk.Radiobutton(frame0, text='MDX-Net', variable=self.selectdownload_var, value='MDX-Net') + l0.grid(row=5,column=0,padx=0,pady=5) + + self.downloadmodelOptions_mdx = l0=ttk.OptionMenu(frame0, self.modeldownload_mdx_var, *mdx_download_list) + l0.grid(row=6,column=0,padx=0,pady=5) + + demucs_radio = l0=ttk.Radiobutton(frame0, text='Demucs', variable=self.selectdownload_var, value='Demucs') + l0.grid(row=7,column=0,padx=0,pady=5) + + self.downloadmodelOptions_demucs = l0=ttk.OptionMenu(frame0, self.modeldownload_demucs_var, *demucs_download_list) + l0.grid(row=8,column=0,padx=0,pady=5) + + download_button = l0=ttk.Button(frame0, image=self.download_img, command=download_model) + l0.grid(row=9,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, textvariable=self.download_progress_bar_var, font=("Century Gothic", "9"), foreground='#13a4c9', borderwidth=0) + l0.grid(row=10,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, textvariable=self.download_progress_var, font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=11,column=0,padx=0,pady=5) + + l0=ttk.Progressbar(frame0, variable=self.download_progress_bar_zip_var) + l0.grid(row=12,column=0,padx=0,pady=5) + + stop_button = l0=ttk.Button(frame0, textvariable=self.download_stop_var, command=stop_thread) + l0.grid(row=13,column=0,padx=0,pady=5) + + try: + with open(user_code_file, "r") as f: + code_read = f.read() + if code_read == 'VIP': + l0=ttk.Button(frame0, text='Refresh List', command=refresh_list_vip) + elif code_read == 'Developer': + l0=ttk.Button(frame0, text='Refresh List', command=refresh_list_dev) + else: + code_read = 'None' + l0=ttk.Button(frame0, text='Refresh List', command=refresh_list) + except: + code_read = 'None' + l0=ttk.Button(frame0, text='Refresh List', command=refresh_list) + + l0.grid(row=14,column=0,padx=0,pady=5) + + l0=ttk.Button(frame0, image=self.key_img, command=user_code) + l0.grid(row=15,column=0,padx=0,pady=5) + + stop_button.configure(state=tk.DISABLED) + + if choose: + pass + else: + self.download_progress_bar_var.set('') + + self.download_progress_var.set('') + self.download_stop_var.set(space_small) + + top.protocol("WM_DELETE_WINDOW", change_event) + + self.update_states() + def error_log(self): """ Open Error Log """ top= Toplevel(self) if GetSystemMetrics(1) >= 900: - top.geometry("1080x810") window_height = 810 window_width = 1080 elif GetSystemMetrics(1) <= 720: - top.geometry("930x640") window_height = 640 window_width = 930 else: - top.geometry("930x670") window_height = 670 window_width = 930 @@ -3345,6 +5957,8 @@ class MainWindow(TkinterDnD.Tk): top.resizable(False, False) # This code helps to disable windows from resizing + top.attributes("-topmost", True) + screen_width = top.winfo_screenwidth() screen_height = top.winfo_screenheight() @@ -3377,13 +5991,13 @@ class MainWindow(TkinterDnD.Tk): frame0=Frame(tab1,highlightbackground='red',highlightthicknes=0) frame0.grid(row=0,column=0,padx=0,pady=0) - l0=Label(frame0,text="Error Details",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") + l0=tk.Label(frame0,text="Error Details",font=("Century Gothic", "16", "bold"), justify="center", fg="#f4f4f4") l0.grid(row=1,column=0,padx=20,pady=10) - l0=Label(frame0,text="This tab will show the raw details of the last error received.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="This tab will show the raw details of the last error received.",font=("Century Gothic", "12"), justify="center", fg="#F6F6F7") l0.grid(row=2,column=0,padx=0,pady=0) - l0=Label(frame0,text="(Click the error console below to copy the error)\n",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") + l0=tk.Label(frame0,text="(Click the error console below to copy the error)\n",font=("Century Gothic", "10"), justify="center", fg="#F6F6F7") l0.grid(row=3,column=0,padx=0,pady=0) with open("errorlog.txt", "r") as f: @@ -3396,12 +6010,17 @@ class MainWindow(TkinterDnD.Tk): l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0.grid(row=6,column=0,padx=20,pady=0) + def copy_clip(self): copy_t = open("errorlog.txt", "r").read() pyperclip.copy(copy_t) + def copy_vr_list(self): + copy_t = open("lib_v5/vr_download_list.txt", "r").read() + pyperclip.copy(copy_t) + def open_Modelfolder_filedialog(self): - """Let user paste a ".pth" model to use for the vocal seperation""" + """Let user paste a ".pth" model to use for the vocal Separation""" filename = 'models' if sys.platform == "win32": @@ -3411,7 +6030,7 @@ class MainWindow(TkinterDnD.Tk): subprocess.call([opener, filename]) def open_Modelfolder_vr(self): - """Let user paste a ".pth" model to use for the vocal seperation""" + """Let user paste a ".pth" model to use for the vocal Separation""" filename = 'models\Main_Models' if sys.platform == "win32": @@ -3421,7 +6040,7 @@ class MainWindow(TkinterDnD.Tk): subprocess.call([opener, filename]) def open_Modelfolder_de(self): - """Let user paste a ".pth" model to use for the vocal seperation""" + """Let user paste a ".pth" model to use for the vocal Separation""" filename = 'models\Demucs_Models' if sys.platform == "win32": @@ -3434,8 +6053,6 @@ class MainWindow(TkinterDnD.Tk): pathname = '.' - print(pathname) - if sys.platform == "win32": os.startfile(pathname) else: @@ -3463,9 +6080,75 @@ class MainWindow(TkinterDnD.Tk): # -Save Data- save_data(data={ + 'agg': agg, + 'aiModel': self.aiModel_var.get(), + 'algo': self.algo_var.get(), + 'appendensem': self.appendensem_var.get(), + 'audfile': self.audfile_var.get(), + 'aud_mdx': self.aud_mdx_var.get(), + 'autocompensate': self.autocompensate_var.get(), + 'channel': self.channel_var.get(), + 'chunks': chunks, + 'chunks_d': self.chunks_d_var.get(), + 'compensate': self.compensate_var.get(), + 'demucs_only': self.demucs_only_var.get(), + 'demucs_stems': self.demucs_stems_var.get(), + 'DemucsModel': self.DemucsModel_var.get(), + 'demucsmodel': self.demucsmodel_var.get(), + 'DemucsModel_MDX': self.DemucsModel_MDX_var.get(), + 'demucsmodel_sel_VR': self.demucsmodel_sel_VR_var.get(), + 'demucsmodelVR': self.demucsmodelVR_var.get(), + 'dim_f': self.dim_f_var.get(), + 'ensChoose': self.ensChoose_var.get(), 'exportPath': self.exportPath_var.get(), + 'flactype': self.flactype_var.get(), + 'gpu': self.gpuConversion_var.get(), 'inputPaths': self.inputPaths, + 'inst_only': self.inst_only_var.get(), + 'inst_only_b': self.inst_only_b_var.get(), + 'lastDir': self.lastDir, + 'margin': self.margin_var.get(), + 'mdx_ensem': self.mdxensemchoose_var.get(), + 'mdx_ensem_b': self.mdxensemchoose_b_var.get(), + 'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(), + 'mdx_only_ensem_b': self.mdx_only_ensem_b_var.get(), + 'mdx_only_ensem_c': self.mdx_only_ensem_c_var.get(), + 'mdx_only_ensem_d': self.mdx_only_ensem_d_var.get(), + 'mdx_only_ensem_e': self.mdx_only_ensem_e_var.get(), + 'mdxnetModel': self.mdxnetModel_var.get(), + 'mdxnetModeltype': self.mdxnetModeltype_var.get(), + 'mixing': mixing, + 'modeldownload': 'No Model Selected', + 'modeldownload_mdx': 'No Model Selected', + 'modeldownload_demucs': 'No Model Selected', + 'modeldownload_type': 'VR Arc', + 'modelFolder': self.modelFolder_var.get(), + 'modelInstrumentalLabel': self.instrumentalModel_var.get(), + 'ModelParams': self.ModelParams_var.get(), + 'mp3bit': self.mp3bit_var.get(), + 'n_fft_scale': self.n_fft_scale_var.get(), + 'noise_pro_select': self.noise_pro_select_var.get(), + 'noise_reduc': self.noisereduc_var.get(), + 'noisereduc_s': noisereduc_s, + 'non_red': self.non_red_var.get(), + 'nophaseinst': self.nophaseinst_var.get(), + 'normalize': self.normalize_var.get(), + 'output_image': self.outputImage_var.get(), + 'overlap': self.overlap_var.get(), + 'overlap_b': self.overlap_b_var.get(), + 'postprocess': self.postprocessing_var.get(), + 'save': self.save_var.get(), 'saveFormat': self.saveFormat_var.get(), + 'selectdownload': self.selectdownload_var.get(), + 'segment': self.segment_var.get(), + 'settest': self.settest_var.get(), + 'shifts': self.shifts_var.get(), + 'shifts_b': self.shifts_b_var.get(), + 'split_mode': self.split_mode_var.get(), + 'tta': self.tta_var.get(), + 'useModel': 'instrumental', + 'voc_only': self.voc_only_var.get(), + 'voc_only_b': self.voc_only_b_var.get(), 'vr_ensem': self.vrensemchoose_var.get(), 'vr_ensem_a': self.vrensemchoose_a_var.get(), 'vr_ensem_b': self.vrensemchoose_b_var.get(), @@ -3475,64 +6158,17 @@ class MainWindow(TkinterDnD.Tk): 'vr_ensem_mdx_a': self.vrensemchoose_mdx_a_var.get(), 'vr_ensem_mdx_b': self.vrensemchoose_mdx_b_var.get(), 'vr_ensem_mdx_c': self.vrensemchoose_mdx_c_var.get(), - 'mdx_ensem': self.mdxensemchoose_var.get(), - 'mdx_ensem_b': self.mdxensemchoose_b_var.get(), - 'demucsmodel_sel_VR': self.demucsmodel_sel_VR_var.get(), - 'gpu': self.gpuConversion_var.get(), - 'appendensem': self.appendensem_var.get(), - 'demucs_only': self.demucs_only_var.get(), - 'split_mode': self.split_mode_var.get(), - 'normalize': self.normalize_var.get(), - 'postprocess': self.postprocessing_var.get(), - 'tta': self.tta_var.get(), - 'save': self.save_var.get(), - 'output_image': self.outputImage_var.get(), - 'window_size': window_size, - 'agg': agg, - 'useModel': 'instrumental', - 'lastDir': self.lastDir, - 'modelFolder': self.modelFolder_var.get(), - 'modelInstrumentalLabel': self.instrumentalModel_var.get(), - 'aiModel': self.aiModel_var.get(), - 'algo': self.algo_var.get(), - 'demucs_stems': self.demucs_stems_var.get(), - 'ensChoose': self.ensChoose_var.get(), - 'mdxnetModel': self.mdxnetModel_var.get(), - 'DemucsModel': self.DemucsModel_var.get(), - 'DemucsModel_MDX': self.DemucsModel_MDX_var.get(), - 'ModelParams': self.ModelParams_var.get(), - #MDX-Net - 'demucsmodel': self.demucsmodel_var.get(), - 'demucsmodelVR': self.demucsmodelVR_var.get(), - 'non_red': self.non_red_var.get(), - 'nophaseinst': self.nophaseinst_var.get(), - 'noise_reduc': self.noisereduc_var.get(), - 'voc_only': self.voc_only_var.get(), - 'inst_only': self.inst_only_var.get(), - 'voc_only_b': self.voc_only_b_var.get(), - 'inst_only_b': self.inst_only_b_var.get(), - 'audfile': self.audfile_var.get(), - 'autocompensate': self.autocompensate_var.get(), - 'settest': self.settest_var.get(), - 'chunks': chunks, - 'chunks_d': self.chunks_d_var.get(), - 'n_fft_scale': self.n_fft_scale_var.get(), - 'segment': self.segment_var.get(), - 'dim_f': self.dim_f_var.get(), - 'noise_pro_select': self.noise_pro_select_var.get(), + 'vr_multi_USER_model_param_1': self.vr_multi_USER_model_param_1.get(), + 'vr_multi_USER_model_param_2': self.vr_multi_USER_model_param_2.get(), + 'vr_multi_USER_model_param_3': self.vr_multi_USER_model_param_3.get(), + 'vr_multi_USER_model_param_4': self.vr_multi_USER_model_param_4.get(), + 'vr_basic_USER_model_param_1': self.vr_basic_USER_model_param_1.get(), + 'vr_basic_USER_model_param_2': self.vr_basic_USER_model_param_2.get(), + 'vr_basic_USER_model_param_3': self.vr_basic_USER_model_param_3.get(), + 'vr_basic_USER_model_param_4': self.vr_basic_USER_model_param_4.get(), + 'vr_basic_USER_model_param_5': self.vr_basic_USER_model_param_5.get(), 'wavtype': self.wavtype_var.get(), - 'flactype': self.flactype_var.get(), - 'mp3bit': self.mp3bit_var.get(), - 'overlap': self.overlap_var.get(), - 'shifts': self.shifts_var.get(), - 'overlap_b': self.overlap_b_var.get(), - 'shifts_b': self.shifts_b_var.get(), - 'margin': self.margin_var.get(), - 'channel': self.channel_var.get(), - 'compensate': self.compensate_var.get(), - 'mdxnetModeltype': self.mdxnetModeltype_var.get(), - 'noisereduc_s': noisereduc_s, - 'mixing': mixing, + 'window_size': window_size, }, ) diff --git a/inference_MDX.py b/inference_MDX.py index 90b1671..170ae1b 100644 --- a/inference_MDX.py +++ b/inference_MDX.py @@ -1,82 +1,334 @@ -import os -import subprocess -from unittest import skip -from pathlib import Path -import os.path from datetime import datetime -import pydub -import shutil -import hashlib - -#MDX-Net -#---------------------------------------- -import soundfile as sf -import torch -import numpy as np - -from demucs.pretrained import get_model as _gm -from demucs.hdemucs import HDemucs from demucs.apply import BagOfModels, apply_model -from demucs.audio import AudioFile -import pathlib - -from models import get_models, spec_effects -import onnxruntime as ort -import time -import os -from tqdm import tqdm -import warnings -import sys -import librosa -import psutil -#---------------------------------------- +from demucs.hdemucs import HDemucs +from demucs.model_v2 import Demucs +from demucs.pretrained import get_model as _gm +from demucs.tasnet_v2 import ConvTasNet +from demucs.utils import apply_model_v1 +from demucs.utils import apply_model_v2 from lib_v5 import spec_utils from lib_v5.model_param_init import ModelParameters -import torch - -# Command line text parsing and widget manipulation -import tkinter as tk -import traceback # Error Message Recent Calls -import time # Timer +from models import get_models, spec_effects +from pathlib import Path from random import randrange +from tqdm import tqdm +from unittest import skip +import tkinter.ttk as ttk +import tkinter.messagebox +import tkinter.filedialog +import tkinter.simpledialog +import tkinter.font +import tkinter as tk +from tkinter import * +from tkinter.tix import * +import json +import gzip +import hashlib +import librosa +import numpy as np +import onnxruntime as ort +import os +import os.path +import pathlib +import psutil +import pydub +import shutil +import soundfile as sf +import subprocess +import sys +import time +import time # Timer +import tkinter as tk +import torch +import traceback # Error Message Recent Calls +import warnings +import lib_v5.filelist -from typing import Literal +#from typing import Literal class Predictor(): def __init__(self): pass + def mdx_options(self): + """ + Open Advanced MDX Options + """ + self.okVar = tk.IntVar() + self.n_fft_scale_set_var = tk.StringVar(value='6144') + self.dim_f_set_var = tk.StringVar(value='2048') + self.mdxnetModeltype_var = tk.StringVar(value='Vocals') + self.noise_pro_select_set_var = tk.StringVar(value='MDX-NET_Noise_Profile_14_kHz') + self.compensate_v_var = tk.StringVar(value=1.03597672895) + + top= Toplevel() + + top.geometry("740x550") + window_height = 740 + window_width = 550 + + top.title("Specify Parameters") + + top.resizable(False, False) # This code helps to disable windows from resizing + + top.attributes("-topmost", True) + + screen_width = top.winfo_screenwidth() + screen_height = top.winfo_screenheight() + + x_cordinate = int((screen_width/2) - (window_width/2)) + y_cordinate = int((screen_height/2) - (window_height/2)) + + top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + # change title bar icon + top.iconbitmap('img\\UVR-Icon-v2.ico') + + tabControl = ttk.Notebook(top) + + tabControl.pack(expand = 1, fill ="both") + + tabControl.grid_rowconfigure(0, weight=1) + tabControl.grid_columnconfigure(0, weight=1) + + frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=0) + + frame0.tkraise(frame0) + + space_small = ' '*20 + space_small_1 = ' '*10 + + l0=tk.Label(frame0, text=f'{space_small}Stem Type{space_small}', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=3,column=0,padx=0,pady=5) + + l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals', 'Instrumental', 'Other', 'Bass', 'Drums') + l0.grid(row=4,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text='N_FFT Scale', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=5,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text=f'{space_small_1}(Manual Set){space_small_1}', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=5,column=1,padx=0,pady=5) + + self.options_n_fft_scale_Opt = l0=ttk.OptionMenu(frame0, self.n_fft_scale_set_var, None, '4096', '6144', '7680', '8192', '16384') + + self.options_n_fft_scale_Opt + l0.grid(row=6,column=0,padx=0,pady=5) + + self.options_n_fft_scale_Entry = l0=ttk.Entry(frame0, textvariable=self.n_fft_scale_set_var, justify='center') + + self.options_n_fft_scale_Entry + l0.grid(row=6,column=1,padx=0,pady=5) + + l0=tk.Label(frame0, text='Dim_f', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=7,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text='(Manual Set)', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=7,column=1,padx=0,pady=5) + + self.options_dim_f_Opt = l0=ttk.OptionMenu(frame0, self.dim_f_set_var, None, '2048', '3072', '4096') + + self.options_dim_f_Opt + l0.grid(row=8,column=0,padx=0,pady=5) + + self.options_dim_f_Entry = l0=ttk.Entry(frame0, textvariable=self.dim_f_set_var, justify='center') + + self.options_dim_f_Entry + l0.grid(row=8,column=1,padx=0,pady=5) + + l0=tk.Label(frame0, text='Noise Profile', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=9,column=0,padx=0,pady=5) + + l0=ttk.OptionMenu(frame0, self.noise_pro_select_set_var, None, 'MDX-NET_Noise_Profile_14_kHz', 'MDX-NET_Noise_Profile_17_kHz', 'MDX-NET_Noise_Profile_Full_Band') + l0.grid(row=10,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text='Volume Compensation', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=11,column=0,padx=0,pady=10) + + self.options_compensate = l0=ttk.Entry(frame0, textvariable=self.compensate_v_var, justify='center') + + self.options_compensate + l0.grid(row=12,column=0,padx=0,pady=0) + + l0=ttk.Button(frame0,text="Continue", command=lambda: self.okVar.set(1)) + l0.grid(row=13,column=0,padx=0,pady=30) + + def stop(): + widget_text.write(f'Please configure the ONNX model settings accordingly and try again.\n\n') + widget_text.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') + torch.cuda.empty_cache() + gui_progress_bar.set(0) + widget_button.configure(state=tk.NORMAL) # Enable Button + top.destroy() + return + + l0=ttk.Button(frame0,text="Stop Process", command=stop) + l0.grid(row=13,column=1,padx=0,pady=30) + + def change_event(): + self.okVar.set(1) + #top.destroy() + pass + + top.protocol("WM_DELETE_WINDOW", change_event) + + frame0.wait_variable(self.okVar) + + global n_fft_scale_set + global dim_f_set + global modeltype + global stemset_n + global stem_text_a + global stem_text_b + global source_val + global noise_pro_set + global compensate + global demucs_model_set + + stemtype = self.mdxnetModeltype_var.get() + + if stemtype == 'Vocals': + modeltype = 'v' + stemset_n = '(Vocals)' + source_val = 3 + if stemtype == 'Instrumental': + modeltype = 'v' + stemset_n = '(Instrumental)' + source_val = 0 + if stemtype == 'Other': + modeltype = 'o' + stemset_n = '(Other)' + source_val = 2 + if stemtype == 'Drums': + modeltype = 'd' + stemset_n = '(Drums)' + source_val = 1 + if stemtype == 'Bass': + modeltype = 'b' + stemset_n = '(Bass)' + source_val = 0 + + if stemset_n == '(Vocals)': + stem_text_a = 'Vocals' + stem_text_b = 'Instrumental' + elif stemset_n == '(Instrumental)': + stem_text_a = 'Instrumental' + stem_text_b = 'Vocals' + elif stemset_n == '(Other)': + stem_text_a = 'Other' + stem_text_b = 'the no \"Other\" track' + elif stemset_n == '(Drums)': + stem_text_a = 'Drums' + stem_text_b = 'no \"Drums\" track' + elif stemset_n == '(Bass)': + stem_text_a = 'Bass' + stem_text_b = 'No \"Bass\" track' + else: + stem_text_a = 'Vocals' + stem_text_b = 'Instrumental' + + compensate = self.compensate_v_var.get() + n_fft_scale_set = int(self.n_fft_scale_set_var.get()) + dim_f_set = int(self.dim_f_set_var.get()) + noise_pro_set = self.noise_pro_select_set_var.get() + + mdx_model_params = { + 'modeltype' : modeltype, + 'stemset_n' : stemset_n, + 'source_val' : source_val, + 'compensate' : compensate, + 'n_fft_scale_set' : n_fft_scale_set, + 'dim_f_set' : dim_f_set, + 'noise_pro' : noise_pro_set, + } + + mdx_model_params_r = json.dumps(mdx_model_params, indent=4) + + with open(f"lib_v5/filelists/model_cache/mdx_model_cache/{model_hash}.json", "w") as outfile: + outfile.write(mdx_model_params_r) + + if 'UVR' in demucs_model_set: + if stemset_n == '(Bass)' or stemset_n == '(Drums)' or stemset_n == '(Other)': + widget_text.write(base_text + 'The selected Demucs model can only be used with vocal or instrumental stems.\n') + widget_text.write(base_text + 'Please select a 4 stem Demucs model next time.\n') + widget_text.write(base_text + 'Setting Demucs Model to \"mdx_extra\"\n') + demucs_model_set = 'mdx_extra' + + + if stemset_n == '(Instrumental)': + if not 'UVR' in demucs_model_set: + widget_text.write(base_text + 'The selected Demucs model cannot be used with this model.\n') + widget_text.write(base_text + 'Only 2 stem Demucs models are compatible with this model.\n') + widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n') + demucs_model_set = 'UVR_Demucs_Model_1' + + top.destroy() + def prediction_setup(self): global device - print('Print the gpu setting: ', data['gpu']) - if data['gpu'] >= 0: device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') if data['gpu'] == -1: device = torch.device('cpu') - + if data['demucsmodel']: - if 'UVR' in demucs_model_set: - self.demucs = HDemucs(sources=["other", "vocals"]) - else: - self.demucs = HDemucs(sources=["drums", "bass", "other", "vocals"]) - widget_text.write(base_text + 'Loading Demucs model...') - update_progress(**progress_kwargs, - step=0.05) - path_d = Path('models/Demucs_Models') - self.demucs = _gm(name=demucs_model_set, repo=path_d) - self.demucs.to(device) - self.demucs.eval() - widget_text.write('Done!\n') - if isinstance(self.demucs, BagOfModels): - widget_text.write(base_text + f"Selected Demucs model is a bag of {len(self.demucs.models)} model(s).\n") + if demucs_model_version == 'v1': + load_from = "models/Demucs_Models/"f"{demucs_model_set}" + if str(load_from).endswith(".gz"): + load_from = gzip.open(load_from, "rb") + klass, args, kwargs, state = torch.load(load_from) + self.demucs = klass(*args, **kwargs) + widget_text.write(base_text + 'Loading Demucs v1 model... ') + update_progress(**progress_kwargs, + step=0.05) + self.demucs.to(device) + self.demucs.load_state_dict(state) + widget_text.write('Done!\n') + + if demucs_model_version == 'v2': + if '48' in demucs_model_set: + channels=48 + elif 'unittest' in demucs_model_set: + channels=4 + else: + channels=64 + + if 'tasnet' in demucs_model_set: + self.demucs = ConvTasNet(sources=["drums", "bass", "other", "vocals"], X=10) + else: + self.demucs = Demucs(sources=["drums", "bass", "other", "vocals"], channels=channels) + widget_text.write(base_text + 'Loading Demucs v2 model... ') + update_progress(**progress_kwargs, + step=0.05) + self.demucs.to(device) + self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set}")) + widget_text.write('Done!\n') + self.demucs.eval() + + if demucs_model_version == 'v3': + if 'UVR' in demucs_model_set: + self.demucs = HDemucs(sources=["other", "vocals"]) + else: + self.demucs = HDemucs(sources=["drums", "bass", "other", "vocals"]) + widget_text.write(base_text + 'Loading Demucs model... ') + update_progress(**progress_kwargs, + step=0.05) + path_d = Path('models/Demucs_Models/v3_repo') + #print('What Demucs model was chosen? ', demucs_model_set) + self.demucs = _gm(name=demucs_model_set, repo=path_d) + self.demucs.to(device) + self.demucs.eval() + widget_text.write('Done!\n') + if isinstance(self.demucs, BagOfModels): + widget_text.write(base_text + f"Selected Demucs model is a bag of {len(self.demucs.models)} model(s).\n") self.onnx_models = {} c = 0 - self.models = get_models('tdf_extra', load=False, device=cpu, stems=modeltype, n_fft_scale=n_fft_scale_set, dim_f=dim_f_set) + self.models = get_models('tdf_extra', load=False, device=cpu, stems=modeltype, n_fft_scale=int(n_fft_scale_set), dim_f=int(dim_f_set)) if not data['demucs_only']: widget_text.write(base_text + 'Loading ONNX model... ') @@ -94,15 +346,15 @@ class Predictor(): elif data['gpu'] == -1: run_type = ['CPUExecutionProvider'] - print('Selected Model: ', model_set) - self.onnx_models[c] = ort.InferenceSession(os.path.join('models/MDX_Net_Models', str(model_set) + '.onnx'), providers=run_type) + print('Selected Model: ', mdx_model_path) + self.onnx_models[c] = ort.InferenceSession(os.path.join(mdx_model_path), providers=run_type) if not data['demucs_only']: widget_text.write('Done!\n') def prediction(self, m): mix, samplerate = librosa.load(m, mono=False, sr=44100) - print('print mix: ', mix) + #print('print mix: ', mix) if mix.ndim == 1: mix = np.asfortranarray([mix,mix]) samplerate = samplerate @@ -114,11 +366,13 @@ class Predictor(): #Main Save Path save_path = os.path.dirname(_basename) - print('stemset_n: ', stemset_n) + #print('stemset_n: ', stemset_n) #Vocal Path if stemset_n == '(Vocals)': vocal_name = '(Vocals)' + elif stemset_n == '(Instrumental)': + vocal_name = '(Instrumental)' elif stemset_n == '(Other)': vocal_name = '(Other)' elif stemset_n == '(Drums)': @@ -151,6 +405,8 @@ class Predictor(): if stemset_n == '(Vocals)': Instrumental_name = '(Instrumental)' + elif stemset_n == '(Instrumental)': + Instrumental_name = '(Vocals)' elif stemset_n == '(Other)': Instrumental_name = '(No_Other)' elif stemset_n == '(Drums)': @@ -188,6 +444,8 @@ class Predictor(): vocal_name = '(Drums)' elif stemset_n == '(Bass)': vocal_name = '(Bass)' + elif stemset_n == '(Instrumental)': + vocal_name = '(Instrumental)' if data['modelFolder']: non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format( @@ -247,16 +505,16 @@ class Predictor(): else: file_exists_i = 'not_there' - print('Is there already a voc file there? ', file_exists_v) + #print('Is there already a voc file there? ', file_exists_v) if not data['noisereduc_s'] == 'None': c += 1 if not data['demucsmodel']: if data['inst_only']: - widget_text.write(base_text + 'Preparing to save Instrumental...') + widget_text.write(base_text + f'Preparing to save {stem_text_b}...') else: - widget_text.write(base_text + 'Saving vocals... ') + widget_text.write(base_text + f'Saving {stem_text_a}... ') sf.write(non_reduced_vocal_path, sources[c].T, samplerate, subtype=wav_type_set) update_progress(**progress_kwargs, @@ -274,13 +532,16 @@ class Predictor(): step=(0.95)) else: if data['inst_only']: - widget_text.write(base_text + 'Preparing Instrumental...') + widget_text.write(base_text + f'Preparing {stem_text_b}...') else: - widget_text.write(base_text + 'Saving Vocals... ') + widget_text.write(base_text + f'Saving {stem_text_a}... ') if data['demucs_only']: if 'UVR' in demucs_model_set: - sf.write(non_reduced_vocal_path, sources[1].T, samplerate, subtype=wav_type_set) + if stemset_n == '(Instrumental)': + sf.write(non_reduced_vocal_path, sources[0].T, samplerate, subtype=wav_type_set) + else: + sf.write(non_reduced_vocal_path, sources[1].T, samplerate, subtype=wav_type_set) else: sf.write(non_reduced_vocal_path, sources[source_val].T, samplerate, subtype=wav_type_set) update_progress(**progress_kwargs, @@ -288,7 +549,7 @@ class Predictor(): widget_text.write('Done!\n') widget_text.write(base_text + 'Performing Noise Reduction... ') reduction_sen = float(data['noisereduc_s'])/10 - print(noise_pro_set) + #print(noise_pro_set) subprocess.call("lib_v5\\sox\\sox.exe" + ' "' + f"{str(non_reduced_vocal_path)}" + '" "' + f"{str(vocal_path)}" + '" ' + "noisered lib_v5\\sox\\" + noise_pro_set + ".prof " + f"{reduction_sen}", @@ -302,22 +563,25 @@ class Predictor(): if not data['demucsmodel']: if data['inst_only']: - widget_text.write(base_text + 'Preparing Instrumental...') + widget_text.write(base_text + f'Preparing {stem_text_b}...') else: - widget_text.write(base_text + 'Saving Vocals... ') + widget_text.write(base_text + f'Saving {stem_text_a}... ') sf.write(vocal_path, sources[c].T, samplerate, subtype=wav_type_set) update_progress(**progress_kwargs, step=(0.9)) widget_text.write('Done!\n') else: if data['inst_only']: - widget_text.write(base_text + 'Preparing Instrumental...') + widget_text.write(base_text + f'Preparing {stem_text_b}...') else: - widget_text.write(base_text + 'Saving Vocals... ') + widget_text.write(base_text + f'Saving {stem_text_a}... ') if data['demucs_only']: if 'UVR' in demucs_model_set: - sf.write(vocal_path, sources[1].T, samplerate, subtype=wav_type_set) + if stemset_n == '(Instrumental)': + sf.write(vocal_path, sources[0].T, samplerate, subtype=wav_type_set) + else: + sf.write(vocal_path, sources[1].T, samplerate, subtype=wav_type_set) else: sf.write(vocal_path, sources[source_val].T, samplerate, subtype=wav_type_set) else: @@ -353,7 +617,7 @@ class Predictor(): } ] - widget_text.write(base_text + 'Saving Instrumental... ') + widget_text.write(base_text + f'Saving {stem_text_b}... ') for i, e in tqdm(enumerate(finalfiles)): wave, specs = {}, {} @@ -397,7 +661,7 @@ class Predictor(): sf.write(non_reduced_Instrumental_path, normalization_set(spec_utils.cmb_spectrogram_to_wave(-v_spec, mp)), mp.param['sr'], subtype=wav_type_set) reduction_sen = float(data['noisereduc_s'])/10 - print(noise_pro_set) + #print(noise_pro_set) subprocess.call("lib_v5\\sox\\sox.exe" + ' "' + f"{str(non_reduced_Instrumental_path)}" + '" "' + f"{str(Instrumental_path)}" + '" ' + @@ -640,7 +904,7 @@ class Predictor(): except: pass - widget_text.write(base_text + 'Completed Seperation!\n') + widget_text.write(base_text + 'Completed Separation!\n') def demix(self, mix): # 1 = demucs only @@ -722,23 +986,34 @@ class Predictor(): sources = self.demix_demucs(segmented_mix, margin_size=margin) else: # both, apply spec effects base_out = self.demix_base(segmented_mix, margin_size=margin) - print(split_mode) - if split_mode == True: - demucs_out = self.demix_demucs_split(mix) - if split_mode == False: - demucs_out = self.demix_demucs(segmented_mix, margin_size=margin) + #print(split_mode) + + + if demucs_model_version == 'v1': + demucs_out = self.demix_demucs_v1(segmented_mix, margin_size=margin) + if demucs_model_version == 'v2': + demucs_out = self.demix_demucs_v2(segmented_mix, margin_size=margin) + if demucs_model_version == 'v3': + if split_mode == True: + demucs_out = self.demix_demucs_split(mix) + if split_mode == False: + demucs_out = self.demix_demucs(segmented_mix, margin_size=margin) nan_count = np.count_nonzero(np.isnan(demucs_out)) + np.count_nonzero(np.isnan(base_out)) if nan_count > 0: print('Warning: there are {} nan values in the array(s).'.format(nan_count)) demucs_out, base_out = np.nan_to_num(demucs_out), np.nan_to_num(base_out) sources = {} - print(data['mixing']) + #print(data['mixing']) if 'UVR' in demucs_model_set: - - sources[source_val] = (spec_effects(wave=[demucs_out[1],base_out[0]], - algorithm=data['mixing'], - value=b[source_val])*float(compensate)) # compensation + if stemset_n == '(Instrumental)': + sources[source_val] = (spec_effects(wave=[demucs_out[0],base_out[0]], + algorithm=data['mixing'], + value=b[source_val])*float(compensate)) # compensation + else: + sources[source_val] = (spec_effects(wave=[demucs_out[1],base_out[0]], + algorithm=data['mixing'], + value=b[source_val])*float(compensate)) # compensation else: sources[source_val] = (spec_effects(wave=[demucs_out[source_val],base_out[0]], algorithm=data['mixing'], @@ -806,7 +1081,7 @@ class Predictor(): return _sources def demix_demucs(self, mix, margin_size): - print('shift_set ', shift_set) + #print('shift_set ', shift_set) processed = {} demucsitera = len(mix) demucsitera_calc = demucsitera * 2 @@ -824,7 +1099,7 @@ class Predictor(): ref = cmix.mean(0) cmix = (cmix - ref.mean()) / ref.std() with torch.no_grad(): - print(split_mode) + #print(split_mode) sources = apply_model(self.demucs, cmix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=False)[0] sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources[[0,1]] = sources[[1,0]] @@ -838,13 +1113,13 @@ class Predictor(): sources = list(processed.values()) sources = np.concatenate(sources, axis=-1) widget_text.write('Done!\n') - print('the demucs model is done running') + #print('the demucs model is done running') return sources def demix_demucs_split(self, mix): - print('shift_set ', shift_set) + #print('shift_set ', shift_set) widget_text.write(base_text + "Split Mode is on. (Chunks disabled for Demucs Model)\n") widget_text.write(base_text + "Running Demucs Inference...\n") widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") @@ -862,45 +1137,111 @@ class Predictor(): sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources[[0,1]] = sources[[1,0]] - print('the demucs model is done running') + #print('the demucs model is done running') return sources + + def demix_demucs_v1(self, mix, margin_size): + processed = {} + demucsitera = len(mix) + demucsitera_calc = demucsitera * 2 + gui_progress_bar_demucs = 0 + widget_text.write(base_text + "Running Demucs v1 Inference...\n") + widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") + print(' Running Demucs Inference...') + for nmix in mix: + gui_progress_bar_demucs += 1 + update_progress(**progress_kwargs, + step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) + cmix = mix[nmix] + cmix = torch.tensor(cmix, dtype=torch.float32) + ref = cmix.mean(0) + cmix = (cmix - ref.mean()) / ref.std() + with torch.no_grad(): + sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set) + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0,1]] = sources[[1,0]] + + start = 0 if nmix == 0 else margin_size + end = None if nmix == list(mix.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + processed[nmix] = sources[:,:,start:end].copy() + + sources = list(processed.values()) + sources = np.concatenate(sources, axis=-1) + widget_text.write('Done!\n') + return sources + + def demix_demucs_v2(self, mix, margin_size): + processed = {} + demucsitera = len(mix) + demucsitera_calc = demucsitera * 2 + gui_progress_bar_demucs = 0 + widget_text.write(base_text + "Running Demucs v2 Inference...\n") + widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") + print(' Running Demucs Inference...') + for nmix in mix: + gui_progress_bar_demucs += 1 + update_progress(**progress_kwargs, + step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) + cmix = mix[nmix] + cmix = torch.tensor(cmix, dtype=torch.float32) + ref = cmix.mean(0) + cmix = (cmix - ref.mean()) / ref.std() + with torch.no_grad(): + sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set) + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0,1]] = sources[[1,0]] + + start = 0 if nmix == 0 else margin_size + end = None if nmix == list(mix.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + processed[nmix] = sources[:,:,start:end].copy() + + sources = list(processed.values()) + sources = np.concatenate(sources, axis=-1) + widget_text.write('Done!\n') + return sources + + data = { - # Paths - 'input_paths': None, - 'export_path': None, - 'saveFormat': 'Wav', - # Processing Options - 'demucsmodel': False, - 'gpu': -1, - 'chunks': 10, - 'non_red': False, - 'noisereduc_s': 3, - 'modelFolder': False, - 'voc_only': False, - 'inst_only': False, - 'n_fft_scale': 6144, - 'dim_f': 2048, - 'noise_pro_select': 'Auto Select', - 'overlap': 0.5, - 'shifts': 0, - 'margin': 44100, - 'split_mode': False, - 'normalize': False, - 'nophaseinst': True, - 'compensate': 1.03597672895, 'autocompensate': True, + 'aud_mdx': True, + 'bit': '', + 'chunks': 10, + 'compensate': 1.03597672895, 'demucs_only': False, - 'wavtype': 'PCM_16', - 'flactype': 'PCM_16', - 'mp3bit': '320k', - 'mixing': 'Default', + 'demucsmodel': False, 'DemucsModel_MDX': 'UVR_Demucs_Model_1', - # Choose Model + 'dim_f': 2048, + 'export_path': None, + 'flactype': 'PCM_16', + 'gpu': -1, + 'input_paths': None, + 'inst_only': False, + 'margin': 44100, 'mdxnetModel': 'UVR-MDX-NET Main', 'mdxnetModeltype': 'Vocals (Custom)', + 'mixing': 'Default', + 'modelFolder': False, + 'mp3bit': '320k', + 'n_fft_scale': 6144, + 'noise_pro_select': 'Auto Select', + 'noisereduc_s': 3, + 'non_red': False, + 'nophaseinst': True, + 'normalize': False, + 'overlap': 0.5, + 'saveFormat': 'Wav', + 'shifts': 0, + 'split_mode': False, + 'voc_only': False, + 'wavtype': 'PCM_16', } + default_chunks = data['chunks'] default_noisereduc_s = data['noisereduc_s'] @@ -929,8 +1270,11 @@ def hide_opt(): yield finally: sys.stdout = old_stdout - -def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress_var: tk.Variable, + +def main(window: tk.Wm, + text_widget: tk.Text, + button_widget: tk.Button, + progress_var: tk.Variable, **kwargs: dict): global widget_text @@ -945,9 +1289,10 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress global dim_f_set global progress_kwargs global base_text - global model_set global model_set_name global stemset_n + global stem_text_a + global stem_text_b global noise_pro_set global demucs_model_set global autocompensate @@ -963,6 +1308,11 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress global flac_type_set global mp3_bit_set global normalization_set + global demucs_model_version + global mdx_model_path + global widget_button + global stime + global model_hash global demucs_switch @@ -973,6 +1323,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress widget_text = text_widget gui_progress_bar = progress_var + widget_button = button_widget #Error Handling @@ -997,171 +1348,154 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress data.update(kwargs) - autocompensate = data['autocompensate'] - - if data['mdxnetModeltype'] == 'Vocals (Custom)': - stemset = 'v' - source_val_set = 3 - stem_name = '(Vocals)' - if data['mdxnetModeltype'] == 'Other (Custom)': - stemset = 'o' - source_val_set = 2 - stem_name = '(Other)' - if data['mdxnetModeltype'] == 'Drums (Custom)': - stemset = 'd' - source_val_set = 1 - stem_name = '(Drums)' - if data['mdxnetModeltype'] == 'Bass (Custom)': - stemset = 'b' - source_val_set = 0 - stem_name = '(Bass)' - if data['mdxnetModeltype'] == 'Vocals (Default)': - stemset = 'v' - source_val_set = 3 - stem_name = '(Vocals)' - if data['mdxnetModeltype'] == 'Other (Default)': - stemset = 'o' - source_val_set = 2 - stem_name = '(Other)' - if data['mdxnetModeltype'] == 'Drums (Default)': - stemset = 'd' - source_val_set = 1 - stem_name = '(Drums)' - if data['mdxnetModeltype'] == 'Bass (Default)': - stemset = 'b' - source_val_set = 0 - stem_name = '(Bass)' - - if data['mdxnetModel'] == 'UVR-MDX-NET 1': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): - model_set = 'UVR_MDXNET_1_9703' - model_set_name = 'UVR_MDXNET_1_9703' - else: - model_set = 'UVR_MDXNET_9703' - model_set_name = 'UVR_MDXNET_9703' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - stemset_n = '(Vocals)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 3 - n_fft_scale_set=6144 - dim_f_set=2048 - elif data['mdxnetModel'] == 'UVR-MDX-NET 2': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): - model_set = 'UVR_MDXNET_2_9682' - model_set_name = 'UVR_MDXNET_2_9682' - else: - model_set = 'UVR_MDXNET_9682' - model_set_name = 'UVR_MDXNET_9682' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - stemset_n = '(Vocals)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 3 - n_fft_scale_set=6144 - dim_f_set=2048 - elif data['mdxnetModel'] == 'UVR-MDX-NET 3': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): - model_set = 'UVR_MDXNET_3_9662' - model_set_name = 'UVR_MDXNET_3_9662' - else: - model_set = 'UVR_MDXNET_9662' - model_set_name = 'UVR_MDXNET_9662' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - stemset_n = '(Vocals)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 3 - n_fft_scale_set=6144 - dim_f_set=2048 - elif data['mdxnetModel'] == 'UVR-MDX-NET Karaoke': - model_set = 'UVR_MDXNET_KARA' - model_set_name = 'UVR_MDXNET_Karaoke' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - stemset_n = '(Vocals)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 3 - n_fft_scale_set=6144 - dim_f_set=2048 - elif data['mdxnetModel'] == 'UVR-MDX-NET Main': - model_set = 'UVR_MDXNET_Main' - model_set_name = 'UVR_MDXNET_Main' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_17_kHz' - stemset_n = '(Vocals)' - if autocompensate == True: - compensate = 1.08 - else: - compensate = data['compensate'] - source_val = 3 - n_fft_scale_set=7680 - dim_f_set=3072 - elif 'other' in data['mdxnetModel']: - model_set = 'other' - model_set_name = 'other' - modeltype = 'o' - noise_pro = 'MDX-NET_Noise_Profile_Full_Band' - stemset_n = '(Other)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 2 - n_fft_scale_set=8192 - dim_f_set=2048 - elif 'drums' in data['mdxnetModel']: - model_set = 'drums' - model_set_name = 'drums' - modeltype = 'd' - noise_pro = 'MDX-NET_Noise_Profile_Full_Band' - stemset_n = '(Drums)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 1 - n_fft_scale_set=4096 - dim_f_set=2048 - elif 'bass' in data['mdxnetModel']: - model_set = 'bass' - model_set_name = 'bass' - modeltype = 'b' - noise_pro = 'MDX-NET_Noise_Profile_Full_Band' - stemset_n = '(Bass)' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = 0 - n_fft_scale_set=16384 - dim_f_set=2048 + if data['DemucsModel_MDX'] == "Tasnet v1": + demucs_model_set_name = 'tasnet.th' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Tasnet_extra v1": + demucs_model_set_name = 'tasnet_extra.th' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Demucs v1": + demucs_model_set_name = 'demucs.th' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Demucs v1.gz": + demucs_model_set_name = 'demucs.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Demucs_extra v1": + demucs_model_set_name = 'demucs_extra.th' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Demucs_extra v1.gz": + demucs_model_set_name = 'demucs_extra.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Light v1": + demucs_model_set_name = 'light.th' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Light v1.gz": + demucs_model_set_name = 'light.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Light_extra v1": + demucs_model_set_name = 'light_extra.th' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Light_extra v1.gz": + demucs_model_set_name = 'light_extra.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel_MDX'] == "Tasnet v2": + demucs_model_set_name = 'tasnet-beb46fac.th' + demucs_model_version = 'v2' + elif data['DemucsModel_MDX'] == "Tasnet_extra v2": + demucs_model_set_name = 'tasnet_extra-df3777b2.th' + demucs_model_version = 'v2' + elif data['DemucsModel_MDX'] == "Demucs48_hq v2": + demucs_model_set_name = 'demucs48_hq-28a1282c.th' + demucs_model_version = 'v2' + elif data['DemucsModel_MDX'] == "Demucs v2": + demucs_model_set_name = 'demucs-e07c671f.th' + demucs_model_version = 'v2' + elif data['DemucsModel_MDX'] == "Demucs_extra v2": + demucs_model_set_name = 'demucs_extra-3646af93.th' + demucs_model_version = 'v2' + elif data['DemucsModel_MDX'] == "Demucs_unittest v2": + demucs_model_set_name = 'demucs_unittest-09ebc15f.th' + demucs_model_version = 'v2' + elif '.ckpt' in data['DemucsModel_MDX'] and 'v2' in data['DemucsModel_MDX']: + demucs_model_set_name = data['DemucsModel_MDX'] + demucs_model_version = 'v2' + elif '.ckpt' in data['DemucsModel_MDX'] and 'v1' in data['DemucsModel_MDX']: + demucs_model_set_name = data['DemucsModel_MDX'] + demucs_model_version = 'v1' + elif '.gz' in data['DemucsModel_MDX']: + demucs_model_set_name = data['DemucsModel_MDX'] + demucs_model_version = 'v1' else: - model_set = data['mdxnetModel'] - model_set_name = data['mdxnetModel'] - modeltype = stemset - noise_pro = 'MDX-NET_Noise_Profile_Full_Band' - stemset_n = stem_name - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - source_val = source_val_set - n_fft_scale_set=int(data['n_fft_scale']) - dim_f_set=int(data['dim_f']) + demucs_model_set_name = data['DemucsModel_MDX'] + demucs_model_version = 'v3' + + autocompensate = data['autocompensate'] + model_set_name = data['mdxnetModel'] + + if model_set_name == 'UVR-MDX-NET 1': + mdx_model_name = 'UVR_MDXNET_1_9703' + elif model_set_name == 'UVR-MDX-NET 2': + mdx_model_name = 'UVR_MDXNET_2_9682' + elif model_set_name == 'UVR-MDX-NET 3': + mdx_model_name = 'UVR_MDXNET_3_9662' + elif model_set_name == 'UVR-MDX-NET Karaoke': + mdx_model_name = 'UVR_MDXNET_KARA' + elif model_set_name == 'UVR-MDX-NET Main': + mdx_model_name = 'UVR_MDXNET_Main' + else: + mdx_model_name = data['mdxnetModel'] + + + mdx_model_path = f'models/MDX_Net_Models/{mdx_model_name}.onnx' + + model_hash = hashlib.md5(open(mdx_model_path,'rb').read()).hexdigest() + model_params = [] + model_params = lib_v5.filelist.provide_mdx_model_param_name(model_hash) + + modeltype = model_params[0] + noise_pro = model_params[1] + stemset_n = model_params[2] + compensate_set = model_params[3] + source_val = model_params[4] + n_fft_scale_set = model_params[5] + dim_f_set = model_params[6] + + if not data['aud_mdx']: + if data['mdxnetModeltype'] == 'Vocals (Custom)': + modeltype = 'v' + source_val = 3 + stemset_n = '(Vocals)' + n_fft_scale_set = data['n_fft_scale'] + dim_f_set = data['dim_f'] + if data['mdxnetModeltype'] == 'Instrumental (Custom)': + modeltype = 'v' + source_val = 0 + stemset_n = '(Instrumental)' + n_fft_scale_set = data['n_fft_scale'] + dim_f_set = data['dim_f'] + if data['mdxnetModeltype'] == 'Other (Custom)': + modeltype = 'v' + source_val = 2 + stemset_n = '(Other)' + n_fft_scale_set = data['n_fft_scale'] + dim_f_set = data['dim_f'] + if data['mdxnetModeltype'] == 'Drums (Custom)': + modeltype = 'v' + source_val = 1 + stemset_n = '(Drums)' + n_fft_scale_set = data['n_fft_scale'] + dim_f_set = data['dim_f'] + if data['mdxnetModeltype'] == 'Bass (Custom)': + modeltype = 'v' + source_val = 0 + stemset_n = '(Bass)' + n_fft_scale_set = data['n_fft_scale'] + dim_f_set = data['dim_f'] + + if stemset_n == '(Vocals)': + stem_text_a = 'Vocals' + stem_text_b = 'Instrumental' + elif stemset_n == '(Instrumental)': + stem_text_a = 'Instrumental' + stem_text_b = 'Vocals' + elif stemset_n == '(Other)': + stem_text_a = 'Other' + stem_text_b = 'the no \"Other\" track' + elif stemset_n == '(Drums)': + stem_text_a = 'Drums' + stem_text_b = 'the no \"Drums\" track' + elif stemset_n == '(Bass)': + stem_text_a = 'Bass' + stem_text_b = 'the no \"Bass\" track' + else: + stem_text_a = 'Vocals' + stem_text_b = 'Instrumental' + + if autocompensate: + compensate = compensate_set + else: + compensate = data['compensate'] if data['noise_pro_select'] == 'Auto Select': noise_pro_set = noise_pro @@ -1180,14 +1514,14 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress if data['normalize'] == True: normalization_set = spec_utils.normalize - print('normalization on') + #print('normalization on') else: normalization_set = spec_utils.nonormalize - print('normalization off') + #print('normalization off') - print(n_fft_scale_set) - print(dim_f_set) - print(data['DemucsModel_MDX']) + #print(n_fft_scale_set) + #print(dim_f_set) + #print(demucs_model_set_name) stime = time.perf_counter() @@ -1202,7 +1536,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress channel_set = int(data['channel']) margin_set = int(data['margin']) shift_set = int(data['shifts']) - demucs_model_set = data['DemucsModel_MDX'] + demucs_model_set = demucs_model_set_name split_mode = data['split_mode'] demucs_switch = data['demucsmodel'] @@ -1221,37 +1555,6 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress progress_var.set(0) button_widget.configure(state=tk.NORMAL) # Enable Button return - - if stemset_n == '(Bass)': - if 'UVR' in demucs_model_set: - text_widget.write('The selected Demucs model can only be used with vocal stems.\n') - text_widget.write('Please select a 4 stem Demucs model and try again.\n\n') - text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') - progress_var.set(0) - button_widget.configure(state=tk.NORMAL) # Enable Button - return - else: - pass - if stemset_n == '(Drums)': - if 'UVR' in demucs_model_set: - text_widget.write('The selected Demucs model can only be used with vocal stems.\n') - text_widget.write('Please select a 4 stem Demucs model and try again.\n\n') - text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') - progress_var.set(0) - button_widget.configure(state=tk.NORMAL) # Enable Button - return - else: - pass - if stemset_n == '(Other)': - if 'UVR' in demucs_model_set: - text_widget.write('The selected Demucs model can only be used with vocal stems.\n') - text_widget.write('Please select a 4 stem Demucs model and try again.\n\n') - text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') - progress_var.set(0) - button_widget.configure(state=tk.NORMAL) # Enable Button - return - else: - pass _mixture = f'{data["input_paths"]}' @@ -1272,10 +1575,25 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress 'total_files': len(data['input_paths']), 'file_num': file_num} - print(model_set) + + if 'UVR' in demucs_model_set: + if stemset_n == '(Bass)' or stemset_n == '(Drums)' or stemset_n == '(Other)': + widget_text.write('The selected Demucs model can only be used with vocal or instrumental stems.\n') + widget_text.write('Please select a 4 stem Demucs model and try again.\n\n') + widget_text.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') + gui_progress_bar.set(0) + widget_button.configure(state=tk.NORMAL) # Enable Button + return + + + if stemset_n == '(Instrumental)': + if not 'UVR' in demucs_model_set: + widget_text.write(base_text + 'The selected Demucs model cannot be used with this model.\n') + widget_text.write(base_text + 'Only 2 stem Demucs models are compatible with this model.\n') + widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n') + demucs_model_set = 'UVR_Demucs_Model_1' try: - if float(data['noisereduc_s']) >= 11: text_widget.write('Error: Noise Reduction only supports values between 0-10.\nPlease set a value between 0-10 (with or without decimals) and try again.') progress_var.set(0) @@ -1325,9 +1643,40 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress demucsmodel = 'models/Demucs_Models/' + str(data['DemucsModel_MDX']) pred = Predictor() + + + print('\n\nmodeltype: ', modeltype) + print('noise_pro: ', noise_pro) + print('stemset_n: ', stemset_n) + print('compensate_set: ', compensate_set) + print('source_val: ', source_val) + print('n_fft_scale_set: ', n_fft_scale_set) + print('dim_f_set: ', dim_f_set, '\n') + + if modeltype == 'Not Set' or \ + noise_pro == 'Not Set' or \ + stemset_n == 'Not Set' or \ + compensate_set == 'Not Set' or \ + source_val == 'Not Set' or \ + n_fft_scale_set == 'Not Set' or \ + dim_f_set == 'Not Set': + confirm = tk.messagebox.askyesno(title='Unrecognized Model Detected', + message=f'\nWould you like to set the correct model parameters for this model before continuing?\n') + + if confirm: + pred.mdx_options() + else: + text_widget.write(f'An unrecognized model has been detected.\n\n') + text_widget.write(f'Please configure the ONNX model settings accordingly and try again.\n\n') + text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') + torch.cuda.empty_cache() + progress_var.set(0) + button_widget.configure(state=tk.NORMAL) # Enable Button + return + pred.prediction_setup() - print(demucsmodel) + #print(demucsmodel) # split pred.prediction( diff --git a/inference_demucs.py b/inference_demucs.py index 9172e42..0d0b7c9 100644 --- a/inference_demucs.py +++ b/inference_demucs.py @@ -1,37 +1,37 @@ -import os -from pathlib import Path -import os.path from datetime import datetime -import pydub -import shutil -from random import randrange -#MDX-Net -#---------------------------------------- -import soundfile as sf -import torch -import numpy as np - -from demucs.pretrained import get_model as _gm -from demucs.hdemucs import HDemucs from demucs.apply import BagOfModels, apply_model -from demucs.audio import AudioFile - -import time -import os -from tqdm import tqdm -import warnings -import sys -import librosa -import psutil -#---------------------------------------- +from demucs.hdemucs import HDemucs +from demucs.model_v2 import Demucs +from demucs.pretrained import get_model as _gm +from demucs.tasnet_v2 import ConvTasNet +from demucs.utils import apply_model_v1 +from demucs.utils import apply_model_v2 +from diffq import DiffQuantizer from lib_v5 import spec_utils from lib_v5.model_param_init import ModelParameters -import torch - -# Command line text parsing and widget manipulation -import tkinter as tk -import traceback # Error Message Recent Calls +from pathlib import Path +from random import randrange +from tqdm import tqdm +import gzip +import io +import librosa +import numpy as np +import os +import os +import os.path +import psutil +import pydub +import shutil +import soundfile as sf +import sys +import time import time # Timer +import tkinter as tk +import torch +import torch.hub +import traceback # Error Message Recent Calls +import warnings +import zlib class Predictor(): def __init__(self): @@ -46,40 +46,62 @@ class Predictor(): if data['gpu'] == -1: device = torch.device('cpu') - self.demucs = HDemucs(sources=["drums", "bass", "other", "vocals"]) - widget_text.write(base_text + 'Loading Demucs model... ') - update_progress(**progress_kwargs, - step=0.05) - path_d = Path('models/Demucs_Models') - print('What Demucs model was chosen? ', data['DemucsModel']) - self.demucs = _gm(name=data['DemucsModel'], repo=path_d) - widget_text.write('Done!\n') - if 'UVR' in data['DemucsModel']: - widget_text.write(base_text + "2 stem model selected.\n") - if isinstance(self.demucs, BagOfModels): - widget_text.write(base_text + f"Selected model is a bag of {len(self.demucs.models)} models.\n") - - if data['segment'] == 'None': - segment = None - if isinstance(self.demucs, BagOfModels): - if segment is not None: - for sub in self.demucs.models: - sub.segment = segment + if demucs_model_version == 'v1': + load_from = "models/Demucs_Models/"f"{demucs_model_set_name}" + if str(load_from).endswith(".gz"): + load_from = gzip.open(load_from, "rb") + klass, args, kwargs, state = torch.load(load_from) + self.demucs = klass(*args, **kwargs) + widget_text.write(base_text + 'Loading Demucs v1 model... ') + update_progress(**progress_kwargs, + step=0.05) + self.demucs.to(device) + self.demucs.load_state_dict(state) + widget_text.write('Done!\n') + if not data['segment'] == 'None': + widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n') else: - if segment is not None: - sub.segment = segment - else: - try: - segment = int(data['segment']) - if isinstance(self.demucs, BagOfModels): - if segment is not None: - for sub in self.demucs.models: - sub.segment = segment - else: - if segment is not None: - sub.segment = segment - widget_text.write(base_text + "Segments set to "f"{segment}.\n") - except: + pass + + if demucs_model_version == 'v2': + if '48' in demucs_model_set_name: + channels=48 + elif 'unittest' in demucs_model_set_name: + channels=4 + else: + channels=64 + + if 'tasnet' in demucs_model_set_name: + self.demucs = ConvTasNet(sources=["drums", "bass", "other", "vocals"], X=10) + else: + self.demucs = Demucs(sources=["drums", "bass", "other", "vocals"], channels=channels) + widget_text.write(base_text + 'Loading Demucs v2 model... ') + update_progress(**progress_kwargs, + step=0.05) + self.demucs.to(device) + self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set_name}")) + widget_text.write('Done!\n') + if not data['segment'] == 'None': + widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n') + else: + pass + self.demucs.eval() + + if demucs_model_version == 'v3': + self.demucs = HDemucs(sources=["drums", "bass", "other", "vocals"]) + widget_text.write(base_text + 'Loading Demucs model... ') + update_progress(**progress_kwargs, + step=0.05) + path_d = Path('models/Demucs_Models/v3_repo') + #print('What Demucs model was chosen? ', demucs_model_set_name) + self.demucs = _gm(name=demucs_model_set_name, repo=path_d) + widget_text.write('Done!\n') + if 'UVR' in data['DemucsModel']: + widget_text.write(base_text + "2 stem model selected.\n") + if isinstance(self.demucs, BagOfModels): + widget_text.write(base_text + f"Selected model is a bag of {len(self.demucs.models)} models.\n") + + if data['segment'] == 'None': segment = None if isinstance(self.demucs, BagOfModels): if segment is not None: @@ -88,9 +110,29 @@ class Predictor(): else: if segment is not None: sub.segment = segment - - self.demucs.to(device) - self.demucs.eval() + else: + try: + segment = int(data['segment']) + if isinstance(self.demucs, BagOfModels): + if segment is not None: + for sub in self.demucs.models: + sub.segment = segment + else: + if segment is not None: + sub.segment = segment + widget_text.write(base_text + "Segments set to "f"{segment}.\n") + except: + segment = None + if isinstance(self.demucs, BagOfModels): + if segment is not None: + for sub in self.demucs.models: + sub.segment = segment + else: + if segment is not None: + sub.segment = segment + + self.demucs.to(device) + self.demucs.eval() update_progress(**progress_kwargs, step=0.1) @@ -646,7 +688,12 @@ class Predictor(): if end == samples: break - sources = self.demix_demucs(segmented_mix, margin_size=margin) + if demucs_model_version == 'v1': + sources = self.demix_demucs_v1(segmented_mix, margin_size=margin) + if demucs_model_version == 'v2': + sources = self.demix_demucs_v2(segmented_mix, margin_size=margin) + if demucs_model_version == 'v3': + sources = self.demix_demucs(segmented_mix, margin_size=margin) return sources @@ -683,31 +730,94 @@ class Predictor(): sources = np.concatenate(sources, axis=-1) widget_text.write('Done!\n') return sources + + def demix_demucs_v1(self, mix, margin_size): + processed = {} + demucsitera = len(mix) + demucsitera_calc = demucsitera * 2 + gui_progress_bar_demucs = 0 + widget_text.write(base_text + "Running Demucs v1 Inference...\n") + widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") + print(' Running Demucs Inference...') + for nmix in mix: + gui_progress_bar_demucs += 1 + update_progress(**progress_kwargs, + step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) + cmix = mix[nmix] + cmix = torch.tensor(cmix, dtype=torch.float32) + ref = cmix.mean(0) + cmix = (cmix - ref.mean()) / ref.std() + with torch.no_grad(): + sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set) + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0,1]] = sources[[1,0]] + + start = 0 if nmix == 0 else margin_size + end = None if nmix == list(mix.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + processed[nmix] = sources[:,:,start:end].copy() + + sources = list(processed.values()) + sources = np.concatenate(sources, axis=-1) + widget_text.write('Done!\n') + return sources + + def demix_demucs_v2(self, mix, margin_size): + processed = {} + demucsitera = len(mix) + demucsitera_calc = demucsitera * 2 + gui_progress_bar_demucs = 0 + widget_text.write(base_text + "Running Demucs v2 Inference...\n") + widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") + print(' Running Demucs Inference...') + for nmix in mix: + gui_progress_bar_demucs += 1 + update_progress(**progress_kwargs, + step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) + cmix = mix[nmix] + cmix = torch.tensor(cmix, dtype=torch.float32) + ref = cmix.mean(0) + cmix = (cmix - ref.mean()) / ref.std() + shift_set = 0 + with torch.no_grad(): + sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set) + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0,1]] = sources[[1,0]] + + start = 0 if nmix == 0 else margin_size + end = None if nmix == list(mix.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + processed[nmix] = sources[:,:,start:end].copy() + + sources = list(processed.values()) + sources = np.concatenate(sources, axis=-1) + widget_text.write('Done!\n') + return sources data = { - # Paths - 'input_paths': None, - 'export_path': None, - 'saveFormat': 'Wav', - # Processing Options - 'demucsmodel': True, - 'gpu': -1, + 'audfile': True, 'chunks_d': 'Full', - 'settest': False, - 'voc_only_b': False, - 'inst_only_b': False, - 'overlap_b': 0.25, - 'shifts_b': 2, - 'segment': 'None', - 'margin': 44100, - 'split_mode': False, - 'normalize': False, 'compensate': 1.03597672895, 'demucs_stems': 'All Stems', 'DemucsModel': 'mdx_extra', - 'audfile': True, - 'wavtype': 'PCM_16', + 'demucsmodel': True, + 'export_path': None, + 'gpu': -1, + 'input_paths': None, + 'inst_only_b': False, + 'margin': 44100, 'mp3bit': '320k', + 'normalize': False, + 'overlap_b': 0.25, + 'saveFormat': 'Wav', + 'segment': 'None', + 'settest': False, + 'shifts_b': 2, + 'split_mode': False, + 'voc_only_b': False, + 'wavtype': 'PCM_16', } default_chunks = data['chunks_d'] @@ -756,6 +866,8 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress global shift_set global source_val global split_mode + global demucs_model_set_name + global demucs_model_version global wav_type_set global flac_type_set @@ -817,6 +929,69 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress progress_var.set(0) text_widget.clear() button_widget.configure(state=tk.DISABLED) # Disable Button + + + if data['DemucsModel'] == "Tasnet v1": + demucs_model_set_name = 'tasnet.th' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Tasnet_extra v1": + demucs_model_set_name = 'tasnet_extra.th' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Demucs v1": + demucs_model_set_name = 'demucs.th' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Demucs v1.gz": + demucs_model_set_name = 'demucs.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Demucs_extra v1": + demucs_model_set_name = 'demucs_extra.th' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Demucs_extra v1.gz": + demucs_model_set_name = 'demucs_extra.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Light v1": + demucs_model_set_name = 'light.th' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Light v1.gz": + demucs_model_set_name = 'light.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Light_extra v1": + demucs_model_set_name = 'light_extra.th' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Light_extra v1.gz": + demucs_model_set_name = 'light_extra.th.gz' + demucs_model_version = 'v1' + elif data['DemucsModel'] == "Tasnet v2": + demucs_model_set_name = 'tasnet-beb46fac.th' + demucs_model_version = 'v2' + elif data['DemucsModel'] == "Tasnet_extra v2": + demucs_model_set_name = 'tasnet_extra-df3777b2.th' + demucs_model_version = 'v2' + elif data['DemucsModel'] == "Demucs48_hq v2": + demucs_model_set_name = 'demucs48_hq-28a1282c.th' + demucs_model_version = 'v2' + elif data['DemucsModel'] == "Demucs v2": + demucs_model_set_name = 'demucs-e07c671f.th' + demucs_model_version = 'v2' + elif data['DemucsModel'] == "Demucs_extra v2": + demucs_model_set_name = 'demucs_extra-3646af93.th' + demucs_model_version = 'v2' + elif data['DemucsModel'] == "Demucs_unittest v2": + demucs_model_set_name = 'demucs_unittest-09ebc15f.th' + demucs_model_version = 'v2' + elif '.ckpt' in data['DemucsModel'] and 'v2' in data['DemucsModel']: + demucs_model_set_name = data['DemucsModel'] + demucs_model_version = 'v2' + elif '.ckpt' in data['DemucsModel'] and 'v1' in data['DemucsModel']: + demucs_model_set_name = data['DemucsModel'] + demucs_model_version = 'v1' + elif '.gz' in data['DemucsModel']: + demucs_model_set_name = data['DemucsModel'] + demucs_model_version = 'v1' + else: + demucs_model_set_name = data['DemucsModel'] + demucs_model_version = 'v3' + try: #Load File(s) for file_num, music_file in tqdm(enumerate(data['input_paths'], start=1)): @@ -880,7 +1055,10 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress channel_set = int(data['channel']) margin_set = int(data['margin']) shift_set = int(data['shifts_b']) + split_mode = data['split_mode'] + + #print('Split? ', split_mode) def determinemusicfileFolderName(): """ diff --git a/inference_v5.py b/inference_v5.py index 3d3a791..e6af489 100644 --- a/inference_v5.py +++ b/inference_v5.py @@ -1,34 +1,31 @@ -import os -import importlib -import pydub -import shutil -import hashlib - -import cv2 -import librosa -import math -import numpy as np -import soundfile as sf -from tqdm import tqdm - -from demucs.pretrained import get_model as _gm -from demucs.hdemucs import HDemucs +from collections import defaultdict +from datetime import datetime from demucs.apply import BagOfModels, apply_model -from pathlib import Path -from models import stft, istft - +from demucs.hdemucs import HDemucs +from demucs.pretrained import get_model as _gm from lib_v5 import dataset from lib_v5 import spec_utils from lib_v5.model_param_init import ModelParameters -import torch -from datetime import datetime - -# Command line text parsing and widget manipulation -from collections import defaultdict -import tkinter as tk -import traceback # Error Message Recent Calls -import time # Timer +from models import stft, istft +from pathlib import Path from random import randrange +from tqdm import tqdm +from tkinter import filedialog +import lib_v5.filelist +import cv2 +import hashlib +import importlib +import librosa +import math +import numpy as np +import os +import pydub +import shutil +import soundfile as sf +import time # Timer +import tkinter as tk +import torch +import traceback # Error Message Recent Calls class VocalRemover(object): @@ -40,35 +37,31 @@ class VocalRemover(object): # self.offset = model.offset data = { - # Paths - 'input_paths': None, - 'export_path': None, - 'saveFormat': 'wav', - # Processing Options - 'gpu': -1, - 'postprocess': True, - 'tta': True, - 'output_image': True, - 'voc_only': False, - 'inst_only': False, - # Models - 'instrumentalModel': None, - 'useModel': None, - # Constants - 'window_size': 512, 'agg': 10, - 'high_end_process': 'mirroring', - 'ModelParams': 'Auto', 'demucsmodel_sel_VR': 'UVR_Demucs_Model_1', - 'overlap': 0.5, - 'shifts': 0, - 'segment': 'None', - 'split_mode': False, - 'normalize': False, 'demucsmodelVR': True, - 'wavtype': 'PCM_16', + 'export_path': None, + 'gpu': -1, + 'high_end_process': 'mirroring', + 'input_paths': None, + 'inst_only': False, + 'instrumentalModel': None, + 'ModelParams': 'Auto', 'mp3bit': '320k', + 'normalize': False, + 'output_image': True, + 'overlap': 0.5, + 'postprocess': True, + 'saveFormat': 'wav', + 'segment': 'None', 'settest': False, + 'shifts': 0, + 'split_mode': False, + 'tta': True, + 'useModel': None, + 'voc_only': False, + 'wavtype': 'PCM_16', + 'window_size': 512, } default_window_size = data['window_size'] @@ -144,7 +137,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress nn_arch_sizes = [ 31191, # default - 33966, 123821, 123812, 537238 # custom + 33966, 123821, 123812, 129605, 537238 # custom ] nn_architecture = list('{}KB'.format(s) for s in nn_arch_sizes) @@ -492,7 +485,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress return #Load Model - text_widget.write(base_text + 'Loading models...') + text_widget.write(base_text + 'Loading model...') model_size = math.ceil(os.stat(data['instrumentalModel']).st_size / 1024) nn_architecture = '{}KB'.format(min(nn_arch_sizes, key=lambda x:abs(x-model_size))) @@ -504,212 +497,77 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress ModelName=(data['instrumentalModel']) #Package Models - - model_hash = hashlib.md5(open(ModelName,'rb').read()).hexdigest() - print(model_hash) - - #v5 Models - - if model_hash == '47939caf0cfe52a0e81442b85b971dfd': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100') - if model_hash == '4e4ecb9764c50a8c414fee6e10395bbe': - model_params_auto=str('lib_v5/modelparams/4band_v2.json') - param_name_auto=str('4band_v2') - if model_hash == 'e60a1e84803ce4efc0a6551206cc4b71': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100') - if model_hash == 'a82f14e75892e55e994376edbf0c8435': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100') - if model_hash == '6dd9eaa6f0420af9f1d403aaafa4cc06': - model_params_auto=str('lib_v5/modelparams/4band_v2_sn.json') - param_name_auto=str('4band_v2_sn') - if model_hash == '5c7bbca45a187e81abbbd351606164e5': - model_params_auto=str('lib_v5/modelparams/3band_44100_msb2.json') - param_name_auto=str('3band_44100_msb2') - if model_hash == 'd6b2cb685a058a091e5e7098192d3233': - model_params_auto=str('lib_v5/modelparams/3band_44100_msb2.json') - param_name_auto=str('3band_44100_msb2') - if model_hash == 'c1b9f38170a7c90e96f027992eb7c62b': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100') - if model_hash == 'c3448ec923fa0edf3d03a19e633faa53': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100') - if model_hash == '68aa2c8093d0080704b200d140f59e54': - model_params_auto=str('lib_v5/modelparams/3band_44100.json') - param_name_auto=str('3band_44100.json') - if model_hash == 'fdc83be5b798e4bd29fe00fe6600e147': - model_params_auto=str('lib_v5/modelparams/3band_44100_mid.json') - param_name_auto=str('3band_44100_mid.json') - if model_hash == '2ce34bc92fd57f55db16b7a4def3d745': - model_params_auto=str('lib_v5/modelparams/3band_44100_mid.json') - param_name_auto=str('3band_44100_mid.json') - if model_hash == '52fdca89576f06cf4340b74a4730ee5f': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100.json') - if model_hash == '41191165b05d38fc77f072fa9e8e8a30': - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100.json') - if model_hash == '89e83b511ad474592689e562d5b1f80e': - model_params_auto=str('lib_v5/modelparams/2band_32000.json') - param_name_auto=str('2band_32000.json') - if model_hash == '0b954da81d453b716b114d6d7c95177f': - model_params_auto=str('lib_v5/modelparams/2band_32000.json') - param_name_auto=str('2band_32000.json') - - #v4 Models - - if model_hash == '6a00461c51c2920fd68937d4609ed6c8': - model_params_auto=str('lib_v5/modelparams/1band_sr16000_hl512.json') - param_name_auto=str('1band_sr16000_hl512') - if model_hash == '0ab504864d20f1bd378fe9c81ef37140': - model_params_auto=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name_auto=str('1band_sr32000_hl512') - if model_hash == '7dd21065bf91c10f7fccb57d7d83b07f': - model_params_auto=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name_auto=str('1band_sr32000_hl512') - if model_hash == '80ab74d65e515caa3622728d2de07d23': - model_params_auto=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name_auto=str('1band_sr32000_hl512') - if model_hash == 'edc115e7fc523245062200c00caa847f': - model_params_auto=str('lib_v5/modelparams/1band_sr33075_hl384.json') - param_name_auto=str('1band_sr33075_hl384') - if model_hash == '28063e9f6ab5b341c5f6d3c67f2045b7': - model_params_auto=str('lib_v5/modelparams/1band_sr33075_hl384.json') - param_name_auto=str('1band_sr33075_hl384') - if model_hash == 'b58090534c52cbc3e9b5104bad666ef2': - model_params_auto=str('lib_v5/modelparams/1band_sr44100_hl512.json') - param_name_auto=str('1band_sr44100_hl512') - if model_hash == '0cdab9947f1b0928705f518f3c78ea8f': - model_params_auto=str('lib_v5/modelparams/1band_sr44100_hl512.json') - param_name_auto=str('1band_sr44100_hl512') - if model_hash == 'ae702fed0238afb5346db8356fe25f13': - model_params_auto=str('lib_v5/modelparams/1band_sr44100_hl1024.json') - param_name_auto=str('1band_sr44100_hl1024') - - #User Models - - #1 Band - if '1band_sr16000_hl512' in ModelName: - model_params_auto=str('lib_v5/modelparams/1band_sr16000_hl512.json') - param_name_auto=str('1band_sr16000_hl512') - if '1band_sr32000_hl512' in ModelName: - model_params_auto=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name_auto=str('1band_sr32000_hl512') - if '1band_sr33075_hl384' in ModelName: - model_params_auto=str('lib_v5/modelparams/1band_sr33075_hl384.json') - param_name_auto=str('1band_sr33075_hl384') - if '1band_sr44100_hl256' in ModelName: - model_params_auto=str('lib_v5/modelparams/1band_sr44100_hl256.json') - param_name_auto=str('1band_sr44100_hl256') - if '1band_sr44100_hl512' in ModelName: - model_params_auto=str('lib_v5/modelparams/1band_sr44100_hl512.json') - param_name_auto=str('1band_sr44100_hl512') - if '1band_sr44100_hl1024' in ModelName: - model_params_auto=str('lib_v5/modelparams/1band_sr44100_hl1024.json') - param_name_auto=str('1band_sr44100_hl1024') - - #2 Band - if '2band_44100_lofi' in ModelName: - model_params_auto=str('lib_v5/modelparams/2band_44100_lofi.json') - param_name_auto=str('2band_44100_lofi') - if '2band_32000' in ModelName: - model_params_auto=str('lib_v5/modelparams/2band_32000.json') - param_name_auto=str('2band_32000') - if '2band_48000' in ModelName: - model_params_auto=str('lib_v5/modelparams/2band_48000.json') - param_name_auto=str('2band_48000') - - #3 Band - if '3band_44100' in ModelName: - model_params_auto=str('lib_v5/modelparams/3band_44100.json') - param_name_auto=str('3band_44100') - if '3band_44100_mid' in ModelName: - model_params_auto=str('lib_v5/modelparams/3band_44100_mid.json') - param_name_auto=str('3band_44100_mid') - if '3band_44100_msb2' in ModelName: - model_params_auto=str('lib_v5/modelparams/3band_44100_msb2.json') - param_name_auto=str('3band_44100_msb2') - - #4 Band - if '4band_44100' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_44100.json') - param_name_auto=str('4band_44100') - if '4band_44100_mid' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_44100_mid.json') - param_name_auto=str('4band_44100_mid') - if '4band_44100_msb' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_44100_msb.json') - param_name_auto=str('4band_44100_msb') - if '4band_44100_msb2' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_44100_msb2.json') - param_name_auto=str('4band_44100_msb2') - if '4band_44100_reverse' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_44100_reverse.json') - param_name_auto=str('4band_44100_reverse') - if '4band_44100_sw' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_44100_sw.json') - param_name_auto=str('4band_44100_sw') - if '4band_v2' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_v2.json') - param_name_auto=str('4band_v2') - if '4band_v2_sn' in ModelName: - model_params_auto=str('lib_v5/modelparams/4band_v2_sn.json') - param_name_auto=str('4band_v2_sn') - if 'tmodelparam' in ModelName: - model_params_auto=str('lib_v5/modelparams/tmodelparam.json') - param_name_auto=str('User Model Param Set') - - text_widget.write(' Done!\n') - + text_widget.write('Done!\n') if data['ModelParams'] == 'Auto': - param_name = param_name_auto - model_params_d = model_params_auto + model_hash = hashlib.md5(open(ModelName,'rb').read()).hexdigest() + model_params = [] + model_params = lib_v5.filelist.provide_model_param_hash(model_hash) + print(model_params) + if model_params[0] == 'Not Found Using Hash': + model_params = [] + model_params = lib_v5.filelist.provide_model_param_name(ModelName) + if model_params[0] == 'Not Found Using Name': + text_widget.write(base_text + f'Unable to set model parameters automatically with the selected model.\n') + confirm = tk.messagebox.askyesno(title='Unrecognized Model Detected', + message=f'\nThe application could not automatically set the model param for the selected model.\n\n' + + f'Would you like to select the model param file for this model?\n\n') + + if confirm: + model_param_selection = filedialog.askopenfilename(initialdir='lib_v5/modelparams', + title=f'Select Model Param', + filetypes=[("Model Param", "*.json")]) + + model_param_file_path = str(model_param_selection) + model_param_file = os.path.splitext(os.path.basename(model_param_file_path))[0] + '.json' + model_params = [model_param_file_path, model_param_file] + + with open(f"lib_v5/filelists/model_cache/vr_param_cache/{model_hash}.txt", 'w') as f: + f.write(model_param_file) + + + if model_params[0] == '': + text_widget.write("\n" + base_text + f'Separation failed for the following audio file:\n') + text_widget.write(base_text + f'"{os.path.basename(music_file)}"\n') + text_widget.write(f'\nError Received:\n\n') + text_widget.write(f'Model parameters are missing.\n\n') + text_widget.write(f'Please check the following:\n') + text_widget.write(f'1. Make sure the model is still present.\n') + text_widget.write(f'2. If you are running a model that was not originally included in this package, \nplease append the modelparam name to the model name.\n') + text_widget.write(f' - Example if using \"4band_v2.json\" modelparam: \"model_4band_v2.pth\"\n\n') + text_widget.write(f'Please address this and try again.\n\n') + text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') + torch.cuda.empty_cache() + progress_var.set(0) + button_widget.configure(state=tk.NORMAL) # Enable Button + return + + else: + pass + else: + text_widget.write(base_text + f'Model param not selected.\n') + text_widget.write("\n" + base_text + f'Separation failed for the following audio file:\n') + text_widget.write(base_text + f'"{os.path.basename(music_file)}"\n') + text_widget.write(f'\nError Received:\n\n') + text_widget.write(f'Model parameters are missing.\n\n') + text_widget.write(f'Please check the following:\n') + text_widget.write(f'1. Make sure the model is still present.\n') + text_widget.write(f'2. If you are running a model that was not originally included in this package, \nplease append the modelparam name to the model name.\n') + text_widget.write(f' - Example if using \"4band_v2.json\" modelparam: \"model_4band_v2.pth\"\n\n') + text_widget.write(f'Please address this and try again.\n\n') + text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') + torch.cuda.empty_cache() + progress_var.set(0) + button_widget.configure(state=tk.NORMAL) # Enable Button + return + else: - param_name = str(data['ModelParams']) - model_params_d = str('lib_v5/modelparams/' + data['ModelParams']) + param = data['ModelParams'] + model_param_file_path = f'lib_v5/modelparams/{param}' + model_params = [model_param_file_path, param] - try: - print('Model Parameters:', model_params_d) - text_widget.write(base_text + 'Loading assigned model parameters ' + '\"' + param_name + '\"... ') - except Exception as e: - traceback_text = ''.join(traceback.format_tb(e.__traceback__)) - errmessage = f'Traceback Error: "{traceback_text}"\n{type(e).__name__}: "{e}"\n' - text_widget.write("\n" + base_text + f'Separation failed for the following audio file:\n') - text_widget.write(base_text + f'"{os.path.basename(music_file)}"\n') - text_widget.write(f'\nError Received:\n\n') - text_widget.write(f'Model parameters are missing.\n\n') - text_widget.write(f'Please check the following:\n') - text_widget.write(f'1. Make sure the model is still present.\n') - text_widget.write(f'2. If you are running a model that was not originally included in this package, \nplease append the modelparam name to the model name.\n') - text_widget.write(f' - Example if using \"4band_v2.json\" modelparam: \"model_4band_v2.pth\"\n\n') - text_widget.write(f'Please address this and try again.\n\n') - text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') - try: - with open('errorlog.txt', 'w') as f: - f.write(f'Last Error Received:\n\n' + - f'Error Received while processing "{os.path.basename(music_file)}":\n' + - f'Process Method: VR Architecture\n\n' + - f'Model parameters are missing.\n\n' + - f'Please check the following:\n' + - f'1. Make sure the model is still present.\n' + - f'2. If you are running a model that was not originally included in this package, please append the modelparam name to the model name.\n' + - f' - Example if using \"4band_v2.json\" modelparam: \"model_4band_v2.pth\"\n\n' + - f'Please address this and try again.\n\n' + - f'Raw error details:\n\n' + - errmessage + f'\nError Time Stamp: [{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}]\n') - except: - pass - torch.cuda.empty_cache() - progress_var.set(0) - button_widget.configure(state=tk.NORMAL) # Enable Button - return - - - mp = ModelParameters(model_params_d) + text_widget.write(base_text + 'Loading assigned model parameters ' + '\"' + model_params[1] + '\"... ') + mp = ModelParameters(model_params[0]) text_widget.write('Done!\n') # -Instrumental- if os.path.isfile(data['instrumentalModel']): @@ -726,10 +584,8 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress model_name = os.path.basename(data[f'{data["useModel"]}Model']) - - mp = ModelParameters(model_params_d) - # -Go through the different steps of seperation- + # -Go through the different steps of Separation- # Wave source text_widget.write(base_text + 'Loading audio source...') @@ -921,12 +777,12 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress text_widget.write(base_text + 'Loading Demucs model... ') update_progress(**progress_kwargs, step=0.95) - path_d = Path('models/Demucs_Models') - print('What Demucs model was chosen? ', demucs_model_set) + path_d = Path('models/Demucs_Models/v3_repo') + #print('What Demucs model was chosen? ', demucs_model_set) demucs = _gm(name=demucs_model_set, repo=path_d) text_widget.write('Done!\n') - print('segment: ', data['segment']) + #print('segment: ', data['segment']) if data['segment'] == 'None': segment = None @@ -958,7 +814,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress if segment is not None: sub.segment = segment - print('segment port-process: ', segment) + #print('segment port-process: ', segment) demucs.cpu() demucs.eval() @@ -1048,7 +904,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress bin_image.tofile(f) - text_widget.write(base_text + 'Completed Seperation!\n\n') + text_widget.write(base_text + 'Completed Separation!\n\n') except Exception as e: traceback_text = ''.join(traceback.format_tb(e.__traceback__)) message = f'Traceback Error: "{traceback_text}"\n{type(e).__name__}: "{e}"\n' diff --git a/inference_v5_ensemble.py b/inference_v5_ensemble.py index 54a203e..c1c86be 100644 --- a/inference_v5_ensemble.py +++ b/inference_v5_ensemble.py @@ -1,55 +1,253 @@ -from functools import total_ordering -import importlib -import os -from statistics import mode -from pathlib import Path -import pydub -import hashlib -from random import randrange -import re - -import subprocess -import soundfile as sf -import torch -import numpy as np -from demucs.pretrained import get_model as _gm -from demucs.hdemucs import HDemucs -from demucs.apply import BagOfModels, apply_model -import pathlib -from models import get_models, spec_effects -import onnxruntime as ort -import time -import os -from tqdm import tqdm -import warnings -import sys -import librosa -import psutil - -import cv2 -import math -import librosa -import numpy as np -import soundfile as sf -import shutil -from tqdm import tqdm +from collections import defaultdict from datetime import datetime - +from demucs.apply import BagOfModels, apply_model +from demucs.hdemucs import HDemucs +from demucs.model_v2 import Demucs +from demucs.pretrained import get_model as _gm +from demucs.tasnet_v2 import ConvTasNet +from demucs.utils import apply_model_v1 +from demucs.utils import apply_model_v2 +from functools import total_ordering from lib_v5 import dataset from lib_v5 import spec_utils from lib_v5.model_param_init import ModelParameters -import torch - -# Command line text parsing and widget manipulation -from collections import defaultdict +from models import get_models, spec_effects +from pathlib import Path +from random import randrange +from statistics import mode +from tqdm import tqdm +from tqdm import tqdm +from tkinter import filedialog +import tkinter.ttk as ttk +import tkinter.messagebox +import tkinter.filedialog +import tkinter.simpledialog +import tkinter.font import tkinter as tk -import traceback # Error Message Recent Calls +from tkinter import * +from tkinter.tix import * +import lib_v5.filelist +import cv2 +import gzip +import hashlib +import importlib +import librosa +import json +import math +import numpy as np +import numpy as np +import onnxruntime as ort +import os +import pathlib +import psutil +import pydub +import re +import shutil +import soundfile as sf +import soundfile as sf +import subprocess +import sys +import time import time # Timer +import tkinter as tk +import torch +import torch +import traceback # Error Message Recent Calls +import warnings class Predictor(): def __init__(self): pass + def mdx_options(self): + """ + Open Advanced MDX Options + """ + self.okVar = tk.IntVar() + self.n_fft_scale_set_var = tk.StringVar(value='6144') + self.dim_f_set_var = tk.StringVar(value='2048') + self.mdxnetModeltype_var = tk.StringVar(value='Vocals') + self.noise_pro_select_set_var = tk.StringVar(value='MDX-NET_Noise_Profile_14_kHz') + self.compensate_v_var = tk.StringVar(value=1.03597672895) + + top= Toplevel() + + top.geometry("740x550") + window_height = 740 + window_width = 550 + + top.title("Specify Parameters") + + top.resizable(False, False) # This code helps to disable windows from resizing + + screen_width = top.winfo_screenwidth() + screen_height = top.winfo_screenheight() + + x_cordinate = int((screen_width/2) - (window_width/2)) + y_cordinate = int((screen_height/2) - (window_height/2)) + + top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) + + # change title bar icon + top.iconbitmap('img\\UVR-Icon-v2.ico') + + tabControl = ttk.Notebook(top) + + tabControl.pack(expand = 1, fill ="both") + + tabControl.grid_rowconfigure(0, weight=1) + tabControl.grid_columnconfigure(0, weight=1) + + frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) + frame0.grid(row=0,column=0,padx=0,pady=0) + + frame0.tkraise(frame0) + + space_small = ' '*20 + space_small_1 = ' '*10 + + l0=tk.Label(frame0, text=f'{space_small}Stem Type{space_small}', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=3,column=0,padx=0,pady=5) + + l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals', 'Instrumental') + l0.grid(row=4,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text='N_FFT Scale', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=5,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text=f'{space_small_1}(Manual Set){space_small_1}', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=5,column=1,padx=0,pady=5) + + self.options_n_fft_scale_Opt = l0=ttk.OptionMenu(frame0, self.n_fft_scale_set_var, None, '4096', '6144', '7680', '8192', '16384') + + self.options_n_fft_scale_Opt + l0.grid(row=6,column=0,padx=0,pady=5) + + self.options_n_fft_scale_Entry = l0=ttk.Entry(frame0, textvariable=self.n_fft_scale_set_var, justify='center') + + self.options_n_fft_scale_Entry + l0.grid(row=6,column=1,padx=0,pady=5) + + l0=tk.Label(frame0, text='Dim_f', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=7,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text='(Manual Set)', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=7,column=1,padx=0,pady=5) + + self.options_dim_f_Opt = l0=ttk.OptionMenu(frame0, self.dim_f_set_var, None, '2048', '3072', '4096') + + self.options_dim_f_Opt + l0.grid(row=8,column=0,padx=0,pady=5) + + self.options_dim_f_Entry = l0=ttk.Entry(frame0, textvariable=self.dim_f_set_var, justify='center') + + self.options_dim_f_Entry + l0.grid(row=8,column=1,padx=0,pady=5) + + l0=tk.Label(frame0, text='Noise Profile', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=9,column=0,padx=0,pady=5) + + l0=ttk.OptionMenu(frame0, self.noise_pro_select_set_var, None, 'MDX-NET_Noise_Profile_14_kHz', 'MDX-NET_Noise_Profile_17_kHz', 'MDX-NET_Noise_Profile_Full_Band') + l0.grid(row=10,column=0,padx=0,pady=5) + + l0=tk.Label(frame0, text='Volume Compensation', font=("Century Gothic", "9"), foreground='#13a4c9') + l0.grid(row=11,column=0,padx=0,pady=10) + + self.options_compensate = l0=ttk.Entry(frame0, textvariable=self.compensate_v_var, justify='center') + + self.options_compensate + l0.grid(row=12,column=0,padx=0,pady=0) + + l0=ttk.Button(frame0,text="Continue & Set These Parameters", command=lambda: self.okVar.set(1)) + l0.grid(row=13,column=0,padx=0,pady=30) + + def stop(): + widget_text.write(f'Please configure the ONNX model settings accordingly and try again.\n\n') + widget_text.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') + torch.cuda.empty_cache() + gui_progress_bar.set(0) + widget_button.configure(state=tk.NORMAL) # Enable Button + top.destroy() + return + + l0=ttk.Button(frame0,text="Stop Process", command=stop) + l0.grid(row=13,column=1,padx=0,pady=30) + + #print('print from top ', model_hash) + + #source_val = 0 + + def change_event(): + self.okVar.set(1) + #top.destroy() + pass + + top.protocol("WM_DELETE_WINDOW", change_event) + + frame0.wait_variable(self.okVar) + + global n_fft_scale_set + global dim_f_set + global modeltype + global stemset_n + global source_val + global noise_pro_set + global compensate + global demucs_model_set + + stemtype = self.mdxnetModeltype_var.get() + + if stemtype == 'Vocals': + modeltype = 'v' + stemset_n = '(Vocals)' + source_val = 3 + if stemtype == 'Instrumental': + modeltype = 'v' + stemset_n = '(Instrumental)' + source_val = 2 + if stemtype == 'Other': + modeltype = 'o' + stemset_n = '(Other)' + source_val = 2 + if stemtype == 'Drums': + modeltype = 'd' + stemset_n = '(Drums)' + source_val = 1 + if stemtype == 'Bass': + modeltype = 'b' + stemset_n = '(Bass)' + source_val = 0 + + compensate = self.compensate_v_var.get() + n_fft_scale_set = int(self.n_fft_scale_set_var.get()) + dim_f_set = int(self.dim_f_set_var.get()) + noise_pro_set = self.noise_pro_select_set_var.get() + + mdx_model_params = { + 'modeltype' : modeltype, + 'stemset_n' : stemset_n, + 'source_val' : source_val, + 'compensate' : compensate, + 'n_fft_scale_set' : n_fft_scale_set, + 'dim_f_set' : dim_f_set, + 'noise_pro' : noise_pro_set, + } + + mdx_model_params_r = json.dumps(mdx_model_params, indent=4) + + with open(f"lib_v5/filelists/model_cache/mdx_model_cache/{model_hash}.json", "w") as outfile: + outfile.write(mdx_model_params_r) + + + if stemset_n == '(Instrumental)': + if not 'UVR' in demucs_model_set: + widget_text.write(base_text + 'The selected Demucs model cannot be used with this model.\n') + widget_text.write(base_text + 'Only 2 stem Demucs models are compatible with this model.\n') + widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n') + demucs_model_set = 'UVR_Demucs_Model_1' + + top.destroy() + def prediction_setup(self): global device @@ -60,27 +258,75 @@ class Predictor(): device = torch.device('cpu') if demucs_switch == 'on': - if 'UVR' in demucs_model_set: - self.demucs = HDemucs(sources=["other", "vocals"]) - else: - self.demucs = HDemucs(sources=["drums", "bass", "other", "vocals"]) - widget_text.write(base_text + 'Loading Demucs model... ') - update_progress(**progress_kwargs, - step=0.05) - path_d = Path('models/Demucs_Models') - self.demucs = _gm(name=demucs_model_set, repo=path_d) - self.demucs.to(device) - self.demucs.eval() - widget_text.write('Done!\n') - if isinstance(self.demucs, BagOfModels): - widget_text.write(base_text + f"Selected Demucs model is a bag of {len(self.demucs.models)} model(s).\n") + + #print('check model here: ', demucs_model_set) + + #'demucs.th.gz', 'demucs_extra.th.gz', 'light.th.gz', 'light_extra.th.gz' + + if 'tasnet.th' in demucs_model_set or 'tasnet_extra.th' in demucs_model_set or \ + 'demucs.th' in demucs_model_set or \ + 'demucs_extra.th' in demucs_model_set or 'light.th' in demucs_model_set or \ + 'light_extra.th' in demucs_model_set or 'v1' in demucs_model_set or '.gz' in demucs_model_set: + load_from = "models/Demucs_Models/"f"{demucs_model_set}" + if str(load_from).endswith(".gz"): + load_from = gzip.open(load_from, "rb") + klass, args, kwargs, state = torch.load(load_from) + self.demucs = klass(*args, **kwargs) + widget_text.write(base_text + 'Loading Demucs v1 model... ') + update_progress(**progress_kwargs, + step=0.05) + self.demucs.to(device) + self.demucs.load_state_dict(state) + widget_text.write('Done!\n') + + elif 'tasnet-beb46fac.th' in demucs_model_set or 'tasnet_extra-df3777b2.th' in demucs_model_set or \ + 'demucs48_hq-28a1282c.th' in demucs_model_set or'demucs-e07c671f.th' in demucs_model_set or \ + 'demucs_extra-3646af93.th' in demucs_model_set or 'demucs_unittest-09ebc15f.th' in demucs_model_set or \ + 'v2' in demucs_model_set: + if '48' in demucs_model_set: + channels=48 + elif 'unittest' in demucs_model_set: + channels=4 + else: + channels=64 + + if 'tasnet' in demucs_model_set: + self.demucs = ConvTasNet(sources=["drums", "bass", "other", "vocals"], X=10) + else: + self.demucs = Demucs(sources=["drums", "bass", "other", "vocals"], channels=channels) + widget_text.write(base_text + 'Loading Demucs v2 model... ') + update_progress(**progress_kwargs, + step=0.05) + self.demucs.to(device) + self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set}")) + widget_text.write('Done!\n') + self.demucs.eval() + + else: + if 'UVR' in demucs_model_set: + self.demucs = HDemucs(sources=["other", "vocals"]) + else: + self.demucs = HDemucs(sources=["drums", "bass", "other", "vocals"]) + widget_text.write(base_text + 'Loading Demucs model... ') + update_progress(**progress_kwargs, + step=0.05) + path_d = Path('models/Demucs_Models/v3_repo') + #print('What Demucs model was chosen? ', demucs_model_set) + self.demucs = _gm(name=demucs_model_set, repo=path_d) + self.demucs.to(device) + self.demucs.eval() + widget_text.write('Done!\n') + if isinstance(self.demucs, BagOfModels): + widget_text.write(base_text + f"Selected Demucs model is a bag of {len(self.demucs.models)} model(s).\n") self.onnx_models = {} c = 0 - self.models = get_models('tdf_extra', load=False, device=cpu, stems=modeltype, n_fft_scale=n_fft_scale_set, dim_f=dim_f_set) - if demucs_only == 'off': - widget_text.write(base_text + 'Loading ONNX model... ') + if demucs_only == 'on': + pass + else: + self.models = get_models('tdf_extra', load=False, device=cpu, stems=modeltype, n_fft_scale=n_fft_scale_set, dim_f=dim_f_set) + widget_text.write(base_text + 'Loading ONNX model... ') update_progress(**progress_kwargs, step=0.1) @@ -98,10 +344,10 @@ class Predictor(): if demucs_only == 'off': self.onnx_models[c] = ort.InferenceSession(os.path.join('models/MDX_Net_Models', model_set), providers=run_type) - print(demucs_model_set) + #print(demucs_model_set) widget_text.write('Done!\n') elif demucs_only == 'on': - print(demucs_model_set) + #print(demucs_model_set) pass def prediction(self, m): @@ -121,7 +367,12 @@ class Predictor(): save_path = os.path.dirname(base_name) #Vocal Path - vocal_name = '(Vocals)' + + if stemset_n == '(Vocals)': + vocal_name = '(Vocals)' + elif stemset_n == '(Instrumental)': + vocal_name = '(Instrumental)' + if data['modelFolder']: vocal_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, @@ -132,7 +383,11 @@ class Predictor(): file_name = f'{os.path.basename(base_name)}_{ModelName_2}_{vocal_name}',) #Instrumental Path - Instrumental_name = '(Instrumental)' + if stemset_n == '(Vocals)': + Instrumental_name = '(Instrumental)' + elif stemset_n == '(Instrumental)': + Instrumental_name = '(Vocals)' + if data['modelFolder']: Instrumental_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, @@ -143,7 +398,11 @@ class Predictor(): file_name = f'{os.path.basename(base_name)}_{ModelName_2}_{Instrumental_name}',) #Non-Reduced Vocal Path - vocal_name = '(Vocals)' + if stemset_n == '(Vocals)': + vocal_name = '(Vocals)' + elif stemset_n == '(Instrumental)': + vocal_name = '(Instrumental)' + if data['modelFolder']: non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format( save_path=save_path, @@ -313,7 +572,7 @@ class Predictor(): except: pass - widget_text.write(base_text + 'Completed Seperation!\n\n') + widget_text.write(base_text + 'Completed Separation!\n\n') def demix(self, mix): # 1 = demucs only @@ -389,16 +648,39 @@ class Predictor(): if demucs_switch == 'off': sources = self.demix_base(segmented_mix, margin_size=margin) elif demucs_only == 'on': - if split_mode == True: - sources = self.demix_demucs_split(mix) - if split_mode == False: - sources = self.demix_demucs(segmented_mix, margin_size=margin) + + if 'tasnet.th' in demucs_model_set or 'tasnet_extra.th' in demucs_model_set or \ + 'demucs.th' in demucs_model_set or \ + 'demucs_extra.th' in demucs_model_set or 'light.th' in demucs_model_set or \ + 'light_extra.th' in demucs_model_set or 'v1' in demucs_model_set or '.gz' in demucs_model_set: + sources = self.demix_demucs_v1(segmented_mix, margin_size=margin) + elif 'tasnet-beb46fac.th' in demucs_model_set or 'tasnet_extra-df3777b2.th' in demucs_model_set or \ + 'demucs48_hq-28a1282c.th' in demucs_model_set or'demucs-e07c671f.th' in demucs_model_set or \ + 'demucs_extra-3646af93.th' in demucs_model_set or 'demucs_unittest-09ebc15f.th' in demucs_model_set or \ + 'v2' in demucs_model_set: + sources = self.demix_demucs_v2(segmented_mix, margin_size=margin) + else: + if split_mode == True: + sources = self.demix_demucs_split(mix) + if split_mode == False: + sources = self.demix_demucs(segmented_mix, margin_size=margin) else: # both, apply spec effects base_out = self.demix_base(segmented_mix, margin_size=margin) - if split_mode == True: - demucs_out = self.demix_demucs_split(mix) - if split_mode == False: - demucs_out = self.demix_demucs(segmented_mix, margin_size=margin) + if 'tasnet.th' in demucs_model_set or 'tasnet_extra.th' in demucs_model_set or \ + 'demucs.th' in demucs_model_set or \ + 'demucs_extra.th' in demucs_model_set or 'light.th' in demucs_model_set or \ + 'light_extra.th' in demucs_model_set or 'v1' in demucs_model_set or '.gz' in demucs_model_set: + demucs_out = self.demix_demucs_v1(segmented_mix, margin_size=margin) + elif 'tasnet-beb46fac.th' in demucs_model_set or 'tasnet_extra-df3777b2.th' in demucs_model_set or \ + 'demucs48_hq-28a1282c.th' in demucs_model_set or'demucs-e07c671f.th' in demucs_model_set or \ + 'demucs_extra-3646af93.th' in demucs_model_set or 'demucs_unittest-09ebc15f.th' in demucs_model_set or \ + 'v2' in demucs_model_set: + demucs_out = self.demix_demucs_v2(segmented_mix, margin_size=margin) + else: + if split_mode == True: + demucs_out = self.demix_demucs_split(mix) + if split_mode == False: + demucs_out = self.demix_demucs(segmented_mix, margin_size=margin) nan_count = np.count_nonzero(np.isnan(demucs_out)) + np.count_nonzero(np.isnan(base_out)) if nan_count > 0: print('Warning: there are {} nan values in the array(s).'.format(nan_count)) @@ -406,9 +688,14 @@ class Predictor(): sources = {} if 'UVR' in demucs_model_set: - sources[3] = (spec_effects(wave=[demucs_out[1],base_out[0]], - algorithm=data['mixing'], - value=b[3])*float(compensate)) # compensation + if stemset_n == '(Instrumental)': + sources[3] = (spec_effects(wave=[demucs_out[0],base_out[0]], + algorithm=data['mixing'], + value=b[3])*float(compensate)) # compensation + else: + sources[3] = (spec_effects(wave=[demucs_out[1],base_out[0]], + algorithm=data['mixing'], + value=b[3])*float(compensate)) # compensation else: sources[3] = (spec_effects(wave=[demucs_out[3],base_out[0]], algorithm=data['mixing'], @@ -475,7 +762,7 @@ class Predictor(): return _sources def demix_demucs(self, mix, margin_size): - print('shift_set ', shift_set) + #print('shift_set ', shift_set) processed = {} demucsitera = len(mix) demucsitera_calc = demucsitera * 2 @@ -513,7 +800,7 @@ class Predictor(): def demix_demucs_split(self, mix): - print('shift_set ', shift_set) + #print('shift_set ', shift_set) widget_text.write(base_text + "Split Mode is on. (Chunks disabled for Demucs Model)\n") widget_text.write(base_text + "Running Demucs Inference...\n") widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") @@ -531,6 +818,70 @@ class Predictor(): sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources[[0,1]] = sources[[1,0]] return sources + + def demix_demucs_v2(self, mix, margin_size): + processed = {} + demucsitera = len(mix) + demucsitera_calc = demucsitera * 2 + gui_progress_bar_demucs = 0 + widget_text.write(base_text + "Running Demucs v2 Inference...\n") + widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") + print(' Running Demucs Inference...') + for nmix in mix: + gui_progress_bar_demucs += 1 + update_progress(**progress_kwargs, + step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) + cmix = mix[nmix] + cmix = torch.tensor(cmix, dtype=torch.float32) + ref = cmix.mean(0) + cmix = (cmix - ref.mean()) / ref.std() + with torch.no_grad(): + sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set) + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0,1]] = sources[[1,0]] + + start = 0 if nmix == 0 else margin_size + end = None if nmix == list(mix.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + processed[nmix] = sources[:,:,start:end].copy() + + sources = list(processed.values()) + sources = np.concatenate(sources, axis=-1) + widget_text.write('Done!\n') + return sources + + def demix_demucs_v1(self, mix, margin_size): + processed = {} + demucsitera = len(mix) + demucsitera_calc = demucsitera * 2 + gui_progress_bar_demucs = 0 + widget_text.write(base_text + "Running Demucs v1 Inference...\n") + widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") + print(' Running Demucs Inference...') + for nmix in mix: + gui_progress_bar_demucs += 1 + update_progress(**progress_kwargs, + step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) + cmix = mix[nmix] + cmix = torch.tensor(cmix, dtype=torch.float32) + ref = cmix.mean(0) + cmix = (cmix - ref.mean()) / ref.std() + with torch.no_grad(): + sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set) + sources = (sources * ref.std() + ref.mean()).cpu().numpy() + sources[[0,1]] = sources[[1,0]] + + start = 0 if nmix == 0 else margin_size + end = None if nmix == list(mix.keys())[::-1][0] else -margin_size + if margin_size == 0: + end = None + processed[nmix] = sources[:,:,start:end].copy() + + sources = list(processed.values()) + sources = np.concatenate(sources, axis=-1) + widget_text.write('Done!\n') + return sources def update_progress(progress_var, total_files, file_num, step: float = 1): """Calculate the progress for the progress widget in the GUI""" @@ -611,10 +962,45 @@ class VocalRemover(object): # self.offset = model.offset data = { - # Paths - 'input_paths': None, + 'agg': 10, + 'algo': 'Instrumentals (Min Spec)', + 'appendensem': False, + 'autocompensate': True, + 'chunks': 'auto', + 'compensate': 1.03597672895, + 'demucs_only': False, + 'demucsmodel': False, + 'DemucsModel_MDX': 'UVR_Demucs_Model_1', + 'ensChoose': 'Basic VR Ensemble', 'export_path': None, + 'gpu': -1, + 'high_end_process': 'mirroring', + 'input_paths': None, + 'inst_only': False, + 'instrumentalModel': None, + 'margin': 44100, + 'mdx_ensem': 'MDX-Net: UVR-MDX-NET 1', + 'mdx_ensem_b': 'No Model', + 'mdx_only_ensem_a': 'MDX-Net: UVR-MDX-NET Main', + 'mdx_only_ensem_b': 'MDX-Net: UVR-MDX-NET 1', + 'mdx_only_ensem_c': 'No Model', + 'mdx_only_ensem_d': 'No Model', + 'mdx_only_ensem_e': 'No Model', + 'mixing': 'Default', + 'mp3bit': '320k', + 'noise_pro_select': 'Auto Select', + 'noisereduc_s': 3, + 'non_red': False, + 'normalize': False, + 'output_image': True, + 'overlap': 0.5, + 'postprocess': True, 'saveFormat': 'wav', + 'shifts': 0, + 'split_mode': False, + 'tta': True, + 'useModel': None, + 'voc_only': False, 'vr_ensem': '2_HP-UVR', 'vr_ensem_a': '1_HP-UVR', 'vr_ensem_b': '2_HP-UVR', @@ -624,45 +1010,17 @@ data = { 'vr_ensem_mdx_a': 'No Model', 'vr_ensem_mdx_b': 'No Model', 'vr_ensem_mdx_c': 'No Model', - 'mdx_ensem': 'UVR-MDX-NET 1', - 'mdx_ensem_b': 'No Model', - # Processing Options - 'gpu': -1, - 'postprocess': True, - 'tta': True, - 'output_image': True, - 'voc_only': False, - 'inst_only': False, - 'demucsmodel': False, - 'chunks': 'auto', - 'non_red': False, - 'noisereduc_s': 3, - 'ensChoose': 'Basic VR Ensemble', - 'algo': 'Instrumentals (Min Spec)', - #Advanced Options - 'appendensem': False, - 'noise_pro_select': 'Auto Select', - 'overlap': 0.5, - 'shifts': 0, - 'margin': 44100, - 'split_mode': False, - 'normalize': False, - 'compensate': 1.03597672895, - 'autocompensate': True, - 'demucs_only': False, - 'mixing': 'Default', - 'DemucsModel_MDX': 'UVR_Demucs_Model_1', + 'vr_multi_USER_model_param_1': 'Auto', + 'vr_multi_USER_model_param_2': 'Auto', + 'vr_multi_USER_model_param_3': 'Auto', + 'vr_multi_USER_model_param_4': 'Auto', + 'vr_basic_USER_model_param_1': 'Auto', + 'vr_basic_USER_model_param_2': 'Auto', + 'vr_basic_USER_model_param_3': 'Auto', + 'vr_basic_USER_model_param_4': 'Auto', + 'vr_basic_USER_model_param_5': 'Auto', 'wavtype': 'PCM_16', - 'mp3bit': '320k', - 'settest': False, - - # Models - 'instrumentalModel': None, - 'useModel': None, - # Constants - 'window_size': 512, - 'agg': 10, - 'high_end_process': 'mirroring' + 'window_size': 512 } default_window_size = data['window_size'] @@ -716,6 +1074,11 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress global wav_type_set global flac_type_set global mp3_bit_set + global model_hash + global stime + global stemset_n + global source_val + global widget_button wav_type_set = data['wavtype'] @@ -726,6 +1089,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress widget_text = text_widget gui_progress_bar = progress_var + widget_button = button_widget #Error Handling @@ -754,7 +1118,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress nn_arch_sizes = [ 31191, # default - 33966, 123821, 123812, 537238, 537227 # custom + 33966, 123821, 123812, 129605, 537238, 537227 # custom ] def save_files(wav_instrument, wav_vocals): @@ -818,6 +1182,395 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress data.update(kwargs) + if data['DemucsModel_MDX'] == "Tasnet v1": + demucs_model_set_name = 'tasnet.th' + elif data['DemucsModel_MDX'] == "Tasnet_extra v1": + demucs_model_set_name = 'tasnet_extra.th' + elif data['DemucsModel_MDX'] == "Demucs v1": + demucs_model_set_name = 'demucs.th' + elif data['DemucsModel_MDX'] == "Demucs v1.gz": + demucs_model_set_name = 'demucs.th.gz' + elif data['DemucsModel_MDX'] == "Demucs_extra v1": + demucs_model_set_name = 'demucs_extra.th' + elif data['DemucsModel_MDX'] == "Demucs_extra v1.gz": + demucs_model_set_name = 'demucs_extra.th.gz' + elif data['DemucsModel_MDX'] == "Light v1": + demucs_model_set_name = 'light.th' + elif data['DemucsModel_MDX'] == "Light v1.gz": + demucs_model_set_name = 'light.th.gz' + elif data['DemucsModel_MDX'] == "Light_extra v1": + demucs_model_set_name = 'light_extra.th' + elif data['DemucsModel_MDX'] == "Light_extra v1.gz": + demucs_model_set_name = 'light_extra.th.gz' + elif data['DemucsModel_MDX'] == "Tasnet v2": + demucs_model_set_name = 'tasnet-beb46fac.th' + elif data['DemucsModel_MDX'] == "Tasnet_extra v2": + demucs_model_set_name = 'tasnet_extra-df3777b2.th' + elif data['DemucsModel_MDX'] == "Demucs48_hq v2": + demucs_model_set_name = 'demucs48_hq-28a1282c.th' + elif data['DemucsModel_MDX'] == "Demucs v2": + demucs_model_set_name = 'demucs-e07c671f.th' + elif data['DemucsModel_MDX'] == "Demucs_extra v2": + demucs_model_set_name = 'demucs_extra-3646af93.th' + elif data['DemucsModel_MDX'] == "Demucs_unittest v2": + demucs_model_set_name = 'demucs_unittest-09ebc15f.th' + elif '.ckpt' in data['DemucsModel_MDX'] and 'v2' in data['DemucsModel_MDX']: + demucs_model_set_name = data['DemucsModel_MDX'] + elif '.ckpt' in data['DemucsModel_MDX'] and 'v1' in data['DemucsModel_MDX']: + demucs_model_set_name = data['DemucsModel_MDX'] + else: + demucs_model_set_name = data['DemucsModel_MDX'] + + if data['mdx_ensem'] == "Demucs: Tasnet v1": + demucs_model_set_name_muilti_a = 'tasnet.th' + elif data['mdx_ensem'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_muilti_a = 'tasnet_extra.th' + elif data['mdx_ensem'] == "Demucs: Demucs v1": + demucs_model_set_name_muilti_a = 'demucs.th' + elif data['mdx_ensem'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_muilti_a = 'demucs_extra.th' + elif data['mdx_ensem'] == "Demucs: Light v1": + demucs_model_set_name_muilti_a = 'light.th' + elif data['mdx_ensem'] == "Demucs: Light_extra v1": + demucs_model_set_name_muilti_a = 'light_extra.th' + elif data['mdx_ensem'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_muilti_a = 'demucs.th.gz' + elif data['mdx_ensem'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_muilti_a = 'demucs_extra.th.gz' + elif data['mdx_ensem'] == "Demucs: Light v1.gz": + demucs_model_set_name_muilti_a = 'light.th.gz' + elif data['mdx_ensem'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_muilti_a = 'light_extra.th.gz' + elif data['mdx_ensem'] == "Demucs: Tasnet v2": + demucs_model_set_name_muilti_a = 'tasnet-beb46fac.th' + elif data['mdx_ensem'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_muilti_a = 'tasnet_extra-df3777b2.th' + elif data['mdx_ensem'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_muilti_a = 'demucs48_hq-28a1282c.th' + elif data['mdx_ensem'] == "Demucs: Demucs v2": + demucs_model_set_name_muilti_a = 'demucs-e07c671f.th' + elif data['mdx_ensem'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_muilti_a = 'demucs_extra-3646af93.th' + elif data['mdx_ensem'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_muilti_a = 'demucs_unittest-09ebc15f.th' + elif data['mdx_ensem'] == "Demucs: mdx_extra": + demucs_model_set_name_muilti_a = 'mdx_extra' + elif data['mdx_ensem'] == "Demucs: mdx_extra_q": + demucs_model_set_name_muilti_a = 'mdx_extra_q' + elif data['mdx_ensem'] == "Demucs: mdx": + demucs_model_set_name_muilti_a = 'mdx' + elif data['mdx_ensem'] == "Demucs: mdx_q": + demucs_model_set_name_muilti_a = 'mdx_q' + elif data['mdx_ensem'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_muilti_a = 'UVR_Demucs_Model_1' + elif data['mdx_ensem'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_muilti_a = 'UVR_Demucs_Model_2' + elif data['mdx_ensem'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_muilti_a = 'UVR_Demucs_Model_Bag' + + else: + demucs_model_set_name_muilti_a = data['mdx_ensem'] + + if data['mdx_ensem_b'] == "Demucs: Tasnet v1": + demucs_model_set_name_muilti_b = 'tasnet.th' + elif data['mdx_ensem_b'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_muilti_b = 'tasnet_extra.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs v1": + demucs_model_set_name_muilti_b = 'demucs.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_muilti_b = 'demucs_extra.th' + elif data['mdx_ensem_b'] == "Demucs: Light v1": + demucs_model_set_name_muilti_b = 'light.th' + elif data['mdx_ensem_b'] == "Demucs: Light_extra v1": + demucs_model_set_name_muilti_b = 'light_extra.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_muilti_b = 'demucs.th.gz' + elif data['mdx_ensem_b'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_muilti_b = 'demucs_extra.th.gz' + elif data['mdx_ensem_b'] == "Demucs: Light v1.gz": + demucs_model_set_name_muilti_b = 'light.th.gz' + elif data['mdx_ensem_b'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_muilti_b = 'light_extra.th.gz' + elif data['mdx_ensem_b'] == "Demucs: Tasnet v2": + demucs_model_set_name_muilti_b = 'tasnet-beb46fac.th' + elif data['mdx_ensem_b'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_muilti_b = 'tasnet_extra-df3777b2.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_muilti_b = 'demucs48_hq-28a1282c.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs v2": + demucs_model_set_name_muilti_b = 'demucs-e07c671f.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_muilti_b = 'demucs_extra-3646af93.th' + elif data['mdx_ensem_b'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_muilti_b = 'demucs_unittest-09ebc15f.th' + elif data['mdx_ensem_b'] == "Demucs: mdx_extra": + demucs_model_set_name_muilti_b = 'mdx_extra' + elif data['mdx_ensem_b'] == "Demucs: mdx_extra_q": + demucs_model_set_name_muilti_b = 'mdx_extra_q' + elif data['mdx_ensem_b'] == "Demucs: mdx": + demucs_model_set_name_muilti_b = 'mdx' + elif data['mdx_ensem_b'] == "Demucs: mdx_q": + demucs_model_set_name_muilti_b = 'mdx_q' + elif data['mdx_ensem_b'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_muilti_b = 'UVR_Demucs_Model_1' + elif data['mdx_ensem_b'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_muilti_b = 'UVR_Demucs_Model_2' + elif data['mdx_ensem_b'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_muilti_b = 'UVR_Demucs_Model_Bag' + else: + demucs_model_set_name_muilti_b = data['mdx_ensem_b'] + + if data['mdx_only_ensem_a'] == "Demucs: Tasnet v1": + demucs_model_set_name_a = 'tasnet.th' + elif data['mdx_only_ensem_a'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_a = 'tasnet_extra.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs v1": + demucs_model_set_name_a = 'demucs.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_a = 'demucs_extra.th' + elif data['mdx_only_ensem_a'] == "Demucs: Light v1": + demucs_model_set_name_a = 'light.th' + elif data['mdx_only_ensem_a'] == "Demucs: Light_extra v1": + demucs_model_set_name_a = 'light_extra.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_a = 'demucs.th.gz' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_a = 'demucs_extra.th.gz' + elif data['mdx_only_ensem_a'] == "Demucs: Light v1.gz": + demucs_model_set_name_a = 'light.th.gz' + elif data['mdx_only_ensem_a'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_a = 'light_extra.th.gz' + elif data['mdx_only_ensem_a'] == "Demucs: Tasnet v2": + demucs_model_set_name_a = 'tasnet-beb46fac.th' + elif data['mdx_only_ensem_a'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_a = 'tasnet_extra-df3777b2.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_a = 'demucs48_hq-28a1282c.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs v2": + demucs_model_set_name_a = 'demucs-e07c671f.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_a = 'demucs_extra-3646af93.th' + elif data['mdx_only_ensem_a'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_a = 'demucs_unittest-09ebc15f.th' + elif data['mdx_only_ensem_a'] == "Demucs: mdx_extra": + demucs_model_set_name_a = 'mdx_extra' + elif data['mdx_only_ensem_a'] == "Demucs: mdx_extra_q": + demucs_model_set_name_a = 'mdx_extra_q' + elif data['mdx_only_ensem_a'] == "Demucs: mdx": + demucs_model_set_name_a = 'mdx' + elif data['mdx_only_ensem_a'] == "Demucs: mdx_q": + demucs_model_set_name_a = 'mdx_q' + elif data['mdx_only_ensem_a'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_a = 'UVR_Demucs_Model_1' + elif data['mdx_only_ensem_a'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_a = 'UVR_Demucs_Model_2' + elif data['mdx_only_ensem_a'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_a = 'UVR_Demucs_Model_Bag' + + else: + demucs_model_set_name_a = data['mdx_only_ensem_a'] + + + if data['mdx_only_ensem_b'] == "Demucs: Tasnet v1": + demucs_model_set_name_b = 'tasnet.th' + elif data['mdx_only_ensem_b'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_b = 'tasnet_extra.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs v1": + demucs_model_set_name_b = 'demucs.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_b = 'demucs_extra.th' + elif data['mdx_only_ensem_b'] == "Demucs: Light v1": + demucs_model_set_name_b = 'light.th' + elif data['mdx_only_ensem_b'] == "Demucs: Light_extra v1": + demucs_model_set_name_b = 'light_extra.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_b = 'demucs.th.gz' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_b = 'demucs_extra.th.gz' + elif data['mdx_only_ensem_b'] == "Demucs: Light v1.gz": + demucs_model_set_name_b = 'light.th.gz' + elif data['mdx_only_ensem_b'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_b = 'light_extra.th.gz' + elif data['mdx_only_ensem_b'] == "Demucs: Tasnet v2": + demucs_model_set_name_b = 'tasnet-beb46fac.th' + elif data['mdx_only_ensem_b'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_b = 'tasnet_extra-df3777b2.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_b = 'demucs48_hq-28a1282c.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs v2": + demucs_model_set_name_b = 'demucs-e07c671f.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_b = 'demucs_extra-3646af93.th' + elif data['mdx_only_ensem_b'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_b = 'demucs_unittest-09ebc15f.th' + elif data['mdx_only_ensem_b'] == "Demucs: mdx_extra": + demucs_model_set_name_b = 'mdx_extra' + elif data['mdx_only_ensem_b'] == "Demucs: mdx_extra_q": + demucs_model_set_name_b = 'mdx_extra_q' + elif data['mdx_only_ensem_b'] == "Demucs: mdx": + demucs_model_set_name_b = 'mdx' + elif data['mdx_only_ensem_b'] == "Demucs: mdx_q": + demucs_model_set_name_b = 'mdx_q' + elif data['mdx_only_ensem_b'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_b = 'UVR_Demucs_Model_1' + elif data['mdx_only_ensem_b'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_b = 'UVR_Demucs_Model_2' + elif data['mdx_only_ensem_b'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_b = 'UVR_Demucs_Model_Bag' + + else: + demucs_model_set_name_b = data['mdx_only_ensem_b'] + + if data['mdx_only_ensem_c'] == "Demucs: Tasnet v1": + demucs_model_set_name_c = 'tasnet.th' + elif data['mdx_only_ensem_c'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_c = 'tasnet_extra.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs v1": + demucs_model_set_name_c = 'demucs.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_c = 'demucs_extra.th' + elif data['mdx_only_ensem_c'] == "Demucs: Light v1": + demucs_model_set_name_c = 'light.th' + elif data['mdx_only_ensem_c'] == "Demucs: Light_extra v1": + demucs_model_set_name_c = 'light_extra.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_c = 'demucs.th.gz' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_c = 'demucs_extra.th.gz' + elif data['mdx_only_ensem_c'] == "Demucs: Light v1.gz": + demucs_model_set_name_c = 'light.th.gz' + elif data['mdx_only_ensem_c'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_c = 'light_extra.th.gz' + elif data['mdx_only_ensem_c'] == "Demucs: Tasnet v2": + demucs_model_set_name_c = 'tasnet-beb46fac.th' + elif data['mdx_only_ensem_c'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_c = 'tasnet_extra-df3777b2.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_c = 'demucs48_hq-28a1282c.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs v2": + demucs_model_set_name_c = 'demucs-e07c671f.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_c = 'demucs_extra-3646af93.th' + elif data['mdx_only_ensem_c'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_c = 'demucs_unittest-09ebc15f.th' + elif data['mdx_only_ensem_c'] == "Demucs: mdx_extra": + demucs_model_set_name_c = 'mdx_extra' + elif data['mdx_only_ensem_c'] == "Demucs: mdx_extra_q": + demucs_model_set_name_c = 'mdx_extra_q' + elif data['mdx_only_ensem_c'] == "Demucs: mdx": + demucs_model_set_name_c = 'mdx' + elif data['mdx_only_ensem_c'] == "Demucs: mdx_q": + demucs_model_set_name_c = 'mdx_q' + elif data['mdx_only_ensem_c'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_c = 'UVR_Demucs_Model_1' + elif data['mdx_only_ensem_c'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_c = 'UVR_Demucs_Model_2' + elif data['mdx_only_ensem_c'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_c = 'UVR_Demucs_Model_Bag' + + else: + demucs_model_set_name_c = data['mdx_only_ensem_c'] + + if data['mdx_only_ensem_d'] == "Demucs: Tasnet v1": + demucs_model_set_name_d = 'tasnet.th' + elif data['mdx_only_ensem_d'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_d = 'tasnet_extra.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs v1": + demucs_model_set_name_d = 'demucs.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_d = 'demucs_extra.th' + elif data['mdx_only_ensem_d'] == "Demucs: Light v1": + demucs_model_set_name_d = 'light.th' + elif data['mdx_only_ensem_d'] == "Demucs: Light_extra v1": + demucs_model_set_name_d = 'light_extra.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_d = 'demucs.th.gz' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_d = 'demucs_extra.th.gz' + elif data['mdx_only_ensem_d'] == "Demucs: Light v1.gz": + demucs_model_set_name_d = 'light.th.gz' + elif data['mdx_only_ensem_d'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_d = 'light_extra.th.gz' + elif data['mdx_only_ensem_d'] == "Demucs: Tasnet v2": + demucs_model_set_name_d = 'tasnet-beb46fac.th' + elif data['mdx_only_ensem_d'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_d = 'tasnet_extra-df3777b2.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_d = 'demucs48_hq-28a1282c.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs v2": + demucs_model_set_name_d = 'demucs-e07c671f.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_d = 'demucs_extra-3646af93.th' + elif data['mdx_only_ensem_d'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_d = 'demucs_unittest-09ebc15f.th' + elif data['mdx_only_ensem_d'] == "Demucs: mdx_extra": + demucs_model_set_name_d = 'mdx_extra' + elif data['mdx_only_ensem_d'] == "Demucs: mdx_extra_q": + demucs_model_set_name_d = 'mdx_extra_q' + elif data['mdx_only_ensem_d'] == "Demucs: mdx": + demucs_model_set_name_d = 'mdx' + elif data['mdx_only_ensem_d'] == "Demucs: mdx_q": + demucs_model_set_name_d = 'mdx_q' + elif data['mdx_only_ensem_d'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_d = 'UVR_Demucs_Model_1' + elif data['mdx_only_ensem_d'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_d = 'UVR_Demucs_Model_2' + elif data['mdx_only_ensem_d'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_d = 'UVR_Demucs_Model_Bag' + else: + demucs_model_set_name_d = data['mdx_only_ensem_d'] + + if data['mdx_only_ensem_e'] == "Demucs: Tasnet v1": + demucs_model_set_name_e = 'tasnet.th' + elif data['mdx_only_ensem_e'] == "Demucs: Tasnet_extra v1": + demucs_model_set_name_e = 'tasnet_extra.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs v1": + demucs_model_set_name_e = 'demucs.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs_extra v1": + demucs_model_set_name_e = 'demucs_extra.th' + elif data['mdx_only_ensem_e'] == "Demucs: Light v1": + demucs_model_set_name_e = 'light.th' + elif data['mdx_only_ensem_e'] == "Demucs: Light_extra v1": + demucs_model_set_name_e = 'light_extra.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs v1.gz": + demucs_model_set_name_e = 'demucs.th.gz' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs_extra v1.gz": + demucs_model_set_name_e = 'demucs_extra.th.gz' + elif data['mdx_only_ensem_e'] == "Demucs: Light v1.gz": + demucs_model_set_name_e = 'light.th.gz' + elif data['mdx_only_ensem_e'] == "Demucs: Light_extra v1.gz": + demucs_model_set_name_e = 'light_extra.th.gz' + elif data['mdx_only_ensem_e'] == "Demucs: Tasnet v2": + demucs_model_set_name_e = 'tasnet-beb46fac.th' + elif data['mdx_only_ensem_e'] == "Demucs: Tasnet_extra v2": + demucs_model_set_name_e = 'tasnet_extra-df3777b2.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs48_hq v2": + demucs_model_set_name_e = 'demucs48_hq-28a1282c.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs v2": + demucs_model_set_name_e = 'demucs-e07c671f.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs_extra v2": + demucs_model_set_name_e = 'demucs_extra-3646af93.th' + elif data['mdx_only_ensem_e'] == "Demucs: Demucs_unittest v2": + demucs_model_set_name_e = 'demucs_unittest-09ebc15f.th' + elif data['mdx_only_ensem_e'] == "Demucs: mdx_extra": + demucs_model_set_name_e = 'mdx_extra' + elif data['mdx_only_ensem_e'] == "Demucs: mdx_extra_q": + demucs_model_set_name_e = 'mdx_extra_q' + elif data['mdx_only_ensem_e'] == "Demucs: mdx": + demucs_model_set_name_e = 'mdx' + elif data['mdx_only_ensem_e'] == "Demucs: mdx_q": + demucs_model_set_name_e = 'mdx_q' + elif data['mdx_only_ensem_e'] == "Demucs: UVR_Demucs_Model_1": + demucs_model_set_name_e = 'UVR_Demucs_Model_1' + elif data['mdx_only_ensem_e'] == "Demucs: UVR_Demucs_Model_2": + demucs_model_set_name_e = 'UVR_Demucs_Model_2' + elif data['mdx_only_ensem_e'] == "Demucs: UVR_Demucs_Model_Bag": + demucs_model_set_name_e = 'UVR_Demucs_Model_Bag' + + else: + demucs_model_set_name_e = data['mdx_only_ensem_e'] + + # Update default settings global default_window_size global default_agg @@ -858,7 +1611,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress timestampnum = round(datetime.utcnow().timestamp()) randomnum = randrange(100000, 1000000) - print('Do all of the HP models exist? ' + hp2_ens) + #print('Do all of the HP models exist? ' + hp2_ens) # Separation Preperation try: #Ensemble Dictionary @@ -867,19 +1620,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress channel_set = int(data['channel']) margin_set = int(data['margin']) shift_set = int(data['shifts']) - demucs_model_set = data['DemucsModel_MDX'] + demucs_model_set = demucs_model_set_name split_mode = data['split_mode'] - demucs_switch = data['demucsmodel'] - if data['demucsmodel']: - demucs_switch = 'on' - else: - demucs_switch = 'off' - - if data['demucs_only']: - demucs_only = 'on' - else: - demucs_only = 'off' if data['wavtype'] == '64-bit Float': if data['saveFormat'] == 'Flac': @@ -899,116 +1642,51 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress if not data['ensChoose'] == 'Manual Ensemble': + ##### Basic VR Ensemble ##### + #1st Model - if data['vr_ensem_a'] == 'MGM_MAIN_v4': - vr_ensem_a = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_a_name = 'MGM_MAIN_v4' - elif data['vr_ensem_a'] == 'MGM_HIGHEND_v4': - vr_ensem_a = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_a_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_a'] == 'MGM_LOWEND_A_v4': - vr_ensem_a = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_a_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_a'] == 'MGM_LOWEND_B_v4': - vr_ensem_a = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_a_name = 'MGM_LOWEND_B_v4' - else: - vr_ensem_a_name = data['vr_ensem_a'] - vr_ensem_a = f'models/Main_Models/{vr_ensem_a_name}.pth' + vr_ensem_a_name = data['vr_ensem_a'] + vr_ensem_a = f'models/Main_Models/{vr_ensem_a_name}.pth' + vr_param_ens_a = data['vr_basic_USER_model_param_1'] #2nd Model - if data['vr_ensem_b'] == 'MGM_MAIN_v4': - vr_ensem_b = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_b_name = 'MGM_MAIN_v4' - elif data['vr_ensem_b'] == 'MGM_HIGHEND_v4': - vr_ensem_b = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_b_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_b'] == 'MGM_LOWEND_A_v4': - vr_ensem_b = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_b_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_b'] == 'MGM_LOWEND_B_v4': - vr_ensem_b = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_b_name = 'MGM_LOWEND_B_v4' - else: - vr_ensem_b_name = data['vr_ensem_b'] - vr_ensem_b = f'models/Main_Models/{vr_ensem_b_name}.pth' + vr_ensem_b_name = data['vr_ensem_b'] + vr_ensem_b = f'models/Main_Models/{vr_ensem_b_name}.pth' + vr_param_ens_b = data['vr_basic_USER_model_param_2'] #3rd Model - if data['vr_ensem_c'] == 'MGM_MAIN_v4': - vr_ensem_c = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_c_name = 'MGM_MAIN_v4' - elif data['vr_ensem_c'] == 'MGM_HIGHEND_v4': - vr_ensem_c = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_c_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_c'] == 'MGM_LOWEND_A_v4': - vr_ensem_c = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_c_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_c'] == 'MGM_LOWEND_B_v4': - vr_ensem_c = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_c_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem_c'] == 'No Model': - vr_ensem_c = 'pass' - vr_ensem_c_name = 'pass' - else: - vr_ensem_c_name = data['vr_ensem_c'] - vr_ensem_c = f'models/Main_Models/{vr_ensem_c_name}.pth' + vr_ensem_c_name = data['vr_ensem_c'] + vr_ensem_c = f'models/Main_Models/{vr_ensem_c_name}.pth' + vr_param_ens_c = data['vr_basic_USER_model_param_3'] #4th Model - if data['vr_ensem_d'] == 'MGM_MAIN_v4': - vr_ensem_d = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_d_name = 'MGM_MAIN_v4' - elif data['vr_ensem_d'] == 'MGM_HIGHEND_v4': - vr_ensem_d = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_d_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_d'] == 'MGM_LOWEND_A_v4': - vr_ensem_d = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_d_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_d'] == 'MGM_LOWEND_B_v4': - vr_ensem_d = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_d_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem_d'] == 'No Model': - vr_ensem_d = 'pass' - vr_ensem_d_name = 'pass' - else: - vr_ensem_d_name = data['vr_ensem_d'] - vr_ensem_d = f'models/Main_Models/{vr_ensem_d_name}.pth' + vr_ensem_d_name = data['vr_ensem_d'] + vr_ensem_d = f'models/Main_Models/{vr_ensem_d_name}.pth' + vr_param_ens_d = data['vr_basic_USER_model_param_4'] # 5th Model - if data['vr_ensem_e'] == 'MGM_MAIN_v4': - vr_ensem_e = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_e_name = 'MGM_MAIN_v4' - elif data['vr_ensem_e'] == 'MGM_HIGHEND_v4': - vr_ensem_e = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_e_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_e'] == 'MGM_LOWEND_A_v4': - vr_ensem_e = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_e_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_e'] == 'MGM_LOWEND_B_v4': - vr_ensem_e = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_e_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem_e'] == 'No Model': - vr_ensem_e = 'pass' - vr_ensem_e_name = 'pass' - else: - vr_ensem_e_name = data['vr_ensem_e'] - vr_ensem_e = f'models/Main_Models/{vr_ensem_e_name}.pth' + vr_ensem_e_name = data['vr_ensem_e'] + vr_ensem_e = f'models/Main_Models/{vr_ensem_e_name}.pth' + vr_param_ens_e = data['vr_basic_USER_model_param_5'] if data['vr_ensem_c'] == 'No Model' and data['vr_ensem_d'] == 'No Model' and data['vr_ensem_e'] == 'No Model': Basic_Ensem = [ { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/2' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/2' } @@ -1018,18 +1696,21 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/3' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/3' }, { 'model_name': vr_ensem_e_name, 'model_name_c':vr_ensem_e_name, + 'model_param': vr_param_ens_e, 'model_location': vr_ensem_e, 'loop_name': 'Ensemble Mode - Model 3/3' } @@ -1039,18 +1720,21 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/3' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/3' }, { 'model_name': vr_ensem_d_name, 'model_name_c':vr_ensem_d_name, + 'model_param': vr_param_ens_d, 'model_location': vr_ensem_d, 'loop_name': 'Ensemble Mode - Model 3/3' } @@ -1060,18 +1744,21 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/3' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/3' }, { 'model_name': vr_ensem_c_name, 'model_name_c':vr_ensem_c_name, + 'model_param': vr_param_ens_c, 'model_location': vr_ensem_c, 'loop_name': 'Ensemble Mode - Model 3/3' } @@ -1081,24 +1768,28 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/4' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/4' }, { 'model_name': vr_ensem_c_name, 'model_name_c':vr_ensem_c_name, + 'model_param': vr_param_ens_c, 'model_location': vr_ensem_c, 'loop_name': 'Ensemble Mode - Model 3/4' }, { 'model_name': vr_ensem_e_name, 'model_name_c':vr_ensem_e_name, + 'model_param': vr_param_ens_e, 'model_location': vr_ensem_e, 'loop_name': 'Ensemble Mode - Model 4/4' } @@ -1109,24 +1800,28 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/4' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/4' }, { 'model_name': vr_ensem_d_name, 'model_name_c':vr_ensem_d_name, + 'model_param': vr_param_ens_d, 'model_location': vr_ensem_d, 'loop_name': 'Ensemble Mode - Model 3/4' }, { 'model_name': vr_ensem_e_name, 'model_name_c':vr_ensem_e_name, + 'model_param': vr_param_ens_e, 'model_location': vr_ensem_e, 'loop_name': 'Ensemble Mode - Model 4/4' } @@ -1136,24 +1831,28 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/4' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/4' }, { 'model_name': vr_ensem_c_name, 'model_name_c':vr_ensem_c_name, + 'model_param': vr_param_ens_c, 'model_location': vr_ensem_c, 'loop_name': 'Ensemble Mode - Model 3/4' }, { 'model_name': vr_ensem_d_name, 'model_name_c':vr_ensem_d_name, + 'model_param': vr_param_ens_d, 'model_location': vr_ensem_d, 'loop_name': 'Ensemble Mode - Model 4/4' } @@ -1163,267 +1862,160 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_a_name, 'model_name_c':vr_ensem_a_name, + 'model_param': vr_param_ens_a, 'model_location': vr_ensem_a, 'loop_name': 'Ensemble Mode - Model 1/5' }, { 'model_name': vr_ensem_b_name, 'model_name_c':vr_ensem_b_name, + 'model_param': vr_param_ens_b, 'model_location': vr_ensem_b, 'loop_name': 'Ensemble Mode - Model 2/5' }, { 'model_name': vr_ensem_c_name, 'model_name_c':vr_ensem_c_name, + 'model_param': vr_param_ens_c, 'model_location': vr_ensem_c, 'loop_name': 'Ensemble Mode - Model 3/5' }, { 'model_name': vr_ensem_d_name, 'model_name_c':vr_ensem_d_name, + 'model_param': vr_param_ens_d, 'model_location': vr_ensem_d, 'loop_name': 'Ensemble Mode - Model 4/5' }, { 'model_name': vr_ensem_e_name, 'model_name_c':vr_ensem_e_name, + 'model_param': vr_param_ens_e, 'model_location': vr_ensem_e, 'loop_name': 'Ensemble Mode - Model 5/5' } ] - HP2_Models = [ - { - 'model_name':'7_HP2-UVR', - 'model_name_c':'1st HP2 Model', - 'model_location':'models/Main_Models/7_HP2-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 1/3' - }, - { - 'model_name':'8_HP2-UVR', - 'model_name_c':'2nd HP2 Model', - 'model_location':'models/Main_Models/8_HP2-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 2/3' - }, - { - 'model_name':'9_HP2-UVR', - 'model_name_c':'3rd HP2 Model', - 'model_location':'models/Main_Models/9_HP2-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 3/3' - } - ] - - All_HP_Models = [ - { - 'model_name':'7_HP2-UVR', - 'model_name_c':'1st HP2 Model', - 'model_location':'models/Main_Models/7_HP2-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 1/5' - - }, - { - 'model_name':'8_HP2-UVR', - 'model_name_c':'2nd HP2 Model', - 'model_location':'models/Main_Models/8_HP2-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 2/5' - - }, - { - 'model_name':'9_HP2-UVR', - 'model_name_c':'3rd HP2 Model', - 'model_location':'models/Main_Models/9_HP2-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 3/5' - }, - { - 'model_name':'1_HP-UVR', - 'model_name_c':'1st HP Model', - 'model_location':'models/Main_Models/1_HP-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 4/5' - }, - { - 'model_name':'2_HP-UVR', - 'model_name_c':'2nd HP Model', - 'model_location':'models/Main_Models/2_HP-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 5/5' - } - ] - - Vocal_Models = [ - { - 'model_name':'3_HP-Vocal-UVR', - 'model_name_c':'1st Vocal Model', - 'model_location':'models/Main_Models/3_HP-Vocal-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 1/2' - }, - { - 'model_name':'4_HP-Vocal-UVR', - 'model_name_c':'2nd Vocal Model', - 'model_location':'models/Main_Models/4_HP-Vocal-UVR.pth', - 'loop_name': 'Ensemble Mode - Model 2/2' - } - ] + ##### Multi-AI Ensemble ##### #VR Model 1 - if data['vr_ensem'] == 'MGM_MAIN_v4': - vr_ensem = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_name = 'MGM_MAIN_v4' - elif data['vr_ensem'] == 'MGM_HIGHEND_v4': - vr_ensem = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem'] == 'MGM_LOWEND_A_v4': - vr_ensem = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem'] == 'MGM_LOWEND_B_v4': - vr_ensem = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem'] == 'No Model': - vr_ensem = 'pass' - vr_ensem_name = 'pass' - else: - vr_ensem_name = data['vr_ensem'] - vr_ensem = f'models/Main_Models/{vr_ensem_name}.pth' + vr_ensem_name = data['vr_ensem'] + vr_ensem = f'models/Main_Models/{vr_ensem_name}.pth' + vr_param_ens_multi = data['vr_multi_USER_model_param_1'] #VR Model 2 - if data['vr_ensem_mdx_a'] == 'MGM_MAIN_v4': - vr_ensem_mdx_a = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_mdx_a_name = 'MGM_MAIN_v4' - elif data['vr_ensem_mdx_a'] == 'MGM_HIGHEND_v4': - vr_ensem_mdx_a = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_mdx_a_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_mdx_a'] == 'MGM_LOWEND_A_v4': - vr_ensem_mdx_a = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_mdx_a_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_mdx_a'] == 'MGM_LOWEND_B_v4': - vr_ensem_mdx_a = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_mdx_a_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem_mdx_a'] == 'No Model': - vr_ensem_mdx_a = 'pass' - vr_ensem_mdx_a_name = 'pass' - else: - vr_ensem_mdx_a_name = data['vr_ensem_mdx_a'] - vr_ensem_mdx_a = f'models/Main_Models/{vr_ensem_mdx_a_name}.pth' + vr_ensem_mdx_a_name = data['vr_ensem_mdx_a'] + vr_ensem_mdx_a = f'models/Main_Models/{vr_ensem_mdx_a_name}.pth' + vr_param_ens_multi_a = data['vr_multi_USER_model_param_2'] #VR Model 3 - if data['vr_ensem_mdx_b'] == 'MGM_MAIN_v4': - vr_ensem_mdx_b = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_mdx_b_name = 'MGM_MAIN_v4' - elif data['vr_ensem_mdx_b'] == 'MGM_HIGHEND_v4': - vr_ensem_mdx_b = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_mdx_b_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_mdx_b'] == 'MGM_LOWEND_A_v4': - vr_ensem_mdx_b = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_mdx_b_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_mdx_b'] == 'MGM_LOWEND_B_v4': - vr_ensem_mdx_b = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_mdx_b_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem_mdx_b'] == 'No Model': - vr_ensem_mdx_b = 'pass' - vr_ensem_mdx_b_name = 'pass' - else: - vr_ensem_mdx_b_name = data['vr_ensem_mdx_b'] - vr_ensem_mdx_b = f'models/Main_Models/{vr_ensem_mdx_b_name}.pth' + vr_ensem_mdx_b_name = data['vr_ensem_mdx_b'] + vr_ensem_mdx_b = f'models/Main_Models/{vr_ensem_mdx_b_name}.pth' + vr_param_ens_multi_b = data['vr_multi_USER_model_param_3'] #VR Model 4 - if data['vr_ensem_mdx_c'] == 'MGM_MAIN_v4': - vr_ensem_mdx_c = 'models/Main_Models/MGM_MAIN_v4_sr44100_hl512_nf2048.pth' - vr_ensem_mdx_c_name = 'MGM_MAIN_v4' - elif data['vr_ensem_mdx_c'] == 'MGM_HIGHEND_v4': - vr_ensem_mdx_c = 'models/Main_Models/MGM_HIGHEND_v4_sr44100_hl1024_nf2048.pth' - vr_ensem_mdx_c_name = 'MGM_HIGHEND_v4' - elif data['vr_ensem_mdx_c'] == 'MGM_LOWEND_A_v4': - vr_ensem_mdx_c = 'models/Main_Models/MGM_LOWEND_A_v4_sr32000_hl512_nf2048.pth' - vr_ensem_mdx_c_name = 'MGM_LOWEND_A_v4' - elif data['vr_ensem_mdx_c'] == 'MGM_LOWEND_B_v4': - vr_ensem_mdx_c = 'models/Main_Models/MGM_LOWEND_B_v4_sr33075_hl384_nf2048.pth' - vr_ensem_mdx_c_name = 'MGM_LOWEND_B_v4' - elif data['vr_ensem_mdx_c'] == 'No Model': - vr_ensem_mdx_c = 'pass' - vr_ensem_mdx_c_name = 'pass' - else: - vr_ensem_mdx_c_name = data['vr_ensem_mdx_c'] - vr_ensem_mdx_c = f'models/Main_Models/{vr_ensem_mdx_c_name}.pth' + vr_ensem_mdx_c_name = data['vr_ensem_mdx_c'] + vr_ensem_mdx_c = f'models/Main_Models/{vr_ensem_mdx_c_name}.pth' + vr_param_ens_multi_c = data['vr_multi_USER_model_param_4'] - #MDX-Net Model - - if data['mdx_ensem'] == 'UVR-MDX-NET 1': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): - mdx_ensem = 'UVR_MDXNET_1_9703' - else: - mdx_ensem = 'UVR_MDXNET_9703' - if data['mdx_ensem'] == 'UVR-MDX-NET 2': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): - mdx_ensem = 'UVR_MDXNET_2_9682' - else: - mdx_ensem = 'UVR_MDXNET_9682' - if data['mdx_ensem'] == 'UVR-MDX-NET 3': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): - mdx_ensem = 'UVR_MDXNET_3_9662' - else: - mdx_ensem = 'UVR_MDXNET_9662' - if data['mdx_ensem'] == 'UVR-MDX-NET Karaoke': - mdx_ensem = 'UVR_MDXNET_KARA' - if data['mdx_ensem'] == 'UVR-MDX-NET Main': - mdx_ensem = 'UVR_MDXNET_Main' - if data['mdx_ensem'] == 'Demucs UVR Model 1': - mdx_ensem = 'UVR_Demucs_Model_1' - if data['mdx_ensem'] == 'Demucs UVR Model 2': - mdx_ensem = 'UVR_Demucs_Model_2' - if data['mdx_ensem'] == 'Demucs mdx_extra': - mdx_ensem = 'mdx_extra' - if data['mdx_ensem'] == 'Demucs mdx_extra_q': - mdx_ensem = 'mdx_extra_q' - - #MDX-Net Model 2 + #MDX-Net/Demucs Model 1 - if data['mdx_ensem_b'] == 'UVR-MDX-NET 1': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): - mdx_ensem_b = 'UVR_MDXNET_1_9703' + if 'MDX-Net:' in data['mdx_ensem']: + mdx_model_run_mul_a = 'yes' + mdx_net_model_name = data['mdx_ensem'] + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #mdx_ensem = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_ensem = 'UVR_MDXNET_1_9703' + else: + mdx_ensem = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_ensem = 'UVR_MDXNET_2_9682' + else: + mdx_ensem = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_ensem = 'UVR_MDXNET_3_9662' + else: + mdx_ensem = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_ensem = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_ensem = 'UVR_MDXNET_Main' else: - mdx_ensem_b = 'UVR_MDXNET_9703' - if data['mdx_ensem_b'] == 'UVR-MDX-NET 2': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): - mdx_ensem_b = 'UVR_MDXNET_2_9682' + mdx_ensem = mdx_net_model_name + + if 'Demucs:' in data['mdx_ensem']: + mdx_model_run_mul_a = 'no' + mdx_ensem = demucs_model_set_name_muilti_a + + if data['mdx_ensem'] == 'No Model': + mdx_ensem = 'pass' + + #MDX-Net/Demucs Model 2 + + if 'MDX-Net:' in data['mdx_ensem_b']: + mdx_model_run_mul_b = 'yes' + mdx_net_model_name = data['mdx_ensem_b'] + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #mdx_ensem_b = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_ensem_b = 'UVR_MDXNET_1_9703' + else: + mdx_ensem_b = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_ensem_b = 'UVR_MDXNET_2_9682' + else: + mdx_ensem_b = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_ensem_b = 'UVR_MDXNET_3_9662' + else: + mdx_ensem_b = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_ensem_b = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_ensem_b = 'UVR_MDXNET_Main' + else: - mdx_ensem_b = 'UVR_MDXNET_9682' - if data['mdx_ensem_b'] == 'UVR-MDX-NET 3': - if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): - mdx_ensem_b = 'UVR_MDXNET_3_9662' - else: - mdx_ensem_b = 'UVR_MDXNET_9662' - if data['mdx_ensem_b'] == 'UVR-MDX-NET Karaoke': - mdx_ensem_b = 'UVR_MDXNET_KARA' - if data['mdx_ensem_b'] == 'UVR-MDX-NET Main': - mdx_ensem_b = 'UVR_MDXNET_Main' - if data['mdx_ensem_b'] == 'Demucs UVR Model 1': - mdx_ensem_b = 'UVR_Demucs_Model_1' - if data['mdx_ensem_b'] == 'Demucs UVR Model 2': - mdx_ensem_b = 'UVR_Demucs_Model_2' - if data['mdx_ensem_b'] == 'Demucs mdx_extra': - mdx_ensem_b = 'mdx_extra' - if data['mdx_ensem_b'] == 'Demucs mdx_extra_q': - mdx_ensem_b = 'mdx_extra_q' + mdx_ensem_b = mdx_net_model_name + + if 'Demucs:' in data['mdx_ensem_b']: + mdx_model_run_mul_b = 'no' + mdx_ensem_b = demucs_model_set_name_muilti_b + if data['mdx_ensem_b'] == 'No Model': mdx_ensem_b = 'pass' + mdx_model_run_mul_b = 'pass' - if data['vr_ensem'] == 'No Model' and data['vr_ensem_mdx_a'] == 'No Model' and data['vr_ensem_mdx_b'] == 'No Model' and data['vr_ensem_mdx_c'] == 'No Model': mdx_vr = [ { 'model_name': vr_ensem_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {mdx_ensem}', }, { 'model_name': 'pass', 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': 'pass', + 'model_param': 'pass', 'model_location':'pass', 'loop_name': f'Ensemble Mode - Last Model - {mdx_ensem_b}', } @@ -1433,14 +2025,18 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}', }, { 'model_name': 'pass', 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': 'pass', + 'model_param': 'pass', 'model_location':'pass', 'loop_name': 'Ensemble Mode - Last Model', } @@ -1450,14 +2046,18 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_c_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_c_name, + 'model_param': vr_param_ens_multi_c, 'model_location':vr_ensem_mdx_c, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_c_name}' } @@ -1467,14 +2067,18 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_b_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_b_name, + 'model_param': vr_param_ens_multi_b, 'model_location':vr_ensem_mdx_b, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_b_name}' }, @@ -1485,14 +2089,18 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_a_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_a_name, + 'model_param': vr_param_ens_multi_a, 'model_location':vr_ensem_mdx_a, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_a_name}' } @@ -1502,21 +2110,27 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': 'pass', + 'mdx_model_run': 'pass', 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_b_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_mdx_b_name, + 'model_param': vr_param_ens_multi_b, 'model_location':vr_ensem_mdx_b, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_b_name}' }, { 'model_name': vr_ensem_mdx_c_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_c_name, + 'model_param': vr_param_ens_multi_c, 'model_location':vr_ensem_mdx_c, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_c_name}' } @@ -1526,21 +2140,27 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': 'pass', + 'mdx_model_run': 'pass', 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_a_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_mdx_a_name, + 'model_param': vr_param_ens_multi_a, 'model_location':vr_ensem_mdx_a, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_a_name}' }, { 'model_name': vr_ensem_mdx_c_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_c_name, + 'model_param': vr_param_ens_multi_c, 'model_location':vr_ensem_mdx_c, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_c_name}' } @@ -1550,21 +2170,27 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': 'pass', + 'mdx_model_run': 'pass', 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_a_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_mdx_a_name, + 'model_param': vr_param_ens_multi_a, 'model_location':vr_ensem_mdx_a, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_a_name}' }, { 'model_name': vr_ensem_mdx_b_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_b_name, + 'model_param': vr_param_ens_multi_b, 'model_location':vr_ensem_mdx_b, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_b_name}' } @@ -1574,85 +2200,494 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress { 'model_name': vr_ensem_name, 'mdx_model_name': 'pass', + 'mdx_model_run': 'pass', 'model_name_c': vr_ensem_name, + 'model_param': vr_param_ens_multi, 'model_location':vr_ensem, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_name}' }, { 'model_name': vr_ensem_mdx_a_name, 'mdx_model_name': 'pass', + 'mdx_model_run': 'pass', 'model_name_c': vr_ensem_mdx_a_name, + 'model_param': vr_param_ens_multi_a, 'model_location':vr_ensem_mdx_a, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_a_name}' }, { 'model_name': vr_ensem_mdx_b_name, 'mdx_model_name': mdx_ensem_b, + 'mdx_model_run': mdx_model_run_mul_b, 'model_name_c': vr_ensem_mdx_b_name, + 'model_param': vr_param_ens_multi_b, 'model_location':vr_ensem_mdx_b, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_b_name}' }, { 'model_name': vr_ensem_mdx_c_name, 'mdx_model_name': mdx_ensem, + 'mdx_model_run': mdx_model_run_mul_a, 'model_name_c': vr_ensem_mdx_c_name, + 'model_param': vr_param_ens_multi_c, 'model_location':vr_ensem_mdx_c, 'loop_name': f'Ensemble Mode - Running Model - {vr_ensem_mdx_c_name}' } ] - if data['ensChoose'] == 'Basic VR Ensemble': - loops = Basic_Ensem - ensefolder = 'Basic_VR_Outputs' - if data['vr_ensem_c'] == 'No Model' and data['vr_ensem_d'] == 'No Model' and data['vr_ensem_e'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name - elif data['vr_ensem_c'] == 'No Model' and data['vr_ensem_d'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_e_name - elif data['vr_ensem_c'] == 'No Model' and data['vr_ensem_e'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_d_name - elif data['vr_ensem_d'] == 'No Model' and data['vr_ensem_e'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_c_name - elif data['vr_ensem_c'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_d_name + '_' + vr_ensem_e_name - elif data['vr_ensem_d'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_c_name + '_' + vr_ensem_e_name - elif data['vr_ensem_e'] == 'No Model': - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_c_name + '_' + vr_ensem_d_name + ##### Basic MD Ensemble ##### + + #MDX-Net/Demucs Model 1 + + if 'MDX-Net:' in data['mdx_only_ensem_a']: + mdx_model_run_a = 'yes' + mdx_net_model_name = str(data['mdx_only_ensem_a']) + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #print('mdx_net_model_name ', mdx_net_model_name) + #mdx_only_ensem_a = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_only_ensem_a = 'UVR_MDXNET_1_9703' + else: + mdx_only_ensem_a = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_only_ensem_a = 'UVR_MDXNET_2_9682' + else: + mdx_only_ensem_a = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_only_ensem_a = 'UVR_MDXNET_3_9662' + else: + mdx_only_ensem_a = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_only_ensem_a = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_only_ensem_a = 'UVR_MDXNET_Main' else: - ensemode = 'Basic_Ensemble' + '_' + vr_ensem_a_name + '_' + vr_ensem_b_name + '_' + vr_ensem_c_name + '_' + vr_ensem_d_name + '_' + vr_ensem_e_name - if data['ensChoose'] == 'HP2 Models': - loops = HP2_Models - ensefolder = 'HP2_Models_Ensemble_Outputs' - ensemode = 'HP2_Models' - if data['ensChoose'] == 'All HP/HP2 Models': - loops = All_HP_Models - ensefolder = 'All_HP_HP2_Models_Ensemble_Outputs' - ensemode = 'All_HP_HP2_Models' - if data['ensChoose'] == 'Vocal Models': - loops = Vocal_Models - ensefolder = 'Vocal_Models_Ensemble_Outputs' - ensemode = 'Vocal_Models' + mdx_only_ensem_a = mdx_net_model_name + + if 'Demucs:' in data['mdx_only_ensem_a']: + mdx_model_run_a = 'no' + mdx_only_ensem_a = demucs_model_set_name_a + + if data['mdx_only_ensem_a'] == 'No Model': + mdx_only_ensem_a = 'pass' + + #MDX-Net/Demucs Model 2 + + if 'MDX-Net:' in data['mdx_only_ensem_b']: + mdx_model_run_b = 'yes' + mdx_net_model_name = str(data['mdx_only_ensem_b']) + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #mdx_only_ensem_b = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_only_ensem_b = 'UVR_MDXNET_1_9703' + else: + mdx_only_ensem_b = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_only_ensem_b = 'UVR_MDXNET_2_9682' + else: + mdx_only_ensem_b = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_only_ensem_b = 'UVR_MDXNET_3_9662' + else: + mdx_only_ensem_b = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_only_ensem_b = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_only_ensem_b = 'UVR_MDXNET_Main' + else: + mdx_only_ensem_b = mdx_net_model_name + + if 'Demucs:' in data['mdx_only_ensem_b']: + mdx_model_run_b = 'no' + mdx_only_ensem_b = demucs_model_set_name_b + + if data['mdx_only_ensem_b'] == 'No Model': + mdx_only_ensem_b = 'pass' + + #MDX-Net/Demucs Model 3 + + if 'MDX-Net:' in data['mdx_only_ensem_c']: + mdx_model_run_c = 'yes' + mdx_net_model_name = data['mdx_only_ensem_c'] + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #mdx_only_ensem_c = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_only_ensem_c = 'UVR_MDXNET_1_9703' + else: + mdx_only_ensem_c = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_only_ensem_c = 'UVR_MDXNET_2_9682' + else: + mdx_only_ensem_c = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_only_ensem_c = 'UVR_MDXNET_3_9662' + else: + mdx_only_ensem_c = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_only_ensem_c = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_only_ensem_c = 'UVR_MDXNET_Main' + else: + mdx_only_ensem_c = mdx_net_model_name + + if 'Demucs:' in data['mdx_only_ensem_c']: + mdx_model_run_c = 'no' + mdx_only_ensem_c = demucs_model_set_name_c + + if data['mdx_only_ensem_c'] == 'No Model': + mdx_only_ensem_c = 'pass' + + #MDX-Net/Demucs Model 4 + + if 'MDX-Net:' in data['mdx_only_ensem_d']: + mdx_model_run_d = 'yes' + mdx_net_model_name = data['mdx_only_ensem_d'] + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #mdx_only_ensem_d = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_only_ensem_d = 'UVR_MDXNET_1_9703' + else: + mdx_only_ensem_d = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_only_ensem_d = 'UVR_MDXNET_2_9682' + else: + mdx_only_ensem_d = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_only_ensem_d = 'UVR_MDXNET_3_9662' + else: + mdx_only_ensem_d = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_only_ensem_d = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_only_ensem_d = 'UVR_MDXNET_Main' + else: + mdx_only_ensem_d = mdx_net_model_name + + if 'Demucs:' in data['mdx_only_ensem_d']: + mdx_model_run_d = 'no' + mdx_only_ensem_d = demucs_model_set_name_d + + if data['mdx_only_ensem_d'] == 'No Model': + mdx_only_ensem_d = 'pass' + + #MDX-Net/Demucs Model 5 + + if 'MDX-Net:' in data['mdx_only_ensem_e']: + mdx_model_run_e = 'yes' + mdx_net_model_name = data['mdx_only_ensem_e'] + head, sep, tail = mdx_net_model_name.partition('MDX-Net: ') + mdx_net_model_name = tail + #mdx_only_ensem_e = mdx_net_model_name + if mdx_net_model_name == 'UVR-MDX-NET 1': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_1_9703.onnx'): + mdx_only_ensem_e = 'UVR_MDXNET_1_9703' + else: + mdx_only_ensem_e = 'UVR_MDXNET_9703' + elif mdx_net_model_name == 'UVR-MDX-NET 2': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_2_9682.onnx'): + mdx_only_ensem_e = 'UVR_MDXNET_2_9682' + else: + mdx_only_ensem_e = 'UVR_MDXNET_9682' + elif mdx_net_model_name == 'UVR-MDX-NET 3': + if os.path.isfile('models/MDX_Net_Models/UVR_MDXNET_3_9662.onnx'): + mdx_only_ensem_e = 'UVR_MDXNET_3_9662' + else: + mdx_only_ensem_e = 'UVR_MDXNET_9662' + elif mdx_net_model_name == 'UVR-MDX-NET Karaoke': + mdx_only_ensem_e = 'UVR_MDXNET_KARA' + elif mdx_net_model_name == 'UVR-MDX-NET Main': + mdx_only_ensem_e = 'UVR_MDXNET_Main' + else: + mdx_only_ensem_e = mdx_net_model_name + + if 'Demucs:' in data['mdx_only_ensem_e']: + mdx_model_run_e = 'no' + mdx_only_ensem_e = demucs_model_set_name_e + + if data['mdx_only_ensem_e'] == 'No Model': + mdx_only_ensem_e = 'pass' + + + if data['mdx_only_ensem_c'] == 'No Model' and data['mdx_only_ensem_d'] == 'No Model' and data['mdx_only_ensem_e'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + } + ] + elif data['mdx_only_ensem_c'] == 'No Model' and data['mdx_only_ensem_d'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_e, + 'mdx_model_run': mdx_model_run_e, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_e}' + } + ] + elif data['mdx_only_ensem_c'] == 'No Model' and data['mdx_only_ensem_e'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_d, + 'mdx_model_run': mdx_model_run_d, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_d}' + } + ] + elif data['mdx_only_ensem_d'] == 'No Model' and data['mdx_only_ensem_e'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_c, + 'mdx_model_run': mdx_model_run_c, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_c}' + } + ] + elif data['mdx_only_ensem_d'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_c, + 'mdx_model_run': mdx_model_run_c, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_c}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_e, + 'mdx_model_run': mdx_model_run_e, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_e}' + } + ] + + elif data['mdx_only_ensem_c'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_d, + 'mdx_model_run': mdx_model_run_d, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_d}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_e, + 'mdx_model_run': mdx_model_run_e, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_e}' + } + ] + elif data['mdx_only_ensem_e'] == 'No Model': + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_c, + 'mdx_model_run': mdx_model_run_c, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_c}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_d, + 'mdx_model_run': mdx_model_run_d, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_d}' + } + ] + else: + mdx_demuc_only = [ + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_a, + 'mdx_model_run': mdx_model_run_a, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_a}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_b, + 'mdx_model_run': mdx_model_run_b, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_b}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_c, + 'mdx_model_run': mdx_model_run_c, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_c}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_d, + 'mdx_model_run': mdx_model_run_d, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_d}' + }, + { + 'model_name': 'pass', + 'model_name_c':'pass', + 'mdx_model_name': mdx_only_ensem_e, + 'mdx_model_run': mdx_model_run_e, + 'model_location': 'pass', + 'loop_name': f'Ensemble Mode - Running Model - {mdx_only_ensem_e}' + } + ] + if data['ensChoose'] == 'Multi-AI Ensemble': loops = mdx_vr ensefolder = 'Multi_AI_Ensemble_Outputs' - if data['vr_ensem'] == 'No Model' and data['vr_ensem_mdx_a'] == 'No Model' and data['vr_ensem_mdx_b'] == 'No Model' and data['vr_ensem_mdx_c'] == 'No Model': - ensemode = 'MDX-Net_Models' - elif data['vr_ensem_mdx_a'] == 'No Model' and data['vr_ensem_mdx_b'] == 'No Model' and data['vr_ensem_mdx_c'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name - elif data['vr_ensem_mdx_a'] == 'No Model' and data['vr_ensem_mdx_b'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_c_name - elif data['vr_ensem_mdx_a'] == 'No Model' and data['vr_ensem_mdx_c'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_b_name - elif data['vr_ensem_mdx_b'] == 'No Model' and data['vr_ensem_mdx_c'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_a_name - elif data['vr_ensem_mdx_a'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_b_name + '_' + vr_ensem_mdx_c_name - elif data['vr_ensem_mdx_b'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_a_name + '_' + vr_ensem_mdx_c_name - elif data['vr_ensem_mdx_c'] == 'No Model': - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_a_name + '_' + vr_ensem_mdx_b_name - else: - ensemode = 'MDX-Net_' + vr_ensem_name + '_' + vr_ensem_mdx_a_name + '_' + vr_ensem_mdx_b_name + '_' + vr_ensem_mdx_c_name + ensemode = 'Multi_AI_Ensemble' + + if data['ensChoose'] == 'Basic VR Ensemble': + loops = Basic_Ensem + ensefolder = 'Basic_VR_Outputs' + ensemode = 'Multi_VR_Ensemble' + + if data['ensChoose'] == 'Basic MD Ensemble': + loops = mdx_demuc_only + ensefolder = 'Basic_MDX_Net_Demucs_Ensemble' + ensemode = 'Basic_MDX_Net_Demucs_Ensemble' #Prepare Audiofile(s) for file_num, music_file in enumerate(data['input_paths'], start=1): @@ -1700,27 +2735,34 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress for i, c in tqdm(enumerate(loops), disable=True, desc='Iterations..'): try: - ModelName_2=(c['mdx_model_name']) + if c['mdx_model_name'] == 'tasnet.th': + ModelName_2 = "Tasnet_v1" + elif c['mdx_model_name'] == 'tasnet_extra.th': + ModelName_2 = "Tasnet_extra_v1" + elif c['mdx_model_name'] == 'demucs.th': + ModelName_2 = "Demucs_v1" + elif c['mdx_model_name'] == 'demucs_extra.th': + ModelName_2 = "Demucs_extra_v1" + elif c['mdx_model_name'] == 'light_extra.th': + ModelName_2 = "Light_v1" + elif c['mdx_model_name'] == 'light_extra.th': + ModelName_2 = "Light_extra_v1" + elif c['mdx_model_name'] == 'tasnet-beb46fac.th': + ModelName_2 = "Tasnet_v2" + elif c['mdx_model_name'] == 'tasnet_extra-df3777b2.th': + ModelName_2 = "Tasnet_extra_v2" + elif c['mdx_model_name'] == 'demucs48_hq-28a1282c.th': + ModelName_2 = "Demucs48_hq_v2" + elif c['mdx_model_name'] == 'demucs-e07c671f.th': + ModelName_2 = "Demucs_v2" + elif c['mdx_model_name'] == 'demucs_extra-3646af93.th': + ModelName_2 = "Demucs_extra_v2" + elif c['mdx_model_name'] == 'demucs_unittest-09ebc15f.th': + ModelName_2 = "Demucs_unittest_v2" + else: + ModelName_2 = c['mdx_model_name'] except: pass - - - if hp2_ens == 'off' and loops == HP2_Models: - text_widget.write(base_text + 'You must install the UVR expansion pack in order to use this ensemble.\n') - text_widget.write(base_text + 'Please install the expansion pack or choose another ensemble.\n') - text_widget.write(base_text + 'See the \"Updates\" tab in the Help Guide for installation instructions.\n') - text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') # nopep8 - torch.cuda.empty_cache() - button_widget.configure(state=tk.NORMAL) - return - elif hp2_ens == 'off' and loops == All_HP_Models: - text_widget.write(base_text + 'You must install the UVR expansion pack in order to use this ensemble.\n') - text_widget.write(base_text + 'Please install the expansion pack or choose another ensemble.\n') - text_widget.write(base_text + 'See the \"Updates\" tab in the Help Guide for installation instructions.\n') - text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') # nopep8 - torch.cuda.empty_cache() - button_widget.configure(state=tk.NORMAL) - return def determineenseFolderName(): @@ -1771,7 +2813,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress else: if data['ensChoose'] == 'Multi-AI Ensemble': text_widget.write(base_text + 'Model "' + c['model_name'] + '.pth" is missing.\n') - text_widget.write(base_text + 'Installation of v5 Model Expansion Pack required to use this model.\n') + text_widget.write(base_text + 'This model can be downloaded straight from the \"Settings\" options.\n') text_widget.write(base_text + f'If the error persists, please verify all models are present.\n\n') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') torch.cuda.empty_cache() @@ -1798,100 +2840,62 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress text_widget.write('Done!\n') ModelName=(c['model_location']) - + ModelParamSettings=(c['model_param']) #Package Models - model_hash = hashlib.md5(open(ModelName,'rb').read()).hexdigest() - print(model_hash) - - #v5 Models - - if model_hash == '47939caf0cfe52a0e81442b85b971dfd': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100') - if model_hash == '4e4ecb9764c50a8c414fee6e10395bbe': - model_params_d=str('lib_v5/modelparams/4band_v2.json') - param_name=str('4band_v2') - if model_hash == 'e60a1e84803ce4efc0a6551206cc4b71': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100') - if model_hash == 'a82f14e75892e55e994376edbf0c8435': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100') - if model_hash == '6dd9eaa6f0420af9f1d403aaafa4cc06': - model_params_d=str('lib_v5/modelparams/4band_v2_sn.json') - param_name=str('4band_v2_sn') - if model_hash == '5c7bbca45a187e81abbbd351606164e5': - model_params_d=str('lib_v5/modelparams/3band_44100_msb2.json') - param_name=str('3band_44100_msb2') - if model_hash == 'd6b2cb685a058a091e5e7098192d3233': - model_params_d=str('lib_v5/modelparams/3band_44100_msb2.json') - param_name=str('3band_44100_msb2') - if model_hash == 'c1b9f38170a7c90e96f027992eb7c62b': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100') - if model_hash == 'c3448ec923fa0edf3d03a19e633faa53': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100') - if model_hash == '68aa2c8093d0080704b200d140f59e54': - model_params_d=str('lib_v5/modelparams/3band_44100.json') - param_name=str('3band_44100.json') - if model_hash == 'fdc83be5b798e4bd29fe00fe6600e147': - model_params_d=str('lib_v5/modelparams/3band_44100_mid.json') - param_name=str('3band_44100_mid.json') - if model_hash == '2ce34bc92fd57f55db16b7a4def3d745': - model_params_d=str('lib_v5/modelparams/3band_44100_mid.json') - param_name=str('3band_44100_mid.json') - if model_hash == '52fdca89576f06cf4340b74a4730ee5f': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100.json') - if model_hash == '41191165b05d38fc77f072fa9e8e8a30': - model_params_d=str('lib_v5/modelparams/4band_44100.json') - param_name=str('4band_44100.json') - if model_hash == '89e83b511ad474592689e562d5b1f80e': - model_params_d=str('lib_v5/modelparams/2band_32000.json') - param_name=str('2band_32000.json') - if model_hash == '0b954da81d453b716b114d6d7c95177f': - model_params_d=str('lib_v5/modelparams/2band_32000.json') - param_name=str('2band_32000.json') - - #v4 Models - - if model_hash == '6a00461c51c2920fd68937d4609ed6c8': - model_params_d=str('lib_v5/modelparams/1band_sr16000_hl512.json') - param_name=str('1band_sr16000_hl512') - if model_hash == '0ab504864d20f1bd378fe9c81ef37140': - model_params_d=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name=str('1band_sr32000_hl512') - if model_hash == '7dd21065bf91c10f7fccb57d7d83b07f': - model_params_d=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name=str('1band_sr32000_hl512') - if model_hash == '80ab74d65e515caa3622728d2de07d23': - model_params_d=str('lib_v5/modelparams/1band_sr32000_hl512.json') - param_name=str('1band_sr32000_hl512') - if model_hash == 'edc115e7fc523245062200c00caa847f': - model_params_d=str('lib_v5/modelparams/1band_sr33075_hl384.json') - param_name=str('1band_sr33075_hl384') - if model_hash == '28063e9f6ab5b341c5f6d3c67f2045b7': - model_params_d=str('lib_v5/modelparams/1band_sr33075_hl384.json') - param_name=str('1band_sr33075_hl384') - if model_hash == 'b58090534c52cbc3e9b5104bad666ef2': - model_params_d=str('lib_v5/modelparams/1band_sr44100_hl512.json') - param_name=str('1band_sr44100_hl512') - if model_hash == '0cdab9947f1b0928705f518f3c78ea8f': - model_params_d=str('lib_v5/modelparams/1band_sr44100_hl512.json') - param_name=str('1band_sr44100_hl512') - if model_hash == 'ae702fed0238afb5346db8356fe25f13': - model_params_d=str('lib_v5/modelparams/1band_sr44100_hl1024.json') - param_name=str('1band_sr44100_hl1024') - + if ModelParamSettings == 'Auto': + model_hash = hashlib.md5(open(ModelName,'rb').read()).hexdigest() + model_params = [] + model_params = lib_v5.filelist.provide_model_param_hash(model_hash) + #print(model_params) + if model_params[0] == 'Not Found Using Hash': + model_params = [] + model_params = lib_v5.filelist.provide_model_param_name(ModelName) + if model_params[0] == 'Not Found Using Name': + text_widget.write(base_text + f'Unable to set model parameters automatically with the selected model. Continue?\n') + confirm = tk.messagebox.askyesno(title='Unrecognized Model Detected', + message=f'\nThe application could not automatically set the model param for the selected model.\n\n' + + f'Would you like to select the Model Param file for this model?\n\n' + + f'This model will be skipped if no Model Param is selected.') + + if confirm: + model_param_selection = filedialog.askopenfilename(initialdir='lib_v5/modelparams', + title=f'Select Model Param', + filetypes=[("Model Param", "*.json")]) + + model_param_file_path = str(model_param_selection) + model_param_file = os.path.splitext(os.path.basename(model_param_file_path))[0] + '.json' + model_params = [model_param_file_path, model_param_file] + + with open(f"lib_v5/filelists/model_cache/vr_param_cache/{model_hash}.txt", 'w') as f: + f.write(model_param_file) + + if model_params[0] == '': + text_widget.write(base_text + f'Model param not selected.\n') + text_widget.write(base_text + f'Moving on to next model...\n\n') + continue + else: + pass + else: + text_widget.write(base_text + f'Model param not selected.\n') + text_widget.write(base_text + f'Moving on to next model...\n\n') + + continue + + + else: + model_param_file_path = f'lib_v5/modelparams/{ModelParamSettings}' + model_params = [model_param_file_path, ModelParamSettings] + ModelName_1=(c['model_name']) - print('Model Parameters:', model_params_d) - text_widget.write(base_text + 'Loading assigned model parameters ' + '\"' + param_name + '\"... ') + #print('model param function output ', model_params) + + print('Model Parameters:', model_params[0]) + text_widget.write(base_text + 'Loading assigned model parameters ' + '\"' + model_params[1] + '\"... ') - mp = ModelParameters(model_params_d) + mp = ModelParameters(model_params[0]) text_widget.write('Done!\n') @@ -1907,7 +2911,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress model_name = os.path.basename(c["model_name"]) - # -Go through the different steps of seperation- + # -Go through the different steps of Separation- # Wave source text_widget.write(base_text + 'Loading audio source... ') @@ -2118,150 +3122,101 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress _, bin_image = cv2.imencode('.jpg', image) bin_image.tofile(f) - text_widget.write(base_text + 'Completed Seperation!\n\n') + text_widget.write(base_text + 'Completed Separation!\n\n') - - if data['ensChoose'] == 'Multi-AI Ensemble': +################################### + if data['ensChoose'] == 'Multi-AI Ensemble' or data['ensChoose'] == 'Basic MD Ensemble': + + if data['demucsmodel']: + demucs_switch = 'on' + else: + demucs_switch = 'off' + + if data['demucs_only']: + demucs_only = 'on' + else: + demucs_only = 'off' + + if c['mdx_model_name'] == 'tasnet.th': + post_mdx_name = "Tasnet v1" + elif c['mdx_model_name'] == 'tasnet_extra.th': + post_mdx_name = "Tasnet_extra v1" + elif c['mdx_model_name'] == 'demucs.th': + post_mdx_name = "Demucs v1" + elif c['mdx_model_name'] == 'demucs_extra.th': + post_mdx_name = "Demucs_extra v1" + elif c['mdx_model_name'] == 'light_extra.th': + post_mdx_name = "Light v1" + elif c['mdx_model_name'] == 'light_extra.th': + post_mdx_name = "Light_extra v1" + elif c['mdx_model_name'] == 'tasnet-beb46fac.th': + post_mdx_name = "Tasnet v2" + elif c['mdx_model_name'] == 'tasnet_extra-df3777b2.th': + post_mdx_name = "Tasnet_extra v2" + elif c['mdx_model_name'] == 'demucs48_hq-28a1282c.th': + post_mdx_name = "Demucs48_hq v2" + elif c['mdx_model_name'] == 'demucs-e07c671f.th': + post_mdx_name = "Demucs v2" + elif c['mdx_model_name'] == 'demucs_extra-3646af93.th': + post_mdx_name = "Demucs_extra v2" + elif c['mdx_model_name'] == 'demucs_unittest-09ebc15f.th': + post_mdx_name = "Demucs_unittest v2" + else: + post_mdx_name = c['mdx_model_name'] mdx_name = c['mdx_model_name'] + + if c['mdx_model_name'] == 'pass': pass else: - text_widget.write('Ensemble Mode - Running Model - ' + mdx_name + '\n\n') - - if mdx_name == 'UVR_MDXNET_1_9703': - demucs_only = 'off' - model_set = 'UVR_MDXNET_1_9703.onnx' - model_set_name = 'UVR_MDXNET_1_9703' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_2_9682': - demucs_only = 'off' - model_set = 'UVR_MDXNET_2_9682.onnx' - model_set_name = 'UVR_MDXNET_2_9682' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_3_9662': - demucs_only = 'off' - model_set = 'UVR_MDXNET_3_9662.onnx' - model_set_name = 'UVR_MDXNET_3_9662' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_KARA': - demucs_only = 'off' - model_set = 'UVR_MDXNET_KARA.onnx' - model_set_name = 'UVR_MDXNET_KARA' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_9703': - demucs_only = 'off' - model_set = 'UVR_MDXNET_9703.onnx' - model_set_name = 'UVR_MDXNET_9703' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_9682': - demucs_only = 'off' - model_set = 'UVR_MDXNET_9682.onnx' - model_set_name = 'UVR_MDXNET_9682' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_9662': - demucs_only = 'off' - model_set = 'UVR_MDXNET_9662.onnx' - model_set_name = 'UVR_MDXNET_9662' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_KARA': - demucs_only = 'off' - model_set = 'UVR_MDXNET_KARA.onnx' - model_set_name = 'UVR_MDXNET_KARA' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if autocompensate == True: - compensate = 1.03597672895 - else: - compensate = data['compensate'] - n_fft_scale_set=6144 - dim_f_set=2048 - if mdx_name == 'UVR_MDXNET_Main': - demucs_only = 'off' - model_set = 'UVR_MDXNET_Main.onnx' - model_set_name = 'UVR_MDXNET_Main' - modeltype = 'v' - demucs_model_set = data['DemucsModel_MDX'] - noise_pro = 'MDX-NET_Noise_Profile_17_kHz' - if autocompensate == True: - compensate = 1.075 - else: - compensate = data['compensate'] - n_fft_scale_set=7680 - dim_f_set=3072 - if 'Demucs' in mdx_name: - demucs_only = 'on' - demucs_switch = 'on' - demucs_model_set = mdx_name - model_set = '' - model_set_name = 'UVR' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' - if 'extra' in mdx_name: - demucs_only = 'on' - demucs_switch = 'on' - demucs_model_set = mdx_name - model_set = '' - model_set_name = 'extra' - modeltype = 'v' - noise_pro = 'MDX-NET_Noise_Profile_14_kHz' + text_widget.write('Ensemble Mode - Running Model - ' + post_mdx_name + '\n\n') + if c['mdx_model_run'] == 'no': + if 'UVR' in mdx_name: + demucs_only = 'on' + demucs_switch = 'on' + demucs_model_set = mdx_name + model_set = '' + model_set_name = 'UVR' + modeltype = 'v' + noise_pro = 'MDX-NET_Noise_Profile_14_kHz' + stemset_n = '(Vocals)' + else: + demucs_only = 'on' + demucs_switch = 'on' + demucs_model_set = mdx_name + model_set = '' + model_set_name = 'extra' + modeltype = 'v' + noise_pro = 'MDX-NET_Noise_Profile_14_kHz' + stemset_n = '(Vocals)' + if c['mdx_model_run'] == 'yes': + demucs_only = 'off' + model_set = f"{mdx_name}.onnx" + model_set_name = mdx_name + demucs_model_set = demucs_model_set_name + mdx_model_path = f'models/MDX_Net_Models/{mdx_name}.onnx' + + model_hash = hashlib.md5(open(mdx_model_path,'rb').read()).hexdigest() + model_params_mdx = [] + model_params_mdx = lib_v5.filelist.provide_mdx_model_param_name(model_hash) + + modeltype = model_params_mdx[0] + noise_pro = model_params_mdx[1] + stemset_n = model_params_mdx[2] + if autocompensate: + compensate = model_params_mdx[3] + else: + compensate = data['compensate'] + source_val = model_params_mdx[4] + n_fft_scale_set = model_params_mdx[5] + dim_f_set = model_params_mdx[6] + + #print(model_params_mdx) + + print('demucs_only? ', demucs_only) if data['noise_pro_select'] == 'Auto Select': @@ -2285,6 +3240,30 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress e = os.path.join(data["export_path"]) pred = Predictor() + + if c['mdx_model_run'] == 'yes': + if stemset_n == '(Bass)' or stemset_n == '(Drums)' or stemset_n == '(Other)': + widget_text.write(base_text + 'Only vocal and instrumental MDX-Net models are supported in \nensemble mode.\n') + widget_text.write(base_text + 'Moving on to next model...\n\n') + continue + if modeltype == 'Not Set' or \ + noise_pro == 'Not Set' or \ + stemset_n == 'Not Set' or \ + compensate == 'Not Set' or \ + source_val == 'Not Set' or \ + n_fft_scale_set == 'Not Set' or \ + dim_f_set == 'Not Set': + confirm = tk.messagebox.askyesno(title='Unrecognized Model Detected', + message=f'\nWould you like to set the correct model parameters for this model before continuing?\n') + + if confirm: + pred.mdx_options() + else: + text_widget.write(base_text + 'An unrecognized model has been detected.\n') + text_widget.write(base_text + 'Please configure the ONNX model settings accordingly and try again.\n') + text_widget.write(base_text + 'Moving on to next model...\n\n') + continue + pred.prediction_setup() # split diff --git a/models.py b/models.py index 0b0af07..77f6a02 100644 --- a/models.py +++ b/models.py @@ -7,8 +7,6 @@ import librosa dim_c = 4 model_path = 'model' -#n_fft_scale = {'vocals-one':6144, 'vocals-two':7680,'*':2} - class Conv_TDF_net_trim(nn.Module): def __init__(self, device, n_fft_scale, dim_f, load, model_name, target_name, L, dim_t, hop=1024): @@ -20,9 +18,9 @@ class Conv_TDF_net_trim(nn.Module): self.hop = hop self.n_bins = self.n_fft//2+1 self.chunk_size = hop * (self.dim_t-1) - self.window = torch.hann_window(window_length=self.n_fft, periodic=True).to(device) + self.window = torch.hann_window(window_length=self.n_fft, periodic=False).to(device) self.target_name = target_name - print(n_fft_scale) + #print(n_fft_scale) out_c = dim_c*4 if target_name=='*' else dim_c self.freq_pad = torch.zeros([1, out_c, self.n_bins-self.dim_f, self.dim_t]).to(device) @@ -61,17 +59,21 @@ def istft(spec, hl): return wave def spec_effects(wave, algorithm='Default', value=None): - spec = [stft(wave[0],2048,1024),stft(wave[1],2048,1024)] + doubleout = spec = [stft(wave[0],2048,1024),stft(wave[1],2048,1024)] if algorithm == 'Min_Mag': + doubleout v_spec_m = np.where(np.abs(spec[1]) <= np.abs(spec[0]), spec[1], spec[0]) wave = istft(v_spec_m,1024) elif algorithm == 'Max_Mag': + doubleout v_spec_m = np.where(np.abs(spec[1]) >= np.abs(spec[0]), spec[1], spec[0]) wave = istft(v_spec_m,1024) elif algorithm == 'Default': + doubleout #wave = [istft(spec[0],1024),istft(spec[1],1024)] wave = (wave[1] * value) + (wave[0] * (1-value)) elif algorithm == 'Invert_p': + doubleout X_mag = np.abs(spec[0]) y_mag = np.abs(spec[1]) max_mag = np.where(X_mag >= y_mag, X_mag, y_mag)