Add files via upload

This commit is contained in:
Anjok07
2022-08-23 15:04:39 -05:00
committed by GitHub
parent f7e37b492b
commit 7778d4c3fb
19 changed files with 1735 additions and 581 deletions

444
UVR.py
View File

@@ -266,6 +266,7 @@ DEFAULT_DATA = {
'inst_only_b': False, 'inst_only_b': False,
'lastDir': None, 'lastDir': None,
'margin': 44100, 'margin': 44100,
'margin_d': 44100,
'mdx_ensem': 'MDX-Net: UVR-MDX-NET Main', 'mdx_ensem': 'MDX-Net: UVR-MDX-NET Main',
'mdx_ensem_b': 'No Model', 'mdx_ensem_b': 'No Model',
'mdx_only_ensem_a': 'MDX-Net: UVR-MDX-NET Main', 'mdx_only_ensem_a': 'MDX-Net: UVR-MDX-NET Main',
@@ -285,6 +286,8 @@ DEFAULT_DATA = {
'ModelParams': 'Auto', 'ModelParams': 'Auto',
'mp3bit': '320k', 'mp3bit': '320k',
'n_fft_scale': 6144, 'n_fft_scale': 6144,
'no_chunk': False,
'no_chunk_d': False,
'noise_pro_select': 'Auto Select', 'noise_pro_select': 'Auto Select',
'noise_reduc': True, 'noise_reduc': True,
'noisereduc_s': '3', 'noisereduc_s': '3',
@@ -298,7 +301,7 @@ DEFAULT_DATA = {
'save': True, 'save': True,
'saveFormat': 'Wav', 'saveFormat': 'Wav',
'selectdownload': 'VR Arc', 'selectdownload': 'VR Arc',
'segment': 'None', 'segment': 'Default',
'settest': False, 'settest': False,
'shifts': 2, 'shifts': 2,
'shifts_b': 2, 'shifts_b': 2,
@@ -432,26 +435,51 @@ class ThreadSafeConsole(tk.Text):
""" """
Text Widget which is thread safe for tkinter Text Widget which is thread safe for tkinter
""" """
def __init__(self, master, **options): def __init__(self, master, **options):
tk.Text.__init__(self, master, **options) tk.Text.__init__(self, master, **options)
self.queue = queue.Queue() self.queue = queue.Queue()
self.update_me() self.update_me()
def write(self, line): def write(self, line):
self.queue.put(line) self.queue.put(line)
def percentage(self, line):
line = f"percentage_value_{line}"
self.queue.put(line)
def remove(self, line):
line = f"remove_line_{line}"
self.queue.put(line)
def clear(self): def clear(self):
self.queue.put(None) self.queue.put(None)
def update_me(self): def update_me(self):
self.configure(state=tk.NORMAL) self.configure(state=tk.NORMAL)
try: try:
while 1: while 1:
line = self.queue.get_nowait() line = self.queue.get_nowait()
if line is None: if line is None:
self.delete(1.0, tk.END) self.delete(1.0, tk.END)
else: else:
self.insert(tk.END, str(line)) if "percentage_value_" in str(line):
line = str(line)
line = line.replace("percentage_value_", "")
string_len = len(str(line))
self.delete(f"end-{string_len + 1}c", tk.END)
self.insert(tk.END, f"\n{line}")
elif "remove_line_" in str(line):
line = str(line)
line = line.replace("remove_line_", "")
string_len = len(str(line))
self.delete(f"end-{string_len}c", tk.END)
else:
self.insert(tk.END, str(line))
self.see(tk.END) self.see(tk.END)
self.update_idletasks() self.update_idletasks()
except queue.Empty: except queue.Empty:
@@ -711,6 +739,10 @@ class MainWindow(TkinterDnD.Tk):
self.margin_var = tk.StringVar(value=data['margin']) self.margin_var = tk.StringVar(value=data['margin'])
except: except:
self.margin_var = tk.StringVar(value=data_alt['margin']) self.margin_var = tk.StringVar(value=data_alt['margin'])
try:
self.margin_d_var = tk.StringVar(value=data['margin_d'])
except:
self.margin_d_var = tk.StringVar(value=data_alt['margin_d'])
try: try:
self.mdx_only_ensem_a_var = tk.StringVar(value=data['mdx_only_ensem_a']) self.mdx_only_ensem_a_var = tk.StringVar(value=data['mdx_only_ensem_a'])
except: except:
@@ -783,6 +815,14 @@ class MainWindow(TkinterDnD.Tk):
self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale']) self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale'])
except: except:
self.n_fft_scale_var = tk.StringVar(value=data_alt['n_fft_scale']) self.n_fft_scale_var = tk.StringVar(value=data_alt['n_fft_scale'])
try:
self.no_chunk_var = tk.BooleanVar(value=data['no_chunk'])
except:
self.no_chunk_var = tk.BooleanVar(value=data_alt['no_chunk'])
try:
self.no_chunk_d_var = tk.BooleanVar(value=data['no_chunk_d'])
except:
self.no_chunk_d_var = tk.BooleanVar(value=data_alt['no_chunk_d'])
try: try:
self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select']) self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select'])
except: except:
@@ -1014,6 +1054,9 @@ class MainWindow(TkinterDnD.Tk):
self.stop_Button = ttk.Button(master=self, self.stop_Button = ttk.Button(master=self,
image=self.stop_img, image=self.stop_img,
command=self.stop_inf) command=self.stop_inf)
self.mdx_stop_Button = ttk.Button(master=self,
image=self.stop_img,
command=self.stop_inf)
self.settings_Button = ttk.Button(master=self, self.settings_Button = ttk.Button(master=self,
image=self.help_img, image=self.help_img,
command=self.settings) command=self.settings)
@@ -1253,7 +1296,7 @@ class MainWindow(TkinterDnD.Tk):
background='#0e0e0f', font=self.font, foreground='#13a4c9') background='#0e0e0f', font=self.font, foreground='#13a4c9')
self.options_segment_Optionmenu = ttk.OptionMenu(self.options_Frame, self.options_segment_Optionmenu = ttk.OptionMenu(self.options_Frame,
self.segment_var, self.segment_var,
None, 'None', '1', '5', '10', '15', '20', None, 'Default', '1', '5', '10', '15', '20',
'25', '30', '35', '40', '45', '50', '25', '30', '35', '40', '45', '50',
'55', '60', '65', '70', '75', '80', '55', '60', '65', '70', '75', '80',
'85', '90', '95', '100') '85', '90', '95', '100')
@@ -1583,6 +1626,15 @@ class MainWindow(TkinterDnD.Tk):
self.chunks_var.trace_add('write', self.chunks_var.trace_add('write',
lambda *args: self.update_states()) lambda *args: self.update_states())
self.chunks_d_var.trace_add('write',
lambda *args: self.update_states())
self.margin_d_var.trace_add('write',
lambda *args: self.update_states())
self.no_chunk_d_var.trace_add('write',
lambda *args: self.update_states())
self.autocompensate_var.trace_add('write', self.autocompensate_var.trace_add('write',
lambda *args: self.update_states()) lambda *args: self.update_states())
@@ -1669,6 +1721,10 @@ class MainWindow(TkinterDnD.Tk):
Start the conversion for all the given mp3 and wav files Start the conversion for all the given mp3 and wav files
""" """
global stop_inf
stop_inf = self.stop_inf_mdx
# -Get all variables- # -Get all variables-
export_path = self.exportPath_var.get() export_path = self.exportPath_var.get()
input_paths = self.inputPaths input_paths = self.inputPaths
@@ -1769,6 +1825,7 @@ class MainWindow(TkinterDnD.Tk):
'inst_only_b': self.inst_only_b_var.get(), 'inst_only_b': self.inst_only_b_var.get(),
'instrumentalModel': instrumentalModel_path, 'instrumentalModel': instrumentalModel_path,
'margin': self.margin_var.get(), 'margin': self.margin_var.get(),
'margin_d': self.margin_d_var.get(),
'mdx_ensem': self.mdxensemchoose_var.get(), 'mdx_ensem': self.mdxensemchoose_var.get(),
'mdx_ensem_b': self.mdxensemchoose_b_var.get(), 'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(), 'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(),
@@ -1783,6 +1840,8 @@ class MainWindow(TkinterDnD.Tk):
'ModelParams': self.ModelParams_var.get(), 'ModelParams': self.ModelParams_var.get(),
'mp3bit': self.mp3bit_var.get(), 'mp3bit': self.mp3bit_var.get(),
'n_fft_scale': self.n_fft_scale_var.get(), 'n_fft_scale': self.n_fft_scale_var.get(),
'no_chunk': self.no_chunk_var.get(),
'no_chunk_d': self.no_chunk_d_var.get(),
'noise_pro_select': self.noise_pro_select_var.get(), 'noise_pro_select': self.noise_pro_select_var.get(),
'noise_reduc': self.noisereduc_var.get(), 'noise_reduc': self.noisereduc_var.get(),
'noisereduc_s': noisereduc_s, 'noisereduc_s': noisereduc_s,
@@ -1829,6 +1888,7 @@ class MainWindow(TkinterDnD.Tk):
'wavtype': self.wavtype_var.get(), 'wavtype': self.wavtype_var.get(),
'window': self, 'window': self,
'window_size': window_size, 'window_size': window_size,
'stop_thread': stop_inf,
}, },
daemon=True daemon=True
) )
@@ -1839,16 +1899,7 @@ class MainWindow(TkinterDnD.Tk):
confirm = tk.messagebox.askyesno(title='Confirmation', confirm = tk.messagebox.askyesno(title='Confirmation',
message='You are about to stop all active processes.\n\nAre you sure you wish to continue?') 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: if confirm:
inf.kill() inf.kill()
button_widget = self.conversion_Button button_widget = self.conversion_Button
@@ -1864,6 +1915,18 @@ class MainWindow(TkinterDnD.Tk):
else: else:
pass pass
def stop_inf_mdx(self):
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)
# Models # Models
def update_inputPaths(self): def update_inputPaths(self):
"""Update the music file entry""" """Update the music file entry"""
@@ -1980,6 +2043,14 @@ class MainWindow(TkinterDnD.Tk):
j = ["UVR_MDXNET_Main"] j = ["UVR_MDXNET_Main"]
for char in j: for char in j:
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Main") file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Main")
k = ["UVR_MDXNET_Inst_1"]
for char in k:
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Inst 1")
l = ["UVR_MDXNET_Inst_2"]
for char in l:
file_name_1 = file_name_1.replace(char, "UVR-MDX-NET Inst 2")
self.options_mdxnetModel_Optionmenu['menu'].add_radiobutton(label=file_name_1, self.options_mdxnetModel_Optionmenu['menu'].add_radiobutton(label=file_name_1,
command=tk._setit(self.mdxnetModel_var, file_name_1)) command=tk._setit(self.mdxnetModel_var, file_name_1))
@@ -2948,6 +3019,19 @@ class MainWindow(TkinterDnD.Tk):
self.downloadmodelOptions_mdx.configure(state=tk.DISABLED) self.downloadmodelOptions_mdx.configure(state=tk.DISABLED)
except: except:
pass pass
if self.no_chunk_d_var.get() == False:
try:
self.chunk_d_entry.configure(state=tk.DISABLED)
self.margin_d_entry.configure(state=tk.DISABLED)
except:
pass
elif self.no_chunk_d_var.get() == True:
try:
self.chunk_d_entry.configure(state=tk.NORMAL)
self.margin_d_entry.configure(state=tk.NORMAL)
except:
pass
if self.demucs_only_var.get() == True: if self.demucs_only_var.get() == True:
self.demucsmodel_var.set(True) self.demucsmodel_var.set(True)
@@ -3114,6 +3198,7 @@ class MainWindow(TkinterDnD.Tk):
self.inst_only_var.set(False) self.inst_only_var.set(False)
self.inst_only_b_var.set(False) self.inst_only_b_var.set(False)
self.margin_var.set(44100) self.margin_var.set(44100)
self.margin_d_var.set(44100)
self.mdxensemchoose_var.set('MDX-Net: UVR-MDX-NET Main') self.mdxensemchoose_var.set('MDX-Net: UVR-MDX-NET Main')
self.mdxensemchoose_b_var.set('No Model') self.mdxensemchoose_b_var.set('No Model')
self.mdx_only_ensem_a_var.set('MDX-Net: UVR-MDX-NET Main') self.mdx_only_ensem_a_var.set('MDX-Net: UVR-MDX-NET Main')
@@ -3129,6 +3214,8 @@ class MainWindow(TkinterDnD.Tk):
self.ModelParams_var.set('Auto') self.ModelParams_var.set('Auto')
self.mp3bit_var.set('320k') self.mp3bit_var.set('320k')
self.n_fft_scale_var.set(6144) self.n_fft_scale_var.set(6144)
self.no_chunk_var.set(False)
self.no_chunk_d_var.set(True)
self.noise_pro_select_var.set('Auto Select') self.noise_pro_select_var.set('Auto Select')
self.noisereduc_var.set(True) self.noisereduc_var.set(True)
self.noisereduc_s_var.set(3) self.noisereduc_s_var.set(3)
@@ -3169,41 +3256,44 @@ class MainWindow(TkinterDnD.Tk):
self.vr_basic_USER_model_param_5.set('Auto') self.vr_basic_USER_model_param_5.set('Auto')
self.wavtype_var.set('PCM_16') self.wavtype_var.set('PCM_16')
self.winSize_var.set('512') self.winSize_var.set('512')
def advanced_vr_options(self): def advanced_vr_options(self):
""" """
Open Advanced VR Options Open Advanced VR Options
""" """
top=Toplevel(self) vr_opt=Toplevel(root)
window_height = 630 window_height = 630
window_width = 500 window_width = 500
top.title("Advanced VR Options") screen_width = vr_opt.winfo_screenwidth()
screen_height = vr_opt.winfo_screenheight()
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)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) vr_opt.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
top.attributes("-topmost", True) vr_opt.resizable(False, False) # This code helps to disable windows from resizing
x = root.winfo_x()
y = root.winfo_y()
vr_opt.geometry("+%d+%d" %(x+57,y+110))
vr_opt.wm_transient(root)
vr_opt.title("Advanced VR Options")
#vr_opt.attributes("-topmost", True)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') vr_opt.iconbitmap('img\\UVR-Icon-v2.ico')
def close_win(): def close_win():
top.destroy() vr_opt.destroy()
self.settings() self.settings()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(vr_opt)
tab1 = ttk.Frame(tabControl) tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl)
@@ -3269,7 +3359,7 @@ class MainWindow(TkinterDnD.Tk):
l0.grid(row=12,column=0,padx=0,pady=5) l0.grid(row=12,column=0,padx=0,pady=5)
def close_win_self(): def close_win_self():
top.destroy() vr_opt.destroy()
l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
l0.grid(row=13,column=0,padx=0,pady=5) l0.grid(row=13,column=0,padx=0,pady=5)
@@ -3307,131 +3397,143 @@ class MainWindow(TkinterDnD.Tk):
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var) l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var)
l0.grid(row=9,column=0,padx=0,pady=5) l0.grid(row=9,column=0,padx=0,pady=5)
self.update_states() #self.update_states()
def advanced_demucs_options(self): def advanced_demucs_options(self):
""" """
Open Advanced Demucs Options Open Advanced Demucs Options
""" """
top= Toplevel(self) demuc_opt= Toplevel(root)
window_height = 750 window_height = 750
window_width = 500 window_width = 500
top.title("Advanced Demucs Options") demuc_opt.title("Advanced Demucs Options")
top.resizable(False, False) # This code helps to disable windows from resizing demuc_opt.resizable(False, False) # This code helps to disable windows from resizing
screen_width = top.winfo_screenwidth() screen_width = demuc_opt.winfo_screenwidth()
screen_height = top.winfo_screenheight() screen_height = demuc_opt.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) demuc_opt.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
top.attributes("-topmost", True) #demuc_opt.attributes("-topmost", True)
x = root.winfo_x()
y = root.winfo_y()
demuc_opt.geometry("+%d+%d" %(x+57,y+45))
demuc_opt.wm_transient(root)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') demuc_opt.iconbitmap('img\\UVR-Icon-v2.ico')
def close_win(): def close_win():
top.destroy() demuc_opt.destroy()
self.settings() self.settings()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(demuc_opt)
tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text ='Advanced Settings')
tabControl.pack(expand = 1, fill ="both") tabControl.pack(expand = 1, fill ="both")
tab1.grid_rowconfigure(0, weight=1) tabControl.grid_rowconfigure(0, weight=1)
tab1.grid_columnconfigure(0, weight=1) tabControl.grid_columnconfigure(0, weight=1)
frame0=Frame(tab1, highlightbackground='red',highlightthicknes=0) frame0=Frame(tabControl, highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=30) frame0.grid(row=0,column=0,padx=0,pady=30)
l0=tk.Label(frame0,text="Advanced Demucs Options",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9") l0=tk.Label(frame0,text="Advanced Demucs Options",font=("Century Gothic", "13", "underline"), justify="center", fg="#13a4c9", width=50)
l0.grid(row=0,column=0,padx=0,pady=10) l0.grid(row=0,column=0,padx=0,pady=10)
l0=tk.Label(frame0, text='Chunks (Set Manually)', font=("Century Gothic", "9"), foreground='#13a4c9') 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=1,column=0,padx=0,pady=10) l0.grid(row=1,column=0,padx=0,pady=10)
l0=ttk.Entry(frame0, textvariable=self.chunks_d_var, justify='center') l0=ttk.Entry(frame0, textvariable=self.shifts_b_var, justify='center')
l0.grid(row=2,column=0,padx=0,pady=0) l0.grid(row=2,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Chunk Margin', font=("Century Gothic", "9"), foreground='#13a4c9') l0=tk.Label(frame0, text='Overlap', 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=10)
l0=ttk.Entry(frame0, textvariable=self.margin_var, justify='center') l0=ttk.Entry(frame0, textvariable=self.overlap_b_var, justify='center')
l0.grid(row=4,column=0,padx=0,pady=0) l0.grid(row=4,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources and increase processing times)', font=("Century Gothic", "9"), foreground='#13a4c9') l0=tk.Label(frame0, text='Segment', 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=10)
l0=ttk.Entry(frame0, textvariable=self.shifts_b_var, justify='center') l0=ttk.Entry(frame0, textvariable=self.segment_var, justify='center')
l0.grid(row=6,column=0,padx=0,pady=0) l0.grid(row=6,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9') l0=tk.Label(frame0, text='Chunks (Set Manually)', 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=10)
l0=ttk.Entry(frame0, textvariable=self.overlap_b_var, justify='center') self.chunk_d_entry=ttk.Entry(frame0, textvariable=self.chunks_d_var, justify='center')
l0.grid(row=8,column=0,padx=0,pady=0) self.chunk_d_entry.grid(row=8,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Segment', font=("Century Gothic", "9"), foreground='#13a4c9') l0=tk.Label(frame0, text='Chunk Margin', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=9,column=0,padx=0,pady=10) l0.grid(row=9,column=0,padx=0,pady=10)
l0=ttk.Entry(frame0, textvariable=self.segment_var, justify='center') self.margin_d_entry=ttk.Entry(frame0, textvariable=self.margin_d_var, justify='center')
l0.grid(row=10,column=0,padx=0,pady=0) self.margin_d_entry.grid(row=10,column=0,padx=0,pady=0)
l0=ttk.Checkbutton(frame0, text='Enable Chunks', variable=self.no_chunk_d_var)
l0.grid(row=11,column=0,padx=0,pady=10)
l0=ttk.Checkbutton(frame0, text='Save Stems to Model & Track Name Directory', variable=self.audfile_var) l0=ttk.Checkbutton(frame0, text='Save Stems to Model & Track Name Directory', variable=self.audfile_var)
l0.grid(row=11,column=0,padx=0,pady=5)
l0=ttk.Button(frame0,text='Open Demucs Model Folder', command=self.open_Modelfolder_de)
l0.grid(row=12,column=0,padx=0,pady=0) l0.grid(row=12,column=0,padx=0,pady=0)
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win) l0=ttk.Button(frame0,text='Open Demucs Model Folder', command=self.open_Modelfolder_de)
l0.grid(row=13,column=0,padx=0,pady=10) l0.grid(row=13,column=0,padx=0,pady=10)
l0=ttk.Button(frame0,text='Back to Main Menu', command=close_win)
l0.grid(row=14,column=0,padx=0,pady=0)
def close_win_self(): def close_win_self():
top.destroy() demuc_opt.destroy()
l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
l0.grid(row=14,column=0,padx=0,pady=0) l0.grid(row=15,column=0,padx=0,pady=10)
l0=ttk.Label(frame0,text='\n')
l0.grid(row=16,column=0,padx=0,pady=50)
self.update_states()
def advanced_mdx_options(self): def advanced_mdx_options(self):
""" """
Open Advanced MDX Options Open Advanced MDX Options
""" """
top= Toplevel(self) mdx_net_opt= Toplevel(root)
window_height = 740 window_height = 740
window_width = 550 window_width = 550
top.title("Advanced MDX-Net Options") mdx_net_opt.title("Advanced MDX-Net Options")
top.resizable(False, False) # This code helps to disable windows from resizing mdx_net_opt.resizable(False, False) # This code helps to disable windows from resizing
screen_width = top.winfo_screenwidth() screen_width = mdx_net_opt.winfo_screenwidth()
screen_height = top.winfo_screenheight() screen_height = mdx_net_opt.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) mdx_net_opt.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
top.attributes("-topmost", True) x = root.winfo_x()
y = root.winfo_y()
mdx_net_opt.geometry("+%d+%d" %(x+35,y+45))
mdx_net_opt.wm_transient(root)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') mdx_net_opt.iconbitmap('img\\UVR-Icon-v2.ico')
def close_win(): def close_win():
top.destroy() mdx_net_opt.destroy()
self.settings() self.settings()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(mdx_net_opt)
tab1 = ttk.Frame(tabControl) tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl)
@@ -3501,7 +3603,7 @@ class MainWindow(TkinterDnD.Tk):
l0.grid(row=14,column=0,padx=0,pady=0) l0.grid(row=14,column=0,padx=0,pady=0)
def close_win_self(): def close_win_self():
top.destroy() mdx_net_opt.destroy()
l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
l0.grid(row=15,column=0,padx=0,pady=10) l0.grid(row=15,column=0,padx=0,pady=10)
@@ -3526,21 +3628,30 @@ class MainWindow(TkinterDnD.Tk):
l0=ttk.OptionMenu(frame0, self.mixing_var, None, 'Default', 'Min_Mag', 'Max_Mag', 'Invert_p') l0=ttk.OptionMenu(frame0, self.mixing_var, None, 'Default', 'Min_Mag', 'Max_Mag', 'Invert_p')
l0.grid(row=4,column=0,padx=0,pady=0) l0.grid(row=4,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Shifts\n(Higher values use more resources and increase processing times)', font=("Century Gothic", "9"), foreground='#13a4c9') l0=tk.Label(frame0, text='Segments\n(Higher values use more resources and increase processing times)', 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=10)
l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center') l0=ttk.Entry(frame0, textvariable=self.segment_var, justify='center')
l0.grid(row=6,column=0,padx=0,pady=0) l0.grid(row=6,column=0,padx=0,pady=0)
l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9') 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=7,column=0,padx=0,pady=10) l0.grid(row=7,column=0,padx=0,pady=10)
l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center') l0=ttk.Entry(frame0, textvariable=self.shifts_var, justify='center')
l0.grid(row=8,column=0,padx=0,pady=0) l0.grid(row=8,column=0,padx=0,pady=0)
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var) l0=tk.Label(frame0, text='Overlap', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=9,column=0,padx=0,pady=10) l0.grid(row=9,column=0,padx=0,pady=10)
l0=ttk.Entry(frame0, textvariable=self.overlap_var, justify='center')
l0.grid(row=10,column=0,padx=0,pady=0)
l0=ttk.Checkbutton(frame0, text='Split Mode', variable=self.split_mode_var)
l0.grid(row=11,column=0,padx=0,pady=10)
l0=ttk.Checkbutton(frame0, text='Enable Chunks', variable=self.no_chunk_var)
l0.grid(row=12,column=0,padx=0,pady=0)
self.update_states() self.update_states()
frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0) frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0)
@@ -3589,7 +3700,7 @@ class MainWindow(TkinterDnD.Tk):
def clear_cache(): def clear_cache():
cachedir = "lib_v5/filelists/hashes/mdx_model_cache" cachedir = "lib_v5/filelists/model_cache/mdx_model_cache"
for basename in os.listdir(cachedir): for basename in os.listdir(cachedir):
if basename.endswith('.json'): if basename.endswith('.json'):
@@ -3610,33 +3721,41 @@ class MainWindow(TkinterDnD.Tk):
""" """
Open Ensemble Custom Open Ensemble Custom
""" """
top= Toplevel(self) custom_ens_opt= Toplevel(root)
window_height = 680 window_height = 680
window_width = 900 window_width = 900
top.title("Customize Ensemble") custom_ens_opt.title("Customize Ensemble")
top.resizable(False, False) # This code helps to disable windows from resizing custom_ens_opt.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True) x = root.winfo_x()
y = root.winfo_y()
custom_ens_opt.geometry("+%d+%d" %(x+57,y+100))
custom_ens_opt.wm_transient(root)
screen_width = top.winfo_screenwidth() screen_width = custom_ens_opt.winfo_screenwidth()
screen_height = top.winfo_screenheight() screen_height = custom_ens_opt.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) custom_ens_opt.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
x = root.winfo_x()
y = root.winfo_y()
custom_ens_opt.geometry("+%d+%d" %(x-140,y+70))
custom_ens_opt.wm_transient(root)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') custom_ens_opt.iconbitmap('img\\UVR-Icon-v2.ico')
def close_win(): def close_win():
top.destroy() custom_ens_opt.destroy()
self.settings() self.settings()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(custom_ens_opt)
tab1 = ttk.Frame(tabControl) tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl)
@@ -3791,7 +3910,7 @@ class MainWindow(TkinterDnD.Tk):
l0.grid(row=11,column=2,padx=0,pady=0) l0.grid(row=11,column=2,padx=0,pady=0)
def close_win_self(): def close_win_self():
top.destroy() custom_ens_opt.destroy()
l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
l0.grid(row=13,column=1,padx=20,pady=0) l0.grid(row=13,column=1,padx=20,pady=0)
@@ -3959,7 +4078,7 @@ class MainWindow(TkinterDnD.Tk):
""" """
Open Help Guide Open Help Guide
""" """
top= Toplevel(self) help_guide_opt = Toplevel(self)
if GetSystemMetrics(1) >= 900: if GetSystemMetrics(1) >= 900:
window_height = 810 window_height = 810
window_width = 1080 window_width = 1080
@@ -3969,28 +4088,32 @@ class MainWindow(TkinterDnD.Tk):
else: else:
window_height = 670 window_height = 670
window_width = 930 window_width = 930
top.title("UVR Help Guide") help_guide_opt.title("UVR Help Guide")
top.resizable(False, False) # This code helps to disable windows from resizing help_guide_opt.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True) screen_width = help_guide_opt.winfo_screenwidth()
screen_height = help_guide_opt.winfo_screenheight()
screen_width = top.winfo_screenwidth()
screen_height = top.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) help_guide_opt.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
if GetSystemMetrics(1) >= 900:
x = root.winfo_x()
y = root.winfo_y()
help_guide_opt.geometry("+%d+%d" %(x-220,y+5))
help_guide_opt.wm_transient(root)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') help_guide_opt.iconbitmap('img\\UVR-Icon-v2.ico')
def close_win(): def close_win():
top.destroy() help_guide_opt.destroy()
self.settings() self.settings()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(help_guide_opt)
tab1 = ttk.Frame(tabControl) tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl)
@@ -4289,34 +4412,37 @@ class MainWindow(TkinterDnD.Tk):
update_button_var = tk.StringVar(value='Check for Updates') update_button_var = tk.StringVar(value='Check for Updates')
update_set_var = tk.StringVar(value='UVR Version Current') update_set_var = tk.StringVar(value='UVR Version Current')
top= Toplevel(self) settings_menu = Toplevel(self)
window_height = 780 window_height = 780
window_width = 500 window_width = 500
top.title("Settings Guide") settings_menu.title("Settings Guide")
top.resizable(False, False) # This code helps to disable windows from resizing settings_menu.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True) screen_width = settings_menu.winfo_screenwidth()
screen_height = settings_menu.winfo_screenheight()
screen_width = top.winfo_screenwidth()
screen_height = top.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) settings_menu.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
x = root.winfo_x()
y = root.winfo_y()
settings_menu.geometry("+%d+%d" %(x+57,y+15))
settings_menu.wm_transient(root)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') settings_menu.iconbitmap('img\\UVR-Icon-v2.ico')
def askyesorno(): def askyesorno():
""" """
Ask to Update Ask to Update
""" """
top_dialoge= Toplevel() top_dialoge = Toplevel()
window_height = 250 window_height = 250
window_width = 370 window_width = 370
@@ -4329,7 +4455,7 @@ class MainWindow(TkinterDnD.Tk):
top_dialoge.attributes("-topmost", True) top_dialoge.attributes("-topmost", True)
top.attributes("-topmost", False) settings_menu.attributes("-topmost", False)
screen_width = top_dialoge.winfo_screenwidth() screen_width = top_dialoge.winfo_screenwidth()
screen_height = top_dialoge.winfo_screenheight() screen_height = top_dialoge.winfo_screenheight()
@@ -4350,12 +4476,12 @@ class MainWindow(TkinterDnD.Tk):
tabControl.grid_columnconfigure(0, weight=1) tabControl.grid_columnconfigure(0, weight=1)
def no(): def no():
top.attributes("-topmost", True) settings_menu.attributes("-topmost", True)
top_dialoge.destroy() top_dialoge.destroy()
def yes(): def yes():
download_update() download_update()
top.attributes("-topmost", True) settings_menu.attributes("-topmost", True)
top_dialoge.destroy() top_dialoge.destroy()
frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0)
@@ -4385,7 +4511,7 @@ class MainWindow(TkinterDnD.Tk):
top_code.destroy() top_code.destroy()
except: except:
pass pass
top.destroy() settings_menu.destroy()
def close_win_custom_ensemble(): def close_win_custom_ensemble():
change_event() change_event()
@@ -4415,10 +4541,10 @@ class MainWindow(TkinterDnD.Tk):
change_event() change_event()
def restart(): def restart():
top.destroy() settings_menu.destroy()
self.restart() self.restart()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(settings_menu)
tab1 = ttk.Frame(tabControl) tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl) tab2 = ttk.Frame(tabControl)
@@ -4533,7 +4659,7 @@ class MainWindow(TkinterDnD.Tk):
rlg.start() rlg.start()
def open_bmac_m(): def open_bmac_m():
top.attributes("-topmost", False) settings_menu.attributes("-topmost", False)
callback("https://www.buymeacoffee.com/uvr5") callback("https://www.buymeacoffee.com/uvr5")
l0=ttk.Button(frame0,text=update_button_var.get(), command=start_check_updates) l0=ttk.Button(frame0,text=update_button_var.get(), command=start_check_updates)
@@ -4598,7 +4724,7 @@ class MainWindow(TkinterDnD.Tk):
global top_code global top_code
top_code= Toplevel() top_code = Toplevel(settings_menu)
window_height = 480 window_height = 480
window_width = 320 window_width = 320
@@ -4607,9 +4733,9 @@ class MainWindow(TkinterDnD.Tk):
top_code.resizable(False, False) # This code helps to disable windows from resizing top_code.resizable(False, False) # This code helps to disable windows from resizing
top_code.attributes("-topmost", True) # top_code.attributes("-topmost", True)
top.attributes("-topmost", False) # settings_menu.attributes("-topmost", False)
screen_width = top_code.winfo_screenwidth() screen_width = top_code.winfo_screenwidth()
screen_height = top_code.winfo_screenheight() screen_height = top_code.winfo_screenheight()
@@ -4619,6 +4745,11 @@ class MainWindow(TkinterDnD.Tk):
top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
x = settings_menu.winfo_x()
y = settings_menu.winfo_y()
top_code.geometry("+%d+%d" %(x+90,y+135))
top_code.wm_transient(settings_menu)
# change title bar icon # change title bar icon
top_code.iconbitmap('img\\UVR-Icon-v2.ico') top_code.iconbitmap('img\\UVR-Icon-v2.ico')
@@ -4656,7 +4787,7 @@ class MainWindow(TkinterDnD.Tk):
callback("https://www.buymeacoffee.com/uvr5") callback("https://www.buymeacoffee.com/uvr5")
def quit(): def quit():
top.attributes("-topmost", True) settings_menu.attributes("-topmost", True)
top_code.destroy() top_code.destroy()
l0=tk.Label(frame0, text=f'User Download Codes', font=("Century Gothic", "11", "underline"), foreground='#13a4c9') l0=tk.Label(frame0, text=f'User Download Codes', font=("Century Gothic", "11", "underline"), foreground='#13a4c9')
@@ -4719,10 +4850,6 @@ class MainWindow(TkinterDnD.Tk):
top_code.resizable(False, False) # This code helps to disable windows from resizing 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_width = top_code.winfo_screenwidth()
screen_height = top_code.winfo_screenheight() screen_height = top_code.winfo_screenheight()
@@ -4731,6 +4858,11 @@ class MainWindow(TkinterDnD.Tk):
top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) top_code.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
x = settings_menu.winfo_x()
y = settings_menu.winfo_y()
top_code.geometry("+%d+%d" %(x+43,y+220))
top_code.wm_transient(settings_menu)
# change title bar icon # change title bar icon
top_code.iconbitmap('img\\UVR-Icon-v2.ico') top_code.iconbitmap('img\\UVR-Icon-v2.ico')
@@ -4752,7 +4884,7 @@ class MainWindow(TkinterDnD.Tk):
top_code.destroy() top_code.destroy()
def quit(): def quit():
top.attributes("-topmost", True) settings_menu.attributes("-topmost", True)
top_code.destroy() top_code.destroy()
l0=tk.Label(frame0, text=f'Invalid Download Code', font=("Century Gothic", "11", "underline"), foreground='#13a4c9') l0=tk.Label(frame0, text=f'Invalid Download Code', font=("Century Gothic", "11", "underline"), foreground='#13a4c9')
@@ -5692,7 +5824,7 @@ class MainWindow(TkinterDnD.Tk):
links = lib_v5.filelist.get_download_links(links, downloads='app_patch') links = lib_v5.filelist.get_download_links(links, downloads='app_patch')
url_link = f"{links}{pack_name}.exe" url_link = f"{links}{pack_name}.exe"
#print(url_link) #print(url_link)
top.attributes("-topmost", False) settings_menu.attributes("-topmost", False)
try: try:
if os.path.isfile(f"{cwd_path}/{pack_name}.exe"): if os.path.isfile(f"{cwd_path}/{pack_name}.exe"):
self.download_progress_var.set('File already exists') self.download_progress_var.set('File already exists')
@@ -5814,7 +5946,7 @@ class MainWindow(TkinterDnD.Tk):
wget.download(url_7, download_links_file_temp, bar=download_progress_bar) wget.download(url_7, download_links_file_temp, bar=download_progress_bar)
move_lists_from_temp() move_lists_from_temp()
self.download_progress_bar_var.set('Download list\'s refreshed!') self.download_progress_bar_var.set('Download list\'s refreshed!')
top.destroy() settings_menu.destroy()
self.settings(choose=True) self.settings(choose=True)
except Exception as e: except Exception as e:
short_error = f'{e}' short_error = f'{e}'
@@ -5851,7 +5983,7 @@ class MainWindow(TkinterDnD.Tk):
wget.download(url_7, download_links_file_temp, bar=download_progress_bar) wget.download(url_7, download_links_file_temp, bar=download_progress_bar)
move_lists_from_temp() move_lists_from_temp()
self.download_progress_bar_var.set('VIP: Download list\'s refreshed!') self.download_progress_bar_var.set('VIP: Download list\'s refreshed!')
top.destroy() settings_menu.destroy()
self.settings(choose=True) self.settings(choose=True)
except Exception as e: except Exception as e:
short_error = f'{e}' short_error = f'{e}'
@@ -5892,7 +6024,7 @@ class MainWindow(TkinterDnD.Tk):
wget.download(url_7, download_links_file_temp, bar=download_progress_bar) wget.download(url_7, download_links_file_temp, bar=download_progress_bar)
move_lists_from_temp() move_lists_from_temp()
self.download_progress_bar_var.set('Developer: Download list\'s refreshed!') self.download_progress_bar_var.set('Developer: Download list\'s refreshed!')
top.destroy() settings_menu.destroy()
self.settings(choose=True) self.settings(choose=True)
except Exception as e: except Exception as e:
short_error = f'{e}' short_error = f'{e}'
@@ -5983,7 +6115,7 @@ class MainWindow(TkinterDnD.Tk):
self.download_progress_var.set('') self.download_progress_var.set('')
self.download_stop_var.set(space_small) self.download_stop_var.set(space_small)
top.protocol("WM_DELETE_WINDOW", change_event) settings_menu.protocol("WM_DELETE_WINDOW", change_event)
self.update_states() self.update_states()
@@ -5991,7 +6123,8 @@ class MainWindow(TkinterDnD.Tk):
""" """
Open Error Log Open Error Log
""" """
top= Toplevel(self) error_log_screen= Toplevel(root)
if GetSystemMetrics(1) >= 900: if GetSystemMetrics(1) >= 900:
window_height = 810 window_height = 810
window_width = 1080 window_width = 1080
@@ -6002,31 +6135,42 @@ class MainWindow(TkinterDnD.Tk):
window_height = 670 window_height = 670
window_width = 930 window_width = 930
top.title("UVR Help Guide") error_log_screen.title("UVR Help Guide")
top.resizable(False, False) # This code helps to disable windows from resizing error_log_screen.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True) #error_log_screen.attributes("-topmost", True)
screen_width = top.winfo_screenwidth() screen_width = error_log_screen.winfo_screenwidth()
screen_height = top.winfo_screenheight() screen_height = error_log_screen.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) error_log_screen.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
if GetSystemMetrics(1) >= 900:
x = root.winfo_x()
y = root.winfo_y()
error_log_screen.geometry("+%d+%d" %(x-220,y+5))
error_log_screen.wm_transient(root)
# x = root.winfo_x()
# y = root.winfo_y()
# error_log_screen.geometry("+%d+%d" %(x+43,y+220))
# error_log_screen.wm_transient(root)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') error_log_screen.iconbitmap('img\\UVR-Icon-v2.ico')
def close_win(): def close_win():
top.destroy() error_log_screen.destroy()
self.settings() self.settings()
def close_win_self(): def close_win_self():
top.destroy() error_log_screen.destroy()
tabControl = ttk.Notebook(top) tabControl = ttk.Notebook(error_log_screen)
tab1 = ttk.Frame(tabControl) tab1 = ttk.Frame(tabControl)
@@ -6059,7 +6203,6 @@ class MainWindow(TkinterDnD.Tk):
l0=ttk.Button(frame0,text='Close Window', command=close_win_self) l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
l0.grid(row=6,column=0,padx=20,pady=0) l0.grid(row=6,column=0,padx=20,pady=0)
def copy_clip(self): def copy_clip(self):
copy_t = open("errorlog.txt", "r").read() copy_t = open("errorlog.txt", "r").read()
pyperclip.copy(copy_t) pyperclip.copy(copy_t)
@@ -6157,6 +6300,7 @@ class MainWindow(TkinterDnD.Tk):
'inst_only_b': self.inst_only_b_var.get(), 'inst_only_b': self.inst_only_b_var.get(),
'lastDir': self.lastDir, 'lastDir': self.lastDir,
'margin': self.margin_var.get(), 'margin': self.margin_var.get(),
'margin_d': self.margin_d_var.get(),
'mdx_ensem': self.mdxensemchoose_var.get(), 'mdx_ensem': self.mdxensemchoose_var.get(),
'mdx_ensem_b': self.mdxensemchoose_b_var.get(), 'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(), 'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(),
@@ -6176,6 +6320,8 @@ class MainWindow(TkinterDnD.Tk):
'ModelParams': self.ModelParams_var.get(), 'ModelParams': self.ModelParams_var.get(),
'mp3bit': self.mp3bit_var.get(), 'mp3bit': self.mp3bit_var.get(),
'n_fft_scale': self.n_fft_scale_var.get(), 'n_fft_scale': self.n_fft_scale_var.get(),
'no_chunk': self.no_chunk_var.get(),
'no_chunk_d': self.no_chunk_d_var.get(),
'noise_pro_select': self.noise_pro_select_var.get(), 'noise_pro_select': self.noise_pro_select_var.get(),
'noise_reduc': self.noisereduc_var.get(), 'noise_reduc': self.noisereduc_var.get(),
'noisereduc_s': noisereduc_s, 'noisereduc_s': noisereduc_s,

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -10,11 +10,13 @@ inteprolation between chunks, as well as the "shift trick".
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
import random import random
import typing as tp import typing as tp
from multiprocessing import Process,Queue,Pipe
import torch as th import torch as th
from torch import nn from torch import nn
from torch.nn import functional as F from torch.nn import functional as F
import tqdm import tqdm
import tkinter as tk
from .demucs import Demucs from .demucs import Demucs
from .hdemucs import HDemucs from .hdemucs import HDemucs
@@ -22,6 +24,7 @@ from .utils import center_trim, DummyPoolExecutor
Model = tp.Union[Demucs, HDemucs] Model = tp.Union[Demucs, HDemucs]
progress_bar_num = 0
class BagOfModels(nn.Module): class BagOfModels(nn.Module):
def __init__(self, models: tp.List[Model], def __init__(self, models: tp.List[Model],
@@ -107,7 +110,6 @@ class TensorChunk:
assert out.shape[-1] == target_length assert out.shape[-1] == target_length
return out return out
def tensor_chunk(tensor_or_chunk): def tensor_chunk(tensor_or_chunk):
if isinstance(tensor_or_chunk, TensorChunk): if isinstance(tensor_or_chunk, TensorChunk):
return tensor_or_chunk return tensor_or_chunk
@@ -115,10 +117,9 @@ def tensor_chunk(tensor_or_chunk):
assert isinstance(tensor_or_chunk, th.Tensor) assert isinstance(tensor_or_chunk, th.Tensor)
return TensorChunk(tensor_or_chunk) return TensorChunk(tensor_or_chunk)
def apply_model(model, mix, gui_progress_bar: tk.Variable, widget_text: tk.Text, update_prog, total_files, file_num, inference_type, shifts=1, split=True,
def apply_model(model, mix, shifts=1, split=True, overlap=0.25, transition_power=1., progress=True, device=None,
overlap=0.25, transition_power=1., progress=False, device=None, num_workers=0, pool=None, segmen=False):
num_workers=0, pool=None):
""" """
Apply model to a given mixture. Apply model to a given mixture.
@@ -136,6 +137,12 @@ def apply_model(model, mix, shifts=1, split=True,
When `device` is different from `mix.device`, only local computations will When `device` is different from `mix.device`, only local computations will
be on `device`, while the entire tracks will be stored on `mix.device`. be on `device`, while the entire tracks will be stored on `mix.device`.
""" """
base_text = 'File {file_num}/{total_files} '.format(file_num=file_num,
total_files=total_files)
global fut_length
if device is None: if device is None:
device = mix.device device = mix.device
else: else:
@@ -145,7 +152,12 @@ def apply_model(model, mix, shifts=1, split=True,
pool = ThreadPoolExecutor(num_workers) pool = ThreadPoolExecutor(num_workers)
else: else:
pool = DummyPoolExecutor() pool = DummyPoolExecutor()
kwargs = { kwargs = {
'gui_progress_bar': gui_progress_bar,
'widget_text': widget_text,
'update_prog': update_prog,
'segmen': segmen,
'shifts': shifts, 'shifts': shifts,
'split': split, 'split': split,
'overlap': overlap, 'overlap': overlap,
@@ -153,17 +165,35 @@ def apply_model(model, mix, shifts=1, split=True,
'progress': progress, 'progress': progress,
'device': device, 'device': device,
'pool': pool, 'pool': pool,
'total_files': total_files,
'file_num': file_num,
'inference_type': inference_type
} }
if isinstance(model, BagOfModels): if isinstance(model, BagOfModels):
# Special treatment for bag of model. # Special treatment for bag of model.
# We explicitely apply multiple times `apply_model` so that the random shifts # We explicitely apply multiple times `apply_model` so that the random shifts
# are different for each model. # are different for each model.
global bag_num
global current_model
global progress_bar
global prog_bar
#global percent_prog_del
#percent_prog_del = gui_progress_bar.get()
progress_bar = 0
prog_bar = 0
estimates = 0 estimates = 0
totals = [0] * len(model.sources) totals = [0] * len(model.sources)
bag_num = len(model.models)
fut_length = 0
current_model = 0 #(bag_num + 1)
for sub_model, weight in zip(model.models, model.weights): for sub_model, weight in zip(model.models, model.weights):
original_model_device = next(iter(sub_model.parameters())).device original_model_device = next(iter(sub_model.parameters())).device
sub_model.to(device) sub_model.to(device)
fut_length += fut_length
current_model += 1
out = apply_model(sub_model, mix, **kwargs) out = apply_model(sub_model, mix, **kwargs)
sub_model.to(original_model_device) sub_model.to(original_model_device)
for k, inst_weight in enumerate(weight): for k, inst_weight in enumerate(weight):
@@ -179,6 +209,7 @@ def apply_model(model, mix, shifts=1, split=True,
model.to(device) model.to(device)
assert transition_power >= 1, "transition_power < 1 leads to weird behavior." assert transition_power >= 1, "transition_power < 1 leads to weird behavior."
batch, channels, length = mix.shape batch, channels, length = mix.shape
if split: if split:
kwargs['split'] = False kwargs['split'] = False
out = th.zeros(batch, len(model.sources), channels, length, device=mix.device) out = th.zeros(batch, len(model.sources), channels, length, device=mix.device)
@@ -202,9 +233,26 @@ def apply_model(model, mix, shifts=1, split=True,
future = pool.submit(apply_model, model, chunk, **kwargs) future = pool.submit(apply_model, model, chunk, **kwargs)
futures.append((future, offset)) futures.append((future, offset))
offset += segment offset += segment
if progress:
futures = tqdm.tqdm(futures, unit_scale=scale, ncols=120, unit='seconds')
for future, offset in futures: for future, offset in futures:
if segmen:
fut_length = len(futures)
full_fut_length = (fut_length * bag_num)
send_back = full_fut_length * 2
progress_bar += 100
prog_bar += 1
full_step = (progress_bar / full_fut_length)
percent_prog = f"{base_text}Demucs Inference Progress: {prog_bar}/{full_fut_length} | {round(full_step)}%"
if inference_type == 'demucs_only':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.1 + (1.7/send_back * prog_bar)))
elif inference_type == 'inference_mdx':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.35 + (1.05/send_back * prog_bar)))
elif inference_type == 'inference_vr':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.6 + (0.7/send_back * prog_bar)))
widget_text.percentage(percent_prog)
#gui_progress_bar.set(step)
chunk_out = future.result() chunk_out = future.result()
chunk_length = chunk_out.shape[-1] chunk_length = chunk_out.shape[-1]
out[..., offset:offset + segment] += (weight[:chunk_length] * chunk_out).to(mix.device) out[..., offset:offset + segment] += (weight[:chunk_length] * chunk_out).to(mix.device)

View File

@@ -22,6 +22,7 @@ import socket
import tempfile import tempfile
import warnings import warnings
import zlib import zlib
import tkinter as tk
from diffq import UniformQuantizer, DiffQuantizer from diffq import UniformQuantizer, DiffQuantizer
import torch as th import torch as th
@@ -228,7 +229,7 @@ def tensor_chunk(tensor_or_chunk):
return TensorChunk(tensor_or_chunk) return TensorChunk(tensor_or_chunk)
def apply_model_v1(model, mix, shifts=None, split=False, progress=False): def apply_model_v1(model, mix, gui_progress_bar: tk.Variable, widget_text: tk.Text, update_prog, total_files, file_num, inference_type, shifts=None, split=False, progress=False, segmen=True):
""" """
Apply model to a given mixture. Apply model to a given mixture.
@@ -242,6 +243,10 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
Useful for model with large memory footprint like Tasnet. Useful for model with large memory footprint like Tasnet.
progress (bool): if True, show a progress bar (requires split=True) progress (bool): if True, show a progress bar (requires split=True)
""" """
base_text = 'File {file_num}/{total_files} '.format(file_num=file_num,
total_files=total_files)
channels, length = mix.size() channels, length = mix.size()
device = mix.device device = mix.device
if split: if split:
@@ -249,11 +254,31 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
shift = model.samplerate * 10 shift = model.samplerate * 10
offsets = range(0, length, shift) offsets = range(0, length, shift)
scale = 10 scale = 10
progress_bar = 0
prog_bar = 0
if progress: if progress:
offsets = tqdm.tqdm(offsets, unit_scale=scale, ncols=120, unit='seconds') offsets = tqdm.tqdm(offsets, unit_scale=scale, ncols=120, unit='seconds')
for offset in offsets: for offset in offsets:
if segmen:
fut_length = len(offsets)
send_back = fut_length * 2
progress_bar += 100
prog_bar += 1
if inference_type == 'demucs_only':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.1 + (1.7/send_back * prog_bar)))
elif inference_type == 'inference_mdx':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.35 + (1.05/send_back * prog_bar)))
elif inference_type == 'inference_vr':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.6 + (0.7/send_back * prog_bar)))
step = (progress_bar / fut_length)
percent_prog = f"{base_text}Demucs v1 Inference Progress: {prog_bar}/{fut_length} | {round(step)}%"
widget_text.percentage(percent_prog)
#gui_progress_bar.set(step)
chunk = mix[..., offset:offset + shift] chunk = mix[..., offset:offset + shift]
chunk_out = apply_model_v1(model, chunk, shifts=shifts) chunk_out = apply_model_v1(model, chunk, gui_progress_bar, widget_text, update_prog, total_files, file_num, inference_type, shifts=shifts)
out[..., offset:offset + shift] = chunk_out out[..., offset:offset + shift] = chunk_out
offset += shift offset += shift
return out return out
@@ -265,7 +290,7 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
out = 0 out = 0
for offset in offsets[:shifts]: for offset in offsets[:shifts]:
shifted = mix[..., offset:offset + length + max_shift] shifted = mix[..., offset:offset + length + max_shift]
shifted_out = apply_model_v1(model, shifted) shifted_out = apply_model_v1(model, shifted, gui_progress_bar, widget_text, update_prog, total_files, file_num, inference_type)
out += shifted_out[..., max_shift - offset:max_shift - offset + length] out += shifted_out[..., max_shift - offset:max_shift - offset + length]
out /= shifts out /= shifts
return out return out
@@ -277,8 +302,8 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
out = model(padded.unsqueeze(0))[0] out = model(padded.unsqueeze(0))[0]
return center_trim(out, mix) return center_trim(out, mix)
def apply_model_v2(model, mix, shifts=None, split=False, def apply_model_v2(model, mix, gui_progress_bar: tk.Variable, widget_text: tk.Text, update_prog, total_files, file_num, inference_type, shifts=None, split=False,
overlap=0.25, transition_power=1., progress=False): overlap=0.25, transition_power=1., progress=False, segmen=True):
""" """
Apply model to a given mixture. Apply model to a given mixture.
@@ -292,6 +317,16 @@ def apply_model_v2(model, mix, shifts=None, split=False,
Useful for model with large memory footprint like Tasnet. Useful for model with large memory footprint like Tasnet.
progress (bool): if True, show a progress bar (requires split=True) progress (bool): if True, show a progress bar (requires split=True)
""" """
global prog_space
global percent_prog
percent_prog = 0
base_text = 'File {file_num}/{total_files} '.format(file_num=file_num,
total_files=total_files)
#widget_text.remove(percent_prog)
assert transition_power >= 1, "transition_power < 1 leads to weird behavior." assert transition_power >= 1, "transition_power < 1 leads to weird behavior."
device = mix.device device = mix.device
channels, length = mix.shape channels, length = mix.shape
@@ -313,9 +348,30 @@ def apply_model_v2(model, mix, shifts=None, split=False,
# If the overlap < 50%, this will translate to linear transition when # If the overlap < 50%, this will translate to linear transition when
# transition_power is 1. # transition_power is 1.
weight = (weight / weight.max())**transition_power weight = (weight / weight.max())**transition_power
progress_bar = 0
prog_bar = 0
for offset in offsets: for offset in offsets:
if segmen:
fut_length = len(offsets)
send_back = fut_length * 2
progress_bar += 100
prog_bar += 1
if inference_type == 'demucs_only':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.1 + (1.7/send_back * prog_bar)))
elif inference_type == 'inference_mdx':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.35 + (1.05/send_back * prog_bar)))
elif inference_type == 'inference_vr':
update_prog(gui_progress_bar, total_files, file_num,
step=(0.6 + (0.7/send_back * prog_bar)))
step = (progress_bar / fut_length)
percent_prog = f"{base_text}Demucs v2 Inference Progress: {prog_bar}/{fut_length} | {round(step)}%"
prog_space = len(percent_prog)
prog_space = prog_bar*prog_space
widget_text.percentage(percent_prog)
chunk = TensorChunk(mix, offset, segment) chunk = TensorChunk(mix, offset, segment)
chunk_out = apply_model_v2(model, chunk, shifts=shifts) chunk_out = apply_model_v2(model, chunk, gui_progress_bar, widget_text, update_prog, total_files, file_num, inference_type, shifts=shifts)
chunk_length = chunk_out.shape[-1] chunk_length = chunk_out.shape[-1]
out[..., offset:offset + segment] += weight[:chunk_length] * chunk_out out[..., offset:offset + segment] += weight[:chunk_length] * chunk_out
sum_weight[offset:offset + segment] += weight[:chunk_length] sum_weight[offset:offset + segment] += weight[:chunk_length]
@@ -331,7 +387,7 @@ def apply_model_v2(model, mix, shifts=None, split=False,
for _ in range(shifts): for _ in range(shifts):
offset = random.randint(0, max_shift) offset = random.randint(0, max_shift)
shifted = TensorChunk(padded_mix, offset, length + max_shift - offset) shifted = TensorChunk(padded_mix, offset, length + max_shift - offset)
shifted_out = apply_model_v2(model, shifted) shifted_out = apply_model_v2(model, shifted, gui_progress_bar, widget_text, update_prog, total_files, file_num, inference_type)
out += shifted_out[..., max_shift - offset:] out += shifted_out[..., max_shift - offset:]
out /= shifts out /= shifts
return out return out

View File

@@ -35,6 +35,7 @@ import pydub
import shutil import shutil
import soundfile as sf import soundfile as sf
import subprocess import subprocess
from UVR import MainWindow
import sys import sys
import time import time
import time # Timer import time # Timer
@@ -61,45 +62,50 @@ class Predictor():
self.noise_pro_select_set_var = tk.StringVar(value='MDX-NET_Noise_Profile_14_kHz') self.noise_pro_select_set_var = tk.StringVar(value='MDX-NET_Noise_Profile_14_kHz')
self.compensate_v_var = tk.StringVar(value=1.03597672895) self.compensate_v_var = tk.StringVar(value=1.03597672895)
top= Toplevel() mdx_model_set = Toplevel()
top.geometry("740x550") mdx_model_set.geometry("490x515")
window_height = 740 window_height = 490
window_width = 550 window_width = 515
top.title("Specify Parameters") mdx_model_set.title("Specify Parameters")
top.resizable(False, False) # This code helps to disable windows from resizing mdx_model_set.resizable(False, False) # This code helps to disable windows from resizing
top.attributes("-topmost", True) mdx_model_set.attributes("-topmost", True)
screen_width = top.winfo_screenwidth() screen_width = mdx_model_set.winfo_screenwidth()
screen_height = top.winfo_screenheight() screen_height = mdx_model_set.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2)) x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2)) y_cordinate = int((screen_height/2) - (window_height/2))
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate)) mdx_model_set.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
x = main_window.winfo_x()
y = main_window.winfo_y()
mdx_model_set.geometry("+%d+%d" %(x+50,y+150))
mdx_model_set.wm_transient(main_window)
# change title bar icon # change title bar icon
top.iconbitmap('img\\UVR-Icon-v2.ico') mdx_model_set.iconbitmap('img\\UVR-Icon-v2.ico')
tabControl = ttk.Notebook(top) mdx_model_set_window = ttk.Notebook(mdx_model_set)
tabControl.pack(expand = 1, fill ="both") mdx_model_set_window.pack(expand = 1, fill ="both")
tabControl.grid_rowconfigure(0, weight=1) mdx_model_set_window.grid_rowconfigure(0, weight=1)
tabControl.grid_columnconfigure(0, weight=1) mdx_model_set_window.grid_columnconfigure(0, weight=1)
frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0) frame0=Frame(mdx_model_set_window,highlightbackground='red',highlightthicknes=0)
frame0.grid(row=0,column=0,padx=0,pady=0) frame0.grid(row=0,column=0,padx=0,pady=0)
frame0.tkraise(frame0) #frame0.tkraise(frame0)
space_small = ' '*20 space_small = ' '*20
space_small_1 = ' '*10 space_small_1 = ' '*10
l0=tk.Label(frame0, text=f'{space_small}Stem Type{space_small}', font=("Century Gothic", "9"), foreground='#13a4c9') l0=tk.Label(frame0, text=f'\n{space_small}Stem Type{space_small}', font=("Century Gothic", "9"), foreground='#13a4c9')
l0.grid(row=3,column=0,padx=0,pady=5) l0.grid(row=3,column=0,padx=0,pady=5)
l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals', 'Instrumental', 'Other', 'Bass', 'Drums') l0=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals', 'Instrumental', 'Other', 'Bass', 'Drums')
@@ -160,18 +166,15 @@ class Predictor():
torch.cuda.empty_cache() torch.cuda.empty_cache()
gui_progress_bar.set(0) gui_progress_bar.set(0)
widget_button.configure(state=tk.NORMAL) # Enable Button widget_button.configure(state=tk.NORMAL) # Enable Button
top.destroy() self.okVar.set(1)
stop_button()
mdx_model_set.destroy()
return return
l0=ttk.Button(frame0,text="Stop Process", command=stop) l0=ttk.Button(frame0,text="Stop Process", command=stop)
l0.grid(row=13,column=1,padx=0,pady=30) l0.grid(row=13,column=1,padx=0,pady=30)
def change_event(): mdx_model_set.protocol("WM_DELETE_WINDOW", stop)
self.okVar.set(1)
#top.destroy()
pass
top.protocol("WM_DELETE_WINDOW", change_event)
frame0.wait_variable(self.okVar) frame0.wait_variable(self.okVar)
@@ -217,13 +220,13 @@ class Predictor():
stem_text_b = 'Vocals' stem_text_b = 'Vocals'
elif stemset_n == '(Other)': elif stemset_n == '(Other)':
stem_text_a = 'Other' stem_text_a = 'Other'
stem_text_b = 'the no \"Other\" track' stem_text_b = 'mixture without selected stem'
elif stemset_n == '(Drums)': elif stemset_n == '(Drums)':
stem_text_a = 'Drums' stem_text_a = 'Drums'
stem_text_b = 'no \"Drums\" track' stem_text_b = 'mixture without selected stem'
elif stemset_n == '(Bass)': elif stemset_n == '(Bass)':
stem_text_a = 'Bass' stem_text_a = 'Bass'
stem_text_b = 'No \"Bass\" track' stem_text_b = 'mixture without selected stem'
else: else:
stem_text_a = 'Vocals' stem_text_a = 'Vocals'
stem_text_b = 'Instrumental' stem_text_b = 'Instrumental'
@@ -263,7 +266,7 @@ class Predictor():
widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n') widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n')
demucs_model_set = 'UVR_Demucs_Model_1' demucs_model_set = 'UVR_Demucs_Model_1'
top.destroy() mdx_model_set.destroy()
def prediction_setup(self): def prediction_setup(self):
@@ -287,6 +290,10 @@ class Predictor():
self.demucs.to(device) self.demucs.to(device)
self.demucs.load_state_dict(state) self.demucs.load_state_dict(state)
widget_text.write('Done!\n') widget_text.write('Done!\n')
if not data['segment'] == 'Default':
widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n')
else:
pass
if demucs_model_version == 'v2': if demucs_model_version == 'v2':
if '48' in demucs_model_set: if '48' in demucs_model_set:
@@ -306,6 +313,10 @@ class Predictor():
self.demucs.to(device) self.demucs.to(device)
self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set}")) self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set}"))
widget_text.write('Done!\n') widget_text.write('Done!\n')
if not data['segment'] == 'Default':
widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n')
else:
pass
self.demucs.eval() self.demucs.eval()
if demucs_model_version == 'v3': if demucs_model_version == 'v3':
@@ -324,6 +335,37 @@ class Predictor():
widget_text.write('Done!\n') widget_text.write('Done!\n')
if isinstance(self.demucs, BagOfModels): 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") widget_text.write(base_text + f"Selected Demucs model is a bag of {len(self.demucs.models)} model(s).\n")
if data['segment'] == 'Default':
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
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
if split_mode:
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.onnx_models = {} self.onnx_models = {}
c = 0 c = 0
@@ -394,13 +436,13 @@ class Predictor():
if data['modelFolder']: if data['modelFolder']:
vocal_path = '{save_path}/{file_name}.wav'.format( vocal_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocal_name}_{model_set_name}',) file_name = f'{os.path.basename(_basename)}_{vocal_name}_{mdx_model_name}',)
vocal_path_mp3 = '{save_path}/{file_name}.mp3'.format( vocal_path_mp3 = '{save_path}/{file_name}.mp3'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocal_name}_{model_set_name}',) file_name = f'{os.path.basename(_basename)}_{vocal_name}_{mdx_model_name}',)
vocal_path_flac = '{save_path}/{file_name}.flac'.format( vocal_path_flac = '{save_path}/{file_name}.flac'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocal_name}_{model_set_name}',) file_name = f'{os.path.basename(_basename)}_{vocal_name}_{mdx_model_name}',)
else: else:
vocal_path = '{save_path}/{file_name}.wav'.format( vocal_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
@@ -428,13 +470,13 @@ class Predictor():
if data['modelFolder']: if data['modelFolder']:
Instrumental_path = '{save_path}/{file_name}.wav'.format( Instrumental_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{model_set_name}',) file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{mdx_model_name}',)
Instrumental_path_mp3 = '{save_path}/{file_name}.mp3'.format( Instrumental_path_mp3 = '{save_path}/{file_name}.mp3'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{model_set_name}',) file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{mdx_model_name}',)
Instrumental_path_flac = '{save_path}/{file_name}.flac'.format( Instrumental_path_flac = '{save_path}/{file_name}.flac'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{model_set_name}',) file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{mdx_model_name}',)
else: else:
Instrumental_path = '{save_path}/{file_name}.wav'.format( Instrumental_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
@@ -461,13 +503,13 @@ class Predictor():
if data['modelFolder']: if data['modelFolder']:
non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format( non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocal_name}_{model_set_name}_No_Reduction',) file_name = f'{os.path.basename(_basename)}_{vocal_name}_{mdx_model_name}_No_Reduction',)
non_reduced_vocal_path_mp3 = '{save_path}/{file_name}.mp3'.format( non_reduced_vocal_path_mp3 = '{save_path}/{file_name}.mp3'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocal_name}_{model_set_name}_No_Reduction',) file_name = f'{os.path.basename(_basename)}_{vocal_name}_{mdx_model_name}_No_Reduction',)
non_reduced_vocal_path_flac = '{save_path}/{file_name}.flac'.format( non_reduced_vocal_path_flac = '{save_path}/{file_name}.flac'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocal_name}_{model_set_name}_No_Reduction',) file_name = f'{os.path.basename(_basename)}_{vocal_name}_{mdx_model_name}_No_Reduction',)
else: else:
non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format( non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
@@ -482,13 +524,13 @@ class Predictor():
if data['modelFolder']: if data['modelFolder']:
non_reduced_Instrumental_path = '{save_path}/{file_name}.wav'.format( non_reduced_Instrumental_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{model_set_name}_No_Reduction',) file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{mdx_model_name}_No_Reduction',)
non_reduced_Instrumental_path_mp3 = '{save_path}/{file_name}.mp3'.format( non_reduced_Instrumental_path_mp3 = '{save_path}/{file_name}.mp3'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{model_set_name}_No_Reduction',) file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{mdx_model_name}_No_Reduction',)
non_reduced_Instrumental_path_flac = '{save_path}/{file_name}.flac'.format( non_reduced_Instrumental_path_flac = '{save_path}/{file_name}.flac'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{model_set_name}_No_Reduction',) file_name = f'{os.path.basename(_basename)}_{Instrumental_name}_{mdx_model_name}_No_Reduction',)
else: else:
non_reduced_Instrumental_path = '{save_path}/{file_name}.wav'.format( non_reduced_Instrumental_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
@@ -918,19 +960,21 @@ class Predictor():
widget_text.write(base_text + 'Completed Separation!\n') widget_text.write(base_text + 'Completed Separation!\n')
def demix(self, mix): def demix(self, mix):
global chunk_set
# 1 = demucs only # 1 = demucs only
# 0 = onnx only # 0 = onnx only
if data['chunks'] == 'Full': if data['chunks'] == 'Full':
chunk_set = 0 chunk_set = 0
else: widget_text.write(base_text + "Chunk size user-set to \"Full\"... \n")
chunk_set = data['chunks'] elif data['chunks'] == 'Auto':
if data['chunks'] == 'Auto':
if data['gpu'] == 0: if data['gpu'] == 0:
try: try:
gpu_mem = round(torch.cuda.get_device_properties(0).total_memory/1.074e+9) gpu_mem = round(torch.cuda.get_device_properties(0).total_memory/1.074e+9)
except: except:
widget_text.write(base_text + 'NVIDIA GPU Required for conversion!\n') widget_text.write(base_text + 'NVIDIA GPU Required for conversion!\n')
data['gpu'] = -1
pass
if int(gpu_mem) <= int(6): if int(gpu_mem) <= int(6):
chunk_set = int(5) chunk_set = int(5)
widget_text.write(base_text + 'Chunk size auto-set to 5... \n') widget_text.write(base_text + 'Chunk size auto-set to 5... \n')
@@ -954,9 +998,9 @@ class Predictor():
if int(sys_mem) >= int(17): if int(sys_mem) >= int(17):
chunk_set = int(60) chunk_set = int(60)
widget_text.write(base_text + 'Chunk size auto-set to 60... \n') widget_text.write(base_text + 'Chunk size auto-set to 60... \n')
elif data['chunks'] == 'Full': elif data['chunks'] == '0':
chunk_set = 0 chunk_set = 0
widget_text.write(base_text + "Chunk size set to full... \n") widget_text.write(base_text + "Chunk size user-set to \"Full\"... \n")
else: else:
chunk_set = int(data['chunks']) chunk_set = int(data['chunks'])
widget_text.write(base_text + "Chunk size user-set to "f"{chunk_set}... \n") widget_text.write(base_text + "Chunk size user-set to "f"{chunk_set}... \n")
@@ -986,29 +1030,33 @@ class Predictor():
segmented_mix[skip] = mix[:,start:end].copy() segmented_mix[skip] = mix[:,start:end].copy()
if end == samples: if end == samples:
break break
if not data['demucsmodel']: if not data['demucsmodel']:
sources = self.demix_base(segmented_mix, margin_size=margin) sources = self.demix_base(segmented_mix, margin_size=margin)
elif data['demucs_only']: elif data['demucs_only']:
if split_mode == True: if no_chunk_demucs == False:
sources = self.demix_demucs_split(mix) sources = self.demix_demucs_split(mix)
if split_mode == False: if no_chunk_demucs == True:
sources = self.demix_demucs(segmented_mix, margin_size=margin) sources = self.demix_demucs(segmented_mix, margin_size=margin)
else: # both, apply spec effects else: # both, apply spec effects
base_out = self.demix_base(segmented_mix, margin_size=margin) base_out = self.demix_base(segmented_mix, margin_size=margin)
#print(split_mode)
if demucs_model_version == 'v1': if demucs_model_version == 'v1':
demucs_out = self.demix_demucs_v1(segmented_mix, margin_size=margin) if no_chunk_demucs == False:
demucs_out = self.demix_demucs_v1_split(mix)
if no_chunk_demucs == True:
demucs_out = self.demix_demucs_v1(segmented_mix, margin_size=margin)
if demucs_model_version == 'v2': if demucs_model_version == 'v2':
demucs_out = self.demix_demucs_v2(segmented_mix, margin_size=margin) if no_chunk_demucs == False:
demucs_out = self.demix_demucs_v2_split(mix)
if no_chunk_demucs == True:
demucs_out = self.demix_demucs_v2(segmented_mix, margin_size=margin)
if demucs_model_version == 'v3': if demucs_model_version == 'v3':
if split_mode == True: if no_chunk_demucs == False:
demucs_out = self.demix_demucs_split(mix) demucs_out = self.demix_demucs_split(mix)
if split_mode == False: if no_chunk_demucs == True:
demucs_out = self.demix_demucs(segmented_mix, margin_size=margin) 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)) nan_count = np.count_nonzero(np.isnan(demucs_out)) + np.count_nonzero(np.isnan(base_out))
if nan_count > 0: if nan_count > 0:
print('Warning: there are {} nan values in the array(s).'.format(nan_count)) print('Warning: there are {} nan values in the array(s).'.format(nan_count))
@@ -1040,10 +1088,15 @@ class Predictor():
onnxitera = len(mixes) onnxitera = len(mixes)
onnxitera_calc = onnxitera * 2 onnxitera_calc = onnxitera * 2
gui_progress_bar_onnx = 0 gui_progress_bar_onnx = 0
widget_text.write(base_text + "Running ONNX Inference...\n") progress_bar = 0
widget_text.write(base_text + "Processing "f"{onnxitera} slices... ")
print(' Running ONNX Inference...') print(' Running ONNX Inference...')
if onnxitera == 1:
widget_text.write(base_text + f"Running ONNX Inference... ")
else:
widget_text.write(base_text + f"Running ONNX Inference...{space}\n")
for mix in mixes: for mix in mixes:
gui_progress_bar_onnx += 1 gui_progress_bar_onnx += 1
if data['demucsmodel']: if data['demucsmodel']:
@@ -1053,6 +1106,15 @@ class Predictor():
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.1 + (0.9/onnxitera * gui_progress_bar_onnx))) step=(0.1 + (0.9/onnxitera * gui_progress_bar_onnx)))
progress_bar += 100
step = (progress_bar / onnxitera)
if onnxitera == 1:
pass
else:
percent_prog = f"{base_text}MDX-Net Inference Progress: {gui_progress_bar_onnx}/{onnxitera} | {round(step)}%"
widget_text.percentage(percent_prog)
cmix = mixes[mix] cmix = mixes[mix]
sources = [] sources = []
n_sample = cmix.shape[1] n_sample = cmix.shape[1]
@@ -1088,21 +1150,35 @@ class Predictor():
chunked_sources.append(sources) chunked_sources.append(sources)
_sources = np.concatenate(chunked_sources, axis=-1) _sources = np.concatenate(chunked_sources, axis=-1)
del self.onnx_models del self.onnx_models
widget_text.write('Done!\n')
if onnxitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
return _sources return _sources
def demix_demucs(self, mix, margin_size): def demix_demucs(self, mix, margin_size):
#print('shift_set ', shift_set)
processed = {} processed = {}
demucsitera = len(mix) demucsitera = len(mix)
demucsitera_calc = demucsitera * 2 demucsitera_calc = demucsitera * 2
gui_progress_bar_demucs = 0 gui_progress_bar_demucs = 0
widget_text.write(base_text + "Split Mode is off. (Chunks enabled for Demucs Model)\n") progress_bar = 0
widget_text.write(base_text + "Running Demucs Inference...\n") if demucsitera == 1:
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") widget_text.write(base_text + f"Running Demucs Inference... ")
else:
widget_text.write(base_text + f"Running Demucs Inference...{space}\n")
print(' Running Demucs Inference...') print(' Running Demucs Inference...')
for nmix in mix: for nmix in mix:
gui_progress_bar_demucs += 1 gui_progress_bar_demucs += 1
progress_bar += 100
step = (progress_bar / demucsitera)
if demucsitera == 1:
pass
else:
percent_prog = f"{base_text}Demucs Inference Progress: {gui_progress_bar_demucs}/{demucsitera} | {round(step)}%"
widget_text.percentage(percent_prog)
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs)))
cmix = mix[nmix] cmix = mix[nmix]
@@ -1110,8 +1186,17 @@ class Predictor():
ref = cmix.mean(0) ref = cmix.mean(0)
cmix = (cmix - ref.mean()) / ref.std() cmix = (cmix - ref.mean()) / ref.std()
with torch.no_grad(): with torch.no_grad():
#print(split_mode) sources = apply_model(self.demucs, cmix[None],
sources = apply_model(self.demucs, cmix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=False)[0] gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
device=device,
overlap=overlap_set,
shifts=shift_set,
progress=False,
segmen=False,
**progress_demucs_kwargs)[0]
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -1123,17 +1208,21 @@ class Predictor():
sources = list(processed.values()) sources = list(processed.values())
sources = np.concatenate(sources, axis=-1) sources = np.concatenate(sources, axis=-1)
widget_text.write('Done!\n')
if demucsitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
#print('the demucs model is done running') #print('the demucs model is done running')
return sources return sources
def demix_demucs_split(self, mix): def demix_demucs_split(self, mix):
#print('shift_set ', shift_set) if split_mode:
widget_text.write(base_text + "Split Mode is on. (Chunks disabled for Demucs Model)\n") widget_text.write(base_text + f"Running Demucs Inference...{space}\n")
widget_text.write(base_text + "Running Demucs Inference...\n") else:
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") widget_text.write(base_text + f"Running Demucs Inference... ")
print(' Running Demucs Inference...') print(' Running Demucs Inference...')
mix = torch.tensor(mix, dtype=torch.float32) mix = torch.tensor(mix, dtype=torch.float32)
@@ -1141,14 +1230,26 @@ class Predictor():
mix = (mix - ref.mean()) / ref.std() mix = (mix - ref.mean()) / ref.std()
with torch.no_grad(): with torch.no_grad():
sources = apply_model(self.demucs, mix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=False)[0] sources = apply_model(self.demucs,
mix[None],
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
device=device,
overlap=overlap_set,
shifts=shift_set,
progress=False,
segmen=True,
**progress_demucs_kwargs)[0]
widget_text.write('Done!\n') if split_mode:
widget_text.write('\n')
else:
widget_text.write('Done!\n')
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
#print('the demucs model is done running')
return sources return sources
@@ -1157,11 +1258,21 @@ class Predictor():
demucsitera = len(mix) demucsitera = len(mix)
demucsitera_calc = demucsitera * 2 demucsitera_calc = demucsitera * 2
gui_progress_bar_demucs = 0 gui_progress_bar_demucs = 0
widget_text.write(base_text + "Running Demucs v1 Inference...\n") progress_bar = 0
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
print(' Running Demucs Inference...') print(' Running Demucs Inference...')
if demucsitera == 1:
widget_text.write(base_text + f"Running Demucs v1 Inference... ")
else:
widget_text.write(base_text + f"Running Demucs v1 Inference...{space}\n")
for nmix in mix: for nmix in mix:
gui_progress_bar_demucs += 1 gui_progress_bar_demucs += 1
progress_bar += 100
step = (progress_bar / demucsitera)
if demucsitera == 1:
pass
else:
percent_prog = f"{base_text}Demucs v1 Inference Progress: {gui_progress_bar_demucs}/{demucsitera} | {round(step)}%"
widget_text.percentage(percent_prog)
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs)))
cmix = mix[nmix] cmix = mix[nmix]
@@ -1169,7 +1280,15 @@ class Predictor():
ref = cmix.mean(0) ref = cmix.mean(0)
cmix = (cmix - ref.mean()) / ref.std() cmix = (cmix - ref.mean()) / ref.std()
with torch.no_grad(): with torch.no_grad():
sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set) sources = apply_model_v1(self.demucs,
cmix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=False,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -1181,7 +1300,44 @@ class Predictor():
sources = list(processed.values()) sources = list(processed.values())
sources = np.concatenate(sources, axis=-1) sources = np.concatenate(sources, axis=-1)
widget_text.write('Done!\n')
if demucsitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
return sources
def demix_demucs_v1_split(self, mix):
print(' Running Demucs Inference...')
if split_mode:
widget_text.write(base_text + f"Running Demucs v1 Inference...{space}\n")
else:
widget_text.write(base_text + f"Running Demucs v1 Inference... ")
mix = torch.tensor(mix, dtype=torch.float32)
ref = mix.mean(0)
mix = (mix - ref.mean()) / ref.std()
with torch.no_grad():
sources = apply_model_v1(self.demucs,
mix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=True,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]]
if split_mode:
widget_text.write('\n')
else:
widget_text.write('Done!\n')
return sources return sources
def demix_demucs_v2(self, mix, margin_size): def demix_demucs_v2(self, mix, margin_size):
@@ -1189,11 +1345,22 @@ class Predictor():
demucsitera = len(mix) demucsitera = len(mix)
demucsitera_calc = demucsitera * 2 demucsitera_calc = demucsitera * 2
gui_progress_bar_demucs = 0 gui_progress_bar_demucs = 0
widget_text.write(base_text + "Running Demucs v2 Inference...\n") progress_bar = 0
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") if demucsitera == 1:
print(' Running Demucs Inference...') widget_text.write(base_text + f"Running Demucs v2 Inference... ")
else:
widget_text.write(base_text + f"Running Demucs v2 Inference...{space}\n")
for nmix in mix: for nmix in mix:
gui_progress_bar_demucs += 1 gui_progress_bar_demucs += 1
progress_bar += 100
step = (progress_bar / demucsitera)
if demucsitera == 1:
pass
else:
percent_prog = f"{base_text}Demucs v2 Inference Progress: {gui_progress_bar_demucs}/{demucsitera} | {round(step)}%"
widget_text.percentage(percent_prog)
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs)))
cmix = mix[nmix] cmix = mix[nmix]
@@ -1201,7 +1368,16 @@ class Predictor():
ref = cmix.mean(0) ref = cmix.mean(0)
cmix = (cmix - ref.mean()) / ref.std() cmix = (cmix - ref.mean()) / ref.std()
with torch.no_grad(): with torch.no_grad():
sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set) sources = apply_model_v2(self.demucs,
cmix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=False,
overlap=overlap_set,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -1213,9 +1389,46 @@ class Predictor():
sources = list(processed.values()) sources = list(processed.values())
sources = np.concatenate(sources, axis=-1) sources = np.concatenate(sources, axis=-1)
widget_text.write('Done!\n')
if demucsitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
return sources return sources
def demix_demucs_v2_split(self, mix):
print(' Running Demucs Inference...')
if split_mode:
widget_text.write(base_text + f"Running Demucs v2 Inference...{space}\n")
else:
widget_text.write(base_text + f"Running Demucs v2 Inference... ")
mix = torch.tensor(mix, dtype=torch.float32)
ref = mix.mean(0)
mix = (mix - ref.mean()) / ref.std()
with torch.no_grad():
sources = apply_model_v2(self.demucs,
mix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=True,
overlap=overlap_set,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]]
if split_mode:
widget_text.write('\n')
else:
widget_text.write('Done!\n')
return sources
data = { data = {
@@ -1240,6 +1453,7 @@ data = {
'modelFolder': False, 'modelFolder': False,
'mp3bit': '320k', 'mp3bit': '320k',
'n_fft_scale': 6144, 'n_fft_scale': 6144,
'no_chunk': False,
'noise_pro_select': 'Auto Select', 'noise_pro_select': 'Auto Select',
'noisereduc_s': 3, 'noisereduc_s': 3,
'non_red': False, 'non_red': False,
@@ -1247,6 +1461,7 @@ data = {
'normalize': False, 'normalize': False,
'overlap': 0.5, 'overlap': 0.5,
'saveFormat': 'Wav', 'saveFormat': 'Wav',
'segment': 'Default',
'shifts': 0, 'shifts': 0,
'split_mode': False, 'split_mode': False,
'voc_only': False, 'voc_only': False,
@@ -1286,6 +1501,7 @@ def main(window: tk.Wm,
text_widget: tk.Text, text_widget: tk.Text,
button_widget: tk.Button, button_widget: tk.Button,
progress_var: tk.Variable, progress_var: tk.Variable,
stop_thread,
**kwargs: dict): **kwargs: dict):
global widget_text global widget_text
@@ -1299,8 +1515,10 @@ def main(window: tk.Wm,
global n_fft_scale_set global n_fft_scale_set
global dim_f_set global dim_f_set
global progress_kwargs global progress_kwargs
global progress_demucs_kwargs
global base_text global base_text
global model_set_name global model_set_name
global mdx_model_name
global stemset_n global stemset_n
global stem_text_a global stem_text_a
global stem_text_b global stem_text_b
@@ -1325,17 +1543,20 @@ def main(window: tk.Wm,
global stime global stime
global model_hash global model_hash
global demucs_switch global demucs_switch
global no_chunk_demucs
global inst_only global inst_only
global voc_only global voc_only
global space
global main_window
global stop_button
stop_button = stop_thread
# Update default settings
default_chunks = data['chunks']
default_noisereduc_s = data['noisereduc_s']
widget_text = text_widget widget_text = text_widget
gui_progress_bar = progress_var gui_progress_bar = progress_var
widget_button = button_widget widget_button = button_widget
main_window = window
#Error Handling #Error Handling
@@ -1361,6 +1582,15 @@ def main(window: tk.Wm,
data.update(kwargs) data.update(kwargs)
global update_prog
# Update default settings
update_prog = update_progress
default_chunks = data['chunks']
default_noisereduc_s = data['noisereduc_s']
no_chunk_demucs = data['no_chunk']
space = ' '*90
if data['DemucsModel_MDX'] == "Tasnet v1": if data['DemucsModel_MDX'] == "Tasnet v1":
demucs_model_set_name = 'tasnet.th' demucs_model_set_name = 'tasnet.th'
demucs_model_version = 'v1' demucs_model_version = 'v1'
@@ -1436,6 +1666,10 @@ def main(window: tk.Wm,
mdx_model_name = 'UVR_MDXNET_KARA' mdx_model_name = 'UVR_MDXNET_KARA'
elif model_set_name == 'UVR-MDX-NET Main': elif model_set_name == 'UVR-MDX-NET Main':
mdx_model_name = 'UVR_MDXNET_Main' mdx_model_name = 'UVR_MDXNET_Main'
elif model_set_name == 'UVR-MDX-NET Inst 1':
mdx_model_name = 'UVR_MDXNET_Inst_1'
elif model_set_name == 'UVR-MDX-NET Inst 2':
mdx_model_name = 'UVR_MDXNET_Inst_2'
else: else:
mdx_model_name = data['mdxnetModel'] mdx_model_name = data['mdxnetModel']
@@ -1583,12 +1817,18 @@ def main(window: tk.Wm,
_basename = f'{data["export_path"]}/{str(randomnum)}_{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}' _basename = f'{data["export_path"]}/{str(randomnum)}_{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}'
else: else:
_basename = f'{data["export_path"]}/{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}' _basename = f'{data["export_path"]}/{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}'
inference_type = 'inference_mdx'
# -Get text and update progress- # -Get text and update progress-
base_text = get_baseText(total_files=len(data['input_paths']), base_text = get_baseText(total_files=len(data['input_paths']),
file_num=file_num) file_num=file_num)
progress_kwargs = {'progress_var': progress_var, progress_kwargs = {'progress_var': progress_var,
'total_files': len(data['input_paths']), 'total_files': len(data['input_paths']),
'file_num': file_num} 'file_num': file_num}
progress_demucs_kwargs = {'total_files': len(data['input_paths']),
'file_num': file_num, 'inference_type': inference_type}
if 'UVR' in demucs_model_set: if 'UVR' in demucs_model_set:
@@ -1603,10 +1843,11 @@ def main(window: tk.Wm,
if stemset_n == '(Instrumental)': if stemset_n == '(Instrumental)':
if not 'UVR' in demucs_model_set: if not 'UVR' in demucs_model_set:
widget_text.write(base_text + 'The selected Demucs model cannot be used with this model.\n') if data['demucsmodel']:
widget_text.write(base_text + 'Only 2 stem Demucs models are compatible with this model.\n') widget_text.write(base_text + 'The selected Demucs model cannot be used with this model.\n')
widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n') widget_text.write(base_text + 'Only 2 stem Demucs models are compatible with this model.\n')
demucs_model_set = 'UVR_Demucs_Model_1' widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n')
demucs_model_set = 'UVR_Demucs_Model_1'
try: try:
if float(data['noisereduc_s']) >= 11: if float(data['noisereduc_s']) >= 11:
@@ -1904,7 +2145,7 @@ def main(window: tk.Wm,
text_widget.write(f'\nError Received:\n\n') text_widget.write(f'\nError Received:\n\n')
text_widget.write(f'Could not write audio file.\n') text_widget.write(f'Could not write audio file.\n')
text_widget.write(f'This could be due to low storage on target device or a system permissions issue.\n') text_widget.write(f'This could be due to low storage on target device or a system permissions issue.\n')
text_widget.write(f"\nFor raw error details, go to the Error Log tab in the Help Guide.\n") text_widget.write(f"\nGo to the Settings Menu and click \"Open Error Log\" for raw error details.\n")
text_widget.write(f'\nIf the error persists, please contact the developers.\n\n') text_widget.write(f'\nIf the error persists, please contact the developers.\n\n')
text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
try: try:
@@ -2013,7 +2254,7 @@ def main(window: tk.Wm,
text_widget.write("\n" + base_text + f'Separation failed for the following audio file:\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(base_text + f'"{os.path.basename(music_file)}"\n')
text_widget.write(f'\nError Received:\n') text_widget.write(f'\nError Received:\n')
text_widget.write("\nFor raw error details, go to the Error Log tab in the Help Guide.\n") text_widget.write("\nGo to the Settings Menu and click \"Open Error Log\" for raw error details.\n")
text_widget.write("\n" + f'Please address the error and try again.' + "\n") text_widget.write("\n" + f'Please address the error and try again.' + "\n")
text_widget.write(f'If this error persists, please contact the developers with the error details.\n\n') text_widget.write(f'If this error persists, please contact the developers with the error details.\n\n')
text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')

View File

@@ -6,6 +6,7 @@ from demucs.pretrained import get_model as _gm
from demucs.tasnet_v2 import ConvTasNet from demucs.tasnet_v2 import ConvTasNet
from demucs.utils import apply_model_v1 from demucs.utils import apply_model_v1
from demucs.utils import apply_model_v2 from demucs.utils import apply_model_v2
import demucs.apply
from diffq import DiffQuantizer from diffq import DiffQuantizer
from lib_v5 import spec_utils from lib_v5 import spec_utils
from lib_v5.model_param_init import ModelParameters from lib_v5.model_param_init import ModelParameters
@@ -30,6 +31,7 @@ import tkinter as tk
import torch import torch
import torch.hub import torch.hub
import traceback # Error Message Recent Calls import traceback # Error Message Recent Calls
import threading
import warnings import warnings
import zlib import zlib
@@ -58,8 +60,8 @@ class Predictor():
self.demucs.to(device) self.demucs.to(device)
self.demucs.load_state_dict(state) self.demucs.load_state_dict(state)
widget_text.write('Done!\n') widget_text.write('Done!\n')
if not data['segment'] == 'None': if not data['segment'] == 'Default':
widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n') widget_text.write(base_text + 'Note: Segments only available for Demucs v3\n')
else: else:
pass pass
@@ -81,8 +83,8 @@ class Predictor():
self.demucs.to(device) self.demucs.to(device)
self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set_name}")) self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set_name}"))
widget_text.write('Done!\n') widget_text.write('Done!\n')
if not data['segment'] == 'None': if not data['segment'] == 'Default':
widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n') widget_text.write(base_text + 'Note: Segments only available for Demucs v3\n')
else: else:
pass pass
self.demucs.eval() self.demucs.eval()
@@ -101,7 +103,7 @@ class Predictor():
if isinstance(self.demucs, BagOfModels): if isinstance(self.demucs, BagOfModels):
widget_text.write(base_text + f"Selected model is a bag of {len(self.demucs.models)} models.\n") widget_text.write(base_text + f"Selected model is a bag of {len(self.demucs.models)} models.\n")
if data['segment'] == 'None': if data['segment'] == 'Default':
segment = None segment = None
if isinstance(self.demucs, BagOfModels): if isinstance(self.demucs, BagOfModels):
if segment is not None: if segment is not None:
@@ -120,7 +122,8 @@ class Predictor():
else: else:
if segment is not None: if segment is not None:
sub.segment = segment sub.segment = segment
widget_text.write(base_text + "Segments set to "f"{segment}.\n") if split_mode:
widget_text.write(base_text + "Segments set to "f"{segment}.\n")
except: except:
segment = None segment = None
if isinstance(self.demucs, BagOfModels): if isinstance(self.demucs, BagOfModels):
@@ -145,7 +148,7 @@ class Predictor():
mix = mix.T mix = mix.T
sources = self.demix(mix.T) sources = self.demix(mix.T)
widget_text.write(base_text + 'Inferences complete!\n') widget_text.write(base_text + 'Inference complete!\n')
#Main Save Path #Main Save Path
save_path = os.path.dirname(_basename) save_path = os.path.dirname(_basename)
@@ -155,6 +158,25 @@ class Predictor():
drums_name = '(Drums)' drums_name = '(Drums)'
bass_name = '(Bass)' bass_name = '(Bass)'
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 = 'mixture without selected stem'
elif stemset_n == '(Drums)':
stem_text_a = 'Drums'
stem_text_b = 'mixture without selected stem'
elif stemset_n == '(Bass)':
stem_text_a = 'Bass'
stem_text_b = 'mixture without selected stem'
else:
stem_text_a = 'Vocals'
stem_text_b = 'Instrumental'
vocals_path = '{save_path}/{file_name}.wav'.format( vocals_path = '{save_path}/{file_name}.wav'.format(
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{vocals_name}',) file_name = f'{os.path.basename(_basename)}_{vocals_name}',)
@@ -202,8 +224,6 @@ class Predictor():
save_path=save_path, save_path=save_path,
file_name = f'{os.path.basename(_basename)}_{bass_name}',) file_name = f'{os.path.basename(_basename)}_{bass_name}',)
#If not 'All Stems' #If not 'All Stems'
if stemset_n == '(Vocals)': if stemset_n == '(Vocals)':
@@ -273,7 +293,7 @@ class Predictor():
if not data['demucs_stems'] == 'All Stems': if not data['demucs_stems'] == 'All Stems':
if data['inst_only_b']: if data['inst_only_b']:
widget_text.write(base_text + 'Preparing mixture without selected stem...') widget_text.write(base_text + 'Preparing mixture without selected stem... ')
else: else:
widget_text.write(base_text + 'Saving Stem(s)... ') widget_text.write(base_text + 'Saving Stem(s)... ')
else: else:
@@ -415,7 +435,7 @@ class Predictor():
widget_text.write('Done!\n') widget_text.write('Done!\n')
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.9)) step=(1))
if data['demucs_stems'] == 'All Stems': if data['demucs_stems'] == 'All Stems':
pass pass
@@ -430,7 +450,7 @@ class Predictor():
'files':[str(music_file), vocal_path], 'files':[str(music_file), vocal_path],
} }
] ]
widget_text.write(base_text + 'Saving Instrumental... ') widget_text.write(base_text + f'Saving {stem_text_b}... ')
for i, e in tqdm(enumerate(finalfiles)): for i, e in tqdm(enumerate(finalfiles)):
wave, specs = {}, {} wave, specs = {}, {}
@@ -469,7 +489,6 @@ class Predictor():
step=(1)) step=(1))
sf.write(Instrumental_path, normalization_set(spec_utils.cmb_spectrogram_to_wave(-v_spec, mp)), mp.param['sr'], subtype=wav_type_set) sf.write(Instrumental_path, normalization_set(spec_utils.cmb_spectrogram_to_wave(-v_spec, mp)), mp.param['sr'], subtype=wav_type_set)
if data['inst_only_b']: if data['inst_only_b']:
if file_exists_v == 'there': if file_exists_v == 'there':
@@ -482,7 +501,6 @@ class Predictor():
widget_text.write('Done!\n') widget_text.write('Done!\n')
if not data['demucs_stems'] == 'All Stems': if not data['demucs_stems'] == 'All Stems':
if data['saveFormat'] == 'Mp3': if data['saveFormat'] == 'Mp3':
@@ -604,76 +622,65 @@ class Predictor():
widget_text.write(base_text + 'Completed Separation!\n') widget_text.write(base_text + 'Completed Separation!\n')
def demix(self, mix): def demix(self, mix):
global chunk_set
# 1 = demucs only # 1 = demucs only
# 0 = onnx only # 0 = onnx only
if data['chunks_d'] == 'Full': if data['chunks_d'] == 'Full':
if split_mode == True: chunk_set = 0
chunk_set = 0 elif data['chunks_d'] == 'Auto':
else: if data['gpu'] == 0:
widget_text.write(base_text + "Chunk size set to full... \n") try:
chunk_set = 0 gpu_mem = round(torch.cuda.get_device_properties(0).total_memory/1.074e+9)
else: except:
chunk_set = data['chunks'] widget_text.write(base_text + 'NVIDIA GPU Required for conversion!\n')
if int(gpu_mem) <= int(6):
if data['chunks_d'] == 'Auto': chunk_set = int(5)
if split_mode == True: if no_chunk_demucs:
widget_text.write(base_text + "Split Mode is on (Chunks disabled).\n")
chunk_set = 0
else:
widget_text.write(base_text + "Split Mode is off (Chunks enabled).\n")
if data['gpu'] == 0:
try:
gpu_mem = round(torch.cuda.get_device_properties(0).total_memory/1.074e+9)
except:
widget_text.write(base_text + 'NVIDIA GPU Required for conversion!\n')
if int(gpu_mem) <= int(6):
chunk_set = int(10)
widget_text.write(base_text + 'Chunk size auto-set to 10... \n')
if gpu_mem in [7, 8, 9]:
chunk_set = int(30)
widget_text.write(base_text + 'Chunk size auto-set to 30... \n')
if gpu_mem in [10, 11, 12, 13, 14, 15]:
chunk_set = int(50)
widget_text.write(base_text + 'Chunk size auto-set to 50... \n')
if int(gpu_mem) >= int(16):
chunk_set = int(0)
widget_text.write(base_text + 'Chunk size auto-set to Full... \n')
if data['gpu'] == -1:
sys_mem = psutil.virtual_memory().total >> 30
if int(sys_mem) <= int(4):
chunk_set = int(5)
widget_text.write(base_text + 'Chunk size auto-set to 5... \n') widget_text.write(base_text + 'Chunk size auto-set to 5... \n')
if sys_mem in [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]: if gpu_mem in [7, 8, 9, 10, 11, 12, 13, 14, 15]:
chunk_set = int(10) chunk_set = int(10)
if no_chunk_demucs:
widget_text.write(base_text + 'Chunk size auto-set to 10... \n') widget_text.write(base_text + 'Chunk size auto-set to 10... \n')
if sys_mem in [17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32]: if int(gpu_mem) >= int(16):
chunk_set = int(40) chunk_set = int(40)
if no_chunk_demucs:
widget_text.write(base_text + 'Chunk size auto-set to 40... \n') widget_text.write(base_text + 'Chunk size auto-set to 40... \n')
if int(sys_mem) >= int(33): if data['gpu'] == -1:
chunk_set = int(0) sys_mem = psutil.virtual_memory().total >> 30
widget_text.write(base_text + 'Chunk size auto-set to Full... \n') if int(sys_mem) <= int(4):
chunk_set = int(1)
if no_chunk_demucs:
widget_text.write(base_text + 'Chunk size auto-set to 1... \n')
if sys_mem in [5, 6, 7, 8]:
chunk_set = int(10)
if no_chunk_demucs:
widget_text.write(base_text + 'Chunk size auto-set to 10... \n')
if sys_mem in [9, 10, 11, 12, 13, 14, 15, 16]:
chunk_set = int(25)
if no_chunk_demucs:
widget_text.write(base_text + 'Chunk size auto-set to 25... \n')
if int(sys_mem) >= int(17):
chunk_set = int(60)
if no_chunk_demucs:
widget_text.write(base_text + 'Chunk size auto-set to 60... \n')
elif data['chunks_d'] == str(0):
chunk_set = 0
if no_chunk_demucs:
widget_text.write(base_text + "Chunk size set to full... \n")
else: else:
if split_mode == True: chunk_set = int(data['chunks_d'])
widget_text.write(base_text + "Split Mode is on (Chunks disabled).\n") if no_chunk_demucs:
chunk_set = 0 widget_text.write(base_text + "Chunk size user-set to "f"{chunk_set}... \n")
else:
widget_text.write(base_text + "Split Mode is off (Chunks enabled).\n")
if data['chunks_d'] == 'Full':
chunk_set = int(0)
widget_text.write(base_text + "Chunk size set to full... \n")
else:
chunk_set = data['chunks_d']
widget_text.write(base_text + "Chunk size user-set to "f"{chunk_set}... \n")
samples = mix.shape[-1] samples = mix.shape[-1]
margin = margin_set margin = margin_set
chunk_size = chunk_set*44100 chunk_size = chunk_set*44100
assert not margin == 0, 'margin cannot be zero!' assert not margin == 0, 'margin cannot be zero!'
if margin > chunk_size: if margin > chunk_size:
margin = chunk_size margin = chunk_size
segmented_mix = {} segmented_mix = {}
if chunk_set == 0 or samples < chunk_size: if chunk_set == 0 or samples < chunk_size:
@@ -692,27 +699,45 @@ class Predictor():
if end == samples: if end == samples:
break break
if demucs_model_version == 'v1': if demucs_model_version == 'v1':
sources = self.demix_demucs_v1(segmented_mix, margin_size=margin) if no_chunk_demucs == False:
if demucs_model_version == 'v2': sources = self.demix_demucs_v1_split(mix)
sources = self.demix_demucs_v2(segmented_mix, margin_size=margin) if no_chunk_demucs == True:
sources = self.demix_demucs_v1(segmented_mix, margin_size=margin)
if demucs_model_version == 'v2':
if no_chunk_demucs == False:
sources = self.demix_demucs_v2_split(mix)
if no_chunk_demucs == True:
sources = self.demix_demucs_v2(segmented_mix, margin_size=margin)
if demucs_model_version == 'v3': if demucs_model_version == 'v3':
sources = self.demix_demucs(segmented_mix, margin_size=margin) if no_chunk_demucs == False:
sources = self.demix_demucs_split(mix)
if no_chunk_demucs == True:
sources = self.demix_demucs(segmented_mix, margin_size=margin)
return sources return sources
def demix_demucs(self, mix, margin_size):
def demix_demucs(self, mix, margin_size):
processed = {} processed = {}
demucsitera = len(mix) demucsitera = len(mix)
demucsitera_calc = demucsitera * 2 demucsitera_calc = demucsitera * 2
gui_progress_bar_demucs = 0 gui_progress_bar_demucs = 0
progress_bar = 0
if demucsitera == 1:
widget_text.write(base_text + f"Running Demucs Inference... ")
else:
widget_text.write(base_text + f"Running Demucs Inference...{space}\n")
widget_text.write(base_text + "Running Demucs Inference...\n")
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
print(' Running Demucs Inference...') print(' Running Demucs Inference...')
for nmix in mix: for nmix in mix:
gui_progress_bar_demucs += 1 gui_progress_bar_demucs += 1
progress_bar += 100
step = (progress_bar / demucsitera)
if demucsitera == 1:
pass
else:
percent_prog = f"{base_text}Demucs Inference Progress: {gui_progress_bar_demucs}/{demucsitera} | {round(step)}%"
widget_text.percentage(percent_prog)
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.1 + (1.7/demucsitera_calc * gui_progress_bar_demucs))) step=(0.1 + (1.7/demucsitera_calc * gui_progress_bar_demucs)))
cmix = mix[nmix] cmix = mix[nmix]
@@ -720,7 +745,17 @@ class Predictor():
ref = cmix.mean(0) ref = cmix.mean(0)
cmix = (cmix - ref.mean()) / ref.std() cmix = (cmix - ref.mean()) / ref.std()
with torch.no_grad(): with torch.no_grad():
sources = apply_model(self.demucs, cmix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=False)[0] sources = apply_model(self.demucs, cmix[None],
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
device=device,
overlap=overlap_set,
shifts=shift_set,
progress=False,
segmen=False,
**progress_demucs_kwargs)[0]
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -732,7 +767,49 @@ class Predictor():
sources = list(processed.values()) sources = list(processed.values())
sources = np.concatenate(sources, axis=-1) sources = np.concatenate(sources, axis=-1)
widget_text.write('Done!\n')
if demucsitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
#print('the demucs model is done running')
return sources
def demix_demucs_split(self, mix):
if split_mode:
widget_text.write(base_text + f"Running Demucs Inference...{space}\n")
else:
widget_text.write(base_text + f"Running Demucs Inference... ")
print(' Running Demucs Inference...')
mix = torch.tensor(mix, dtype=torch.float32)
ref = mix.mean(0)
mix = (mix - ref.mean()) / ref.std()
with torch.no_grad():
sources = apply_model(self.demucs,
mix[None],
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
device=device,
overlap=overlap_set,
shifts=shift_set,
progress=False,
segmen=True,
**progress_demucs_kwargs)[0]
if split_mode:
widget_text.write('\n')
else:
widget_text.write('Done!\n')
sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]]
return sources return sources
def demix_demucs_v1(self, mix, margin_size): def demix_demucs_v1(self, mix, margin_size):
@@ -740,19 +817,37 @@ class Predictor():
demucsitera = len(mix) demucsitera = len(mix)
demucsitera_calc = demucsitera * 2 demucsitera_calc = demucsitera * 2
gui_progress_bar_demucs = 0 gui_progress_bar_demucs = 0
widget_text.write(base_text + "Running Demucs v1 Inference...\n") progress_bar = 0
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
print(' Running Demucs Inference...') print(' Running Demucs Inference...')
if demucsitera == 1:
widget_text.write(base_text + f"Running Demucs v1 Inference... ")
else:
widget_text.write(base_text + f"Running Demucs v1 Inference...{space}\n")
for nmix in mix: for nmix in mix:
gui_progress_bar_demucs += 1 gui_progress_bar_demucs += 1
progress_bar += 100
step = (progress_bar / demucsitera)
if demucsitera == 1:
pass
else:
percent_prog = f"{base_text}Demucs v1 Inference Progress: {gui_progress_bar_demucs}/{demucsitera} | {round(step)}%"
widget_text.percentage(percent_prog)
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) step=(0.1 + (1.7/demucsitera_calc * gui_progress_bar_demucs)))
cmix = mix[nmix] cmix = mix[nmix]
cmix = torch.tensor(cmix, dtype=torch.float32) cmix = torch.tensor(cmix, dtype=torch.float32)
ref = cmix.mean(0) ref = cmix.mean(0)
cmix = (cmix - ref.mean()) / ref.std() cmix = (cmix - ref.mean()) / ref.std()
with torch.no_grad(): with torch.no_grad():
sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set) sources = apply_model_v1(self.demucs,
cmix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=False,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -764,7 +859,44 @@ class Predictor():
sources = list(processed.values()) sources = list(processed.values())
sources = np.concatenate(sources, axis=-1) sources = np.concatenate(sources, axis=-1)
widget_text.write('Done!\n')
if demucsitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
return sources
def demix_demucs_v1_split(self, mix):
print(' Running Demucs Inference...')
if split_mode:
widget_text.write(base_text + f"Running Demucs v1 Inference...{space}\n")
else:
widget_text.write(base_text + f"Running Demucs v1 Inference... ")
mix = torch.tensor(mix, dtype=torch.float32)
ref = mix.mean(0)
mix = (mix - ref.mean()) / ref.std()
with torch.no_grad():
sources = apply_model_v1(self.demucs,
mix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=True,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]]
if split_mode:
widget_text.write('\n')
else:
widget_text.write('Done!\n')
return sources return sources
def demix_demucs_v2(self, mix, margin_size): def demix_demucs_v2(self, mix, margin_size):
@@ -772,20 +904,39 @@ class Predictor():
demucsitera = len(mix) demucsitera = len(mix)
demucsitera_calc = demucsitera * 2 demucsitera_calc = demucsitera * 2
gui_progress_bar_demucs = 0 gui_progress_bar_demucs = 0
widget_text.write(base_text + "Running Demucs v2 Inference...\n") progress_bar = 0
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ") if demucsitera == 1:
print(' Running Demucs Inference...') widget_text.write(base_text + f"Running Demucs v2 Inference... ")
else:
widget_text.write(base_text + f"Running Demucs v2 Inference...{space}\n")
for nmix in mix: for nmix in mix:
gui_progress_bar_demucs += 1 gui_progress_bar_demucs += 1
progress_bar += 100
step = (progress_bar / demucsitera)
if demucsitera == 1:
pass
else:
percent_prog = f"{base_text}Demucs v2 Inference Progress: {gui_progress_bar_demucs}/{demucsitera} | {round(step)}%"
widget_text.percentage(percent_prog)
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs))) step=(0.1 + (1.7/demucsitera_calc * gui_progress_bar_demucs)))
cmix = mix[nmix] cmix = mix[nmix]
cmix = torch.tensor(cmix, dtype=torch.float32) cmix = torch.tensor(cmix, dtype=torch.float32)
ref = cmix.mean(0) ref = cmix.mean(0)
cmix = (cmix - ref.mean()) / ref.std() cmix = (cmix - ref.mean()) / ref.std()
shift_set = 0
with torch.no_grad(): with torch.no_grad():
sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set) sources = apply_model_v2(self.demucs,
cmix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=False,
overlap=overlap_set,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -797,8 +948,47 @@ class Predictor():
sources = list(processed.values()) sources = list(processed.values())
sources = np.concatenate(sources, axis=-1) sources = np.concatenate(sources, axis=-1)
widget_text.write('Done!\n')
if demucsitera == 1:
widget_text.write('Done!\n')
else:
widget_text.write('\n')
return sources return sources
def demix_demucs_v2_split(self, mix):
print(' Running Demucs Inference...')
if split_mode:
widget_text.write(base_text + f"Running Demucs v2 Inference...{space}\n")
else:
widget_text.write(base_text + f"Running Demucs v2 Inference... ")
mix = torch.tensor(mix, dtype=torch.float32)
ref = mix.mean(0)
mix = (mix - ref.mean()) / ref.std()
with torch.no_grad():
sources = apply_model_v2(self.demucs,
mix.to(device),
gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
segmen=True,
overlap=overlap_set,
shifts=shift_set,
**progress_demucs_kwargs)
sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]]
if split_mode:
widget_text.write('\n')
else:
widget_text.write('Done!\n')
return sources
data = { data = {
'audfile': True, 'audfile': True,
@@ -811,19 +1001,19 @@ data = {
'gpu': -1, 'gpu': -1,
'input_paths': None, 'input_paths': None,
'inst_only_b': False, 'inst_only_b': False,
'margin': 44100, 'margin_d': 44100,
'mp3bit': '320k', 'mp3bit': '320k',
'no_chunk_d': False,
'normalize': False, 'normalize': False,
'overlap_b': 0.25, 'overlap_b': 0.25,
'saveFormat': 'Wav', 'saveFormat': 'Wav',
'segment': 'None', 'segment': 'Default',
'settest': False, 'settest': False,
'shifts_b': 2, 'shifts_b': 2,
'split_mode': False, 'split_mode': False,
'voc_only_b': False, 'voc_only_b': False,
'wavtype': 'PCM_16', 'wavtype': 'PCM_16',
} }
default_chunks = data['chunks_d']
def update_progress(progress_var, total_files, file_num, step: float = 1): def update_progress(progress_var, total_files, file_num, step: float = 1):
"""Calculate the progress for the progress widget in the GUI""" """Calculate the progress for the progress widget in the GUI"""
@@ -850,7 +1040,7 @@ def hide_opt():
yield yield
finally: finally:
sys.stdout = old_stdout 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): **kwargs: dict):
@@ -861,6 +1051,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
global _basename global _basename
global _mixture global _mixture
global progress_kwargs global progress_kwargs
global progress_demucs_kwargs
global base_text global base_text
global model_set_name global model_set_name
global stemset_n global stemset_n
@@ -872,11 +1063,15 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
global split_mode global split_mode
global demucs_model_set_name global demucs_model_set_name
global demucs_model_version global demucs_model_version
global wav_type_set global wav_type_set
global no_chunk_demucs
global space
global flac_type_set global flac_type_set
global mp3_bit_set global mp3_bit_set
global normalization_set global normalization_set
global update_prog
update_prog = update_progress
wav_type_set = data['wavtype'] wav_type_set = data['wavtype']
@@ -899,6 +1094,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
ffmp_err = """audioread\__init__.py", line 116, in audio_open""" ffmp_err = """audioread\__init__.py", line 116, in audio_open"""
sf_write_err = "sf.write" sf_write_err = "sf.write"
model_adv_set_err = "Got invalid dimensions for input" model_adv_set_err = "Got invalid dimensions for input"
demucs_model_missing_err = "is neither a single pre-trained model or a bag of models."
try: try:
with open('errorlog.txt', 'w') as f: with open('errorlog.txt', 'w') as f:
@@ -911,7 +1107,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
randomnum = randrange(100000, 1000000) randomnum = randrange(100000, 1000000)
data.update(kwargs) data.update(kwargs)
if data['wavtype'] == '32-bit Float': if data['wavtype'] == '32-bit Float':
wav_type_set = 'FLOAT' wav_type_set = 'FLOAT'
elif data['wavtype'] == '64-bit Float': elif data['wavtype'] == '64-bit Float':
@@ -921,6 +1117,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
flac_type_set = data['flactype'] flac_type_set = data['flactype']
mp3_bit_set = data['mp3bit'] mp3_bit_set = data['mp3bit']
default_chunks = data['chunks_d']
no_chunk_demucs = data['no_chunk_d']
if data['normalize'] == True: if data['normalize'] == True:
normalization_set = spec_utils.normalize normalization_set = spec_utils.normalize
@@ -1057,10 +1256,10 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
overlap_set = float(data['overlap_b']) overlap_set = float(data['overlap_b'])
channel_set = int(data['channel']) channel_set = int(data['channel'])
margin_set = int(data['margin']) margin_set = int(data['margin_d'])
shift_set = int(data['shifts_b']) shift_set = int(data['shifts_b'])
split_mode = data['split_mode'] split_mode = data['split_mode']
space = ' '*90
#print('Split? ', split_mode) #print('Split? ', split_mode)
@@ -1133,6 +1332,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
#if ('models/MDX_Net_Models/' + model_set + '.onnx') #if ('models/MDX_Net_Models/' + model_set + '.onnx')
inference_type = 'demucs_only'
# -Get text and update progress- # -Get text and update progress-
base_text = get_baseText(total_files=len(data['input_paths']), base_text = get_baseText(total_files=len(data['input_paths']),
@@ -1140,6 +1340,8 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
progress_kwargs = {'progress_var': progress_var, progress_kwargs = {'progress_var': progress_var,
'total_files': len(data['input_paths']), 'total_files': len(data['input_paths']),
'file_num': file_num} 'file_num': file_num}
progress_demucs_kwargs = {'total_files': len(data['input_paths']),
'file_num': file_num, 'inference_type': inference_type}
try: try:
@@ -1389,7 +1591,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
text_widget.write(f'\nError Received:\n\n') text_widget.write(f'\nError Received:\n\n')
text_widget.write(f'Could not write audio file.\n') text_widget.write(f'Could not write audio file.\n')
text_widget.write(f'This could be due to low storage on target device or a system permissions issue.\n') text_widget.write(f'This could be due to low storage on target device or a system permissions issue.\n')
text_widget.write(f"\nFor raw error details, go to the Error Log tab in the Help Guide.\n") text_widget.write(f"\nGo to the Settings Menu and click \"Open Error Log\" for raw error details.\n")
text_widget.write(f'\nIf the error persists, please contact the developers.\n\n') text_widget.write(f'\nIf the error persists, please contact the developers.\n\n')
text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
try: try:
@@ -1456,6 +1658,50 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
button_widget.configure(state=tk.NORMAL) # Enable Button button_widget.configure(state=tk.NORMAL) # Enable Button
return return
if model_adv_set_err in message:
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'The current ONNX model settings are not compatible with the selected \nmodel.\n\n')
text_widget.write(f'Please re-configure the advanced ONNX model settings accordingly and try \nagain.\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: Demucs v3\n\n' +
f'The current ONNX model settings are not compatible with the selected model.\n\n' +
f'Please re-configure the advanced ONNX model settings accordingly and try again.\n\n' +
message + 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
if demucs_model_missing_err in message:
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'The selected Demucs model is missing.\n\n')
text_widget.write(f'Please download the model or make sure it is in the correct directory.\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: Demucs v3\n\n' +
f'The selected Demucs model is missing.\n\n' +
f'Please download the model or make sure it is in the correct directory.\n\n' +
message + 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
print(traceback_text) print(traceback_text)
print(type(e).__name__, e) print(type(e).__name__, e)
@@ -1476,7 +1722,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
text_widget.write("\n" + base_text + f'Separation failed for the following audio file:\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(base_text + f'"{os.path.basename(music_file)}"\n')
text_widget.write(f'\nError Received:\n') text_widget.write(f'\nError Received:\n')
text_widget.write("\nFor raw error details, go to the Error Log tab in the Help Guide.\n") text_widget.write("\nGo to the Settings Menu and click \"Open Error Log\" for raw error details.\n")
text_widget.write("\n" + f'Please address the error and try again.' + "\n") text_widget.write("\n" + f'Please address the error and try again.' + "\n")
text_widget.write(f'If this error persists, please contact the developers with the error details.\n\n') text_widget.write(f'If this error persists, please contact the developers with the error details.\n\n')
text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
@@ -1500,3 +1746,17 @@ if __name__ == '__main__':
main() main()
print("Successfully completed music demixing.");print('Total time: {0:.{1}f}s'.format(time.time() - start_time, 1)) print("Successfully completed music demixing.");print('Total time: {0:.{1}f}s'.format(time.time() - start_time, 1))
## Grave yard
# def prog_val():
# def thread():
# global source
# source = apply_model(self.demucs, cmix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=True, )[0]
# th = threading.Thread(target=thread)
# th.start()
# print('wait')
# val = demucs.apply.progress_bar_num
# th.join()
# print('continue')
# return source

View File

@@ -103,7 +103,7 @@ def determineModelFolderName():
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): **kwargs: dict):
global model_params_d global gui_progress_bar
global nn_arch_sizes global nn_arch_sizes
global nn_architecture global nn_architecture
@@ -115,9 +115,10 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
global flac_type_set global flac_type_set
global mp3_bit_set global mp3_bit_set
global space
wav_type_set = data['wavtype'] wav_type_set = data['wavtype']
gui_progress_bar = progress_var
#Error Handling #Error Handling
runtimeerr = "CUDNN error executing cudnnSetTensorNdDescriptor" runtimeerr = "CUDNN error executing cudnnSetTensorNdDescriptor"
@@ -127,6 +128,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
file_err = "FileNotFoundError" file_err = "FileNotFoundError"
ffmp_err = """audioread\__init__.py", line 116, in audio_open""" ffmp_err = """audioread\__init__.py", line 116, in audio_open"""
sf_write_err = "sf.write" sf_write_err = "sf.write"
demucs_model_missing_err = "is neither a single pre-trained model or a bag of models."
try: try:
with open('errorlog.txt', 'w') as f: with open('errorlog.txt', 'w') as f:
@@ -382,8 +384,12 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
global default_window_size global default_window_size
global default_agg global default_agg
global normalization_set global normalization_set
global update_prog
update_prog = update_progress
default_window_size = data['window_size'] default_window_size = data['window_size']
default_agg = data['agg'] default_agg = data['agg']
space = ' '*90
stime = time.perf_counter() stime = time.perf_counter()
progress_var.set(0) progress_var.set(0)
@@ -432,6 +438,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
else: else:
base_name = f'{data["export_path"]}/{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}' base_name = f'{data["export_path"]}/{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}'
global inference_type
inference_type = 'inference_vr'
model_name = os.path.basename(data[f'{data["useModel"]}Model']) model_name = os.path.basename(data[f'{data["useModel"]}Model'])
model = vocal_remover.models[data['useModel']] model = vocal_remover.models[data['useModel']]
device = vocal_remover.devices[data['useModel']] device = vocal_remover.devices[data['useModel']]
@@ -441,6 +450,8 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
progress_kwargs = {'progress_var': progress_var, progress_kwargs = {'progress_var': progress_var,
'total_files': len(data['input_paths']), 'total_files': len(data['input_paths']),
'file_num': file_num} 'file_num': file_num}
progress_demucs_kwargs = {'total_files': len(data['input_paths']),
'file_num': file_num, 'inference_type': inference_type}
update_progress(**progress_kwargs, update_progress(**progress_kwargs,
step=0) step=0)
@@ -503,7 +514,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
model_hash = hashlib.md5(open(ModelName,'rb').read()).hexdigest() model_hash = hashlib.md5(open(ModelName,'rb').read()).hexdigest()
model_params = [] model_params = []
model_params = lib_v5.filelist.provide_model_param_hash(model_hash) model_params = lib_v5.filelist.provide_model_param_hash(model_hash)
print(model_params) #print(model_params)
if model_params[0] == 'Not Found Using Hash': if model_params[0] == 'Not Found Using Hash':
model_params = [] model_params = []
model_params = lib_v5.filelist.provide_model_param_name(ModelName) model_params = lib_v5.filelist.provide_model_param_name(ModelName)
@@ -622,8 +633,6 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
text_widget.write(base_text + 'Loading the stft of audio source...') text_widget.write(base_text + 'Loading the stft of audio source...')
text_widget.write(' Done!\n') text_widget.write(' Done!\n')
text_widget.write(base_text + "Please Wait...\n")
X_spec_m = spec_utils.combine_spectrograms(X_spec_s, mp) X_spec_m = spec_utils.combine_spectrograms(X_spec_s, mp)
@@ -631,22 +640,47 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
def inference(X_spec, device, model, aggressiveness): def inference(X_spec, device, model, aggressiveness):
def _execute(X_mag_pad, roi_size, n_window, device, model, aggressiveness): def _execute(X_mag_pad, roi_size, n_window, device, model, aggressiveness, tta=False):
model.eval() model.eval()
global active_iterations
global progress_value
with torch.no_grad(): with torch.no_grad():
preds = [] preds = []
iterations = [n_window] iterations = [n_window]
total_iterations = sum(iterations) if data['tta']:
total_iterations = sum(iterations)
text_widget.write(base_text + "Processing "f"{total_iterations} Slices... ") total_iterations = total_iterations*2
else:
total_iterations = sum(iterations)
if tta:
active_iterations = sum(iterations)
active_iterations = active_iterations - 2
total_iterations = total_iterations - 2
else:
active_iterations = 0
for i in tqdm(range(n_window)): progress_bar = 0
update_progress(**progress_kwargs, for i in range(n_window):
step=(0.1 + (0.8/n_window * i))) active_iterations += 1
if data['demucsmodelVR']:
update_progress(**progress_kwargs,
step=(0.1 + (0.5/total_iterations * active_iterations)))
else:
update_progress(**progress_kwargs,
step=(0.1 + (0.8/total_iterations * active_iterations)))
start = i * roi_size start = i * roi_size
progress_bar += 100
progress_value = progress_bar
active_iterations_step = active_iterations*100
step = (active_iterations_step / total_iterations)
percent_prog = f"{base_text}Inference Progress: {active_iterations}/{total_iterations} | {round(step)}%"
text_widget.percentage(percent_prog)
X_mag_window = X_mag_pad[None, :, :, start:start + data['window_size']] X_mag_window = X_mag_pad[None, :, :, start:start + data['window_size']]
X_mag_window = torch.from_numpy(X_mag_window).to(device) X_mag_window = torch.from_numpy(X_mag_window).to(device)
@@ -656,7 +690,6 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
preds.append(pred[0]) preds.append(pred[0])
pred = np.concatenate(preds, axis=2) pred = np.concatenate(preds, axis=2)
text_widget.write('Done!\n')
return pred return pred
def preprocess(X_spec): def preprocess(X_spec):
@@ -691,7 +724,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
X_mag_pre, ((0, 0), (0, 0), (pad_l, pad_r)), mode='constant') X_mag_pre, ((0, 0), (0, 0), (pad_l, pad_r)), mode='constant')
pred_tta = _execute(X_mag_pad, roi_size, n_window, pred_tta = _execute(X_mag_pad, roi_size, n_window,
device, model, aggressiveness) device, model, aggressiveness, tta=True)
pred_tta = pred_tta[:, :, roi_size // 2:] pred_tta = pred_tta[:, :, roi_size // 2:]
pred_tta = pred_tta[:, :, :n_frame] pred_tta = pred_tta[:, :, :n_frame]
@@ -702,17 +735,16 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
aggressiveness = {'value': aggresive_set, 'split_bin': mp.param['band'][1]['crop_stop']} aggressiveness = {'value': aggresive_set, 'split_bin': mp.param['band'][1]['crop_stop']}
if data['tta']: if data['tta']:
text_widget.write(base_text + "Running Inferences (TTA)...\n") text_widget.write(base_text + f"Running Inferences (TTA)... {space}\n")
else: else:
text_widget.write(base_text + "Running Inference...\n") text_widget.write(base_text + f"Running Inference... {space}\n")
pred, X_mag, X_phase = inference(X_spec_m, pred, X_mag, X_phase = inference(X_spec_m,
device, device,
model, aggressiveness) model, aggressiveness)
update_progress(**progress_kwargs, text_widget.write('\n')
step=0.9)
# Postprocess
if data['postprocess']: if data['postprocess']:
try: try:
text_widget.write(base_text + 'Post processing...') text_widget.write(base_text + 'Post processing...')
@@ -743,19 +775,38 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
v_spec_m = X_spec_m - y_spec_m v_spec_m = X_spec_m - y_spec_m
def demix_demucs(mix): def demix_demucs(mix):
#print('shift_set ', shift_set)
text_widget.write(base_text + "Running Demucs Inference...\n")
text_widget.write(base_text + "Processing... ")
print(' Running Demucs Inference...') print(' Running Demucs Inference...')
if split_mode:
text_widget.write(base_text + f'Running Demucs Inference... {space}')
else:
text_widget.write(base_text + f'Running Demucs Inference... ')
mix = torch.tensor(mix, dtype=torch.float32) mix = torch.tensor(mix, dtype=torch.float32)
ref = mix.mean(0) ref = mix.mean(0)
mix = (mix - ref.mean()) / ref.std() mix = (mix - ref.mean()) / ref.std()
widget_text = text_widget
with torch.no_grad(): with torch.no_grad():
sources = apply_model(demucs, mix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=False)[0] sources = apply_model(demucs,
mix[None],
text_widget.write('Done!\n') gui_progress_bar,
widget_text,
update_prog,
split=split_mode,
device=device,
overlap=overlap_set,
shifts=shift_set,
progress=False,
segmen=True,
**progress_demucs_kwargs)[0]
if split_mode:
text_widget.write('\n')
else:
update_progress(**progress_kwargs,
step=0.9)
text_widget.write('Done!\n')
sources = (sources * ref.std() + ref.mean()).cpu().numpy() sources = (sources * ref.std() + ref.mean()).cpu().numpy()
sources[[0,1]] = sources[[1,0]] sources[[0,1]] = sources[[1,0]]
@@ -774,15 +825,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
if data['demucsmodelVR']: if data['demucsmodelVR']:
demucs = HDemucs(sources=["other", "vocals"]) demucs = HDemucs(sources=["other", "vocals"])
text_widget.write(base_text + 'Loading Demucs model... ')
update_progress(**progress_kwargs,
step=0.95)
path_d = Path('models/Demucs_Models/v3_repo') path_d = Path('models/Demucs_Models/v3_repo')
#print('What Demucs model was chosen? ', demucs_model_set) #print('What Demucs model was chosen? ', demucs_model_set)
demucs = _gm(name=demucs_model_set, repo=path_d) demucs = _gm(name=demucs_model_set, repo=path_d)
text_widget.write('Done!\n')
#print('segment: ', data['segment'])
if data['segment'] == 'None': if data['segment'] == 'None':
segment = None segment = None
@@ -803,7 +848,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
else: else:
if segment is not None: if segment is not None:
sub.segment = segment sub.segment = segment
text_widget.write(base_text + "Segments set to "f"{segment}.\n") #text_widget.write(base_text + "Segments set to "f"{segment}.\n")
except: except:
segment = None segment = None
if isinstance(demucs, BagOfModels): if isinstance(demucs, BagOfModels):
@@ -814,8 +859,6 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
if segment is not None: if segment is not None:
sub.segment = segment sub.segment = segment
#print('segment port-process: ', segment)
demucs.cpu() demucs.cpu()
demucs.eval() demucs.eval()
@@ -1039,7 +1082,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
text_widget.write(f'\nError Received:\n\n') text_widget.write(f'\nError Received:\n\n')
text_widget.write(f'Could not write audio file.\n') text_widget.write(f'Could not write audio file.\n')
text_widget.write(f'This could be due to low storage on target device or a system permissions issue.\n') text_widget.write(f'This could be due to low storage on target device or a system permissions issue.\n')
text_widget.write(f"\nFor raw error details, go to the Error Log tab in the Help Guide.\n") text_widget.write(f"\nGo to the Settings Menu and click \"Open Error Log\" for raw error details.\n")
text_widget.write(f'\nIf the error persists, please contact the developers.\n\n') text_widget.write(f'\nIf the error persists, please contact the developers.\n\n')
text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
try: try:
@@ -1084,6 +1127,28 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
button_widget.configure(state=tk.NORMAL) # Enable Button button_widget.configure(state=tk.NORMAL) # Enable Button
return return
if demucs_model_missing_err in message:
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'The selected Demucs model is missing.\n\n')
text_widget.write(f'Please download the model or make sure it is in the correct directory.\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'The selected Demucs model is missing.\n\n' +
f'Please download the model or make sure it is in the correct directory.\n\n' +
message + 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
print(traceback_text) print(traceback_text)
print(type(e).__name__, e) print(type(e).__name__, e)
print(message) print(message)
@@ -1103,7 +1168,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
text_widget.write("\n" + base_text + f'Separation failed for the following audio file:\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(base_text + f'"{os.path.basename(music_file)}"\n')
text_widget.write(f'\nError Received:\n') text_widget.write(f'\nError Received:\n')
text_widget.write("\nFor raw error details, go to the Error Log tab in the Help Guide.\n") text_widget.write("\Go to the Settings Menu and click \"Open Error Log\" for raw error details.\n")
text_widget.write("\n" + f'Please address the error and try again.' + "\n") text_widget.write("\n" + f'Please address the error and try again.' + "\n")
text_widget.write(f'If this error persists, please contact the developers with the error details.\n\n') text_widget.write(f'If this error persists, please contact the developers with the error details.\n\n')
text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}') text_widget.write(f'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')

File diff suppressed because it is too large Load Diff