From 8bf055ecdfb68231e2a95cc2c464feb45f834869 Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Thu, 14 Jan 2021 16:11:59 +0100 Subject: [PATCH 1/7] Implemented custom parameters option --- VocalRemover.py | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/VocalRemover.py b/VocalRemover.py index 6cd36bc..db4ac64 100644 --- a/VocalRemover.py +++ b/VocalRemover.py @@ -62,6 +62,7 @@ DEFAULT_DATA = { 'modelStackedLabel': '', 'aiModel': 'v4', 'resType': 'Kaiser Fast', + 'manType': False, 'useModel': 'instrumental', 'lastDir': None, @@ -247,7 +248,7 @@ class MainWindow(TkinterDnD.Tk): PROGRESS_HEIGHT = 26 PADDING = 10 - COL1_ROWS = 9 + COL1_ROWS = 9.5 COL2_ROWS = 8.1 COL3_ROWS = 5.5 @@ -306,6 +307,7 @@ class MainWindow(TkinterDnD.Tk): self.hopValue_var = tk.StringVar(value=data['hop_length']) self.winSize_var = tk.StringVar(value=data['window_size']) self.nfft_var = tk.StringVar(value=data['n_fft']) + self.manType_var = tk.BooleanVar(value=data['manType']) # AI model self.aiModel_var = tk.StringVar(value=data['aiModel']) self.resType_var = tk.StringVar(value=data['resType']) @@ -468,6 +470,11 @@ class MainWindow(TkinterDnD.Tk): text='Model Test Mode', variable=self.modelFolder_var, ) + # Manual Constants + self.options_manType_Checkbutton = ttk.Checkbutton(master=self.options_Frame, + text='Custom parameters', + variable=self.manType_var, + ) # -Column 2- # SR self.options_sr_Entry = ttk.Entry(master=self.options_Frame, @@ -550,6 +557,9 @@ class MainWindow(TkinterDnD.Tk): # Model Folder self.options_modelFolder_Checkbutton.place(x=0, y=0, width=0, height=0, relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) + # Manual Constants + self.options_manType_Checkbutton.place(x=0, y=0, width=0, height=0, + relx=0, rely=8/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) # -Column 2- # SR self.options_sr_Label.place(x=5, y=4, width=5, height=-8, @@ -605,6 +615,8 @@ class MainWindow(TkinterDnD.Tk): lambda *args: self.decode_modelNames()) self.stackedModel_var.trace_add('write', lambda *args: self.decode_modelNames()) + self.manType_var.trace_add('write', + lambda *args: self.decode_modelNames()) # Model deselect self.aiModel_var.trace_add('write', lambda *args: self.deselect_models()) @@ -776,7 +788,12 @@ class MainWindow(TkinterDnD.Tk): # Loop through each constant (key) and its widgets for key, (widget, var) in widgetsVars.items(): - if stacked_selectable: + if self.manType_var.get(): + if str(widget.cget('state')) != 'normal': + # Manual typing and widget not enabled + widget.configure(state=tk.NORMAL) + continue + elif stacked_selectable: if instrumental_selectable: if (key in instrumental.keys() and key in stacked.keys()): @@ -784,19 +801,17 @@ class MainWindow(TkinterDnD.Tk): widget.configure(state=tk.DISABLED) var.set('%d/%d' % (instrumental[key], stacked[key])) continue - else: - if key in stacked.keys(): - # Only stacked selectable - widget.configure(state=tk.DISABLED) - var.set(stacked[key]) - continue - else: - # Stacked model can not be selected - if (key in instrumental.keys() and - instrumental_selectable): + elif key in stacked.keys(): + # Only stacked selectable widget.configure(state=tk.DISABLED) - var.set(instrumental[key]) + var.set(stacked[key]) continue + elif (key in instrumental.keys() and + instrumental_selectable): + # Stacked model can not be selected + widget.configure(state=tk.DISABLED) + var.set(instrumental[key]) + continue # If widget is already enabled, no need to reset the value if str(widget.cget('state')) != 'normal': @@ -993,6 +1008,7 @@ class MainWindow(TkinterDnD.Tk): 'modelStackedLabel': self.stackedModel_var.get(), 'aiModel': self.aiModel_var.get(), 'resType': self.resType_var.get(), + 'manType': self.manType_var.get(), }) self.destroy() From 043a45b35018340827eb306335d98f3278fd3313 Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Thu, 14 Jan 2021 16:40:14 +0100 Subject: [PATCH 2/7] Fixed parameters not actually parsing through --- .gitignore | 3 ++- VocalRemover.py | 8 ++++++-- inference_v2.py | 8 +++++++- inference_v4.py | 8 +++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index fbc624f..01362ca 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ data.pkl # Testing models model_iter26_sr33075_hl384_w512.pth baseline.pth -temp.wav \ No newline at end of file +temp.wav +models/**/*.pth \ No newline at end of file diff --git a/VocalRemover.py b/VocalRemover.py index db4ac64..5d58c39 100644 --- a/VocalRemover.py +++ b/VocalRemover.py @@ -671,7 +671,8 @@ class MainWindow(TkinterDnD.Tk): instrumental = get_model_values(self.instrumentalModel_var.get()) stacked = get_model_values(self.stackedModel_var.get()) try: - if [bool(instrumental), bool(stacked)].count(True) == 2: + if ([bool(instrumental), bool(stacked)].count(True) == 2 and + not self.manType_var.get()): sr = DEFAULT_DATA['sr'] hop_length = DEFAULT_DATA['hop_length'] window_size = DEFAULT_DATA['window_size'] @@ -756,6 +757,8 @@ class MainWindow(TkinterDnD.Tk): 'n_fft': n_fft, # not needed for v2 # Resolution Type 'resType': resType, + # Parsed constants should be fixed + 'manType': self.manType_var.get(), # Other Variables (Tkinter) 'window': self, 'text_widget': self.command_Text, @@ -974,7 +977,8 @@ class MainWindow(TkinterDnD.Tk): # Get constants instrumental = get_model_values(self.instrumentalModel_var.get()) stacked = get_model_values(self.stackedModel_var.get()) - if [bool(instrumental), bool(stacked)].count(True) == 2: + if ([bool(instrumental), bool(stacked)].count(True) == 2 and + not self.manType_var.get()): sr = DEFAULT_DATA['sr'] hop_length = DEFAULT_DATA['hop_length'] window_size = DEFAULT_DATA['window_size'] diff --git a/inference_v2.py b/inference_v2.py index cc072b9..854eae8 100644 --- a/inference_v2.py +++ b/inference_v2.py @@ -54,7 +54,9 @@ data = { 'window_size': 320, 'n_fft': 2_048, # Resolution Type - 'resType': 'kaiser_fast' + 'resType': 'kaiser_fast', + # Parsed constants should be fixed + 'manType': False, } default_sr = data['sr'] default_hop_length = data['hop_length'] @@ -94,6 +96,10 @@ def update_constants(model_name): data['window_size'] = default_window_size data['n_fft'] = default_n_fft + if data['manType']: + # Default constants should be fixed + return + for text_part in text_parts: if 'sr' in text_part: text_part = text_part.replace('sr', '') diff --git a/inference_v4.py b/inference_v4.py index 2629386..2c1fb98 100644 --- a/inference_v4.py +++ b/inference_v4.py @@ -176,7 +176,9 @@ data = { 'window_size': 320, 'n_fft': 2_048, # Resolution Type - 'resType': 'kaiser_fast' + 'resType': 'kaiser_fast', + # Parsed constants should be fixed + 'manType': False, } default_sr = data['sr'] default_hop_length = data['hop_length'] @@ -214,6 +216,10 @@ def update_constants(model_name): data['window_size'] = default_window_size data['n_fft'] = default_n_fft + if data['manType']: + # Default constants should be fixed + return + for text_part in text_parts: if 'sr' in text_part: text_part = text_part.replace('sr', '') From 6a10de3f05ff3553f9ee59a0299252646aa6a207 Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Thu, 14 Jan 2021 16:44:44 +0100 Subject: [PATCH 3/7] Fixed a minor bug --- VocalRemover.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VocalRemover.py b/VocalRemover.py index 5d58c39..0da3b56 100644 --- a/VocalRemover.py +++ b/VocalRemover.py @@ -795,6 +795,8 @@ class MainWindow(TkinterDnD.Tk): if str(widget.cget('state')) != 'normal': # Manual typing and widget not enabled widget.configure(state=tk.NORMAL) + if '/' in str(var.get()): + var.set(var.get().split('/')[0]) continue elif stacked_selectable: if instrumental_selectable: From 7bdd61e67c4447c080b6c1bd7e890d2c4c00960b Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Fri, 15 Jan 2021 10:12:16 +0100 Subject: [PATCH 4/7] Fixed conversion not working --- inference_v2.py | 7 ++++--- inference_v4.py | 7 ++++--- models/v2/Main Models/Models Go Here.txt | 1 - models/v2/Stacked Models/Models Go Here.txt | 1 - models/v4/Main Models/Models Go Here.txt | 1 - models/v4/Stacked Models/Models Go Here.txt | 1 - 6 files changed, 8 insertions(+), 10 deletions(-) delete mode 100644 models/v2/Main Models/Models Go Here.txt delete mode 100644 models/v2/Stacked Models/Models Go Here.txt delete mode 100644 models/v4/Main Models/Models Go Here.txt delete mode 100644 models/v4/Stacked Models/Models Go Here.txt diff --git a/inference_v2.py b/inference_v2.py index 854eae8..00857e7 100644 --- a/inference_v2.py +++ b/inference_v2.py @@ -377,6 +377,8 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress folder_path = os.path.join(data["export_path"], modelFolderName) if not os.path.isdir(folder_path): os.mkdir(folder_path) + else: + folder_path = '' # Determine Loops total_loops = data['stackPasses'] @@ -384,10 +386,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): + # Determine File Name + base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') try: - # Determine File Name - base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') - for loop_num in range(total_loops): # -Determine which model will be used- if not loop_num: diff --git a/inference_v4.py b/inference_v4.py index 2c1fb98..a0ea93b 100644 --- a/inference_v4.py +++ b/inference_v4.py @@ -384,16 +384,17 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress folder_path = os.path.join(data["export_path"], modelFolderName) if not os.path.isdir(folder_path): os.mkdir(folder_path) + else: + folder_path = '' # Determine Loops total_loops = data['stackPasses'] if not data['stackOnly']: total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): + # Determine File Name + base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') try: - # Determine File Name - base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') - # --Seperate Music Files-- for loop_num in range(total_loops): # -Determine which model will be used- diff --git a/models/v2/Main Models/Models Go Here.txt b/models/v2/Main Models/Models Go Here.txt deleted file mode 100644 index 6671662..0000000 --- a/models/v2/Main Models/Models Go Here.txt +++ /dev/null @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file diff --git a/models/v2/Stacked Models/Models Go Here.txt b/models/v2/Stacked Models/Models Go Here.txt deleted file mode 100644 index 6671662..0000000 --- a/models/v2/Stacked Models/Models Go Here.txt +++ /dev/null @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file diff --git a/models/v4/Main Models/Models Go Here.txt b/models/v4/Main Models/Models Go Here.txt deleted file mode 100644 index 6671662..0000000 --- a/models/v4/Main Models/Models Go Here.txt +++ /dev/null @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file diff --git a/models/v4/Stacked Models/Models Go Here.txt b/models/v4/Stacked Models/Models Go Here.txt deleted file mode 100644 index 6671662..0000000 --- a/models/v4/Stacked Models/Models Go Here.txt +++ /dev/null @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file From d0f1496ea7e5a12867f25c753a51a9e8f026f64f Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Fri, 15 Jan 2021 10:13:48 +0100 Subject: [PATCH 5/7] Added model path indicators --- models/v2/Main Models/Models Go Here.txt | 0 models/v2/Stacked Models/Models Go Here.txt | 0 models/v4/Main Models/Models Go Here.txt | 0 models/v4/Stacked Models/Models Go Here.txt | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/v2/Main Models/Models Go Here.txt create mode 100644 models/v2/Stacked Models/Models Go Here.txt create mode 100644 models/v4/Main Models/Models Go Here.txt create mode 100644 models/v4/Stacked Models/Models Go Here.txt diff --git a/models/v2/Main Models/Models Go Here.txt b/models/v2/Main Models/Models Go Here.txt new file mode 100644 index 0000000..e69de29 diff --git a/models/v2/Stacked Models/Models Go Here.txt b/models/v2/Stacked Models/Models Go Here.txt new file mode 100644 index 0000000..e69de29 diff --git a/models/v4/Main Models/Models Go Here.txt b/models/v4/Main Models/Models Go Here.txt new file mode 100644 index 0000000..e69de29 diff --git a/models/v4/Stacked Models/Models Go Here.txt b/models/v4/Stacked Models/Models Go Here.txt new file mode 100644 index 0000000..e69de29 From a5b76325e1d977b230c08847f4f690c08d190f6b Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Fri, 15 Jan 2021 10:23:15 +0100 Subject: [PATCH 6/7] Revert "Feature resolution type" --- .gitignore | 3 +- VocalRemover.py | 87 ++++++--------------- inference_v2.py | 17 +--- inference_v4.py | 17 +--- models/v2/Main Models/Models Go Here.txt | 1 + models/v2/Stacked Models/Models Go Here.txt | 1 + models/v4/Main Models/Models Go Here.txt | 1 + models/v4/Stacked Models/Models Go Here.txt | 1 + 8 files changed, 37 insertions(+), 91 deletions(-) diff --git a/.gitignore b/.gitignore index 01362ca..fbc624f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ data.pkl # Testing models model_iter26_sr33075_hl384_w512.pth baseline.pth -temp.wav -models/**/*.pth \ No newline at end of file +temp.wav \ No newline at end of file diff --git a/VocalRemover.py b/VocalRemover.py index 0da3b56..678d89e 100644 --- a/VocalRemover.py +++ b/VocalRemover.py @@ -61,8 +61,6 @@ DEFAULT_DATA = { 'modelInstrumentalLabel': '', 'modelStackedLabel': '', 'aiModel': 'v4', - 'resType': 'Kaiser Fast', - 'manType': False, 'useModel': 'instrumental', 'lastDir': None, @@ -242,15 +240,15 @@ class MainWindow(TkinterDnD.Tk): # Layout IMAGE_HEIGHT = 140 FILEPATHS_HEIGHT = 90 - OPTIONS_HEIGHT = 285 + OPTIONS_HEIGHT = 240 CONVERSIONBUTTON_HEIGHT = 35 COMMAND_HEIGHT = 200 PROGRESS_HEIGHT = 26 PADDING = 10 - COL1_ROWS = 9.5 - COL2_ROWS = 8.1 - COL3_ROWS = 5.5 + COL1_ROWS = 8 + COL2_ROWS = 7 + COL3_ROWS = 5 def __init__(self): # Run the __init__ method on the tk.Tk class @@ -307,10 +305,8 @@ class MainWindow(TkinterDnD.Tk): self.hopValue_var = tk.StringVar(value=data['hop_length']) self.winSize_var = tk.StringVar(value=data['window_size']) self.nfft_var = tk.StringVar(value=data['n_fft']) - self.manType_var = tk.BooleanVar(value=data['manType']) # AI model self.aiModel_var = tk.StringVar(value=data['aiModel']) - self.resType_var = tk.StringVar(value=data['resType']) self.last_aiModel = self.aiModel_var.get() # Other self.inputPathsEntry_var = tk.StringVar(value='') @@ -402,6 +398,7 @@ class MainWindow(TkinterDnD.Tk): text='Save to', command=self.open_export_filedialog) self.filePaths_saveTo_Entry = ttk.Entry(master=self.filePaths_Frame, + textvariable=self.exportPath_var, state=tk.DISABLED ) @@ -470,11 +467,6 @@ class MainWindow(TkinterDnD.Tk): text='Model Test Mode', variable=self.modelFolder_var, ) - # Manual Constants - self.options_manType_Checkbutton = ttk.Checkbutton(master=self.options_Frame, - text='Custom parameters', - variable=self.manType_var, - ) # -Column 2- # SR self.options_sr_Entry = ttk.Entry(master=self.options_Frame, @@ -500,13 +492,6 @@ class MainWindow(TkinterDnD.Tk): self.options_nfft_Label = tk.Label(master=self.options_Frame, text='N_FFT', anchor=tk.W, background='#63605f', font=self.font, foreground='white', relief="sunken") - # Resolution Type - self.options_resType_Label = tk.Label(master=self.options_Frame, - text='Resolution Type', anchor=tk.CENTER, - background='#63605f', font=self.font, foreground='white', relief="sunken") - self.options_resType_Optionmenu = ttk.OptionMenu(self.options_Frame, - self.resType_var, - None, 'Kaiser Fast', 'Kaiser Best', 'Scipy') # AI model self.options_aiModel_Label = tk.Label(master=self.options_Frame, text='Choose AI Engine', anchor=tk.CENTER, @@ -557,9 +542,6 @@ class MainWindow(TkinterDnD.Tk): # Model Folder self.options_modelFolder_Checkbutton.place(x=0, y=0, width=0, height=0, relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) - # Manual Constants - self.options_manType_Checkbutton.place(x=0, y=0, width=0, height=0, - relx=0, rely=8/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) # -Column 2- # SR self.options_sr_Label.place(x=5, y=4, width=5, height=-8, @@ -581,16 +563,11 @@ class MainWindow(TkinterDnD.Tk): relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3/2, relheight=1/self.COL2_ROWS) self.options_nfft_Entry.place(x=15, y=4, width=5, height=-8, relx=1/3 + 1/3/2, rely=3/self.COL2_ROWS, relwidth=1/3/4, relheight=1/self.COL2_ROWS) - # Resolution Type - self.options_resType_Label.place(x=5, y=8, width=-30, height=-8, - relx=1/3, rely=4/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) - self.options_resType_Optionmenu.place(x=5, y=8, width=-30, height=-8, - relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # AI model - self.options_aiModel_Label.place(x=5, y=8, width=-30, height=-8, - relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) - self.options_aiModel_Optionmenu.place(x=5, y=8, width=-30, height=-8, - relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_aiModel_Label.place(x=5, y=-5, width=-30, height=-8, + relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_aiModel_Optionmenu.place(x=5, y=-5, width=-30, height=-8, + relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # -Column 3- # Choose Model @@ -615,8 +592,6 @@ class MainWindow(TkinterDnD.Tk): lambda *args: self.decode_modelNames()) self.stackedModel_var.trace_add('write', lambda *args: self.decode_modelNames()) - self.manType_var.trace_add('write', - lambda *args: self.decode_modelNames()) # Model deselect self.aiModel_var.trace_add('write', lambda *args: self.deselect_models()) @@ -666,13 +641,11 @@ class MainWindow(TkinterDnD.Tk): input_paths = self.inputPaths instrumentalModel_path = self.instrumentalLabel_to_path[self.instrumentalModel_var.get()] # nopep8 stackedModel_path = self.stackedLabel_to_path[self.stackedModel_var.get()] # nopep8 - resType = self.resType_var.get().lower().replace(' ', '_') # Get constants instrumental = get_model_values(self.instrumentalModel_var.get()) stacked = get_model_values(self.stackedModel_var.get()) try: - if ([bool(instrumental), bool(stacked)].count(True) == 2 and - not self.manType_var.get()): + if [bool(instrumental), bool(stacked)].count(True) == 2: sr = DEFAULT_DATA['sr'] hop_length = DEFAULT_DATA['hop_length'] window_size = DEFAULT_DATA['window_size'] @@ -755,10 +728,6 @@ class MainWindow(TkinterDnD.Tk): 'hop_length': hop_length, 'window_size': window_size, 'n_fft': n_fft, # not needed for v2 - # Resolution Type - 'resType': resType, - # Parsed constants should be fixed - 'manType': self.manType_var.get(), # Other Variables (Tkinter) 'window': self, 'text_widget': self.command_Text, @@ -791,14 +760,7 @@ class MainWindow(TkinterDnD.Tk): # Loop through each constant (key) and its widgets for key, (widget, var) in widgetsVars.items(): - if self.manType_var.get(): - if str(widget.cget('state')) != 'normal': - # Manual typing and widget not enabled - widget.configure(state=tk.NORMAL) - if '/' in str(var.get()): - var.set(var.get().split('/')[0]) - continue - elif stacked_selectable: + if stacked_selectable: if instrumental_selectable: if (key in instrumental.keys() and key in stacked.keys()): @@ -806,17 +768,19 @@ class MainWindow(TkinterDnD.Tk): widget.configure(state=tk.DISABLED) var.set('%d/%d' % (instrumental[key], stacked[key])) continue - elif key in stacked.keys(): - # Only stacked selectable - widget.configure(state=tk.DISABLED) - var.set(stacked[key]) - continue - elif (key in instrumental.keys() and - instrumental_selectable): + else: + if key in stacked.keys(): + # Only stacked selectable + widget.configure(state=tk.DISABLED) + var.set(stacked[key]) + continue + else: # Stacked model can not be selected - widget.configure(state=tk.DISABLED) - var.set(instrumental[key]) - continue + if (key in instrumental.keys() and + instrumental_selectable): + widget.configure(state=tk.DISABLED) + var.set(instrumental[key]) + continue # If widget is already enabled, no need to reset the value if str(widget.cget('state')) != 'normal': @@ -979,8 +943,7 @@ class MainWindow(TkinterDnD.Tk): # Get constants instrumental = get_model_values(self.instrumentalModel_var.get()) stacked = get_model_values(self.stackedModel_var.get()) - if ([bool(instrumental), bool(stacked)].count(True) == 2 and - not self.manType_var.get()): + if [bool(instrumental), bool(stacked)].count(True) == 2: sr = DEFAULT_DATA['sr'] hop_length = DEFAULT_DATA['hop_length'] window_size = DEFAULT_DATA['window_size'] @@ -1013,8 +976,6 @@ class MainWindow(TkinterDnD.Tk): 'modelInstrumentalLabel': self.instrumentalModel_var.get(), 'modelStackedLabel': self.stackedModel_var.get(), 'aiModel': self.aiModel_var.get(), - 'resType': self.resType_var.get(), - 'manType': self.manType_var.get(), }) self.destroy() diff --git a/inference_v2.py b/inference_v2.py index 00857e7..224af8a 100644 --- a/inference_v2.py +++ b/inference_v2.py @@ -53,10 +53,6 @@ data = { 'hop_length': 1_024, 'window_size': 320, 'n_fft': 2_048, - # Resolution Type - 'resType': 'kaiser_fast', - # Parsed constants should be fixed - 'manType': False, } default_sr = data['sr'] default_hop_length = data['hop_length'] @@ -96,10 +92,6 @@ def update_constants(model_name): data['window_size'] = default_window_size data['n_fft'] = default_n_fft - if data['manType']: - # Default constants should be fixed - return - for text_part in text_parts: if 'sr' in text_part: text_part = text_part.replace('sr', '') @@ -214,7 +206,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress data['sr'], False, dtype=np.float32, - res_type=data['resType']) + res_type='kaiser_fast') return X, sr @@ -377,8 +369,6 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress folder_path = os.path.join(data["export_path"], modelFolderName) if not os.path.isdir(folder_path): os.mkdir(folder_path) - else: - folder_path = '' # Determine Loops total_loops = data['stackPasses'] @@ -386,9 +376,10 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): - # Determine File Name - base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') try: + # Determine File Name + base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') + for loop_num in range(total_loops): # -Determine which model will be used- if not loop_num: diff --git a/inference_v4.py b/inference_v4.py index a0ea93b..7f1fc3f 100644 --- a/inference_v4.py +++ b/inference_v4.py @@ -175,10 +175,6 @@ data = { 'hop_length': 1_024, 'window_size': 320, 'n_fft': 2_048, - # Resolution Type - 'resType': 'kaiser_fast', - # Parsed constants should be fixed - 'manType': False, } default_sr = data['sr'] default_hop_length = data['hop_length'] @@ -216,10 +212,6 @@ def update_constants(model_name): data['window_size'] = default_window_size data['n_fft'] = default_n_fft - if data['manType']: - # Default constants should be fixed - return - for text_part in text_parts: if 'sr' in text_part: text_part = text_part.replace('sr', '') @@ -384,17 +376,16 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress folder_path = os.path.join(data["export_path"], modelFolderName) if not os.path.isdir(folder_path): os.mkdir(folder_path) - else: - folder_path = '' # Determine Loops total_loops = data['stackPasses'] if not data['stackOnly']: total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): - # Determine File Name - base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') try: + # Determine File Name + base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') + # --Seperate Music Files-- for loop_num in range(total_loops): # -Determine which model will be used- @@ -437,7 +428,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress # Wave source text_widget.write(base_text + 'Loading wave source...\n') X, sr = librosa.load(music_file, data['sr'], False, - dtype=np.float32, res_type=data['resType']) + dtype=np.float32, res_type='kaiser_fast') if X.ndim == 1: X = np.asarray([X, X]) text_widget.write(base_text + 'Done!\n') diff --git a/models/v2/Main Models/Models Go Here.txt b/models/v2/Main Models/Models Go Here.txt index e69de29..6671662 100644 --- a/models/v2/Main Models/Models Go Here.txt +++ b/models/v2/Main Models/Models Go Here.txt @@ -0,0 +1 @@ +Models Go Here \ No newline at end of file diff --git a/models/v2/Stacked Models/Models Go Here.txt b/models/v2/Stacked Models/Models Go Here.txt index e69de29..6671662 100644 --- a/models/v2/Stacked Models/Models Go Here.txt +++ b/models/v2/Stacked Models/Models Go Here.txt @@ -0,0 +1 @@ +Models Go Here \ No newline at end of file diff --git a/models/v4/Main Models/Models Go Here.txt b/models/v4/Main Models/Models Go Here.txt index e69de29..6671662 100644 --- a/models/v4/Main Models/Models Go Here.txt +++ b/models/v4/Main Models/Models Go Here.txt @@ -0,0 +1 @@ +Models Go Here \ No newline at end of file diff --git a/models/v4/Stacked Models/Models Go Here.txt b/models/v4/Stacked Models/Models Go Here.txt index e69de29..6671662 100644 --- a/models/v4/Stacked Models/Models Go Here.txt +++ b/models/v4/Stacked Models/Models Go Here.txt @@ -0,0 +1 @@ +Models Go Here \ No newline at end of file From a18d18cab375cca454443d1930bb59bd92329723 Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Fri, 15 Jan 2021 10:23:54 +0100 Subject: [PATCH 7/7] Revert "Revert "Feature resolution type"" --- .gitignore | 3 +- VocalRemover.py | 85 +++++++++++++++------ inference_v2.py | 17 ++++- inference_v4.py | 17 ++++- models/v2/Main Models/Models Go Here.txt | 1 - models/v2/Stacked Models/Models Go Here.txt | 1 - models/v4/Main Models/Models Go Here.txt | 1 - models/v4/Stacked Models/Models Go Here.txt | 1 - 8 files changed, 90 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index fbc624f..01362ca 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ data.pkl # Testing models model_iter26_sr33075_hl384_w512.pth baseline.pth -temp.wav \ No newline at end of file +temp.wav +models/**/*.pth \ No newline at end of file diff --git a/VocalRemover.py b/VocalRemover.py index 678d89e..0da3b56 100644 --- a/VocalRemover.py +++ b/VocalRemover.py @@ -61,6 +61,8 @@ DEFAULT_DATA = { 'modelInstrumentalLabel': '', 'modelStackedLabel': '', 'aiModel': 'v4', + 'resType': 'Kaiser Fast', + 'manType': False, 'useModel': 'instrumental', 'lastDir': None, @@ -240,15 +242,15 @@ class MainWindow(TkinterDnD.Tk): # Layout IMAGE_HEIGHT = 140 FILEPATHS_HEIGHT = 90 - OPTIONS_HEIGHT = 240 + OPTIONS_HEIGHT = 285 CONVERSIONBUTTON_HEIGHT = 35 COMMAND_HEIGHT = 200 PROGRESS_HEIGHT = 26 PADDING = 10 - COL1_ROWS = 8 - COL2_ROWS = 7 - COL3_ROWS = 5 + COL1_ROWS = 9.5 + COL2_ROWS = 8.1 + COL3_ROWS = 5.5 def __init__(self): # Run the __init__ method on the tk.Tk class @@ -305,8 +307,10 @@ class MainWindow(TkinterDnD.Tk): self.hopValue_var = tk.StringVar(value=data['hop_length']) self.winSize_var = tk.StringVar(value=data['window_size']) self.nfft_var = tk.StringVar(value=data['n_fft']) + self.manType_var = tk.BooleanVar(value=data['manType']) # AI model self.aiModel_var = tk.StringVar(value=data['aiModel']) + self.resType_var = tk.StringVar(value=data['resType']) self.last_aiModel = self.aiModel_var.get() # Other self.inputPathsEntry_var = tk.StringVar(value='') @@ -398,7 +402,6 @@ class MainWindow(TkinterDnD.Tk): text='Save to', command=self.open_export_filedialog) self.filePaths_saveTo_Entry = ttk.Entry(master=self.filePaths_Frame, - textvariable=self.exportPath_var, state=tk.DISABLED ) @@ -467,6 +470,11 @@ class MainWindow(TkinterDnD.Tk): text='Model Test Mode', variable=self.modelFolder_var, ) + # Manual Constants + self.options_manType_Checkbutton = ttk.Checkbutton(master=self.options_Frame, + text='Custom parameters', + variable=self.manType_var, + ) # -Column 2- # SR self.options_sr_Entry = ttk.Entry(master=self.options_Frame, @@ -492,6 +500,13 @@ class MainWindow(TkinterDnD.Tk): self.options_nfft_Label = tk.Label(master=self.options_Frame, text='N_FFT', anchor=tk.W, background='#63605f', font=self.font, foreground='white', relief="sunken") + # Resolution Type + self.options_resType_Label = tk.Label(master=self.options_Frame, + text='Resolution Type', anchor=tk.CENTER, + background='#63605f', font=self.font, foreground='white', relief="sunken") + self.options_resType_Optionmenu = ttk.OptionMenu(self.options_Frame, + self.resType_var, + None, 'Kaiser Fast', 'Kaiser Best', 'Scipy') # AI model self.options_aiModel_Label = tk.Label(master=self.options_Frame, text='Choose AI Engine', anchor=tk.CENTER, @@ -542,6 +557,9 @@ class MainWindow(TkinterDnD.Tk): # Model Folder self.options_modelFolder_Checkbutton.place(x=0, y=0, width=0, height=0, relx=0, rely=7/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) + # Manual Constants + self.options_manType_Checkbutton.place(x=0, y=0, width=0, height=0, + relx=0, rely=8/self.COL1_ROWS, relwidth=1/3, relheight=1/self.COL1_ROWS) # -Column 2- # SR self.options_sr_Label.place(x=5, y=4, width=5, height=-8, @@ -563,11 +581,16 @@ class MainWindow(TkinterDnD.Tk): relx=1/3, rely=3/self.COL2_ROWS, relwidth=1/3/2, relheight=1/self.COL2_ROWS) self.options_nfft_Entry.place(x=15, y=4, width=5, height=-8, relx=1/3 + 1/3/2, rely=3/self.COL2_ROWS, relwidth=1/3/4, relheight=1/self.COL2_ROWS) + # Resolution Type + self.options_resType_Label.place(x=5, y=8, width=-30, height=-8, + relx=1/3, rely=4/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_resType_Optionmenu.place(x=5, y=8, width=-30, height=-8, + relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # AI model - self.options_aiModel_Label.place(x=5, y=-5, width=-30, height=-8, - relx=1/3, rely=5/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) - self.options_aiModel_Optionmenu.place(x=5, y=-5, width=-30, height=-8, - relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_aiModel_Label.place(x=5, y=8, width=-30, height=-8, + relx=1/3, rely=6/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) + self.options_aiModel_Optionmenu.place(x=5, y=8, width=-30, height=-8, + relx=1/3, rely=7/self.COL2_ROWS, relwidth=1/3, relheight=1/self.COL2_ROWS) # -Column 3- # Choose Model @@ -592,6 +615,8 @@ class MainWindow(TkinterDnD.Tk): lambda *args: self.decode_modelNames()) self.stackedModel_var.trace_add('write', lambda *args: self.decode_modelNames()) + self.manType_var.trace_add('write', + lambda *args: self.decode_modelNames()) # Model deselect self.aiModel_var.trace_add('write', lambda *args: self.deselect_models()) @@ -641,11 +666,13 @@ class MainWindow(TkinterDnD.Tk): input_paths = self.inputPaths instrumentalModel_path = self.instrumentalLabel_to_path[self.instrumentalModel_var.get()] # nopep8 stackedModel_path = self.stackedLabel_to_path[self.stackedModel_var.get()] # nopep8 + resType = self.resType_var.get().lower().replace(' ', '_') # Get constants instrumental = get_model_values(self.instrumentalModel_var.get()) stacked = get_model_values(self.stackedModel_var.get()) try: - if [bool(instrumental), bool(stacked)].count(True) == 2: + if ([bool(instrumental), bool(stacked)].count(True) == 2 and + not self.manType_var.get()): sr = DEFAULT_DATA['sr'] hop_length = DEFAULT_DATA['hop_length'] window_size = DEFAULT_DATA['window_size'] @@ -728,6 +755,10 @@ class MainWindow(TkinterDnD.Tk): 'hop_length': hop_length, 'window_size': window_size, 'n_fft': n_fft, # not needed for v2 + # Resolution Type + 'resType': resType, + # Parsed constants should be fixed + 'manType': self.manType_var.get(), # Other Variables (Tkinter) 'window': self, 'text_widget': self.command_Text, @@ -760,7 +791,14 @@ class MainWindow(TkinterDnD.Tk): # Loop through each constant (key) and its widgets for key, (widget, var) in widgetsVars.items(): - if stacked_selectable: + if self.manType_var.get(): + if str(widget.cget('state')) != 'normal': + # Manual typing and widget not enabled + widget.configure(state=tk.NORMAL) + if '/' in str(var.get()): + var.set(var.get().split('/')[0]) + continue + elif stacked_selectable: if instrumental_selectable: if (key in instrumental.keys() and key in stacked.keys()): @@ -768,19 +806,17 @@ class MainWindow(TkinterDnD.Tk): widget.configure(state=tk.DISABLED) var.set('%d/%d' % (instrumental[key], stacked[key])) continue - else: - if key in stacked.keys(): - # Only stacked selectable - widget.configure(state=tk.DISABLED) - var.set(stacked[key]) - continue - else: - # Stacked model can not be selected - if (key in instrumental.keys() and - instrumental_selectable): + elif key in stacked.keys(): + # Only stacked selectable widget.configure(state=tk.DISABLED) - var.set(instrumental[key]) + var.set(stacked[key]) continue + elif (key in instrumental.keys() and + instrumental_selectable): + # Stacked model can not be selected + widget.configure(state=tk.DISABLED) + var.set(instrumental[key]) + continue # If widget is already enabled, no need to reset the value if str(widget.cget('state')) != 'normal': @@ -943,7 +979,8 @@ class MainWindow(TkinterDnD.Tk): # Get constants instrumental = get_model_values(self.instrumentalModel_var.get()) stacked = get_model_values(self.stackedModel_var.get()) - if [bool(instrumental), bool(stacked)].count(True) == 2: + if ([bool(instrumental), bool(stacked)].count(True) == 2 and + not self.manType_var.get()): sr = DEFAULT_DATA['sr'] hop_length = DEFAULT_DATA['hop_length'] window_size = DEFAULT_DATA['window_size'] @@ -976,6 +1013,8 @@ class MainWindow(TkinterDnD.Tk): 'modelInstrumentalLabel': self.instrumentalModel_var.get(), 'modelStackedLabel': self.stackedModel_var.get(), 'aiModel': self.aiModel_var.get(), + 'resType': self.resType_var.get(), + 'manType': self.manType_var.get(), }) self.destroy() diff --git a/inference_v2.py b/inference_v2.py index 224af8a..00857e7 100644 --- a/inference_v2.py +++ b/inference_v2.py @@ -53,6 +53,10 @@ data = { 'hop_length': 1_024, 'window_size': 320, 'n_fft': 2_048, + # Resolution Type + 'resType': 'kaiser_fast', + # Parsed constants should be fixed + 'manType': False, } default_sr = data['sr'] default_hop_length = data['hop_length'] @@ -92,6 +96,10 @@ def update_constants(model_name): data['window_size'] = default_window_size data['n_fft'] = default_n_fft + if data['manType']: + # Default constants should be fixed + return + for text_part in text_parts: if 'sr' in text_part: text_part = text_part.replace('sr', '') @@ -206,7 +214,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress data['sr'], False, dtype=np.float32, - res_type='kaiser_fast') + res_type=data['resType']) return X, sr @@ -369,6 +377,8 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress folder_path = os.path.join(data["export_path"], modelFolderName) if not os.path.isdir(folder_path): os.mkdir(folder_path) + else: + folder_path = '' # Determine Loops total_loops = data['stackPasses'] @@ -376,10 +386,9 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): + # Determine File Name + base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') try: - # Determine File Name - base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') - for loop_num in range(total_loops): # -Determine which model will be used- if not loop_num: diff --git a/inference_v4.py b/inference_v4.py index 7f1fc3f..a0ea93b 100644 --- a/inference_v4.py +++ b/inference_v4.py @@ -175,6 +175,10 @@ data = { 'hop_length': 1_024, 'window_size': 320, 'n_fft': 2_048, + # Resolution Type + 'resType': 'kaiser_fast', + # Parsed constants should be fixed + 'manType': False, } default_sr = data['sr'] default_hop_length = data['hop_length'] @@ -212,6 +216,10 @@ def update_constants(model_name): data['window_size'] = default_window_size data['n_fft'] = default_n_fft + if data['manType']: + # Default constants should be fixed + return + for text_part in text_parts: if 'sr' in text_part: text_part = text_part.replace('sr', '') @@ -376,16 +384,17 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress folder_path = os.path.join(data["export_path"], modelFolderName) if not os.path.isdir(folder_path): os.mkdir(folder_path) + else: + folder_path = '' # Determine Loops total_loops = data['stackPasses'] if not data['stackOnly']: total_loops += 1 for file_num, music_file in enumerate(data['input_paths'], start=1): + # Determine File Name + base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') try: - # Determine File Name - base_name = os.path.join(folder_path, f'{file_num}_{os.path.splitext(os.path.basename(music_file))[0]}') - # --Seperate Music Files-- for loop_num in range(total_loops): # -Determine which model will be used- @@ -428,7 +437,7 @@ def main(window: tk.Wm, text_widget: tk.Text, button_widget: tk.Button, progress # Wave source text_widget.write(base_text + 'Loading wave source...\n') X, sr = librosa.load(music_file, data['sr'], False, - dtype=np.float32, res_type='kaiser_fast') + dtype=np.float32, res_type=data['resType']) if X.ndim == 1: X = np.asarray([X, X]) text_widget.write(base_text + 'Done!\n') diff --git a/models/v2/Main Models/Models Go Here.txt b/models/v2/Main Models/Models Go Here.txt index 6671662..e69de29 100644 --- a/models/v2/Main Models/Models Go Here.txt +++ b/models/v2/Main Models/Models Go Here.txt @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file diff --git a/models/v2/Stacked Models/Models Go Here.txt b/models/v2/Stacked Models/Models Go Here.txt index 6671662..e69de29 100644 --- a/models/v2/Stacked Models/Models Go Here.txt +++ b/models/v2/Stacked Models/Models Go Here.txt @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file diff --git a/models/v4/Main Models/Models Go Here.txt b/models/v4/Main Models/Models Go Here.txt index 6671662..e69de29 100644 --- a/models/v4/Main Models/Models Go Here.txt +++ b/models/v4/Main Models/Models Go Here.txt @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file diff --git a/models/v4/Stacked Models/Models Go Here.txt b/models/v4/Stacked Models/Models Go Here.txt index 6671662..e69de29 100644 --- a/models/v4/Stacked Models/Models Go Here.txt +++ b/models/v4/Stacked Models/Models Go Here.txt @@ -1 +0,0 @@ -Models Go Here \ No newline at end of file