diff --git a/infer-web.py b/infer-web.py index faa15ed..4b33cd3 100644 --- a/infer-web.py +++ b/infer-web.py @@ -14,7 +14,6 @@ import warnings import numpy as np import torch import re - os.environ["OPENBLAS_NUM_THREADS"] = "1" os.environ["no_proxy"] = "localhost, 127.0.0.1, ::1" import logging @@ -62,11 +61,11 @@ DoFormant = False Quefrency = 8.0 Timbre = 1.2 -with open("formanting.txt", "w+") as fsf: +with open('formanting.txt', 'w+') as fsf: fsf.truncate(0) - fsf.writelines([str(DoFormant) + "\n", str(Quefrency) + "\n", str(Timbre) + "\n"]) - + fsf.writelines([str(DoFormant) + '\n', str(Quefrency) + '\n', str(Timbre) + '\n']) + config = Config() i18n = I18nAuto() @@ -160,7 +159,7 @@ index_root = "./logs/" global audio_root audio_root = "audios" global input_audio_path0 -global input_audio_path1 +global input_audio_path1 names = [] for name in os.listdir(weight_root): if name.endswith(".pth"): @@ -168,83 +167,77 @@ for name in os.listdir(weight_root): index_paths = [] global indexes_list -indexes_list = [] +indexes_list=[] audio_paths = [] for root, dirs, files in os.walk(index_root, topdown=False): for name in files: if name.endswith(".index") and "trained" not in name: index_paths.append("%s\\%s" % (root, name)) - + for root, dirs, files in os.walk(audio_root, topdown=False): for name in files: + audio_paths.append("%s/%s" % (root, name)) - + uvr5_names = [] for name in os.listdir(weight_uvr5_root): if name.endswith(".pth") or "onnx" in name: uvr5_names.append(name.replace(".pth", "")) - def check_for_name(): if len(names) > 0: return sorted(names)[0] else: - return "" - + return '' def get_index(): - if check_for_name() != "": - chosen_model = sorted(names)[0].split(".")[0] - logs_path = "./logs/" + chosen_model + if check_for_name() != '': + chosen_model=sorted(names)[0].split(".")[0] + logs_path="./logs/"+chosen_model if os.path.exists(logs_path): for file in os.listdir(logs_path): if file.endswith(".index"): - return os.path.join(logs_path, file).replace("\\", "/") - return "" + return os.path.join(logs_path, file).replace('\\','/') + return '' else: - return "" - + return '' def get_indexes(): for dirpath, dirnames, filenames in os.walk("./logs/"): for filename in filenames: if filename.endswith(".index") and "trained" not in filename: - indexes_list.append(os.path.join(dirpath, filename).replace("\\", "/")) + indexes_list.append(os.path.join(dirpath,filename).replace('\\','/')) if len(indexes_list) > 0: return indexes_list else: - return "" - + return '' fshift_presets_list = [] - def get_fshift_presets(): fshift_presets_list = [] for dirpath, dirnames, filenames in os.walk("./formantshiftcfg/"): for filename in filenames: if filename.endswith(".txt"): - fshift_presets_list.append( - os.path.join(dirpath, filename).replace("\\", "/") - ) - + fshift_presets_list.append(os.path.join(dirpath,filename).replace('\\','/')) + if len(fshift_presets_list) > 0: return fshift_presets_list else: - return "" + return '' def get_audios(): - if check_for_name() != "": - audios_path = '"' + os.path.abspath(os.getcwd()) + "/audios/" + if check_for_name() != '': + audios_path= '"' + os.path.abspath(os.getcwd()) + '/audios/' if os.path.exists(audios_path): for file in os.listdir(audios_path): print(audios_path.join(file) + '"') return os.path.join(audios_path, file + '"') - return "" + return '' else: - return "" + return '' def vc_single( @@ -269,12 +262,12 @@ def vc_single( return "You need to upload an audio", None f0_up_key = int(f0_up_key) try: - if input_audio_path0 == "": + if input_audio_path0 == '': audio = load_audio(input_audio_path1, 16000, DoFormant, Quefrency, Timbre) - + else: audio = load_audio(input_audio_path0, 16000, DoFormant, Quefrency, Timbre) - + audio_max = np.abs(audio).max() / 0.95 if audio_max > 1: audio /= audio_max @@ -386,7 +379,7 @@ def vc_multi( resample_sr, rms_mix_rate, protect, - crepe_hop_length, + crepe_hop_length ) if "Success" in info: try: @@ -530,11 +523,7 @@ def get_vc(sid, to_return_protect0, to_return_protect1): if torch.cuda.is_available(): torch.cuda.empty_cache() cpt = None - return ( - {"visible": False, "__type__": "update"}, - {"visible": False, "__type__": "update"}, - {"visible": False, "__type__": "update"}, - ) + return ({"visible": False, "__type__": "update"}, {"visible": False, "__type__": "update"}, {"visible": False, "__type__": "update"}) person = "%s/%s" % (weight_root, sid) print("loading %s" % person) cpt = torch.load(person, map_location="cpu") @@ -592,23 +581,19 @@ def change_choices(): names.append(name) index_paths = [] audio_paths = [] - audios_path = os.path.abspath(os.getcwd()) + "/audios/" + audios_path=os.path.abspath(os.getcwd()) + "/audios/" for root, dirs, files in os.walk(index_root, topdown=False): for name in files: if name.endswith(".index") and "trained" not in name: index_paths.append("%s/%s" % (root, name)) for file in os.listdir(audios_path): - audio_paths.append("%s/%s" % (audio_root, file)) - return ( - {"choices": sorted(names), "__type__": "update"}, - {"choices": sorted(index_paths), "__type__": "update"}, - {"choices": sorted(audio_paths), "__type__": "update"}, - ) + audio_paths.append("%s/%s" % (audio_root, file)) + return {"choices": sorted(names), "__type__": "update"}, {"choices": sorted(index_paths), "__type__": "update"}, {"choices": sorted(audio_paths), "__type__": "update"} def clean(): - return {"value": "", "__type__": "update"} - + return ({"value": "", "__type__": "update"}) + sr_dict = { "32k": 32000, @@ -640,20 +625,17 @@ def if_done_multi(done, ps): break done[0] = True +def formant_enabled(cbox, qfrency, tmbre, frmntapply, formantpreset, formant_refresh_button): + + if (cbox): -def formant_enabled( - cbox, qfrency, tmbre, frmntapply, formantpreset, formant_refresh_button -): - if cbox: DoFormant = True - with open("formanting.txt", "w") as fxxf: + with open('formanting.txt', 'w') as fxxf: fxxf.truncate(0) - fxxf.writelines( - [str(DoFormant) + "\n", str(Quefrency) + "\n", str(Timbre) + "\n"] - ) - # print(f"is checked? - {cbox}\ngot {DoFormant}") - + fxxf.writelines([str(DoFormant) + '\n', str(Quefrency) + '\n', str(Timbre) + '\n']) + #print(f"is checked? - {cbox}\ngot {DoFormant}") + return ( {"value": True, "__type__": "update"}, {"visible": True, "__type__": "update"}, @@ -662,16 +644,16 @@ def formant_enabled( {"visible": True, "__type__": "update"}, {"visible": True, "__type__": "update"}, ) - + + else: + DoFormant = False - with open("formanting.txt", "w") as fxf: + with open('formanting.txt', 'w') as fxf: fxf.truncate(0) - fxf.writelines( - [str(DoFormant) + "\n", str(Quefrency) + "\n", str(Timbre) + "\n"] - ) - # print(f"is checked? - {cbox}\ngot {DoFormant}") + fxf.writelines([str(DoFormant) + '\n', str(Quefrency) + '\n', str(Timbre) + '\n']) + #print(f"is checked? - {cbox}\ngot {DoFormant}") return ( {"value": False, "__type__": "update"}, {"visible": False, "__type__": "update"}, @@ -681,33 +663,28 @@ def formant_enabled( {"visible": False, "__type__": "update"}, {"visible": False, "__type__": "update"}, ) - + def formant_apply(qfrency, tmbre): Quefrency = qfrency Timbre = tmbre DoFormant = True - - with open("formanting.txt", "w") as fxxxf: + + with open('formanting.txt', 'w') as fxxxf: fxxxf.truncate(0) - fxxxf.writelines( - [str(DoFormant) + "\n", str(Quefrency) + "\n", str(Timbre) + "\n"] - ) - return ( - {"value": Quefrency, "__type__": "update"}, - {"value": Timbre, "__type__": "update"}, - ) - + fxxxf.writelines([str(DoFormant) + '\n', str(Quefrency) + '\n', str(Timbre) + '\n']) + return ({"value": Quefrency, "__type__": "update"}, {"value": Timbre, "__type__": "update"}) def update_fshift_presets(preset, qfrency, tmbre): + qfrency, tmbre = preset_apply(preset, qfrency, tmbre) - - if str(preset) != "": - with open(str(preset), "r") as p: + + if (str(preset) != ''): + with open(str(preset), 'r') as p: content = p.readlines() - qfrency, tmbre = content[0].split("\n")[0], content[1] - + qfrency, tmbre = content[0].split('\n')[0], content[1] + formant_apply(qfrency, tmbre) else: pass @@ -905,7 +882,7 @@ def change_version19(sr2, if_f0_3, version19): ) -def change_f0(if_f0_3, sr2, version19): # f0method8,pretrained_G14,pretrained_D15 +def change_f0(if_f0_3, sr2, version19, step2b, gpus6, gpu_info9, extraction_crepe_hop_length, but2, info2): # f0method8,pretrained_G14,pretrained_D15 path_str = "" if version19 == "v1" else "_v2" if_pretrained_generator_exist = os.access( "pretrained%s/f0G%s.pth" % (path_str, sr2), os.F_OK @@ -923,6 +900,7 @@ def change_f0(if_f0_3, sr2, version19): # f0method8,pretrained_G14,pretrained_D "pretrained%s/f0D%s.pth" % (path_str, sr2), "not exist, will not use pretrained model", ) + if if_f0_3: return ( {"visible": True, "__type__": "update"}, @@ -932,7 +910,14 @@ def change_f0(if_f0_3, sr2, version19): # f0method8,pretrained_G14,pretrained_D "pretrained%s/f0D%s.pth" % (path_str, sr2) if if_pretrained_discriminator_exist else "", + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, + {"visible": True, "__type__": "update"}, ) + return ( {"visible": False, "__type__": "update"}, ("pretrained%s/G%s.pth" % (path_str, sr2)) @@ -941,6 +926,12 @@ def change_f0(if_f0_3, sr2, version19): # f0method8,pretrained_G14,pretrained_D ("pretrained%s/D%s.pth" % (path_str, sr2)) if if_pretrained_discriminator_exist else "", + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, ) @@ -1070,9 +1061,9 @@ def click_train( save_epoch10, "-pg %s" % pretrained_G14 if pretrained_G14 != "" else "", "-pd %s" % pretrained_D15 if pretrained_D15 != "" else "", - 1 if if_save_latest13 == i18n("是") else 0, - 1 if if_cache_gpu17 == i18n("是") else 0, - 1 if if_save_every_weights18 == i18n("是") else 0, + 1 if if_save_latest13 == True else 0, + 1 if if_cache_gpu17 == True else 0, + 1 if if_save_every_weights18 == True else 0, version19, log_interval, ) @@ -1090,9 +1081,9 @@ def click_train( save_epoch10, "-pg %s" % pretrained_G14 if pretrained_G14 != "" else "\b", "-pd %s" % pretrained_D15 if pretrained_D15 != "" else "\b", - 1 if if_save_latest13 == i18n("是") else 0, - 1 if if_cache_gpu17 == i18n("是") else 0, - 1 if if_save_every_weights18 == i18n("是") else 0, + 1 if if_save_latest13 == True else 0, + 1 if if_cache_gpu17 == True else 0, + 1 if if_save_every_weights18 == True else 0, version19, log_interval, ) @@ -1104,7 +1095,7 @@ def click_train( PID = p.pid p.wait() - return "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log" + return ("训练结束, 您可查看控制台训练日志或实验文件夹下的train.log", {"visible": False, "__type__": "update"}, {"visible": True, "__type__": "update"}) # but4.click(train_index, [exp_dir1], info3) @@ -1187,7 +1178,10 @@ def train_index(exp_dir1, version19): # infos.append("成功构建索引,added_IVF%s_Flat_FastScan_%s.index"%(n_ivf,version19)) yield "\n".join(infos) - +#def setBoolean(status): #true to false and vice versa / not implemented yet, dont touch!!!!!!! +# status = not status +# return status + # but5.click(train1key, [exp_dir1, sr2, if_f0_3, trainset_dir4, spk_id5, gpus6, np7, f0method8, save_epoch10, total_epoch11, batch_size12, if_save_latest13, pretrained_G14, pretrained_D15, gpus16, if_cache_gpu17], info3) def train1key( exp_dir1, @@ -1207,7 +1201,7 @@ def train1key( if_cache_gpu17, if_save_every_weights18, version19, - echl, + echl ): infos = [] @@ -1248,7 +1242,7 @@ def train1key( model_log_dir, np7, f0method8, - echl, + echl ) yield get_info_str(cmd) p = Popen(cmd, shell=True, cwd=now_dir) @@ -1355,9 +1349,9 @@ def train1key( save_epoch10, "-pg %s" % pretrained_G14 if pretrained_G14 != "" else "", "-pd %s" % pretrained_D15 if pretrained_D15 != "" else "", - 1 if if_save_latest13 == i18n("是") else 0, - 1 if if_cache_gpu17 == i18n("是") else 0, - 1 if if_save_every_weights18 == i18n("是") else 0, + 1 if if_save_latest13 == True else 0, + 1 if if_cache_gpu17 == True else 0, + 1 if if_save_every_weights18 == True else 0, version19, ) ) @@ -1374,9 +1368,9 @@ def train1key( save_epoch10, "-pg %s" % pretrained_G14 if pretrained_G14 != "" else "", "-pd %s" % pretrained_D15 if pretrained_D15 != "" else "", - 1 if if_save_latest13 == i18n("是") else 0, - 1 if if_cache_gpu17 == i18n("是") else 0, - 1 if if_save_every_weights18 == i18n("是") else 0, + 1 if if_save_latest13 == True else 0, + 1 if if_cache_gpu17 == True else 0, + 1 if if_save_every_weights18 == True else 0, version19, ) ) @@ -1480,6 +1474,7 @@ def export_onnx(ModelPath, ExportedPath): device = "cpu" # 导出时设备(不影响使用模型) + net_g = SynthesizerTrnMsNSFsidM( *cpt["config"], is_half=False, version=cpt.get("version", "v1") ) # fp32导出(C++要支持fp16必须手动将内存重新排列所以暂时不用fp16) @@ -1515,24 +1510,20 @@ def export_onnx(ModelPath, ExportedPath): return "Finished" -# region Mangio-RVC-Fork CLI App +#region Mangio-RVC-Fork CLI App import re as regex import scipy.io.wavfile as wavfile cli_current_page = "HOME" - def cli_split_command(com): exp = r'(?:(?<=\s)|^)"(.*?)"(?=\s|$)|(\S+)' split_array = regex.findall(exp, com) split_array = [group[0] if group[0] else group[1] for group in split_array] return split_array - def execute_generator_function(genObject): - for _ in genObject: - pass - + for _ in genObject: pass def cli_infer(com): # get VC first @@ -1541,7 +1532,7 @@ def cli_infer(com): source_audio_path = com[1] output_file_name = com[2] feature_index_path = com[3] - f0_file = None # Not Implemented Yet + f0_file = None # Not Implemented Yet # Get parameters for inference speaker_id = int(com[4]) @@ -1554,7 +1545,7 @@ def cli_infer(com): feature_ratio = float(com[11]) protection_amnt = float(com[12]) ##### - + print("Mangio-RVC-Fork Infer-CLI: Starting the inference...") vc_data = get_vc(model_name) print(vc_data) @@ -1573,27 +1564,16 @@ def cli_infer(com): resample, mix, protection_amnt, - crepe_hop_length, + crepe_hop_length, ) if "Success." in conversion_data[0]: - print( - "Mangio-RVC-Fork Infer-CLI: Inference succeeded. Writing to %s/%s..." - % ("audio-outputs", output_file_name) - ) - wavfile.write( - "%s/%s" % ("audio-outputs", output_file_name), - conversion_data[1][0], - conversion_data[1][1], - ) - print( - "Mangio-RVC-Fork Infer-CLI: Finished! Saved output to %s/%s" - % ("audio-outputs", output_file_name) - ) + print("Mangio-RVC-Fork Infer-CLI: Inference succeeded. Writing to %s/%s..." % ('audio-outputs', output_file_name)) + wavfile.write('%s/%s' % ('audio-outputs', output_file_name), conversion_data[1][0], conversion_data[1][1]) + print("Mangio-RVC-Fork Infer-CLI: Finished! Saved output to %s/%s" % ('audio-outputs', output_file_name)) else: print("Mangio-RVC-Fork Infer-CLI: Inference failed. Here's the traceback: ") print(conversion_data[0]) - def cli_pre_process(com): com = cli_split_command(com) model_name = com[0] @@ -1603,12 +1583,14 @@ def cli_pre_process(com): print("Mangio-RVC-Fork Pre-process: Starting...") generator = preprocess_dataset( - trainset_directory, model_name, sample_rate, num_processes + trainset_directory, + model_name, + sample_rate, + num_processes ) execute_generator_function(generator) print("Mangio-RVC-Fork Pre-process: Finished") - def cli_extract_feature(com): com = cli_split_command(com) model_name = com[0] @@ -1617,24 +1599,23 @@ def cli_extract_feature(com): has_pitch_guidance = True if (int(com[3]) == 1) else False f0_method = com[4] crepe_hop_length = int(com[5]) - version = com[6] # v1 or v2 - + version = com[6] # v1 or v2 + print("Mangio-RVC-CLI: Extract Feature Has Pitch: " + str(has_pitch_guidance)) print("Mangio-RVC-CLI: Extract Feature Version: " + str(version)) print("Mangio-RVC-Fork Feature Extraction: Starting...") generator = extract_f0_feature( - gpus, - num_processes, - f0_method, - has_pitch_guidance, - model_name, - version, - crepe_hop_length, + gpus, + num_processes, + f0_method, + has_pitch_guidance, + model_name, + version, + crepe_hop_length ) execute_generator_function(generator) print("Mangio-RVC-Fork Feature Extraction: Finished") - def cli_train(com): com = cli_split_command(com) model_name = com[0] @@ -1642,16 +1623,16 @@ def cli_train(com): has_pitch_guidance = True if (int(com[2]) == 1) else False speaker_id = int(com[3]) save_epoch_iteration = int(com[4]) - total_epoch = int(com[5]) # 10000 + total_epoch = int(com[5]) # 10000 batch_size = int(com[6]) gpu_card_slot_numbers = com[7] - if_save_latest = i18n("是") if (int(com[8]) == 1) else i18n("否") - if_cache_gpu = i18n("是") if (int(com[9]) == 1) else i18n("否") - if_save_every_weight = i18n("是") if (int(com[10]) == 1) else i18n("否") + if_save_latest = True if (int(com[8]) == 1) else False + if_cache_gpu = True if (int(com[9]) == 1) else False + if_save_every_weight = True if (int(com[10]) == 1) else False version = com[11] - pretrained_base = "pretrained/" if version == "v1" else "pretrained_v2/" - + pretrained_base = "pretrained/" if version == "v1" else "pretrained_v2/" + g_pretrained_path = "%sf0G%s.pth" % (pretrained_base, sample_rate) d_pretrained_path = "%sf0D%s.pth" % (pretrained_base, sample_rate) @@ -1670,20 +1651,21 @@ def cli_train(com): gpu_card_slot_numbers, if_cache_gpu, if_save_every_weight, - version, + version ) - def cli_train_feature(com): com = cli_split_command(com) model_name = com[0] version = com[1] print("Mangio-RVC-Fork Train Feature Index-CLI: Training... Please wait") - generator = train_index(model_name, version) + generator = train_index( + model_name, + version + ) execute_generator_function(generator) print("Mangio-RVC-Fork Train Feature Index-CLI: Done!") - def cli_extract_model(com): com = cli_split_command(com) model_path = com[0] @@ -1693,74 +1675,55 @@ def cli_extract_model(com): info = com[4] version = com[5] extract_small_model_process = extract_small_model( - model_path, save_name, sample_rate, has_pitch_guidance, info, version + model_path, + save_name, + sample_rate, + has_pitch_guidance, + info, + version ) if extract_small_model_process == "Success.": print("Mangio-RVC-Fork Extract Small Model: Success!") else: - print(str(extract_small_model_process)) + print(str(extract_small_model_process)) print("Mangio-RVC-Fork Extract Small Model: Failed!") def preset_apply(preset, qfer, tmbr): - if str(preset) != "": - with open(str(preset), "r") as p: + if str(preset) != '': + with open(str(preset), 'r') as p: content = p.readlines() - qfer, tmbr = content[0].split("\n")[0], content[1] - + qfer, tmbr = content[0].split('\n')[0], content[1] + formant_apply(qfer, tmbr) else: pass - return ( - {"value": qfer, "__type__": "update"}, - {"value": tmbr, "__type__": "update"}, - ) - + return ({"value": qfer, "__type__": "update"}, {"value": tmbr, "__type__": "update"}) def print_page_details(): if cli_current_page == "HOME": print(" go home : Takes you back to home with a navigation list.") print(" go infer : Takes you to inference command execution.\n") - print( - " go pre-process : Takes you to training step.1) pre-process command execution." - ) - print( - " go extract-feature : Takes you to training step.2) extract-feature command execution." - ) - print( - " go train : Takes you to training step.3) being or continue training command execution." - ) - print( - " go train-feature : Takes you to the train feature index command execution.\n" - ) - print( - " go extract-model : Takes you to the extract small model command execution." - ) + print(" go pre-process : Takes you to training step.1) pre-process command execution.") + print(" go extract-feature : Takes you to training step.2) extract-feature command execution.") + print(" go train : Takes you to training step.3) being or continue training command execution.") + print(" go train-feature : Takes you to the train feature index command execution.\n") + print(" go extract-model : Takes you to the extract small model command execution.") elif cli_current_page == "INFER": print(" arg 1) model name with .pth in ./weights: mi-test.pth") print(" arg 2) source audio path: myFolder\\MySource.wav") - print( - " arg 3) output file name to be placed in './audio-outputs': MyTest.wav" - ) - print( - " arg 4) feature index file path: logs/mi-test/added_IVF3042_Flat_nprobe_1.index" - ) + print(" arg 3) output file name to be placed in './audio-outputs': MyTest.wav") + print(" arg 4) feature index file path: logs/mi-test/added_IVF3042_Flat_nprobe_1.index") print(" arg 5) speaker id: 0") print(" arg 6) transposition: 0") - print( - " arg 7) f0 method: harvest (pm, harvest, crepe, crepe-tiny, hybrid[x,x,x,x], mangio-crepe, mangio-crepe-tiny)" - ) + print(" arg 7) f0 method: harvest (pm, harvest, crepe, crepe-tiny, hybrid[x,x,x,x], mangio-crepe, mangio-crepe-tiny)") print(" arg 8) crepe hop length: 160") print(" arg 9) harvest median filter radius: 3 (0-7)") print(" arg 10) post resample rate: 0") print(" arg 11) mix volume envelope: 1") print(" arg 12) feature index ratio: 0.78 (0-1)") - print( - " arg 13) Voiceless Consonant Protection (Less Artifact): 0.33 (Smaller number = more protection. 0.50 means Dont Use.) \n" - ) - print( - "Example: mi-test.pth saudio/Sidney.wav myTest.wav logs/mi-test/added_index.index 0 -2 harvest 160 3 0 1 0.95 0.33" - ) + print(" arg 13) Voiceless Consonant Protection (Less Artifact): 0.33 (Smaller number = more protection. 0.50 means Dont Use.) \n") + print("Example: mi-test.pth saudio/Sidney.wav myTest.wav logs/mi-test/added_index.index 0 -2 harvest 160 3 0 1 0.95 0.33") elif cli_current_page == "PRE-PROCESS": print(" arg 1) Model folder name in ./logs: mi-test") print(" arg 2) Trainset directory: mydataset (or) E:\\my-data-set") @@ -1786,12 +1749,8 @@ def print_page_details(): print(" arg 7) Batch size: 8") print(" arg 8) Gpu card slot: 0 (0-1-2 if using 3 GPUs)") print(" arg 9) Save only the latest checkpoint: 0 (0 for no, 1 for yes)") - print( - " arg 10) Whether to cache training set to vram: 0 (0 for no, 1 for yes)" - ) - print( - " arg 11) Save extracted small model every generation?: 0 (0 for no, 1 for yes)" - ) + print(" arg 10) Whether to cache training set to vram: 0 (0 for no, 1 for yes)") + print(" arg 11) Save extracted small model every generation?: 0 (0 for no, 1 for yes)") print(" arg 12) Model architecture version: v2 (use either v1 or v2)\n") print("Example: mi-test 40k 1 0 50 10000 8 0 0 0 0 v2") elif cli_current_page == "TRAIN-FEATURE": @@ -1805,18 +1764,14 @@ def print_page_details(): print(" arg 4) Has Pitch Guidance?: 1 (0 for no, 1 for yes)") print(' arg 5) Model information: "My Model"') print(" arg 6) Model architecture version: v2 (use either v1 or v2)\n") - print( - 'Example: logs/mi-test/G_168000.pth MyModel 40k 1 "Created by Cole Mangio" v2' - ) + print('Example: logs/mi-test/G_168000.pth MyModel 40k 1 "Created by Cole Mangio" v2') print("") - def change_page(page): global cli_current_page cli_current_page = page return 0 - def execute_command(com): if com == "go home": return change_page("HOME") @@ -1836,7 +1791,7 @@ def execute_command(com): if com[:3] == "go ": print("page '%s' does not exist!" % com[3:]) return 0 - + if cli_current_page == "INFER": cli_infer(com) elif cli_current_page == "PRE-PROCESS": @@ -1850,7 +1805,6 @@ def execute_command(com): elif cli_current_page == "EXTRACT-MODEL": cli_extract_model(com) - def cli_navigation_loop(): while True: print("You are currently in '%s':" % cli_current_page) @@ -1861,1125 +1815,111 @@ def cli_navigation_loop(): except: print(traceback.format_exc()) - -if config.is_cli: +if(config.is_cli): print("\n\nMangio-RVC-Fork v2 CLI App!\n") - print( - "Welcome to the CLI version of RVC. Please read the documentation on https://github.com/Mangio621/Mangio-RVC-Fork (README.MD) to understand how to use this app.\n" - ) + print("Welcome to the CLI version of RVC. Please read the documentation on https://github.com/Mangio621/Mangio-RVC-Fork (README.MD) to understand how to use this app.\n") cli_navigation_loop() -# endregion - -# region RVC WebUI App +#endregion +#region RVC WebUI App def get_presets(): data = None - with open("../inference-presets.json", "r") as file: + with open('../inference-presets.json', 'r') as file: data = json.load(file) preset_names = [] - for preset in data["presets"]: - preset_names.append(preset["name"]) - + for preset in data['presets']: + preset_names.append(preset['name']) + return preset_names +def stepdisplay(if_save_every_weights): + return ({"visible": if_save_every_weights, "__type__": "update"}) def match_index(sid0): picked = False - # folder = sid0.split('.')[0] - - # folder = re.split(r'. |_', sid0)[0] - folder = sid0.split(".")[0].split("_")[0] - # folder_test = sid0.split('.')[0].split('_')[0].split('-')[0] + #folder = sid0.split('.')[0] + + #folder = re.split(r'. |_', sid0)[0] + folder = sid0.split('.')[0].split('_')[0] + #folder_test = sid0.split('.')[0].split('_')[0].split('-')[0] parent_dir = "./logs/" + folder - # print(parent_dir) + #print(parent_dir) if os.path.exists(parent_dir): - # print('path exists') - for filename in os.listdir(parent_dir.replace("\\", "/")): + #print('path exists') + for filename in os.listdir(parent_dir.replace('\\','/')): if filename.endswith(".index"): for i in range(len(indexes_list)): - if indexes_list[i] == ( - os.path.join(("./logs/" + folder), filename).replace("\\", "/") - ): - print("regular index found") + if indexes_list[i] == (os.path.join(("./logs/" + folder), filename).replace('\\','/')): + print('regular index found') break else: - if indexes_list[i] == ( - os.path.join( - ("./logs/" + folder.lower()), filename - ).replace("\\", "/") - ): - print("lowered index found") + if indexes_list[i] == (os.path.join(("./logs/" + folder.lower()), filename).replace('\\','/')): + print('lowered index found') parent_dir = "./logs/" + folder.lower() break - # elif (indexes_list[i]).casefold() == ((os.path.join(("./logs/" + folder), filename).replace('\\','/')).casefold()): + #elif (indexes_list[i]).casefold() == ((os.path.join(("./logs/" + folder), filename).replace('\\','/')).casefold()): # print('8') # parent_dir = "./logs/" + folder.casefold() # break - # elif (indexes_list[i]) == ((os.path.join(("./logs/" + folder_test), filename).replace('\\','/'))): + #elif (indexes_list[i]) == ((os.path.join(("./logs/" + folder_test), filename).replace('\\','/'))): # parent_dir = "./logs/" + folder_test # print(parent_dir) # break - # elif (indexes_list[i]) == (os.path.join(("./logs/" + folder_test.lower()), filename).replace('\\','/')): + #elif (indexes_list[i]) == (os.path.join(("./logs/" + folder_test.lower()), filename).replace('\\','/')): # parent_dir = "./logs/" + folder_test # print(parent_dir) # break - # else: + #else: # #print('couldnt find index') # continue - - # print('all done') - index_path = os.path.join( - parent_dir.replace("\\", "/"), filename.replace("\\", "/") - ).replace("\\", "/") - # print(index_path) + + #print('all done') + index_path=os.path.join(parent_dir.replace('\\','/'), filename.replace('\\','/')).replace('\\','/') + #print(index_path) return (index_path, index_path) + else: - # print('nothing found') - return ("", "") - + #print('nothing found') + return ('', '') def choveraudio(): - return "" + return '' -def stoptraining(mim): +def stoptraining(mim): if int(mim) == 1: + with open("stop.txt", "w+") as tostops: - tostops.writelines("stop") - # p.terminate() - # p.kill() - os.kill(PID, signal.SIGTERM) + + + tostops.writelines('stop') + #p.terminate() + #p.kill() + try: + os.kill(PID, signal.SIGTERM) + except Exception as e: + print(f"Couldn't click due to {e}") + pass else: pass - + return ( - {"visible": False, "__type__": "update"}, + {"visible": False, "__type__": "update"}, {"visible": True, "__type__": "update"}, ) -# Default-GUI -with gr.Blocks(theme="HaleyCH/HaleyCH_Theme") as app: - gr.HTML("

The Mangio-RVC-Fork 💻

") - gr.Markdown( - value=i18n( - "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt." - ) - ) - with gr.Tabs(): - with gr.TabItem(i18n("模型推理")): - # Inference Preset Row - # with gr.Row(): - # mangio_preset = gr.Dropdown(label="Inference Preset", choices=sorted(get_presets())) - # mangio_preset_name_save = gr.Textbox( - # label="Your preset name" - # ) - # mangio_preset_save_btn = gr.Button('Save Preset', variant="primary") +def whethercrepeornah(radio): + mango = True if radio == 'mangio-crepe' or radio == 'mangio-crepe-tiny' else False + + return ({"visible": mango, "__type__": "update"}) - # Other RVC stuff - with gr.Row(): - # sid0 = gr.Dropdown(label=i18n("推理音色"), choices=sorted(names), value=check_for_name()) - sid0 = gr.Dropdown(label=i18n("推理音色"), choices=sorted(names), value="") - # input_audio_path2 - refresh_button = gr.Button( - i18n("Refresh voice list, index path and audio files"), - variant="primary", - ) - clean_button = gr.Button(i18n("卸载音色省显存"), variant="primary") - spk_item = gr.Slider( - minimum=0, - maximum=2333, - step=1, - label=i18n("请选择说话人id"), - value=0, - visible=False, - interactive=True, - ) - clean_button.click(fn=clean, inputs=[], outputs=[sid0]) - - with gr.Group(): - gr.Markdown( - value=i18n("男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ") - ) - with gr.Row(): - with gr.Column(): - vc_transform0 = gr.Number( - label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0 - ) - input_audio0 = gr.Textbox( - label=i18n( - "Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:" - ), - value=os.path.abspath(os.getcwd()).replace("\\", "/") - + "/audios/" - + "audio.wav", - ) - input_audio1 = gr.Dropdown( - label=i18n( - "Auto detect audio path and select from the dropdown:" - ), - choices=sorted(audio_paths), - value=get_audios(), - interactive=True, - ) - input_audio1.change( - fn=choveraudio, inputs=[], outputs=[input_audio0] - ) - f0method0 = gr.Radio( - label=i18n( - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU" - ), - choices=[ - "pm", - "harvest", - "dio", - "crepe", - "crepe-tiny", - "mangio-crepe", - "mangio-crepe-tiny", - "rmvpe", - ], # Fork Feature. Add Crepe-Tiny - value="rmvpe", - interactive=True, - ) - crepe_hop_length = gr.Slider( - minimum=1, - maximum=512, - step=1, - label=i18n("crepe_hop_length"), - value=120, - interactive=True, - ) - filter_radius0 = gr.Slider( - minimum=0, - maximum=7, - label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), - value=3, - step=1, - interactive=True, - ) - with gr.Column(): - file_index1 = gr.Textbox( - label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"), - value="", - interactive=True, - ) - - file_index2 = gr.Dropdown( - label="3. Path to your added.index file (if it didn't automatically find it.)", - choices=get_indexes(), - value=get_index(), - interactive=True, - allow_custom_value=True, - ) - # sid0.select(fn=match_index, inputs=sid0, outputs=file_index2) - - refresh_button.click( - fn=change_choices, - inputs=[], - outputs=[sid0, file_index2, input_audio1], - ) - # file_big_npy1 = gr.Textbox( - # label=i18n("特征文件路径"), - # value="E:\\codes\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy", - # interactive=True, - # ) - index_rate1 = gr.Slider( - minimum=0, - maximum=1, - label=i18n("检索特征占比"), - value=0.75, - interactive=True, - ) - with gr.Column(): - resample_sr0 = gr.Slider( - minimum=0, - maximum=48000, - label=i18n("后处理重采样至最终采样率,0为不进行重采样"), - value=0, - step=1, - interactive=True, - ) - rms_mix_rate0 = gr.Slider( - minimum=0, - maximum=1, - label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), - value=0.25, - interactive=True, - ) - protect0 = gr.Slider( - minimum=0, - maximum=0.5, - label=i18n( - "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果" - ), - value=0.33, - step=0.01, - interactive=True, - ) - formanting = gr.Checkbox( - value=False, - label="[EXPERIMENTAL, WAV ONLY] Formant shift inference audio", - info="Used for male to female and vice-versa conversions", - interactive=True, - visible=True, - ) - - formant_preset = gr.Dropdown( - value="", - choices=get_fshift_presets(), - label="browse presets for formanting", - visible=False, - ) - formant_refresh_button = gr.Button( - value="\U0001f504", visible=False, variant="primary" - ) - # formant_refresh_button = ToolButton( elem_id='1') - # create_refresh_button(formant_preset, lambda: {"choices": formant_preset}, "refresh_list_shiftpresets") - - qfrency = gr.Slider( - value=Quefrency, - label="Quefrency for formant shifting", - minimum=-16.0, - maximum=16.0, - step=0.1, - visible=False, - interactive=True, - ) - tmbre = gr.Slider( - value=Timbre, - label="Timbre for formant shifting", - minimum=-16.0, - maximum=16.0, - step=0.1, - visible=False, - interactive=True, - ) - - formant_preset.change( - fn=preset_apply, - inputs=[formant_preset, qfrency, tmbre], - outputs=[qfrency, tmbre], - ) - frmntbut = gr.Button("Apply", variant="primary", visible=False) - formanting.change( - fn=formant_enabled, - inputs=[ - formanting, - qfrency, - tmbre, - frmntbut, - formant_preset, - formant_refresh_button, - ], - outputs=[ - formanting, - qfrency, - tmbre, - frmntbut, - formant_preset, - formant_refresh_button, - ], - ) - frmntbut.click( - fn=formant_apply, - inputs=[qfrency, tmbre], - outputs=[qfrency, tmbre], - ) - formant_refresh_button.click( - fn=update_fshift_presets, - inputs=[formant_preset, qfrency, tmbre], - outputs=[formant_preset, qfrency, tmbre], - ) - ##formant_refresh_button.click(fn=preset_apply, inputs=[formant_preset, qfrency, tmbre], outputs=[formant_preset, qfrency, tmbre]) - ##formant_refresh_button.click(fn=update_fshift_presets, inputs=[formant_preset, qfrency, tmbre], outputs=[formant_preset, qfrency, tmbre]) - f0_file = gr.File(label=i18n("F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调")) - but0 = gr.Button(i18n("转换"), variant="primary") - with gr.Row(): - vc_output1 = gr.Textbox(label=i18n("输出信息")) - vc_output2 = gr.Audio(label=i18n("输出音频(右下角三个点,点了可以下载)")) - but0.click( - vc_single, - [ - spk_item, - input_audio0, - input_audio1, - vc_transform0, - f0_file, - f0method0, - file_index1, - file_index2, - # file_big_npy1, - index_rate1, - filter_radius0, - resample_sr0, - rms_mix_rate0, - protect0, - crepe_hop_length, - ], - [vc_output1, vc_output2], - ) - with gr.Group(): - gr.Markdown( - value=i18n("批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ") - ) - with gr.Row(): - with gr.Column(): - vc_transform1 = gr.Number( - label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0 - ) - opt_input = gr.Textbox(label=i18n("指定输出文件夹"), value="opt") - f0method1 = gr.Radio( - label=i18n( - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU" - ), - choices=["pm", "harvest", "crepe", "rmvpe"], - value="rmvpe", - interactive=True, - ) - filter_radius1 = gr.Slider( - minimum=0, - maximum=7, - label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), - value=3, - step=1, - interactive=True, - ) - with gr.Column(): - file_index3 = gr.Textbox( - label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"), - value="", - interactive=True, - ) - file_index4 = gr.Dropdown( # file index dropdown for batch - label=i18n("自动检测index路径,下拉式选择(dropdown)"), - choices=get_indexes(), - value=get_index(), - interactive=True, - ) - sid0.select( - fn=match_index, - inputs=[sid0], - outputs=[file_index2, file_index4], - ) - refresh_button.click( - fn=lambda: change_choices()[1], - inputs=[], - outputs=file_index4, - ) - # file_big_npy2 = gr.Textbox( - # label=i18n("特征文件路径"), - # value="E:\\codes\\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy", - # interactive=True, - # ) - index_rate2 = gr.Slider( - minimum=0, - maximum=1, - label=i18n("检索特征占比"), - value=1, - interactive=True, - ) - with gr.Column(): - resample_sr1 = gr.Slider( - minimum=0, - maximum=48000, - label=i18n("后处理重采样至最终采样率,0为不进行重采样"), - value=0, - step=1, - interactive=True, - ) - rms_mix_rate1 = gr.Slider( - minimum=0, - maximum=1, - label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), - value=1, - interactive=True, - ) - protect1 = gr.Slider( - minimum=0, - maximum=0.5, - label=i18n( - "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果" - ), - value=0.33, - step=0.01, - interactive=True, - ) - with gr.Column(): - dir_input = gr.Textbox( - label=i18n("输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)"), - value=os.path.abspath(os.getcwd()).replace("\\", "/") - + "/audios/", - ) - inputs = gr.File( - file_count="multiple", label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹") - ) - with gr.Row(): - format1 = gr.Radio( - label=i18n("导出文件格式"), - choices=["wav", "flac", "mp3", "m4a"], - value="flac", - interactive=True, - ) - but1 = gr.Button(i18n("转换"), variant="primary") - vc_output3 = gr.Textbox(label=i18n("输出信息")) - but1.click( - vc_multi, - [ - spk_item, - dir_input, - opt_input, - inputs, - vc_transform1, - f0method1, - file_index3, - file_index4, - # file_big_npy2, - index_rate2, - filter_radius1, - resample_sr1, - rms_mix_rate1, - protect1, - format1, - crepe_hop_length, - ], - [vc_output3], - ) - sid0.change( - fn=get_vc, - inputs=[sid0, protect0, protect1], - outputs=[spk_item, protect0, protect1], - ) - with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")): - with gr.Group(): - gr.Markdown( - value=i18n( - "人声伴奏分离批量处理, 使用UVR5模型。
" - "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。
" - "模型分为三类:
" - "1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点;
" - "2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型;
" - "3、去混响、去延迟模型(by FoxJoy):
" - "  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;
" - " (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。
" - "去混响/去延迟,附:
" - "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;
" - "2、MDX-Net-Dereverb模型挺慢的;
" - "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。" - ) - ) - with gr.Row(): - with gr.Column(): - dir_wav_input = gr.Textbox( - label=i18n("输入待处理音频文件夹路径"), - value=((os.getcwd()).replace("\\", "/") + "/audios/"), - ) - wav_inputs = gr.File( - file_count="multiple", label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹") - ) ##### - with gr.Column(): - model_choose = gr.Dropdown(label=i18n("模型"), choices=uvr5_names) - agg = gr.Slider( - minimum=0, - maximum=20, - step=1, - label="人声提取激进程度", - value=10, - interactive=True, - visible=False, # 先不开放调整 - ) - opt_vocal_root = gr.Textbox( - label=i18n("指定输出主人声文件夹"), value="opt" - ) - opt_ins_root = gr.Textbox( - label=i18n("指定输出非主人声文件夹"), value="opt" - ) - format0 = gr.Radio( - label=i18n("导出文件格式"), - choices=["wav", "flac", "mp3", "m4a"], - value="flac", - interactive=True, - ) - but2 = gr.Button(i18n("转换"), variant="primary") - vc_output4 = gr.Textbox(label=i18n("输出信息")) - but2.click( - uvr, - [ - model_choose, - dir_wav_input, - opt_vocal_root, - wav_inputs, - opt_ins_root, - agg, - format0, - ], - [vc_output4], - ) - with gr.TabItem(i18n("训练")): - gr.Markdown( - value=i18n( - "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. " - ) - ) - with gr.Row(): - exp_dir1 = gr.Textbox(label=i18n("输入实验名"), value="mi-test") - sr2 = gr.Radio( - label=i18n("目标采样率"), - choices=["40k", "48k"], - value="40k", - interactive=True, - ) - if_f0_3 = gr.Radio( - label=i18n("模型是否带音高指导(唱歌一定要, 语音可以不要)"), - choices=[True, False], - value=True, - interactive=True, - ) - version19 = gr.Radio( - label=i18n("版本"), - choices=["v1", "v2"], - value="v1", - interactive=True, - visible=True, - ) - np7 = gr.Slider( - minimum=0, - maximum=config.n_cpu, - step=1, - label=i18n("提取音高和处理数据使用的CPU进程数"), - value=int(np.ceil(config.n_cpu / 1.5)), - interactive=True, - ) - with gr.Group(): # 暂时单人的, 后面支持最多4人的#数据处理 - gr.Markdown( - value=i18n( - "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. " - ) - ) - with gr.Row(): - trainset_dir4 = gr.Textbox( - label=i18n("输入训练文件夹路径"), - value=os.path.abspath(os.getcwd()) + "\\datasets\\", - ) - spk_id5 = gr.Slider( - minimum=0, - maximum=4, - step=1, - label=i18n("请指定说话人id"), - value=0, - interactive=True, - ) - but1 = gr.Button(i18n("处理数据"), variant="primary") - info1 = gr.Textbox(label=i18n("输出信息"), value="") - but1.click( - preprocess_dataset, [trainset_dir4, exp_dir1, sr2, np7], [info1] - ) - with gr.Group(): - gr.Markdown(value=i18n("step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)")) - with gr.Row(): - with gr.Column(): - gpus6 = gr.Textbox( - label=i18n("以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"), - value=gpus, - interactive=True, - ) - gpu_info9 = gr.Textbox(label=i18n("显卡信息"), value=gpu_info) - with gr.Column(): - f0method8 = gr.Radio( - label=i18n( - "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢" - ), - choices=[ - "pm", - "harvest", - "dio", - "crepe", - "mangio-crepe", - "rmvpe", - ], # Fork feature: Crepe on f0 extraction for training. - value="rmvpe", - interactive=True, - ) - extraction_crepe_hop_length = gr.Slider( - minimum=1, - maximum=512, - step=1, - label=i18n("crepe_hop_length"), - value=64, - interactive=True, - ) - but2 = gr.Button(i18n("特征提取"), variant="primary") - info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - but2.click( - extract_f0_feature, - [ - gpus6, - np7, - f0method8, - if_f0_3, - exp_dir1, - version19, - extraction_crepe_hop_length, - ], - [info2], - ) - with gr.Group(): - gr.Markdown(value=i18n("step3: 填写训练设置, 开始训练模型和索引")) - with gr.Row(): - save_epoch10 = gr.Slider( - minimum=0, - maximum=50, - step=1, - label=i18n("保存频率save_every_epoch"), - value=5, - interactive=True, - ) - total_epoch11 = gr.Slider( - minimum=0, - maximum=10000, - step=1, - label=i18n("总训练轮数total_epoch"), - value=20, - interactive=True, - ) - batch_size12 = gr.Slider( - minimum=1, - maximum=40, - step=1, - label=i18n("每张显卡的batch_size"), - value=default_batch_size, - interactive=True, - ) - if_save_latest13 = gr.Radio( - label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), - choices=[i18n("是"), i18n("否")], - value=i18n("是"), - interactive=True, - ) - if_cache_gpu17 = gr.Radio( - label=i18n( - "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速" - ), - choices=[i18n("是"), i18n("否")], - value=i18n("否"), - interactive=True, - ) - if_save_every_weights18 = gr.Radio( - label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), - choices=[i18n("是"), i18n("否")], - value=i18n("是"), - interactive=True, - ) - with gr.Row(): - pretrained_G14 = gr.Textbox( - lines=2, - label=i18n("加载预训练底模G路径"), - value="pretrained/f0G40k.pth", - interactive=True, - ) - pretrained_D15 = gr.Textbox( - lines=2, - label=i18n("加载预训练底模D路径"), - value="pretrained/f0D40k.pth", - interactive=True, - ) - sr2.change( - change_sr2, - [sr2, if_f0_3, version19], - [pretrained_G14, pretrained_D15], - ) - version19.change( - change_version19, - [sr2, if_f0_3, version19], - [pretrained_G14, pretrained_D15, sr2], - ) - if_f0_3.change( - change_f0, - [if_f0_3, sr2, version19], - [f0method8, pretrained_G14, pretrained_D15], - ) - gpus16 = gr.Textbox( - label=i18n("以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"), - value=gpus, - interactive=True, - ) - butstop = gr.Button( - "Stop Training", - variant="primary", - visible=False, - ) - but3 = gr.Button(i18n("训练模型"), variant="primary", visible=True) - but3.click( - fn=stoptraining, - inputs=[gr.Number(value=0, visible=False)], - outputs=[but3, butstop], - ) - butstop.click( - fn=stoptraining, - inputs=[gr.Number(value=1, visible=False)], - outputs=[butstop, but3], - ) - - but4 = gr.Button(i18n("训练特征索引"), variant="primary") - # but5 = gr.Button(i18n("一键训练"), variant="primary") - info3 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=10) - - but3.click( - click_train, - [ - exp_dir1, - sr2, - if_f0_3, - spk_id5, - save_epoch10, - total_epoch11, - batch_size12, - if_save_latest13, - pretrained_G14, - pretrained_D15, - gpus16, - if_cache_gpu17, - if_save_every_weights18, - version19, - ], - [info3], - ) - - but4.click(train_index, [exp_dir1, version19], info3) - - # but5.click( - # train1key, - # [ - # exp_dir1, - # sr2, - # if_f0_3, - # trainset_dir4, - # spk_id5, - # np7, - # f0method8, - # save_epoch10, - # total_epoch11, - # batch_size12, - # if_save_latest13, - # pretrained_G14, - # pretrained_D15, - # gpus16, - # if_cache_gpu17, - # if_save_every_weights18, - # version19, - # extraction_crepe_hop_length - # ], - # info3, - # ) - - with gr.TabItem(i18n("ckpt处理")): - with gr.Group(): - gr.Markdown(value=i18n("模型融合, 可用于测试音色融合")) - with gr.Row(): - ckpt_a = gr.Textbox(label=i18n("A模型路径"), value="", interactive=True) - ckpt_b = gr.Textbox(label=i18n("B模型路径"), value="", interactive=True) - alpha_a = gr.Slider( - minimum=0, - maximum=1, - label=i18n("A模型权重"), - value=0.5, - interactive=True, - ) - with gr.Row(): - sr_ = gr.Radio( - label=i18n("目标采样率"), - choices=["40k", "48k"], - value="40k", - interactive=True, - ) - if_f0_ = gr.Radio( - label=i18n("模型是否带音高指导"), - choices=[i18n("是"), i18n("否")], - value=i18n("是"), - interactive=True, - ) - info__ = gr.Textbox( - label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True - ) - name_to_save0 = gr.Textbox( - label=i18n("保存的模型名不带后缀"), - value="", - max_lines=1, - interactive=True, - ) - version_2 = gr.Radio( - label=i18n("模型版本型号"), - choices=["v1", "v2"], - value="v1", - interactive=True, - ) - with gr.Row(): - but6 = gr.Button(i18n("融合"), variant="primary") - info4 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - but6.click( - merge, - [ - ckpt_a, - ckpt_b, - alpha_a, - sr_, - if_f0_, - info__, - name_to_save0, - version_2, - ], - info4, - ) # def merge(path1,path2,alpha1,sr,f0,info): - with gr.Group(): - gr.Markdown(value=i18n("修改模型信息(仅支持weights文件夹下提取的小模型文件)")) - with gr.Row(): - ckpt_path0 = gr.Textbox( - label=i18n("模型路径"), value="", interactive=True - ) - info_ = gr.Textbox( - label=i18n("要改的模型信息"), value="", max_lines=8, interactive=True - ) - name_to_save1 = gr.Textbox( - label=i18n("保存的文件名, 默认空为和源文件同名"), - value="", - max_lines=8, - interactive=True, - ) - with gr.Row(): - but7 = gr.Button(i18n("修改"), variant="primary") - info5 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - but7.click(change_info, [ckpt_path0, info_, name_to_save1], info5) - with gr.Group(): - gr.Markdown(value=i18n("查看模型信息(仅支持weights文件夹下提取的小模型文件)")) - with gr.Row(): - ckpt_path1 = gr.Textbox( - label=i18n("模型路径"), value="", interactive=True - ) - but8 = gr.Button(i18n("查看"), variant="primary") - info6 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - but8.click(show_info, [ckpt_path1], info6) - with gr.Group(): - gr.Markdown( - value=i18n( - "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况" - ) - ) - with gr.Row(): - ckpt_path2 = gr.Textbox( - lines=3, - label=i18n("模型路径"), - value=os.path.abspath(os.getcwd()).replace("\\", "/") - + "/logs/[YOUR_MODEL]/G_23333.pth", - interactive=True, - ) - save_name = gr.Textbox( - label=i18n("保存名"), value="", interactive=True - ) - sr__ = gr.Radio( - label=i18n("目标采样率"), - choices=["32k", "40k", "48k"], - value="40k", - interactive=True, - ) - if_f0__ = gr.Radio( - label=i18n("模型是否带音高指导,1是0否"), - choices=["1", "0"], - value="1", - interactive=True, - ) - version_1 = gr.Radio( - label=i18n("模型版本型号"), - choices=["v1", "v2"], - value="v2", - interactive=True, - ) - info___ = gr.Textbox( - label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True - ) - but9 = gr.Button(i18n("提取"), variant="primary") - info7 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - ckpt_path2.change( - change_info_, [ckpt_path2], [sr__, if_f0__, version_1] - ) - but9.click( - extract_small_model, - [ckpt_path2, save_name, sr__, if_f0__, info___, version_1], - info7, - ) - - with gr.TabItem(i18n("Onnx导出")): - with gr.Row(): - ckpt_dir = gr.Textbox(label=i18n("RVC模型路径"), value="", interactive=True) - with gr.Row(): - onnx_dir = gr.Textbox( - label=i18n("Onnx输出路径"), value="", interactive=True - ) - with gr.Row(): - infoOnnx = gr.Label(label="info") - with gr.Row(): - butOnnx = gr.Button(i18n("导出Onnx模型"), variant="primary") - butOnnx.click(export_onnx, [ckpt_dir, onnx_dir], infoOnnx) - - tab_faq = i18n("常见问题解答") - with gr.TabItem(tab_faq): - try: - if tab_faq == "常见问题解答": - with open("docs/faq.md", "r", encoding="utf8") as f: - info = f.read() - else: - with open("docs/faq_en.md", "r", encoding="utf8") as f: - info = f.read() - gr.Markdown(value=info) - except: - gr.Markdown(traceback.format_exc()) - - # region Mangio Preset Handler Region - def save_preset( - preset_name, - sid0, - vc_transform, - input_audio0, - input_audio1, - f0method, - crepe_hop_length, - filter_radius, - file_index1, - file_index2, - index_rate, - resample_sr, - rms_mix_rate, - protect, - f0_file, - ): - data = None - with open("../inference-presets.json", "r") as file: - data = json.load(file) - preset_json = { - "name": preset_name, - "model": sid0, - "transpose": vc_transform, - "audio_file": input_audio0, - "auto_audio_file": input_audio1, - "f0_method": f0method, - "crepe_hop_length": crepe_hop_length, - "median_filtering": filter_radius, - "feature_path": file_index1, - "auto_feature_path": file_index2, - "search_feature_ratio": index_rate, - "resample": resample_sr, - "volume_envelope": rms_mix_rate, - "protect_voiceless": protect, - "f0_file_path": f0_file, - } - data["presets"].append(preset_json) - with open("../inference-presets.json", "w") as file: - json.dump(data, file) - file.flush() - print("Saved Preset %s into inference-presets.json!" % preset_name) - - def on_preset_changed(preset_name): - print("Changed Preset to %s!" % preset_name) - data = None - with open("../inference-presets.json", "r") as file: - data = json.load(file) - - print("Searching for " + preset_name) - returning_preset = None - for preset in data["presets"]: - if preset["name"] == preset_name: - print("Found a preset") - returning_preset = preset - # return all new input values - return ( - # returning_preset['model'], - # returning_preset['transpose'], - # returning_preset['audio_file'], - # returning_preset['f0_method'], - # returning_preset['crepe_hop_length'], - # returning_preset['median_filtering'], - # returning_preset['feature_path'], - # returning_preset['auto_feature_path'], - # returning_preset['search_feature_ratio'], - # returning_preset['resample'], - # returning_preset['volume_envelope'], - # returning_preset['protect_voiceless'], - # returning_preset['f0_file_path'] - ) - - # Preset State Changes - - # This click calls save_preset that saves the preset into inference-presets.json with the preset name - # mangio_preset_save_btn.click( - # fn=save_preset, - # inputs=[ - # mangio_preset_name_save, - # sid0, - # vc_transform0, - # input_audio0, - # f0method0, - # crepe_hop_length, - # filter_radius0, - # file_index1, - # file_index2, - # index_rate1, - # resample_sr0, - # rms_mix_rate0, - # protect0, - # f0_file - # ], - # outputs=[] - # ) - - # mangio_preset.change( - # on_preset_changed, - # inputs=[ - # # Pass inputs here - # mangio_preset - # ], - # outputs=[ - # # Pass Outputs here. These refer to the gradio elements that we want to directly change - # # sid0, - # # vc_transform0, - # # input_audio0, - # # f0method0, - # # crepe_hop_length, - # # filter_radius0, - # # file_index1, - # # file_index2, - # # index_rate1, - # # resample_sr0, - # # rms_mix_rate0, - # # protect0, - # # f0_file - # ] - # ) - # endregion - - # with gr.TabItem(i18n("招募音高曲线前端编辑器")): - # gr.Markdown(value=i18n("加开发群联系我xxxxx")) - # with gr.TabItem(i18n("点击查看交流、问题反馈群号")): - # gr.Markdown(value=i18n("xxxxx")) - - if ( - config.iscolab or config.paperspace - ): # Share gradio link for colab and paperspace (FORK FEATURE) - app.queue(concurrency_count=511, max_size=1022).launch(share=True) - else: - app.queue(concurrency_count=511, max_size=1022).launch( - server_name="0.0.0.0", - inbrowser=not config.noautoopen, - server_port=config.listen_port, - quiet=False, - ) - -# endregion -""" #End of Default-GUI - -with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: +#Change your Gradio Theme here. 👇 👇 👇 👇 +with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: gr.HTML("

The Mangio-RVC-Fork 💻

") gr.Markdown( value=i18n( @@ -3038,31 +1978,32 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: interactive=True, ) input_audio1.change(fn=choveraudio,inputs=[],outputs=[input_audio0]) - with gr.Accordion("F0 Settings"): - f0method0 = gr.Radio( - label=i18n( - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU" - ), - choices=["pm", "harvest", "dio", "crepe", "crepe-tiny", "mangio-crepe", "mangio-crepe-tiny", "rmvpe"], # Fork Feature. Add Crepe-Tiny - value="rmvpe", - interactive=True, - ) - crepe_hop_length = gr.Slider( - minimum=1, - maximum=512, - step=1, - label=i18n("crepe_hop_length"), - value=120, - interactive=True - ) - filter_radius0 = gr.Slider( - minimum=0, - maximum=7, - label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), - value=3, - step=1, - interactive=True, - ) + f0method0 = gr.Radio( + label=i18n( + "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU" + ), + choices=["pm", "harvest", "dio", "crepe", "crepe-tiny", "mangio-crepe", "mangio-crepe-tiny", "rmvpe"], # Fork Feature. Add Crepe-Tiny + value="rmvpe", + interactive=True, + ) + crepe_hop_length = gr.Slider( + minimum=1, + maximum=512, + step=1, + label=i18n("crepe_hop_length"), + value=120, + interactive=True, + visible=False, + ) + f0method0.change(fn=whethercrepeornah, inputs=[f0method0], outputs=[crepe_hop_length]) + filter_radius0 = gr.Slider( + minimum=0, + maximum=7, + label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), + value=3, + step=1, + interactive=True, + ) with gr.Column(): file_index1 = gr.Textbox( label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"), @@ -3097,34 +2038,6 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: value=0.75, interactive=True, ) - formant_preset = gr.Dropdown( - value='', - choices=get_fshift_presets(), - label="Browse Presets for Formanting", - visible=False, - ) - formant_refresh_button = gr.Button(value='\U0001f504', visible=False,variant='primary') - #formant_refresh_button = ToolButton( elem_id='1') - #create_refresh_button(formant_preset, lambda: {"choices": formant_preset}, "refresh_list_shiftpresets") - - qfrency = gr.Slider( - value=Quefrency, - label="Quefrency for formant shifting", - minimum=-16.0, - maximum=16.0, - step=0.1, - visible=False, - interactive=True, - ) - tmbre = gr.Slider( - value=Timbre, - label="Timbre for formant shifting", - minimum=-16.0, - maximum=16.0, - step=0.1, - visible=False, - interactive=True, - ) with gr.Column(): resample_sr0 = gr.Slider( minimum=0, @@ -3159,13 +2072,42 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: visible=True, ) + formant_preset = gr.Dropdown( + value='', + choices=get_fshift_presets(), + label="browse presets for formanting", + visible=False, + ) + formant_refresh_button = gr.Button(value='\U0001f504', visible=False,variant='primary') + #formant_refresh_button = ToolButton( elem_id='1') + #create_refresh_button(formant_preset, lambda: {"choices": formant_preset}, "refresh_list_shiftpresets") + qfrency = gr.Slider( + value=Quefrency, + label="Quefrency for formant shifting", + minimum=-16.0, + maximum=16.0, + step=0.1, + visible=False, + interactive=True, + ) + tmbre = gr.Slider( + value=Timbre, + label="Timbre for formant shifting", + minimum=-16.0, + maximum=16.0, + step=0.1, + visible=False, + interactive=True, + ) - formant_preset.change(fn=preset_apply,inputs=[formant_preset, qfrency, tmbre],outputs=[qfrency, tmbre]) + formant_preset.change(fn=preset_apply, inputs=[formant_preset, qfrency, tmbre], outputs=[qfrency, tmbre]) frmntbut = gr.Button("Apply", variant="primary", visible=False) formanting.change(fn=formant_enabled,inputs=[formanting,qfrency,tmbre,frmntbut,formant_preset,formant_refresh_button],outputs=[formanting,qfrency,tmbre,frmntbut,formant_preset,formant_refresh_button]) frmntbut.click(fn=formant_apply,inputs=[qfrency, tmbre], outputs=[qfrency, tmbre]) - formant_refresh_button.click(fn=update_fshift_presets, inputs=[], outputs=[formant_preset]) + formant_refresh_button.click(fn=update_fshift_presets,inputs=[formant_preset, qfrency, tmbre],outputs=[formant_preset, qfrency, tmbre]) + ##formant_refresh_button.click(fn=preset_apply, inputs=[formant_preset, qfrency, tmbre], outputs=[formant_preset, qfrency, tmbre]) + ##formant_refresh_button.click(fn=update_fshift_presets, inputs=[formant_preset, qfrency, tmbre], outputs=[formant_preset, qfrency, tmbre]) f0_file = gr.File(label=i18n("F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调")) but0 = gr.Button(i18n("转换"), variant="primary") with gr.Row(): @@ -3193,128 +2135,127 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: [vc_output1, vc_output2], ) with gr.Group(): - with gr.Accordion("Batch conversion", open = False): - gr.Markdown( - value=i18n("批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ") - ) - with gr.Row(): - with gr.Column(): - vc_transform1 = gr.Number( - label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0 - ) - opt_input = gr.Textbox(label=i18n("指定输出文件夹"), value="opt") - f0method1 = gr.Radio( - label=i18n( - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU" - ), - choices=["pm", "harvest", "crepe", "rmvpe"], - value="rmvpe", - interactive=True, - ) - filter_radius1 = gr.Slider( - minimum=0, - maximum=7, - label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), - value=3, - step=1, - interactive=True, - ) - - with gr.Column(): - file_index3 = gr.Textbox( - label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"), - value="", - interactive=True, - ) - file_index4 = gr.Dropdown( #file index dropdown for batch - label=i18n("自动检测index路径,下拉式选择(dropdown)"), - choices=get_indexes(), - value=get_index(), - interactive=True, - ) - sid0.select(fn=match_index, inputs=[sid0], outputs=[file_index2, file_index4]) - refresh_button.click( - fn=lambda: change_choices()[1], - inputs=[], - outputs=file_index4, - ) - # file_big_npy2 = gr.Textbox( - # label=i18n("特征文件路径"), - # value="E:\\codes\\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy", - # interactive=True, - # ) - index_rate2 = gr.Slider( - minimum=0, - maximum=1, - label=i18n("检索特征占比"), - value=1, - interactive=True, - ) - with gr.Column(): - resample_sr1 = gr.Slider( - minimum=0, - maximum=48000, - label=i18n("后处理重采样至最终采样率,0为不进行重采样"), - value=0, - step=1, - interactive=True, - ) - rms_mix_rate1 = gr.Slider( - minimum=0, - maximum=1, - label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), - value=1, - interactive=True, - ) - protect1 = gr.Slider( - minimum=0, - maximum=0.5, - label=i18n( - "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果" - ), - value=0.33, - step=0.01, - interactive=True, - ) - with gr.Column(): - dir_input = gr.Textbox( - label=i18n("输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)"), - value=os.path.abspath(os.getcwd()).replace('\\', '/') + "/audios/", - ) - inputs = gr.File( - file_count="multiple", label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹") - ) - with gr.Row(): - format1 = gr.Radio( - label=i18n("导出文件格式"), - choices=["wav", "flac", "mp3", "m4a"], - value="flac", - interactive=True, - ) - but1 = gr.Button(i18n("转换"), variant="primary") - vc_output3 = gr.Textbox(label=i18n("输出信息")) - but1.click( - vc_multi, - [ - spk_item, - dir_input, - opt_input, - inputs, - vc_transform1, - f0method1, - file_index3, - file_index4, - # file_big_npy2, - index_rate2, - filter_radius1, - resample_sr1, - rms_mix_rate1, - protect1, - format1, - crepe_hop_length, - ], - [vc_output3], + gr.Markdown( + value=i18n("批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ") + ) + with gr.Row(): + with gr.Column(): + vc_transform1 = gr.Number( + label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0 ) + opt_input = gr.Textbox(label=i18n("指定输出文件夹"), value="opt") + f0method1 = gr.Radio( + label=i18n( + "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU" + ), + choices=["pm", "harvest", "crepe", "rmvpe"], + value="rmvpe", + interactive=True, + ) + + filter_radius1 = gr.Slider( + minimum=0, + maximum=7, + label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), + value=3, + step=1, + interactive=True, + ) + with gr.Column(): + file_index3 = gr.Textbox( + label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"), + value="", + interactive=True, + ) + file_index4 = gr.Dropdown( #file index dropdown for batch + label=i18n("自动检测index路径,下拉式选择(dropdown)"), + choices=get_indexes(), + value=get_index(), + interactive=True, + ) + sid0.select(fn=match_index, inputs=[sid0], outputs=[file_index2, file_index4]) + refresh_button.click( + fn=lambda: change_choices()[1], + inputs=[], + outputs=file_index4, + ) + # file_big_npy2 = gr.Textbox( + # label=i18n("特征文件路径"), + # value="E:\\codes\\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy", + # interactive=True, + # ) + index_rate2 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("检索特征占比"), + value=1, + interactive=True, + ) + with gr.Column(): + resample_sr1 = gr.Slider( + minimum=0, + maximum=48000, + label=i18n("后处理重采样至最终采样率,0为不进行重采样"), + value=0, + step=1, + interactive=True, + ) + rms_mix_rate1 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), + value=1, + interactive=True, + ) + protect1 = gr.Slider( + minimum=0, + maximum=0.5, + label=i18n( + "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果" + ), + value=0.33, + step=0.01, + interactive=True, + ) + with gr.Column(): + dir_input = gr.Textbox( + label=i18n("输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)"), + value=os.path.abspath(os.getcwd()).replace('\\', '/') + "/audios/", + ) + inputs = gr.File( + file_count="multiple", label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹") + ) + with gr.Row(): + format1 = gr.Radio( + label=i18n("导出文件格式"), + choices=["wav", "flac", "mp3", "m4a"], + value="flac", + interactive=True, + ) + but1 = gr.Button(i18n("转换"), variant="primary") + vc_output3 = gr.Textbox(label=i18n("输出信息")) + but1.click( + vc_multi, + [ + spk_item, + dir_input, + opt_input, + inputs, + vc_transform1, + f0method1, + file_index3, + file_index4, + # file_big_npy2, + index_rate2, + filter_radius1, + resample_sr1, + rms_mix_rate1, + protect1, + format1, + crepe_hop_length, + ], + [vc_output3], + ) sid0.change( fn=get_vc, inputs=[sid0, protect0, protect1], @@ -3399,9 +2340,8 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: value="40k", interactive=True, ) - if_f0_3 = gr.Radio( - label=i18n("模型是否带音高指导(唱歌一定要, 语音可以不要)"), - choices=[True, False], + if_f0_3 = gr.Checkbox( + label="Whether the model has pitch guidance.", value=True, interactive=True, ) @@ -3444,7 +2384,7 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: preprocess_dataset, [trainset_dir4, exp_dir1, sr2, np7], [info1] ) with gr.Group(): - gr.Markdown(value=i18n("step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)")) + step2b = gr.Markdown(value=i18n("step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)")) with gr.Row(): with gr.Column(): gpus6 = gr.Textbox( @@ -3462,14 +2402,18 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: value="rmvpe", interactive=True, ) + extraction_crepe_hop_length = gr.Slider( minimum=1, maximum=512, step=1, label=i18n("crepe_hop_length"), value=64, - interactive=True + interactive=True, + visible=False, ) + + f0method8.change(fn=whethercrepeornah, inputs=[f0method8], outputs=[extraction_crepe_hop_length]) but2 = gr.Button(i18n("特征提取"), variant="primary") info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) but2.click( @@ -3481,15 +2425,16 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: gr.Markdown(value=i18n("step3: 填写训练设置, 开始训练模型和索引")) with gr.Row(): save_epoch10 = gr.Slider( - minimum=0, + minimum=1, maximum=50, step=1, label=i18n("保存频率save_every_epoch"), value=5, interactive=True, + visible=True, ) total_epoch11 = gr.Slider( - minimum=0, + minimum=1, maximum=10000, step=1, label=i18n("总训练轮数total_epoch"), @@ -3504,24 +2449,20 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: value=default_batch_size, interactive=True, ) - if_save_latest13 = gr.Radio( - label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), - choices=[i18n("是"), i18n("否")], - value=i18n("是"), + if_save_latest13 = gr.Checkbox( + label="Whether to save only the latest .ckpt file to save hard disk space", + + value=True, interactive=True, ) - if_cache_gpu17 = gr.Radio( - label=i18n( - "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速" - ), - choices=[i18n("是"), i18n("否")], - value=i18n("否"), + if_cache_gpu17 = gr.Checkbox( + label="Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training, but caching large datasets will consume a lot of GPU memory and may not provide much speed improvement", + value=False, interactive=True, ) - if_save_every_weights18 = gr.Radio( - label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), - choices=[i18n("是"), i18n("否")], - value=i18n("是"), + if_save_every_weights18 = gr.Checkbox( + label="Save a small final model to the 'weights' folder at each save point", + value=True, interactive=True, ) with gr.Row(): @@ -3547,20 +2488,34 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: [sr2, if_f0_3, version19], [pretrained_G14, pretrained_D15, sr2], ) + ### if f0_3 put here if_f0_3.change( - change_f0, - [if_f0_3, sr2, version19], - [f0method8, pretrained_G14, pretrained_D15], + fn=change_f0, + inputs=[if_f0_3, sr2, version19, step2b, gpus6, gpu_info9, extraction_crepe_hop_length, but2, info2], + outputs=[f0method8, pretrained_G14, pretrained_D15, step2b, gpus6, gpu_info9, extraction_crepe_hop_length, but2, info2], ) + if_f0_3.change(fn=whethercrepeornah, inputs=[f0method8], outputs=[extraction_crepe_hop_length]) gpus16 = gr.Textbox( label=i18n("以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"), value=gpus, interactive=True, ) - but3 = gr.Button(i18n("训练模型"), variant="primary") + butstop = gr.Button( + "Stop Training", + variant='primary', + visible=False, + ) + but3 = gr.Button(i18n("训练模型"), variant="primary", visible=True) + but3.click(fn=stoptraining, inputs=[gr.Number(value=0, visible=False)], outputs=[but3, butstop]) + butstop.click(fn=stoptraining, inputs=[gr.Number(value=1, visible=False)], outputs=[butstop, but3]) + + but4 = gr.Button(i18n("训练特征索引"), variant="primary") #but5 = gr.Button(i18n("一键训练"), variant="primary") info3 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=10) + + if_save_every_weights18.change(fn=stepdisplay, inputs=[if_save_every_weights18], outputs=[save_epoch10]) + but3.click( click_train, [ @@ -3579,9 +2534,13 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: if_save_every_weights18, version19, ], - info3, + [info3, butstop, but3], ) + but4.click(train_index, [exp_dir1, version19], info3) + + + #but5.click( # train1key, # [ @@ -3606,13 +2565,13 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: # ], # info3, #) - + with gr.TabItem(i18n("ckpt处理")): with gr.Group(): gr.Markdown(value=i18n("模型融合, 可用于测试音色融合")) with gr.Row(): - ckpt_a = gr.Textbox(label=i18n("A模型路径"), value="", interactive=True) - ckpt_b = gr.Textbox(label=i18n("B模型路径"), value="", interactive=True) + ckpt_a = gr.Textbox(label=i18n("A模型路径"), value="", interactive=True, placeholder="Path to your model A.") + ckpt_b = gr.Textbox(label=i18n("B模型路径"), value="", interactive=True, placeholder="Path to your model B.") alpha_a = gr.Slider( minimum=0, maximum=1, @@ -3627,18 +2586,18 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: value="40k", interactive=True, ) - if_f0_ = gr.Radio( - label=i18n("模型是否带音高指导"), - choices=[i18n("是"), i18n("否")], - value=i18n("是"), + if_f0_ = gr.Checkbox( + label="Whether the model has pitch guidance.", + value=True, interactive=True, ) info__ = gr.Textbox( - label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True + label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True, placeholder="Model information to be placed." ) name_to_save0 = gr.Textbox( label=i18n("保存的模型名不带后缀"), value="", + placeholder="Name for saving.", max_lines=1, interactive=True, ) @@ -3667,15 +2626,16 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: ) # def merge(path1,path2,alpha1,sr,f0,info): with gr.Group(): gr.Markdown(value=i18n("修改模型信息(仅支持weights文件夹下提取的小模型文件)")) - with gr.Row(): + with gr.Row(): ###### ckpt_path0 = gr.Textbox( - label=i18n("模型路径"), value="", interactive=True + label=i18n("模型路径"), placeholder="Path to your Model.", value="", interactive=True ) info_ = gr.Textbox( - label=i18n("要改的模型信息"), value="", max_lines=8, interactive=True + label=i18n("要改的模型信息"), value="", max_lines=8, interactive=True, placeholder="Model information to be changed." ) name_to_save1 = gr.Textbox( label=i18n("保存的文件名, 默认空为和源文件同名"), + placeholder="Either leave empty or put in the Name of the Model to be saved.", value="", max_lines=8, interactive=True, @@ -3688,7 +2648,7 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: gr.Markdown(value=i18n("查看模型信息(仅支持weights文件夹下提取的小模型文件)")) with gr.Row(): ckpt_path1 = gr.Textbox( - label=i18n("模型路径"), value="", interactive=True + label=i18n("模型路径"), value="", interactive=True, placeholder="Model path here." ) but8 = gr.Button(i18n("查看"), variant="primary") info6 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) @@ -3707,7 +2667,8 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: interactive=True, ) save_name = gr.Textbox( - label=i18n("保存名"), value="", interactive=True + label=i18n("保存名"), value="", interactive=True, + placeholder="Your filename here.", ) sr__ = gr.Radio( label=i18n("目标采样率"), @@ -3715,10 +2676,9 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: value="40k", interactive=True, ) - if_f0__ = gr.Radio( - label=i18n("模型是否带音高指导,1是0否"), - choices=["1", "0"], - value="1", + if_f0__ = gr.Checkbox( + label="Whether the model has pitch guidance.", + value=True, interactive=True, ) version_1 = gr.Radio( @@ -3728,7 +2688,7 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: interactive=True, ) info___ = gr.Textbox( - label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True + label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True, placeholder="Model info here." ) but9 = gr.Button(i18n("提取"), variant="primary") info7 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) @@ -3743,10 +2703,10 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: with gr.TabItem(i18n("Onnx导出")): with gr.Row(): - ckpt_dir = gr.Textbox(label=i18n("RVC模型路径"), value="", interactive=True) + ckpt_dir = gr.Textbox(label=i18n("RVC模型路径"), value="", interactive=True, placeholder="RVC model path.") with gr.Row(): onnx_dir = gr.Textbox( - label=i18n("Onnx输出路径"), value="", interactive=True + label=i18n("Onnx输出路径"), value="", interactive=True, placeholder="Onnx model output path." ) with gr.Row(): infoOnnx = gr.Label(label="info") @@ -3903,8 +2863,7 @@ with gr.Blocks(theme='HaleyCH/HaleyCH_Theme') as app: server_name="0.0.0.0", inbrowser=not config.noautoopen, server_port=config.listen_port, - quiet=True, + quiet=False, ) #endregion -"""