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
-"""