Add files via upload
This commit is contained in:
@@ -266,6 +266,7 @@ DEFAULT_DATA = {
|
||||
'inst_only_b': False,
|
||||
'lastDir': None,
|
||||
'margin': 44100,
|
||||
'margin_d': 44100,
|
||||
'mdx_ensem': 'MDX-Net: UVR-MDX-NET Main',
|
||||
'mdx_ensem_b': 'No Model',
|
||||
'mdx_only_ensem_a': 'MDX-Net: UVR-MDX-NET Main',
|
||||
@@ -285,6 +286,8 @@ DEFAULT_DATA = {
|
||||
'ModelParams': 'Auto',
|
||||
'mp3bit': '320k',
|
||||
'n_fft_scale': 6144,
|
||||
'no_chunk': False,
|
||||
'no_chunk_d': False,
|
||||
'noise_pro_select': 'Auto Select',
|
||||
'noise_reduc': True,
|
||||
'noisereduc_s': '3',
|
||||
@@ -298,7 +301,7 @@ DEFAULT_DATA = {
|
||||
'save': True,
|
||||
'saveFormat': 'Wav',
|
||||
'selectdownload': 'VR Arc',
|
||||
'segment': 'None',
|
||||
'segment': 'Default',
|
||||
'settest': False,
|
||||
'shifts': 2,
|
||||
'shifts_b': 2,
|
||||
@@ -432,26 +435,51 @@ class ThreadSafeConsole(tk.Text):
|
||||
"""
|
||||
Text Widget which is thread safe for tkinter
|
||||
"""
|
||||
|
||||
def __init__(self, master, **options):
|
||||
tk.Text.__init__(self, master, **options)
|
||||
self.queue = queue.Queue()
|
||||
self.update_me()
|
||||
|
||||
|
||||
def write(self, 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):
|
||||
self.queue.put(None)
|
||||
|
||||
def update_me(self):
|
||||
self.configure(state=tk.NORMAL)
|
||||
|
||||
try:
|
||||
while 1:
|
||||
line = self.queue.get_nowait()
|
||||
|
||||
if line is None:
|
||||
self.delete(1.0, tk.END)
|
||||
else:
|
||||
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.update_idletasks()
|
||||
except queue.Empty:
|
||||
@@ -711,6 +739,10 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.margin_var = tk.StringVar(value=data['margin'])
|
||||
except:
|
||||
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:
|
||||
self.mdx_only_ensem_a_var = tk.StringVar(value=data['mdx_only_ensem_a'])
|
||||
except:
|
||||
@@ -783,6 +815,14 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.n_fft_scale_var = tk.StringVar(value=data['n_fft_scale'])
|
||||
except:
|
||||
self.n_fft_scale_var = tk.StringVar(value=data_alt['n_fft_scale'])
|
||||
try:
|
||||
self.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:
|
||||
self.noise_pro_select_var = tk.StringVar(value=data['noise_pro_select'])
|
||||
except:
|
||||
@@ -1014,6 +1054,9 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.stop_Button = ttk.Button(master=self,
|
||||
image=self.stop_img,
|
||||
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,
|
||||
image=self.help_img,
|
||||
command=self.settings)
|
||||
@@ -1253,7 +1296,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
background='#0e0e0f', font=self.font, foreground='#13a4c9')
|
||||
self.options_segment_Optionmenu = ttk.OptionMenu(self.options_Frame,
|
||||
self.segment_var,
|
||||
None, 'None', '1', '5', '10', '15', '20',
|
||||
None, 'Default', '1', '5', '10', '15', '20',
|
||||
'25', '30', '35', '40', '45', '50',
|
||||
'55', '60', '65', '70', '75', '80',
|
||||
'85', '90', '95', '100')
|
||||
@@ -1583,6 +1626,15 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.chunks_var.trace_add('write',
|
||||
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',
|
||||
lambda *args: self.update_states())
|
||||
|
||||
@@ -1669,6 +1721,10 @@ class MainWindow(TkinterDnD.Tk):
|
||||
Start the conversion for all the given mp3 and wav files
|
||||
"""
|
||||
|
||||
global stop_inf
|
||||
|
||||
stop_inf = self.stop_inf_mdx
|
||||
|
||||
# -Get all variables-
|
||||
export_path = self.exportPath_var.get()
|
||||
input_paths = self.inputPaths
|
||||
@@ -1769,6 +1825,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
'inst_only_b': self.inst_only_b_var.get(),
|
||||
'instrumentalModel': instrumentalModel_path,
|
||||
'margin': self.margin_var.get(),
|
||||
'margin_d': self.margin_d_var.get(),
|
||||
'mdx_ensem': self.mdxensemchoose_var.get(),
|
||||
'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
|
||||
'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(),
|
||||
@@ -1783,6 +1840,8 @@ class MainWindow(TkinterDnD.Tk):
|
||||
'ModelParams': self.ModelParams_var.get(),
|
||||
'mp3bit': self.mp3bit_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_reduc': self.noisereduc_var.get(),
|
||||
'noisereduc_s': noisereduc_s,
|
||||
@@ -1829,6 +1888,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
'wavtype': self.wavtype_var.get(),
|
||||
'window': self,
|
||||
'window_size': window_size,
|
||||
'stop_thread': stop_inf,
|
||||
},
|
||||
daemon=True
|
||||
)
|
||||
@@ -1840,15 +1900,6 @@ class MainWindow(TkinterDnD.Tk):
|
||||
confirm = tk.messagebox.askyesno(title='Confirmation',
|
||||
message='You are about to stop all active processes.\n\nAre you sure you wish to continue?')
|
||||
|
||||
# if self.aiModel_var.get() == 'VR Architecture':
|
||||
# inference = inference_v5
|
||||
# elif self.aiModel_var.get() == 'Ensemble Mode':
|
||||
# inference = inference_v5_ensemble
|
||||
# elif self.aiModel_var.get() == 'MDX-Net':
|
||||
# inference = inference_MDX
|
||||
# elif self.aiModel_var.get() == 'Demucs v3':
|
||||
# inference = inference_demucs
|
||||
|
||||
if confirm:
|
||||
inf.kill()
|
||||
button_widget = self.conversion_Button
|
||||
@@ -1864,6 +1915,18 @@ class MainWindow(TkinterDnD.Tk):
|
||||
else:
|
||||
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
|
||||
def update_inputPaths(self):
|
||||
"""Update the music file entry"""
|
||||
@@ -1981,6 +2044,14 @@ class MainWindow(TkinterDnD.Tk):
|
||||
for char in j:
|
||||
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,
|
||||
command=tk._setit(self.mdxnetModel_var, file_name_1))
|
||||
|
||||
@@ -2949,6 +3020,19 @@ class MainWindow(TkinterDnD.Tk):
|
||||
except:
|
||||
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:
|
||||
self.demucsmodel_var.set(True)
|
||||
self.options_demucsmodel_Checkbutton.configure(state=tk.DISABLED)
|
||||
@@ -3114,6 +3198,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.inst_only_var.set(False)
|
||||
self.inst_only_b_var.set(False)
|
||||
self.margin_var.set(44100)
|
||||
self.margin_d_var.set(44100)
|
||||
self.mdxensemchoose_var.set('MDX-Net: UVR-MDX-NET Main')
|
||||
self.mdxensemchoose_b_var.set('No Model')
|
||||
self.mdx_only_ensem_a_var.set('MDX-Net: UVR-MDX-NET Main')
|
||||
@@ -3129,6 +3214,8 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.ModelParams_var.set('Auto')
|
||||
self.mp3bit_var.set('320k')
|
||||
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.noisereduc_var.set(True)
|
||||
self.noisereduc_s_var.set(3)
|
||||
@@ -3170,40 +3257,43 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.wavtype_var.set('PCM_16')
|
||||
self.winSize_var.set('512')
|
||||
|
||||
|
||||
|
||||
def advanced_vr_options(self):
|
||||
"""
|
||||
Open Advanced VR Options
|
||||
"""
|
||||
|
||||
top=Toplevel(self)
|
||||
vr_opt=Toplevel(root)
|
||||
|
||||
window_height = 630
|
||||
window_width = 500
|
||||
|
||||
top.title("Advanced VR Options")
|
||||
|
||||
top.resizable(False, False) # This code helps to disable windows from resizing
|
||||
|
||||
screen_width = top.winfo_screenwidth()
|
||||
screen_height = top.winfo_screenheight()
|
||||
screen_width = vr_opt.winfo_screenwidth()
|
||||
screen_height = vr_opt.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
vr_opt.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def close_win():
|
||||
top.destroy()
|
||||
vr_opt.destroy()
|
||||
self.settings()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
tabControl = ttk.Notebook(vr_opt)
|
||||
|
||||
tab1 = 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)
|
||||
|
||||
def close_win_self():
|
||||
top.destroy()
|
||||
vr_opt.destroy()
|
||||
|
||||
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
||||
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.grid(row=9,column=0,padx=0,pady=5)
|
||||
|
||||
self.update_states()
|
||||
#self.update_states()
|
||||
|
||||
def advanced_demucs_options(self):
|
||||
"""
|
||||
Open Advanced Demucs Options
|
||||
"""
|
||||
top= Toplevel(self)
|
||||
demuc_opt= Toplevel(root)
|
||||
|
||||
window_height = 750
|
||||
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_height = top.winfo_screenheight()
|
||||
screen_width = demuc_opt.winfo_screenwidth()
|
||||
screen_height = demuc_opt.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
demuc_opt.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def close_win():
|
||||
top.destroy()
|
||||
demuc_opt.destroy()
|
||||
self.settings()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
|
||||
tab1 = ttk.Frame(tabControl)
|
||||
|
||||
tabControl.add(tab1, text ='Advanced Settings')
|
||||
tabControl = ttk.Notebook(demuc_opt)
|
||||
|
||||
tabControl.pack(expand = 1, fill ="both")
|
||||
|
||||
tab1.grid_rowconfigure(0, weight=1)
|
||||
tab1.grid_columnconfigure(0, weight=1)
|
||||
tabControl.grid_rowconfigure(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)
|
||||
|
||||
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=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=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=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=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=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=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=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=ttk.Entry(frame0, textvariable=self.overlap_b_var, justify='center')
|
||||
l0.grid(row=8,column=0,padx=0,pady=0)
|
||||
self.chunk_d_entry=ttk.Entry(frame0, textvariable=self.chunks_d_var, justify='center')
|
||||
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=ttk.Entry(frame0, textvariable=self.segment_var, justify='center')
|
||||
l0.grid(row=10,column=0,padx=0,pady=0)
|
||||
self.margin_d_entry=ttk.Entry(frame0, textvariable=self.margin_d_var, justify='center')
|
||||
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.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=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=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():
|
||||
top.destroy()
|
||||
demuc_opt.destroy()
|
||||
|
||||
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):
|
||||
"""
|
||||
Open Advanced MDX Options
|
||||
"""
|
||||
top= Toplevel(self)
|
||||
mdx_net_opt= Toplevel(root)
|
||||
|
||||
window_height = 740
|
||||
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_height = top.winfo_screenheight()
|
||||
screen_width = mdx_net_opt.winfo_screenwidth()
|
||||
screen_height = mdx_net_opt.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
mdx_net_opt.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def close_win():
|
||||
top.destroy()
|
||||
mdx_net_opt.destroy()
|
||||
self.settings()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
tabControl = ttk.Notebook(mdx_net_opt)
|
||||
|
||||
tab1 = 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)
|
||||
|
||||
def close_win_self():
|
||||
top.destroy()
|
||||
mdx_net_opt.destroy()
|
||||
|
||||
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
||||
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.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=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=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=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=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=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()
|
||||
|
||||
frame0=Frame(tab3, highlightbackground='red',highlightthicknes=0)
|
||||
@@ -3589,7 +3700,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
|
||||
|
||||
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):
|
||||
if basename.endswith('.json'):
|
||||
@@ -3610,33 +3721,41 @@ class MainWindow(TkinterDnD.Tk):
|
||||
"""
|
||||
Open Ensemble Custom
|
||||
"""
|
||||
top= Toplevel(self)
|
||||
custom_ens_opt= Toplevel(root)
|
||||
|
||||
window_height = 680
|
||||
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_height = top.winfo_screenheight()
|
||||
screen_width = custom_ens_opt.winfo_screenwidth()
|
||||
screen_height = custom_ens_opt.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
custom_ens_opt.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def close_win():
|
||||
top.destroy()
|
||||
custom_ens_opt.destroy()
|
||||
self.settings()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
tabControl = ttk.Notebook(custom_ens_opt)
|
||||
|
||||
tab1 = 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)
|
||||
|
||||
def close_win_self():
|
||||
top.destroy()
|
||||
custom_ens_opt.destroy()
|
||||
|
||||
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
||||
l0.grid(row=13,column=1,padx=20,pady=0)
|
||||
@@ -3959,7 +4078,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
"""
|
||||
Open Help Guide
|
||||
"""
|
||||
top= Toplevel(self)
|
||||
help_guide_opt = Toplevel(self)
|
||||
if GetSystemMetrics(1) >= 900:
|
||||
window_height = 810
|
||||
window_width = 1080
|
||||
@@ -3969,28 +4088,32 @@ class MainWindow(TkinterDnD.Tk):
|
||||
else:
|
||||
window_height = 670
|
||||
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 = top.winfo_screenwidth()
|
||||
screen_height = top.winfo_screenheight()
|
||||
screen_width = help_guide_opt.winfo_screenwidth()
|
||||
screen_height = help_guide_opt.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
help_guide_opt.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def close_win():
|
||||
top.destroy()
|
||||
help_guide_opt.destroy()
|
||||
self.settings()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
tabControl = ttk.Notebook(help_guide_opt)
|
||||
|
||||
tab1 = 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_set_var = tk.StringVar(value='UVR Version Current')
|
||||
|
||||
top= Toplevel(self)
|
||||
settings_menu = Toplevel(self)
|
||||
|
||||
window_height = 780
|
||||
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 = top.winfo_screenwidth()
|
||||
screen_height = top.winfo_screenheight()
|
||||
screen_width = settings_menu.winfo_screenwidth()
|
||||
screen_height = settings_menu.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
settings_menu.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def askyesorno():
|
||||
"""
|
||||
Ask to Update
|
||||
"""
|
||||
|
||||
top_dialoge= Toplevel()
|
||||
top_dialoge = Toplevel()
|
||||
|
||||
window_height = 250
|
||||
window_width = 370
|
||||
@@ -4329,7 +4455,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
|
||||
top_dialoge.attributes("-topmost", True)
|
||||
|
||||
top.attributes("-topmost", False)
|
||||
settings_menu.attributes("-topmost", False)
|
||||
|
||||
screen_width = top_dialoge.winfo_screenwidth()
|
||||
screen_height = top_dialoge.winfo_screenheight()
|
||||
@@ -4350,12 +4476,12 @@ class MainWindow(TkinterDnD.Tk):
|
||||
tabControl.grid_columnconfigure(0, weight=1)
|
||||
|
||||
def no():
|
||||
top.attributes("-topmost", True)
|
||||
settings_menu.attributes("-topmost", True)
|
||||
top_dialoge.destroy()
|
||||
|
||||
def yes():
|
||||
download_update()
|
||||
top.attributes("-topmost", True)
|
||||
settings_menu.attributes("-topmost", True)
|
||||
top_dialoge.destroy()
|
||||
|
||||
frame0=Frame(tabControl,highlightbackground='red',highlightthicknes=0)
|
||||
@@ -4385,7 +4511,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
top_code.destroy()
|
||||
except:
|
||||
pass
|
||||
top.destroy()
|
||||
settings_menu.destroy()
|
||||
|
||||
def close_win_custom_ensemble():
|
||||
change_event()
|
||||
@@ -4415,10 +4541,10 @@ class MainWindow(TkinterDnD.Tk):
|
||||
change_event()
|
||||
|
||||
def restart():
|
||||
top.destroy()
|
||||
settings_menu.destroy()
|
||||
self.restart()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
tabControl = ttk.Notebook(settings_menu)
|
||||
|
||||
tab1 = ttk.Frame(tabControl)
|
||||
tab2 = ttk.Frame(tabControl)
|
||||
@@ -4533,7 +4659,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
rlg.start()
|
||||
|
||||
def open_bmac_m():
|
||||
top.attributes("-topmost", False)
|
||||
settings_menu.attributes("-topmost", False)
|
||||
callback("https://www.buymeacoffee.com/uvr5")
|
||||
|
||||
l0=ttk.Button(frame0,text=update_button_var.get(), command=start_check_updates)
|
||||
@@ -4598,7 +4724,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
|
||||
global top_code
|
||||
|
||||
top_code= Toplevel()
|
||||
top_code = Toplevel(settings_menu)
|
||||
|
||||
window_height = 480
|
||||
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.attributes("-topmost", True)
|
||||
# top_code.attributes("-topmost", True)
|
||||
|
||||
top.attributes("-topmost", False)
|
||||
# settings_menu.attributes("-topmost", False)
|
||||
|
||||
screen_width = top_code.winfo_screenwidth()
|
||||
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))
|
||||
|
||||
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
|
||||
top_code.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
@@ -4656,7 +4787,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
callback("https://www.buymeacoffee.com/uvr5")
|
||||
|
||||
def quit():
|
||||
top.attributes("-topmost", True)
|
||||
settings_menu.attributes("-topmost", True)
|
||||
top_code.destroy()
|
||||
|
||||
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.attributes("-topmost", True)
|
||||
|
||||
top.attributes("-topmost", False)
|
||||
|
||||
screen_width = top_code.winfo_screenwidth()
|
||||
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))
|
||||
|
||||
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
|
||||
top_code.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
@@ -4752,7 +4884,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
top_code.destroy()
|
||||
|
||||
def quit():
|
||||
top.attributes("-topmost", True)
|
||||
settings_menu.attributes("-topmost", True)
|
||||
top_code.destroy()
|
||||
|
||||
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')
|
||||
url_link = f"{links}{pack_name}.exe"
|
||||
#print(url_link)
|
||||
top.attributes("-topmost", False)
|
||||
settings_menu.attributes("-topmost", False)
|
||||
try:
|
||||
if os.path.isfile(f"{cwd_path}/{pack_name}.exe"):
|
||||
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)
|
||||
move_lists_from_temp()
|
||||
self.download_progress_bar_var.set('Download list\'s refreshed!')
|
||||
top.destroy()
|
||||
settings_menu.destroy()
|
||||
self.settings(choose=True)
|
||||
except Exception as 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)
|
||||
move_lists_from_temp()
|
||||
self.download_progress_bar_var.set('VIP: Download list\'s refreshed!')
|
||||
top.destroy()
|
||||
settings_menu.destroy()
|
||||
self.settings(choose=True)
|
||||
except Exception as 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)
|
||||
move_lists_from_temp()
|
||||
self.download_progress_bar_var.set('Developer: Download list\'s refreshed!')
|
||||
top.destroy()
|
||||
settings_menu.destroy()
|
||||
self.settings(choose=True)
|
||||
except Exception as e:
|
||||
short_error = f'{e}'
|
||||
@@ -5983,7 +6115,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
self.download_progress_var.set('')
|
||||
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()
|
||||
|
||||
@@ -5991,7 +6123,8 @@ class MainWindow(TkinterDnD.Tk):
|
||||
"""
|
||||
Open Error Log
|
||||
"""
|
||||
top= Toplevel(self)
|
||||
error_log_screen= Toplevel(root)
|
||||
|
||||
if GetSystemMetrics(1) >= 900:
|
||||
window_height = 810
|
||||
window_width = 1080
|
||||
@@ -6002,31 +6135,42 @@ class MainWindow(TkinterDnD.Tk):
|
||||
window_height = 670
|
||||
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_height = top.winfo_screenheight()
|
||||
screen_width = error_log_screen.winfo_screenwidth()
|
||||
screen_height = error_log_screen.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
top.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
error_log_screen.iconbitmap('img\\UVR-Icon-v2.ico')
|
||||
|
||||
def close_win():
|
||||
top.destroy()
|
||||
error_log_screen.destroy()
|
||||
self.settings()
|
||||
|
||||
def close_win_self():
|
||||
top.destroy()
|
||||
error_log_screen.destroy()
|
||||
|
||||
tabControl = ttk.Notebook(top)
|
||||
tabControl = ttk.Notebook(error_log_screen)
|
||||
|
||||
tab1 = ttk.Frame(tabControl)
|
||||
|
||||
@@ -6059,7 +6203,6 @@ class MainWindow(TkinterDnD.Tk):
|
||||
l0=ttk.Button(frame0,text='Close Window', command=close_win_self)
|
||||
l0.grid(row=6,column=0,padx=20,pady=0)
|
||||
|
||||
|
||||
def copy_clip(self):
|
||||
copy_t = open("errorlog.txt", "r").read()
|
||||
pyperclip.copy(copy_t)
|
||||
@@ -6157,6 +6300,7 @@ class MainWindow(TkinterDnD.Tk):
|
||||
'inst_only_b': self.inst_only_b_var.get(),
|
||||
'lastDir': self.lastDir,
|
||||
'margin': self.margin_var.get(),
|
||||
'margin_d': self.margin_d_var.get(),
|
||||
'mdx_ensem': self.mdxensemchoose_var.get(),
|
||||
'mdx_ensem_b': self.mdxensemchoose_b_var.get(),
|
||||
'mdx_only_ensem_a': self.mdx_only_ensem_a_var.get(),
|
||||
@@ -6176,6 +6320,8 @@ class MainWindow(TkinterDnD.Tk):
|
||||
'ModelParams': self.ModelParams_var.get(),
|
||||
'mp3bit': self.mp3bit_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_reduc': self.noisereduc_var.get(),
|
||||
'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.
+56
-8
@@ -10,11 +10,13 @@ inteprolation between chunks, as well as the "shift trick".
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
import random
|
||||
import typing as tp
|
||||
from multiprocessing import Process,Queue,Pipe
|
||||
|
||||
import torch as th
|
||||
from torch import nn
|
||||
from torch.nn import functional as F
|
||||
import tqdm
|
||||
import tkinter as tk
|
||||
|
||||
from .demucs import Demucs
|
||||
from .hdemucs import HDemucs
|
||||
@@ -22,6 +24,7 @@ from .utils import center_trim, DummyPoolExecutor
|
||||
|
||||
Model = tp.Union[Demucs, HDemucs]
|
||||
|
||||
progress_bar_num = 0
|
||||
|
||||
class BagOfModels(nn.Module):
|
||||
def __init__(self, models: tp.List[Model],
|
||||
@@ -107,7 +110,6 @@ class TensorChunk:
|
||||
assert out.shape[-1] == target_length
|
||||
return out
|
||||
|
||||
|
||||
def tensor_chunk(tensor_or_chunk):
|
||||
if isinstance(tensor_or_chunk, TensorChunk):
|
||||
return tensor_or_chunk
|
||||
@@ -115,10 +117,9 @@ def tensor_chunk(tensor_or_chunk):
|
||||
assert isinstance(tensor_or_chunk, th.Tensor)
|
||||
return TensorChunk(tensor_or_chunk)
|
||||
|
||||
|
||||
def apply_model(model, mix, shifts=1, split=True,
|
||||
overlap=0.25, transition_power=1., progress=False, device=None,
|
||||
num_workers=0, pool=None):
|
||||
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,
|
||||
overlap=0.25, transition_power=1., progress=True, device=None,
|
||||
num_workers=0, pool=None, segmen=False):
|
||||
"""
|
||||
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
|
||||
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:
|
||||
device = mix.device
|
||||
else:
|
||||
@@ -145,7 +152,12 @@ def apply_model(model, mix, shifts=1, split=True,
|
||||
pool = ThreadPoolExecutor(num_workers)
|
||||
else:
|
||||
pool = DummyPoolExecutor()
|
||||
|
||||
kwargs = {
|
||||
'gui_progress_bar': gui_progress_bar,
|
||||
'widget_text': widget_text,
|
||||
'update_prog': update_prog,
|
||||
'segmen': segmen,
|
||||
'shifts': shifts,
|
||||
'split': split,
|
||||
'overlap': overlap,
|
||||
@@ -153,17 +165,35 @@ def apply_model(model, mix, shifts=1, split=True,
|
||||
'progress': progress,
|
||||
'device': device,
|
||||
'pool': pool,
|
||||
'total_files': total_files,
|
||||
'file_num': file_num,
|
||||
'inference_type': inference_type
|
||||
}
|
||||
|
||||
if isinstance(model, BagOfModels):
|
||||
# Special treatment for bag of model.
|
||||
# We explicitely apply multiple times `apply_model` so that the random shifts
|
||||
# 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
|
||||
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):
|
||||
original_model_device = next(iter(sub_model.parameters())).device
|
||||
sub_model.to(device)
|
||||
|
||||
fut_length += fut_length
|
||||
current_model += 1
|
||||
out = apply_model(sub_model, mix, **kwargs)
|
||||
sub_model.to(original_model_device)
|
||||
for k, inst_weight in enumerate(weight):
|
||||
@@ -179,6 +209,7 @@ def apply_model(model, mix, shifts=1, split=True,
|
||||
model.to(device)
|
||||
assert transition_power >= 1, "transition_power < 1 leads to weird behavior."
|
||||
batch, channels, length = mix.shape
|
||||
|
||||
if split:
|
||||
kwargs['split'] = False
|
||||
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)
|
||||
futures.append((future, offset))
|
||||
offset += segment
|
||||
if progress:
|
||||
futures = tqdm.tqdm(futures, unit_scale=scale, ncols=120, unit='seconds')
|
||||
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_length = chunk_out.shape[-1]
|
||||
out[..., offset:offset + segment] += (weight[:chunk_length] * chunk_out).to(mix.device)
|
||||
|
||||
+63
-7
@@ -22,6 +22,7 @@ import socket
|
||||
import tempfile
|
||||
import warnings
|
||||
import zlib
|
||||
import tkinter as tk
|
||||
|
||||
from diffq import UniformQuantizer, DiffQuantizer
|
||||
import torch as th
|
||||
@@ -228,7 +229,7 @@ def tensor_chunk(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.
|
||||
|
||||
@@ -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.
|
||||
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()
|
||||
device = mix.device
|
||||
if split:
|
||||
@@ -249,11 +254,31 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
|
||||
shift = model.samplerate * 10
|
||||
offsets = range(0, length, shift)
|
||||
scale = 10
|
||||
progress_bar = 0
|
||||
prog_bar = 0
|
||||
if progress:
|
||||
offsets = tqdm.tqdm(offsets, unit_scale=scale, ncols=120, unit='seconds')
|
||||
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_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
|
||||
offset += shift
|
||||
return out
|
||||
@@ -265,7 +290,7 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
|
||||
out = 0
|
||||
for offset in offsets[:shifts]:
|
||||
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 /= shifts
|
||||
return out
|
||||
@@ -277,8 +302,8 @@ def apply_model_v1(model, mix, shifts=None, split=False, progress=False):
|
||||
out = model(padded.unsqueeze(0))[0]
|
||||
return center_trim(out, mix)
|
||||
|
||||
def apply_model_v2(model, mix, shifts=None, split=False,
|
||||
overlap=0.25, transition_power=1., progress=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, segmen=True):
|
||||
"""
|
||||
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.
|
||||
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."
|
||||
device = mix.device
|
||||
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
|
||||
# transition_power is 1.
|
||||
weight = (weight / weight.max())**transition_power
|
||||
progress_bar = 0
|
||||
prog_bar = 0
|
||||
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_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]
|
||||
out[..., offset:offset + segment] += weight[:chunk_length] * chunk_out
|
||||
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):
|
||||
offset = random.randint(0, max_shift)
|
||||
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 /= shifts
|
||||
return out
|
||||
|
||||
+323
-82
@@ -35,6 +35,7 @@ import pydub
|
||||
import shutil
|
||||
import soundfile as sf
|
||||
import subprocess
|
||||
from UVR import MainWindow
|
||||
import sys
|
||||
import time
|
||||
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.compensate_v_var = tk.StringVar(value=1.03597672895)
|
||||
|
||||
top= Toplevel()
|
||||
mdx_model_set = Toplevel()
|
||||
|
||||
top.geometry("740x550")
|
||||
window_height = 740
|
||||
window_width = 550
|
||||
mdx_model_set.geometry("490x515")
|
||||
window_height = 490
|
||||
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_height = top.winfo_screenheight()
|
||||
screen_width = mdx_model_set.winfo_screenwidth()
|
||||
screen_height = mdx_model_set.winfo_screenheight()
|
||||
|
||||
x_cordinate = int((screen_width/2) - (window_width/2))
|
||||
y_cordinate = int((screen_height/2) - (window_height/2))
|
||||
|
||||
top.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
|
||||
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
|
||||
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)
|
||||
tabControl.grid_columnconfigure(0, weight=1)
|
||||
mdx_model_set_window.grid_rowconfigure(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.tkraise(frame0)
|
||||
#frame0.tkraise(frame0)
|
||||
|
||||
space_small = ' '*20
|
||||
space_small_1 = ' '*10
|
||||
|
||||
l0=tk.Label(frame0, text=f'{space_small}Stem Type{space_small}', font=("Century Gothic", "9"), foreground='#13a4c9')
|
||||
l0=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=ttk.OptionMenu(frame0, self.mdxnetModeltype_var, None, 'Vocals', 'Instrumental', 'Other', 'Bass', 'Drums')
|
||||
@@ -160,18 +166,15 @@ class Predictor():
|
||||
torch.cuda.empty_cache()
|
||||
gui_progress_bar.set(0)
|
||||
widget_button.configure(state=tk.NORMAL) # Enable Button
|
||||
top.destroy()
|
||||
self.okVar.set(1)
|
||||
stop_button()
|
||||
mdx_model_set.destroy()
|
||||
return
|
||||
|
||||
l0=ttk.Button(frame0,text="Stop Process", command=stop)
|
||||
l0.grid(row=13,column=1,padx=0,pady=30)
|
||||
|
||||
def change_event():
|
||||
self.okVar.set(1)
|
||||
#top.destroy()
|
||||
pass
|
||||
|
||||
top.protocol("WM_DELETE_WINDOW", change_event)
|
||||
mdx_model_set.protocol("WM_DELETE_WINDOW", stop)
|
||||
|
||||
frame0.wait_variable(self.okVar)
|
||||
|
||||
@@ -217,13 +220,13 @@ class Predictor():
|
||||
stem_text_b = 'Vocals'
|
||||
elif stemset_n == '(Other)':
|
||||
stem_text_a = 'Other'
|
||||
stem_text_b = 'the no \"Other\" track'
|
||||
stem_text_b = 'mixture without selected stem'
|
||||
elif stemset_n == '(Drums)':
|
||||
stem_text_a = 'Drums'
|
||||
stem_text_b = 'no \"Drums\" track'
|
||||
stem_text_b = 'mixture without selected stem'
|
||||
elif stemset_n == '(Bass)':
|
||||
stem_text_a = 'Bass'
|
||||
stem_text_b = 'No \"Bass\" track'
|
||||
stem_text_b = 'mixture without selected stem'
|
||||
else:
|
||||
stem_text_a = 'Vocals'
|
||||
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')
|
||||
demucs_model_set = 'UVR_Demucs_Model_1'
|
||||
|
||||
top.destroy()
|
||||
mdx_model_set.destroy()
|
||||
|
||||
def prediction_setup(self):
|
||||
|
||||
@@ -287,6 +290,10 @@ class Predictor():
|
||||
self.demucs.to(device)
|
||||
self.demucs.load_state_dict(state)
|
||||
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 '48' in demucs_model_set:
|
||||
@@ -306,6 +313,10 @@ class Predictor():
|
||||
self.demucs.to(device)
|
||||
self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set}"))
|
||||
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()
|
||||
|
||||
if demucs_model_version == 'v3':
|
||||
@@ -325,6 +336,37 @@ class Predictor():
|
||||
if isinstance(self.demucs, BagOfModels):
|
||||
widget_text.write(base_text + f"Selected Demucs model is a bag of {len(self.demucs.models)} model(s).\n")
|
||||
|
||||
if 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 = {}
|
||||
c = 0
|
||||
|
||||
@@ -394,13 +436,13 @@ class Predictor():
|
||||
if data['modelFolder']:
|
||||
vocal_path = '{save_path}/{file_name}.wav'.format(
|
||||
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(
|
||||
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(
|
||||
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:
|
||||
vocal_path = '{save_path}/{file_name}.wav'.format(
|
||||
save_path=save_path,
|
||||
@@ -428,13 +470,13 @@ class Predictor():
|
||||
if data['modelFolder']:
|
||||
Instrumental_path = '{save_path}/{file_name}.wav'.format(
|
||||
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(
|
||||
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(
|
||||
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:
|
||||
Instrumental_path = '{save_path}/{file_name}.wav'.format(
|
||||
save_path=save_path,
|
||||
@@ -461,13 +503,13 @@ class Predictor():
|
||||
if data['modelFolder']:
|
||||
non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format(
|
||||
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(
|
||||
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(
|
||||
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:
|
||||
non_reduced_vocal_path = '{save_path}/{file_name}.wav'.format(
|
||||
save_path=save_path,
|
||||
@@ -482,13 +524,13 @@ class Predictor():
|
||||
if data['modelFolder']:
|
||||
non_reduced_Instrumental_path = '{save_path}/{file_name}.wav'.format(
|
||||
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(
|
||||
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(
|
||||
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:
|
||||
non_reduced_Instrumental_path = '{save_path}/{file_name}.wav'.format(
|
||||
save_path=save_path,
|
||||
@@ -918,19 +960,21 @@ class Predictor():
|
||||
widget_text.write(base_text + 'Completed Separation!\n')
|
||||
|
||||
def demix(self, mix):
|
||||
global chunk_set
|
||||
|
||||
# 1 = demucs only
|
||||
# 0 = onnx only
|
||||
if data['chunks'] == 'Full':
|
||||
chunk_set = 0
|
||||
else:
|
||||
chunk_set = data['chunks']
|
||||
|
||||
if data['chunks'] == 'Auto':
|
||||
widget_text.write(base_text + "Chunk size user-set to \"Full\"... \n")
|
||||
elif data['chunks'] == 'Auto':
|
||||
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')
|
||||
data['gpu'] = -1
|
||||
pass
|
||||
if int(gpu_mem) <= int(6):
|
||||
chunk_set = int(5)
|
||||
widget_text.write(base_text + 'Chunk size auto-set to 5... \n')
|
||||
@@ -954,9 +998,9 @@ class Predictor():
|
||||
if int(sys_mem) >= int(17):
|
||||
chunk_set = int(60)
|
||||
widget_text.write(base_text + 'Chunk size auto-set to 60... \n')
|
||||
elif data['chunks'] == 'Full':
|
||||
elif data['chunks'] == '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:
|
||||
chunk_set = int(data['chunks'])
|
||||
widget_text.write(base_text + "Chunk size user-set to "f"{chunk_set}... \n")
|
||||
@@ -987,28 +1031,32 @@ class Predictor():
|
||||
if end == samples:
|
||||
break
|
||||
|
||||
|
||||
if not data['demucsmodel']:
|
||||
sources = self.demix_base(segmented_mix, margin_size=margin)
|
||||
elif data['demucs_only']:
|
||||
if split_mode == True:
|
||||
if no_chunk_demucs == False:
|
||||
sources = self.demix_demucs_split(mix)
|
||||
if split_mode == False:
|
||||
if no_chunk_demucs == True:
|
||||
sources = self.demix_demucs(segmented_mix, margin_size=margin)
|
||||
else: # both, apply spec effects
|
||||
base_out = self.demix_base(segmented_mix, margin_size=margin)
|
||||
#print(split_mode)
|
||||
|
||||
|
||||
if demucs_model_version == 'v1':
|
||||
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 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 split_mode == True:
|
||||
if no_chunk_demucs == False:
|
||||
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)
|
||||
|
||||
nan_count = np.count_nonzero(np.isnan(demucs_out)) + np.count_nonzero(np.isnan(base_out))
|
||||
if nan_count > 0:
|
||||
print('Warning: there are {} nan values in the array(s).'.format(nan_count))
|
||||
@@ -1040,10 +1088,15 @@ class Predictor():
|
||||
onnxitera = len(mixes)
|
||||
onnxitera_calc = onnxitera * 2
|
||||
gui_progress_bar_onnx = 0
|
||||
widget_text.write(base_text + "Running ONNX Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{onnxitera} slices... ")
|
||||
progress_bar = 0
|
||||
|
||||
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:
|
||||
gui_progress_bar_onnx += 1
|
||||
if data['demucsmodel']:
|
||||
@@ -1053,6 +1106,15 @@ class Predictor():
|
||||
update_progress(**progress_kwargs,
|
||||
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]
|
||||
sources = []
|
||||
n_sample = cmix.shape[1]
|
||||
@@ -1088,21 +1150,35 @@ class Predictor():
|
||||
chunked_sources.append(sources)
|
||||
_sources = np.concatenate(chunked_sources, axis=-1)
|
||||
del self.onnx_models
|
||||
|
||||
if onnxitera == 1:
|
||||
widget_text.write('Done!\n')
|
||||
else:
|
||||
widget_text.write('\n')
|
||||
|
||||
return _sources
|
||||
|
||||
def demix_demucs(self, mix, margin_size):
|
||||
#print('shift_set ', shift_set)
|
||||
processed = {}
|
||||
demucsitera = len(mix)
|
||||
demucsitera_calc = demucsitera * 2
|
||||
gui_progress_bar_demucs = 0
|
||||
widget_text.write(base_text + "Split Mode is off. (Chunks enabled for Demucs Model)\n")
|
||||
widget_text.write(base_text + "Running Demucs Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
|
||||
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")
|
||||
|
||||
print(' Running Demucs Inference...')
|
||||
for nmix in mix:
|
||||
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,
|
||||
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs)))
|
||||
cmix = mix[nmix]
|
||||
@@ -1110,8 +1186,17 @@ class Predictor():
|
||||
ref = cmix.mean(0)
|
||||
cmix = (cmix - ref.mean()) / ref.std()
|
||||
with torch.no_grad():
|
||||
#print(split_mode)
|
||||
sources = apply_model(self.demucs, cmix[None], split=split_mode, device=device, overlap=overlap_set, shifts=shift_set, progress=False)[0]
|
||||
sources = 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[[0,1]] = sources[[1,0]]
|
||||
|
||||
@@ -1123,17 +1208,21 @@ class Predictor():
|
||||
|
||||
sources = list(processed.values())
|
||||
sources = np.concatenate(sources, axis=-1)
|
||||
|
||||
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):
|
||||
|
||||
#print('shift_set ', shift_set)
|
||||
widget_text.write(base_text + "Split Mode is on. (Chunks disabled for Demucs Model)\n")
|
||||
widget_text.write(base_text + "Running Demucs Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
|
||||
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)
|
||||
@@ -1141,15 +1230,27 @@ class Predictor():
|
||||
mix = (mix - ref.mean()) / ref.std()
|
||||
|
||||
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]
|
||||
|
||||
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]]
|
||||
|
||||
#print('the demucs model is done running')
|
||||
|
||||
return sources
|
||||
|
||||
def demix_demucs_v1(self, mix, margin_size):
|
||||
@@ -1157,11 +1258,21 @@ class Predictor():
|
||||
demucsitera = len(mix)
|
||||
demucsitera_calc = demucsitera * 2
|
||||
gui_progress_bar_demucs = 0
|
||||
widget_text.write(base_text + "Running Demucs v1 Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
|
||||
progress_bar = 0
|
||||
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:
|
||||
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,
|
||||
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs)))
|
||||
cmix = mix[nmix]
|
||||
@@ -1169,7 +1280,15 @@ class Predictor():
|
||||
ref = cmix.mean(0)
|
||||
cmix = (cmix - ref.mean()) / ref.std()
|
||||
with torch.no_grad():
|
||||
sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set)
|
||||
sources = 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[[0,1]] = sources[[1,0]]
|
||||
|
||||
@@ -1181,7 +1300,44 @@ class Predictor():
|
||||
|
||||
sources = list(processed.values())
|
||||
sources = np.concatenate(sources, axis=-1)
|
||||
|
||||
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
|
||||
|
||||
def demix_demucs_v2(self, mix, margin_size):
|
||||
@@ -1189,11 +1345,22 @@ class Predictor():
|
||||
demucsitera = len(mix)
|
||||
demucsitera_calc = demucsitera * 2
|
||||
gui_progress_bar_demucs = 0
|
||||
widget_text.write(base_text + "Running Demucs v2 Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
|
||||
print(' Running Demucs Inference...')
|
||||
progress_bar = 0
|
||||
if demucsitera == 1:
|
||||
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:
|
||||
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,
|
||||
step=(0.35 + (1.05/demucsitera_calc * gui_progress_bar_demucs)))
|
||||
cmix = mix[nmix]
|
||||
@@ -1201,7 +1368,16 @@ class Predictor():
|
||||
ref = cmix.mean(0)
|
||||
cmix = (cmix - ref.mean()) / ref.std()
|
||||
with torch.no_grad():
|
||||
sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set)
|
||||
sources = 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[[0,1]] = sources[[1,0]]
|
||||
|
||||
@@ -1213,9 +1389,46 @@ class Predictor():
|
||||
|
||||
sources = list(processed.values())
|
||||
sources = np.concatenate(sources, axis=-1)
|
||||
|
||||
if demucsitera == 1:
|
||||
widget_text.write('Done!\n')
|
||||
else:
|
||||
widget_text.write('\n')
|
||||
|
||||
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 = {
|
||||
@@ -1240,6 +1453,7 @@ data = {
|
||||
'modelFolder': False,
|
||||
'mp3bit': '320k',
|
||||
'n_fft_scale': 6144,
|
||||
'no_chunk': False,
|
||||
'noise_pro_select': 'Auto Select',
|
||||
'noisereduc_s': 3,
|
||||
'non_red': False,
|
||||
@@ -1247,6 +1461,7 @@ data = {
|
||||
'normalize': False,
|
||||
'overlap': 0.5,
|
||||
'saveFormat': 'Wav',
|
||||
'segment': 'Default',
|
||||
'shifts': 0,
|
||||
'split_mode': False,
|
||||
'voc_only': False,
|
||||
@@ -1286,6 +1501,7 @@ def main(window: tk.Wm,
|
||||
text_widget: tk.Text,
|
||||
button_widget: tk.Button,
|
||||
progress_var: tk.Variable,
|
||||
stop_thread,
|
||||
**kwargs: dict):
|
||||
|
||||
global widget_text
|
||||
@@ -1299,8 +1515,10 @@ def main(window: tk.Wm,
|
||||
global n_fft_scale_set
|
||||
global dim_f_set
|
||||
global progress_kwargs
|
||||
global progress_demucs_kwargs
|
||||
global base_text
|
||||
global model_set_name
|
||||
global mdx_model_name
|
||||
global stemset_n
|
||||
global stem_text_a
|
||||
global stem_text_b
|
||||
@@ -1325,17 +1543,20 @@ def main(window: tk.Wm,
|
||||
global stime
|
||||
global model_hash
|
||||
global demucs_switch
|
||||
global no_chunk_demucs
|
||||
global inst_only
|
||||
global voc_only
|
||||
global space
|
||||
global main_window
|
||||
global stop_button
|
||||
|
||||
|
||||
# Update default settings
|
||||
default_chunks = data['chunks']
|
||||
default_noisereduc_s = data['noisereduc_s']
|
||||
stop_button = stop_thread
|
||||
|
||||
widget_text = text_widget
|
||||
gui_progress_bar = progress_var
|
||||
widget_button = button_widget
|
||||
main_window = window
|
||||
|
||||
|
||||
#Error Handling
|
||||
|
||||
@@ -1361,6 +1582,15 @@ def main(window: tk.Wm,
|
||||
|
||||
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":
|
||||
demucs_model_set_name = 'tasnet.th'
|
||||
demucs_model_version = 'v1'
|
||||
@@ -1436,6 +1666,10 @@ def main(window: tk.Wm,
|
||||
mdx_model_name = 'UVR_MDXNET_KARA'
|
||||
elif model_set_name == 'UVR-MDX-NET 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:
|
||||
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]}'
|
||||
else:
|
||||
_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-
|
||||
base_text = get_baseText(total_files=len(data['input_paths']),
|
||||
file_num=file_num)
|
||||
progress_kwargs = {'progress_var': progress_var,
|
||||
'total_files': len(data['input_paths']),
|
||||
'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:
|
||||
@@ -1603,6 +1843,7 @@ def main(window: tk.Wm,
|
||||
|
||||
if stemset_n == '(Instrumental)':
|
||||
if not 'UVR' in demucs_model_set:
|
||||
if data['demucsmodel']:
|
||||
widget_text.write(base_text + 'The selected Demucs model cannot be used with this model.\n')
|
||||
widget_text.write(base_text + 'Only 2 stem Demucs models are compatible with this model.\n')
|
||||
widget_text.write(base_text + 'Setting Demucs model to \"UVR_Demucs_Model_1\".\n\n')
|
||||
@@ -1904,7 +2145,7 @@ def main(window: tk.Wm,
|
||||
text_widget.write(f'\nError Received:\n\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"\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'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
|
||||
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(base_text + f'"{os.path.basename(music_file)}"\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(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)))}')
|
||||
|
||||
+335
-75
@@ -6,6 +6,7 @@ from demucs.pretrained import get_model as _gm
|
||||
from demucs.tasnet_v2 import ConvTasNet
|
||||
from demucs.utils import apply_model_v1
|
||||
from demucs.utils import apply_model_v2
|
||||
import demucs.apply
|
||||
from diffq import DiffQuantizer
|
||||
from lib_v5 import spec_utils
|
||||
from lib_v5.model_param_init import ModelParameters
|
||||
@@ -30,6 +31,7 @@ import tkinter as tk
|
||||
import torch
|
||||
import torch.hub
|
||||
import traceback # Error Message Recent Calls
|
||||
import threading
|
||||
import warnings
|
||||
import zlib
|
||||
|
||||
@@ -58,8 +60,8 @@ class Predictor():
|
||||
self.demucs.to(device)
|
||||
self.demucs.load_state_dict(state)
|
||||
widget_text.write('Done!\n')
|
||||
if not data['segment'] == 'None':
|
||||
widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n')
|
||||
if not data['segment'] == 'Default':
|
||||
widget_text.write(base_text + 'Note: Segments only available for Demucs v3\n')
|
||||
else:
|
||||
pass
|
||||
|
||||
@@ -81,8 +83,8 @@ class Predictor():
|
||||
self.demucs.to(device)
|
||||
self.demucs.load_state_dict(torch.load("models/Demucs_Models/"f"{demucs_model_set_name}"))
|
||||
widget_text.write('Done!\n')
|
||||
if not data['segment'] == 'None':
|
||||
widget_text.write(base_text + 'Segments is only available in Demucs v3. Please use \"Chunks\" instead.\n')
|
||||
if not data['segment'] == 'Default':
|
||||
widget_text.write(base_text + 'Note: Segments only available for Demucs v3\n')
|
||||
else:
|
||||
pass
|
||||
self.demucs.eval()
|
||||
@@ -101,7 +103,7 @@ class Predictor():
|
||||
if isinstance(self.demucs, BagOfModels):
|
||||
widget_text.write(base_text + f"Selected model is a bag of {len(self.demucs.models)} models.\n")
|
||||
|
||||
if data['segment'] == 'None':
|
||||
if data['segment'] == 'Default':
|
||||
segment = None
|
||||
if isinstance(self.demucs, BagOfModels):
|
||||
if segment is not None:
|
||||
@@ -120,6 +122,7 @@ class Predictor():
|
||||
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
|
||||
@@ -145,7 +148,7 @@ class Predictor():
|
||||
|
||||
mix = 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
|
||||
save_path = os.path.dirname(_basename)
|
||||
@@ -155,6 +158,25 @@ class Predictor():
|
||||
drums_name = '(Drums)'
|
||||
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(
|
||||
save_path=save_path,
|
||||
file_name = f'{os.path.basename(_basename)}_{vocals_name}',)
|
||||
@@ -202,8 +224,6 @@ class Predictor():
|
||||
save_path=save_path,
|
||||
file_name = f'{os.path.basename(_basename)}_{bass_name}',)
|
||||
|
||||
|
||||
|
||||
#If not 'All Stems'
|
||||
|
||||
if stemset_n == '(Vocals)':
|
||||
@@ -273,7 +293,7 @@ class Predictor():
|
||||
|
||||
if not data['demucs_stems'] == 'All Stems':
|
||||
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:
|
||||
widget_text.write(base_text + 'Saving Stem(s)... ')
|
||||
else:
|
||||
@@ -415,7 +435,7 @@ class Predictor():
|
||||
widget_text.write('Done!\n')
|
||||
|
||||
update_progress(**progress_kwargs,
|
||||
step=(0.9))
|
||||
step=(1))
|
||||
|
||||
if data['demucs_stems'] == 'All Stems':
|
||||
pass
|
||||
@@ -430,7 +450,7 @@ class Predictor():
|
||||
'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)):
|
||||
|
||||
wave, specs = {}, {}
|
||||
@@ -470,7 +490,6 @@ class Predictor():
|
||||
|
||||
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 file_exists_v == 'there':
|
||||
pass
|
||||
@@ -482,7 +501,6 @@ class Predictor():
|
||||
|
||||
widget_text.write('Done!\n')
|
||||
|
||||
|
||||
if not data['demucs_stems'] == 'All Stems':
|
||||
|
||||
if data['saveFormat'] == 'Mp3':
|
||||
@@ -604,76 +622,65 @@ class Predictor():
|
||||
widget_text.write(base_text + 'Completed Separation!\n')
|
||||
|
||||
def demix(self, mix):
|
||||
|
||||
global chunk_set
|
||||
# 1 = demucs only
|
||||
# 0 = onnx only
|
||||
if data['chunks_d'] == 'Full':
|
||||
if split_mode == True:
|
||||
chunk_set = 0
|
||||
else:
|
||||
widget_text.write(base_text + "Chunk size set to full... \n")
|
||||
chunk_set = 0
|
||||
else:
|
||||
chunk_set = data['chunks']
|
||||
|
||||
if data['chunks_d'] == 'Auto':
|
||||
if split_mode == True:
|
||||
widget_text.write(base_text + "Split Mode is on (Chunks disabled).\n")
|
||||
if data['chunks_d'] == 'Full':
|
||||
chunk_set = 0
|
||||
else:
|
||||
widget_text.write(base_text + "Split Mode is off (Chunks enabled).\n")
|
||||
elif data['chunks_d'] == 'Auto':
|
||||
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(5)
|
||||
if no_chunk_demucs:
|
||||
widget_text.write(base_text + 'Chunk size auto-set to 5... \n')
|
||||
if gpu_mem in [7, 8, 9, 10, 11, 12, 13, 14, 15]:
|
||||
chunk_set = int(10)
|
||||
if no_chunk_demucs:
|
||||
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')
|
||||
chunk_set = int(40)
|
||||
if no_chunk_demucs:
|
||||
widget_text.write(base_text + 'Chunk size auto-set to 40... \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')
|
||||
if sys_mem in [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]:
|
||||
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 [17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32]:
|
||||
chunk_set = int(40)
|
||||
widget_text.write(base_text + 'Chunk size auto-set to 40... \n')
|
||||
if int(sys_mem) >= int(33):
|
||||
chunk_set = int(0)
|
||||
widget_text.write(base_text + 'Chunk size auto-set to Full... \n')
|
||||
else:
|
||||
if split_mode == True:
|
||||
widget_text.write(base_text + "Split Mode is on (Chunks disabled).\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
|
||||
else:
|
||||
widget_text.write(base_text + "Split Mode is off (Chunks enabled).\n")
|
||||
if data['chunks_d'] == 'Full':
|
||||
chunk_set = int(0)
|
||||
if no_chunk_demucs:
|
||||
widget_text.write(base_text + "Chunk size set to full... \n")
|
||||
else:
|
||||
chunk_set = data['chunks_d']
|
||||
chunk_set = int(data['chunks_d'])
|
||||
if no_chunk_demucs:
|
||||
widget_text.write(base_text + "Chunk size user-set to "f"{chunk_set}... \n")
|
||||
|
||||
samples = mix.shape[-1]
|
||||
margin = margin_set
|
||||
chunk_size = chunk_set*44100
|
||||
assert not margin == 0, 'margin cannot be zero!'
|
||||
|
||||
if margin > chunk_size:
|
||||
margin = chunk_size
|
||||
|
||||
|
||||
segmented_mix = {}
|
||||
|
||||
if chunk_set == 0 or samples < chunk_size:
|
||||
@@ -693,26 +700,44 @@ class Predictor():
|
||||
break
|
||||
|
||||
if demucs_model_version == 'v1':
|
||||
if no_chunk_demucs == False:
|
||||
sources = self.demix_demucs_v1_split(mix)
|
||||
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 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
|
||||
|
||||
def demix_demucs(self, mix, margin_size):
|
||||
|
||||
processed = {}
|
||||
demucsitera = len(mix)
|
||||
demucsitera_calc = demucsitera * 2
|
||||
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...')
|
||||
for nmix in mix:
|
||||
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,
|
||||
step=(0.1 + (1.7/demucsitera_calc * gui_progress_bar_demucs)))
|
||||
cmix = mix[nmix]
|
||||
@@ -720,7 +745,17 @@ class Predictor():
|
||||
ref = cmix.mean(0)
|
||||
cmix = (cmix - ref.mean()) / ref.std()
|
||||
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[[0,1]] = sources[[1,0]]
|
||||
|
||||
@@ -732,7 +767,49 @@ class Predictor():
|
||||
|
||||
sources = list(processed.values())
|
||||
sources = np.concatenate(sources, axis=-1)
|
||||
|
||||
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
|
||||
|
||||
def demix_demucs_v1(self, mix, margin_size):
|
||||
@@ -740,19 +817,37 @@ class Predictor():
|
||||
demucsitera = len(mix)
|
||||
demucsitera_calc = demucsitera * 2
|
||||
gui_progress_bar_demucs = 0
|
||||
widget_text.write(base_text + "Running Demucs v1 Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
|
||||
progress_bar = 0
|
||||
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:
|
||||
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,
|
||||
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 = torch.tensor(cmix, dtype=torch.float32)
|
||||
ref = cmix.mean(0)
|
||||
cmix = (cmix - ref.mean()) / ref.std()
|
||||
with torch.no_grad():
|
||||
sources = apply_model_v1(self.demucs, cmix.to(device), split=split_mode, shifts=shift_set)
|
||||
sources = 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[[0,1]] = sources[[1,0]]
|
||||
|
||||
@@ -764,7 +859,44 @@ class Predictor():
|
||||
|
||||
sources = list(processed.values())
|
||||
sources = np.concatenate(sources, axis=-1)
|
||||
|
||||
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
|
||||
|
||||
def demix_demucs_v2(self, mix, margin_size):
|
||||
@@ -772,20 +904,39 @@ class Predictor():
|
||||
demucsitera = len(mix)
|
||||
demucsitera_calc = demucsitera * 2
|
||||
gui_progress_bar_demucs = 0
|
||||
widget_text.write(base_text + "Running Demucs v2 Inference...\n")
|
||||
widget_text.write(base_text + "Processing "f"{len(mix)} slices... ")
|
||||
print(' Running Demucs Inference...')
|
||||
progress_bar = 0
|
||||
if demucsitera == 1:
|
||||
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:
|
||||
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,
|
||||
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 = torch.tensor(cmix, dtype=torch.float32)
|
||||
ref = cmix.mean(0)
|
||||
cmix = (cmix - ref.mean()) / ref.std()
|
||||
shift_set = 0
|
||||
with torch.no_grad():
|
||||
sources = apply_model_v2(self.demucs, cmix.to(device), split=split_mode, overlap=overlap_set, shifts=shift_set)
|
||||
sources = 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[[0,1]] = sources[[1,0]]
|
||||
|
||||
@@ -797,9 +948,48 @@ class Predictor():
|
||||
|
||||
sources = list(processed.values())
|
||||
sources = np.concatenate(sources, axis=-1)
|
||||
|
||||
if demucsitera == 1:
|
||||
widget_text.write('Done!\n')
|
||||
else:
|
||||
widget_text.write('\n')
|
||||
|
||||
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 = {
|
||||
'audfile': True,
|
||||
'chunks_d': 'Full',
|
||||
@@ -811,19 +1001,19 @@ data = {
|
||||
'gpu': -1,
|
||||
'input_paths': None,
|
||||
'inst_only_b': False,
|
||||
'margin': 44100,
|
||||
'margin_d': 44100,
|
||||
'mp3bit': '320k',
|
||||
'no_chunk_d': False,
|
||||
'normalize': False,
|
||||
'overlap_b': 0.25,
|
||||
'saveFormat': 'Wav',
|
||||
'segment': 'None',
|
||||
'segment': 'Default',
|
||||
'settest': False,
|
||||
'shifts_b': 2,
|
||||
'split_mode': False,
|
||||
'voc_only_b': False,
|
||||
'wavtype': 'PCM_16',
|
||||
}
|
||||
default_chunks = data['chunks_d']
|
||||
|
||||
def update_progress(progress_var, total_files, file_num, step: float = 1):
|
||||
"""Calculate the progress for the progress widget in the GUI"""
|
||||
@@ -861,6 +1051,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
global _basename
|
||||
global _mixture
|
||||
global progress_kwargs
|
||||
global progress_demucs_kwargs
|
||||
global base_text
|
||||
global model_set_name
|
||||
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 demucs_model_set_name
|
||||
global demucs_model_version
|
||||
|
||||
global wav_type_set
|
||||
global no_chunk_demucs
|
||||
global space
|
||||
global flac_type_set
|
||||
global mp3_bit_set
|
||||
global normalization_set
|
||||
global update_prog
|
||||
|
||||
update_prog = update_progress
|
||||
|
||||
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"""
|
||||
sf_write_err = "sf.write"
|
||||
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:
|
||||
with open('errorlog.txt', 'w') as f:
|
||||
@@ -921,6 +1117,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
|
||||
flac_type_set = data['flactype']
|
||||
mp3_bit_set = data['mp3bit']
|
||||
default_chunks = data['chunks_d']
|
||||
no_chunk_demucs = data['no_chunk_d']
|
||||
|
||||
|
||||
if data['normalize'] == True:
|
||||
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'])
|
||||
channel_set = int(data['channel'])
|
||||
margin_set = int(data['margin'])
|
||||
margin_set = int(data['margin_d'])
|
||||
shift_set = int(data['shifts_b'])
|
||||
|
||||
split_mode = data['split_mode']
|
||||
space = ' '*90
|
||||
|
||||
#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')
|
||||
|
||||
inference_type = 'demucs_only'
|
||||
|
||||
# -Get text and update progress-
|
||||
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,
|
||||
'total_files': len(data['input_paths']),
|
||||
'file_num': file_num}
|
||||
progress_demucs_kwargs = {'total_files': len(data['input_paths']),
|
||||
'file_num': file_num, 'inference_type': inference_type}
|
||||
|
||||
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'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"\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'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
|
||||
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
|
||||
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(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(base_text + f'"{os.path.basename(music_file)}"\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(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)))}')
|
||||
@@ -1500,3 +1746,17 @@ if __name__ == '__main__':
|
||||
main()
|
||||
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
|
||||
+97
-32
@@ -103,7 +103,7 @@ def determineModelFolderName():
|
||||
def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress_var: tk.Variable,
|
||||
**kwargs: dict):
|
||||
|
||||
global model_params_d
|
||||
global gui_progress_bar
|
||||
global nn_arch_sizes
|
||||
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 mp3_bit_set
|
||||
global space
|
||||
|
||||
wav_type_set = data['wavtype']
|
||||
|
||||
gui_progress_bar = progress_var
|
||||
#Error Handling
|
||||
|
||||
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"
|
||||
ffmp_err = """audioread\__init__.py", line 116, in audio_open"""
|
||||
sf_write_err = "sf.write"
|
||||
demucs_model_missing_err = "is neither a single pre-trained model or a bag of models."
|
||||
|
||||
try:
|
||||
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_agg
|
||||
global normalization_set
|
||||
global update_prog
|
||||
|
||||
update_prog = update_progress
|
||||
default_window_size = data['window_size']
|
||||
default_agg = data['agg']
|
||||
space = ' '*90
|
||||
|
||||
stime = time.perf_counter()
|
||||
progress_var.set(0)
|
||||
@@ -432,6 +438,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
else:
|
||||
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 = vocal_remover.models[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,
|
||||
'total_files': len(data['input_paths']),
|
||||
'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,
|
||||
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_params = []
|
||||
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':
|
||||
model_params = []
|
||||
model_params = lib_v5.filelist.provide_model_param_name(ModelName)
|
||||
@@ -623,30 +634,53 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
|
||||
text_widget.write(' Done!\n')
|
||||
|
||||
text_widget.write(base_text + "Please Wait...\n")
|
||||
|
||||
X_spec_m = spec_utils.combine_spectrograms(X_spec_s, mp)
|
||||
|
||||
del X_wave, X_spec_s
|
||||
|
||||
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()
|
||||
|
||||
global active_iterations
|
||||
global progress_value
|
||||
|
||||
with torch.no_grad():
|
||||
preds = []
|
||||
|
||||
iterations = [n_window]
|
||||
|
||||
if data['tta']:
|
||||
total_iterations = sum(iterations)
|
||||
total_iterations = total_iterations*2
|
||||
else:
|
||||
total_iterations = sum(iterations)
|
||||
|
||||
text_widget.write(base_text + "Processing "f"{total_iterations} Slices... ")
|
||||
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
|
||||
for i in range(n_window):
|
||||
active_iterations += 1
|
||||
if data['demucsmodelVR']:
|
||||
update_progress(**progress_kwargs,
|
||||
step=(0.1 + (0.8/n_window * i)))
|
||||
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
|
||||
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 = 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])
|
||||
|
||||
pred = np.concatenate(preds, axis=2)
|
||||
text_widget.write('Done!\n')
|
||||
return pred
|
||||
|
||||
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')
|
||||
|
||||
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[:, :, :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']}
|
||||
|
||||
if data['tta']:
|
||||
text_widget.write(base_text + "Running Inferences (TTA)...\n")
|
||||
text_widget.write(base_text + f"Running Inferences (TTA)... {space}\n")
|
||||
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,
|
||||
device,
|
||||
model, aggressiveness)
|
||||
|
||||
update_progress(**progress_kwargs,
|
||||
step=0.9)
|
||||
# Postprocess
|
||||
text_widget.write('\n')
|
||||
|
||||
if data['postprocess']:
|
||||
try:
|
||||
text_widget.write(base_text + 'Post processing...')
|
||||
@@ -743,18 +775,37 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
v_spec_m = X_spec_m - y_spec_m
|
||||
|
||||
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...')
|
||||
|
||||
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)
|
||||
ref = mix.mean(0)
|
||||
mix = (mix - ref.mean()) / ref.std()
|
||||
|
||||
widget_text = text_widget
|
||||
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],
|
||||
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()
|
||||
@@ -774,15 +825,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
|
||||
if data['demucsmodelVR']:
|
||||
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')
|
||||
#print('What Demucs model was chosen? ', demucs_model_set)
|
||||
demucs = _gm(name=demucs_model_set, repo=path_d)
|
||||
text_widget.write('Done!\n')
|
||||
|
||||
#print('segment: ', data['segment'])
|
||||
|
||||
if data['segment'] == 'None':
|
||||
segment = None
|
||||
@@ -803,7 +848,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress
|
||||
else:
|
||||
if segment is not None:
|
||||
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:
|
||||
segment = None
|
||||
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:
|
||||
sub.segment = segment
|
||||
|
||||
#print('segment port-process: ', segment)
|
||||
|
||||
demucs.cpu()
|
||||
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'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"\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'Time Elapsed: {time.strftime("%H:%M:%S", time.gmtime(int(time.perf_counter() - stime)))}')
|
||||
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
|
||||
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(type(e).__name__, e)
|
||||
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(base_text + f'"{os.path.basename(music_file)}"\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(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)))}')
|
||||
|
||||
+489
-151
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user