diff --git a/LazyImport.py b/LazyImport.py
new file mode 100644
index 000000000..5bdb05ddd
--- /dev/null
+++ b/LazyImport.py
@@ -0,0 +1,13 @@
+from importlib.util import find_spec, LazyLoader, module_from_spec
+from sys import modules
+
+def lazyload(name):
+ if name in modules:
+ return modules[name]
+ else:
+ spec = find_spec(name)
+ loader = LazyLoader(spec.loader)
+ module = module_from_spec(spec)
+ modules[name] = module
+ loader.exec_module(module)
+ return module
\ No newline at end of file
diff --git a/infer-web.py b/infer-web.py
index a9246bba3..979c0fbe5 100644
--- a/infer-web.py
+++ b/infer-web.py
@@ -1,43 +1,37 @@
-from importlib.util import find_spec, LazyLoader, module_from_spec
import sys
-def lazyload(name):
- spec = find_spec(name)
- loader = LazyLoader(spec.loader)
- spec.loader = loader
- module = module_from_spec(spec)
- sys.modules[name] = module
- loader.exec_module(module)
- return module
-
-import shutil
+from shutil import rmtree
import json # Mangio fork using json for preset saving
-math = lazyload('math')
+
from glob import glob1
from signal import SIGTERM
import os
now_dir = os.getcwd()
sys.path.append(now_dir)
+
+from LazyImport import lazyload
+
+math = lazyload('math')
+
import traceback
import warnings
tensorlowest = lazyload('tensorlowest')
import faiss
ffmpeg = lazyload('ffmpeg')
-import numpy as np
+np = lazyload("numpy")
torch = lazyload('torch')
re = lazyload('regex')
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["no_proxy"] = "localhost, 127.0.0.1, ::1"
import logging
-import threading
from random import shuffle
from subprocess import Popen
-from time import sleep
-
-import gradio as gr
-from soundfile import write as SFWrite
+gr = lazyload("gradio")
+SF = lazyload("soundfile")
+SFWrite = SF.write
+import onnx
from config import Config
from fairseq import checkpoint_utils
from i18n import I18nAuto
@@ -55,6 +49,12 @@ def lazyload(name):
from vc_infer_pipeline import VC
from sklearn.cluster import MiniBatchKMeans
+import time
+import threading
+from safetensors.torch import load_file
+
+from numba import jit
+
from shlex import quote as SQuote
RQuote = lambda val: SQuote(str(val))
@@ -63,9 +63,9 @@ def lazyload(name):
runtime_dir = os.path.join(now_dir, "runtime/Lib/site-packages")
directories = ['logs', 'audios', 'datasets', 'weights']
-shutil.rmtree(tmp, ignore_errors=True)
-shutil.rmtree(os.path.join(runtime_dir, "infer_pack"), ignore_errors=True)
-shutil.rmtree(os.path.join(runtime_dir, "uvr5_pack"), ignore_errors=True)
+rmtree(tmp, ignore_errors=True)
+rmtree(os.path.join(runtime_dir, "infer_pack"), ignore_errors=True)
+rmtree(os.path.join(runtime_dir, "uvr5_pack"), ignore_errors=True)
os.makedirs(tmp, exist_ok=True)
for folder in directories:
@@ -131,14 +131,14 @@ def load_hubert():
index_root = "./logs/"
audio_root = "audios"
-names = [name for name in os.listdir(weight_root) if name.endswith(".pth")]
+names = [name for name in os.listdir(weight_root) if name.endswith((".pth", ".onnx"))]
-indexes_list = ["%s/%s" % (root, name)
+indexes_list = [f"{root}/{name}"
for root, _, files in os.walk(index_root, topdown=False)
for name in files
if name.endswith(".index") and "trained" not in name]
-audio_paths = ["%s/%s" % (root, name)
+audio_paths = [f"{root}/{name}"
for root, _, files in os.walk(audio_root, topdown=False)
for name in files]
@@ -168,7 +168,6 @@ def get_fshift_presets():
return fshift_presets_list if fshift_presets_list else ''
-
def vc_single(
sid,
input_audio_path0,
@@ -346,8 +345,6 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format
yield "\n".join(infos)
-
-# 一个选项卡全局只能有一个音色
def get_vc(sid, to_return_protect0, to_return_protect1):
global n_spk, tgt_sr, net_g, vc, cpt, version, hubert_model
if not sid:
@@ -366,7 +363,7 @@ def get_vc(sid, to_return_protect0, to_return_protect1):
cpt = None
return ({"visible": False, "__type__": "update"},) * 3
- person = "%s/%s" % (weight_root, sid)
+ person = f"{weight_root}/{sid}"
print(f"loading {person}")
cpt = torch.load(person, map_location="cpu")
tgt_sr = cpt["config"][-1]
@@ -398,7 +395,7 @@ def get_vc(sid, to_return_protect0, to_return_protect1):
def change_choices():
- names = [name for name in os.listdir(weight_root) if name.endswith(".pth")]
+ names = [name for name in os.listdir(weight_root) if name.endswith(".pth", ".onnx")]
indexes_list = [os.path.join(root, name) for root, _, files in os.walk(index_root, topdown=False) for name in files if name.endswith(".index") and "trained" not in name]
audio_paths = [os.path.join(audio_root, file) for file in os.listdir(os.path.join(os.getcwd(), "audios"))]
@@ -414,17 +411,16 @@ def change_choices():
"48k": 48000,
}
-
+@jit
def if_done(done, p):
while p.poll() is None:
- sleep(0.5)
+ time.sleep(0.5)
done[0] = True
-
def if_done_multi(done, ps):
while not all(p.poll() is not None for p in ps):
- sleep(0.5)
+ time.sleep(0.5)
done[0] = True
def formant_enabled(cbox, qfrency, tmbre, frmntapply, formantpreset, formant_refresh_button):
@@ -468,11 +464,13 @@ def update_fshift_presets(preset, qfrency, tmbre):
{"value": tmbre, "__type__": "update"},
)
-
def preprocess_dataset(trainset_dir, exp_dir, sr, n_p):
sr = sr_dict[sr]
- log_dir = f"{now_dir}\\logs\\{exp_dir}"
- log_file = f"{log_dir}\\preprocess.log"
+
+ tmpdir = os.path.join(now_dir, "logs", exp_dir).split("/")
+ log_dir = os.path.join(*tmpdir, "logs", exp_dir)
+ log_file = os.path.join(log_dir, "preprocess.log")
+
os.makedirs(log_dir, exist_ok=True)
@@ -497,7 +495,7 @@ def preprocess_dataset(trainset_dir, exp_dir, sr, n_p):
while not done[0]:
with open(log_file, "r") as f:
yield f.read()
- sleep(1)
+ time.sleep(1)
with open(log_file, "r") as f:
log = f.read()
@@ -505,7 +503,6 @@ def preprocess_dataset(trainset_dir, exp_dir, sr, n_p):
print(log)
yield log
-
def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir, version19, echl):
gpus = gpus.split("-")
log_dir = f"{now_dir}/logs/{exp_dir}"
@@ -526,7 +523,7 @@ def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir, version19, echl):
while not done[0]:
with open(log_file, "r") as f:
yield f.read()
- sleep(1)
+ time.sleep(1)
leng = len(gpus)
ps = []
@@ -546,7 +543,7 @@ def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir, version19, echl):
while not done[0]:
with open(log_file, "r") as f:
yield f.read()
- sleep(1)
+ time.sleep(1)
with open(log_file, "r") as f:
log = f.read()
@@ -640,18 +637,18 @@ def click_train(
if_save_every_weights18,
version19,
):
+
+
CSVutil('csvdb/stop.csv', 'w+', 'formanting', False)
- log_dir = f"%s\\logs\\%s" % (
- now_dir, exp_dir1
- )
+ log_dir = os.path.join(now_dir, "logs", exp_dir1)
+
os.makedirs(log_dir, exist_ok=True)
- gt_wavs_dir = f"%s\\0_gt_wavs" % (log_dir)
+ gt_wavs_dir = os.path.join(log_dir, "0_gt_wavs")
feature_dim = "256" if version19 == "v1" else "768"
- feature_dir = f"%s\\3_feature%s" % (
- log_dir, feature_dim
- )
+
+ feature_dir = os.path.join(log_dir, "3_feature", feature_dim)
log_interval = set_log_interval(log_dir, batch_size12)
@@ -693,14 +690,11 @@ def generate_paths(name):
G_train = f"-pg {pretrained_G14}" if pretrained_G14 else ""
D_train = f"-pd {pretrained_D15}" if pretrained_D15 else ""
- save_latest = 1 if if_save_latest13 else 0
- cache_gpu = 1 if if_cache_gpu17 else 0
- save_every_weights = 1 if if_save_every_weights18 else 0
cmd = (
f"{config.python_cmd} train_nsf_sim_cache_sid_load_pretrain.py -e {exp_dir1} -sr {sr2} -f0 {int(if_f0_3)} -bs {batch_size12}"
- f" -g {gpus16 if gpus16 is not None else ''} -te {total_epoch11} -se {save_epoch10} {G_train} {D_train} -l {save_latest}"
- f" -c {cache_gpu} -sw {save_every_weights} -v {version19} -li {log_interval}"
+ f" -g {gpus16 if gpus16 is not None else ''} -te {total_epoch11} -se {save_epoch10} {G_train} {D_train} -l {int(if_save_latest13)}"
+ f" -c {int(if_cache_gpu17)} -sw {int(if_save_every_weights18)} -v {version19} -li {log_interval}"
)
print(cmd)
@@ -793,7 +787,6 @@ def change_info_(ckpt_path):
print(f"Exception occurred: {str(e)}, Traceback: {traceback.format_exc()}")
return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
-
def export_onnx(model_path, exported_path):
device = torch.device("cpu")
checkpoint = torch.load(model_path, map_location=device)
@@ -862,7 +855,7 @@ def cli_infer(com):
output_path = f'audio-outputs/{output_file_name}'
print(f"{output_message} Starting the inference...")
- vc_data = get_vc(model_name, protection_amnt, protect1)
+ vc_data = get_vc(model_name, protection_amnt, protection_amnt)
print(vc_data)
print(f"{output_message} Performing inference...")
@@ -871,7 +864,7 @@ def cli_infer(com):
source_audio_path,
source_audio_path,
transposition,
- f0_file,
+ None, # f0 file support not implemented
f0_method,
feature_index_path,
feature_index_path,
@@ -968,7 +961,7 @@ def preset_apply(preset, qfer, tmbr):
print("An unexpected error occurred", e)
return ({"value": qfer, "__type__": "update"}, {"value": tmbr, "__type__": "update"})
-
+@jit(nopython=True)
def print_page_details():
page_description = {
'HOME':
@@ -1040,12 +1033,13 @@ def print_page_details():
'\nExample: logs/mi-test/G_168000.pth MyModel 40k 1 "Created by Cole Mangio" v2'
}
print(page_description.get(cli_current_page, 'Invalid page'))
-
+
+
def change_page(page):
global cli_current_page
cli_current_page = page
return 0
-
+@jit
def execute_command(com):
command_to_page = {
"go home": "HOME",
@@ -1080,11 +1074,9 @@ def cli_navigation_loop():
while True:
print(f"\nYou are currently in '{cli_current_page}':")
print_page_details()
- print(cli_current_page + ": ", end="")
- try:
- execute_command(input())
- except Exception as e:
- print(f"An error occurred: {traceback.format_exc()}")
+ print(f"{cli_current_page}: ", end="")
+ try: execute_command(input())
+ except Exception as e: print(f"An error occurred: {traceback.format_exc()}")
if(config.is_cli):
print(
@@ -1142,1029 +1134,1033 @@ def stoptraining(mim):
faq_file = "docs/faq.md" if tab_faq == "常见问题解答" else "docs/faq_en.md"
weights_dir = 'weights/'
-#Change your Gradio Theme here. 👇 👇 👇 👇 Example: " theme='HaleyCH/HaleyCH_Theme' "
-with gr.Blocks(theme=gr.themes.Soft(), title='Mangio-RVC-Web 💻') as app:
- gr.HTML("
The Mangio-RVC-Fork 💻
")
- gr.Markdown(
- value=i18n(
- "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt."
+def GradioSetup():
+ #Change your Gradio Theme here. 👇 👇 👇 👇 Example: " theme='HaleyCH/HaleyCH_Theme' "
+ with gr.Blocks(theme=gr.themes.Soft(), title='Mangio-RVC-Web 💻') 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")
-
- # Other RVC stuff
- with gr.Row():
-
- sid0 = gr.Dropdown(label=i18n("推理音色"), choices=sorted(names), value='')
-
- 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=lambda: ({"value": "", "__type__": "update"}), inputs=[], outputs=[sid0])
+ 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")
+
+ # Other RVC stuff
+ with gr.Row():
+
+ sid0 = gr.Dropdown(label=i18n("推理音色"), choices=sorted(names), value='')
+
+ 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=lambda: ({"value": "", "__type__": "update"}), inputs=[], outputs=[sid0])
- with gr.Group():
+ 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='',
+ interactive=True,
+ )
+ input_audio1.change(fn=lambda:'',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,
+ visible=False,
+ )
+ f0method0.change(
+ fn=lambda radio: (
+ {
+ "visible": radio in ['mangio-crepe', 'mangio-crepe-tiny'],
+ "__type__": "update"
+ }
+ ),
+ 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("特征检索库文件路径,为空则使用下拉的选择结果"),
+ 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(),
+ 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=bool(DoFormant),
+ label="[EXPERIMENTAL] 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',
+ info='Presets are located in formantshiftcfg/ folder',
+ visible=bool(DoFormant),
+ )
+
+ formant_refresh_button = gr.Button(
+ value='\U0001f504',
+ visible=bool(DoFormant),
+ variant='primary',
+ )
+
+ qfrency = gr.Slider(
+ value=Quefrency,
+ info="Default value is 1.0",
+ label="Quefrency for formant shifting",
+ minimum=0.0,
+ maximum=16.0,
+ step=0.1,
+ visible=bool(DoFormant),
+ interactive=True,
+ )
+
+ tmbre = gr.Slider(
+ value=Timbre,
+ info="Default value is 1.0",
+ label="Timbre for formant shifting",
+ minimum=0.0,
+ maximum=16.0,
+ step=0.1,
+ visible=bool(DoFormant),
+ interactive=True,
+ )
+
+ formant_preset.change(fn=preset_apply, inputs=[formant_preset, qfrency, tmbre], outputs=[qfrency, tmbre])
+ frmntbut = gr.Button("Apply", variant="primary", visible=bool(DoFormant))
+ 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])
+
+ 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(),
+ 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("男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ")
+ value=i18n(
+ "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. "
+ )
)
with gr.Row():
- with gr.Column():
- vc_transform0 = gr.Number(
- label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0
+ exp_dir1 = gr.Textbox(label=i18n("输入实验名"), value="mi-test")
+ sr2 = gr.Radio(
+ label=i18n("目标采样率"),
+ choices=["40k", "48k", "32k"],
+ value="40k",
+ interactive=True,
+ )
+ if_f0_3 = gr.Checkbox(
+ label="Whether the model has pitch guidance.",
+ value=True,
+ interactive=True,
+ )
+ version19 = gr.Radio(
+ label=i18n("版本"),
+ choices=["v1", "v2"],
+ value="v2",
+ 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文件夹; 暂时只支持单人训练. "
)
- 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",
+ )
+ with gr.Row():
+ trainset_dir4 = gr.Textbox(
+ label=i18n("输入训练文件夹路径"), value=os.path.abspath(os.getcwd()) + "\\datasets\\"
)
- input_audio1 = gr.Dropdown(
- label=i18n("Auto detect audio path and select from the dropdown:"),
- choices=sorted(audio_paths),
- value='',
+ spk_id5 = gr.Slider(
+ minimum=0,
+ maximum=4,
+ step=1,
+ label=i18n("请指定说话人id"),
+ value=0,
interactive=True,
)
- input_audio1.change(fn=lambda:'',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,
+ but1 = gr.Button(i18n("处理数据"), variant="primary")
+ info1 = gr.Textbox(label=i18n("输出信息"), value="")
+ but1.click(
+ preprocess_dataset, [trainset_dir4, exp_dir1, sr2, np7], [info1]
)
- crepe_hop_length = gr.Slider(
+ with gr.Group():
+ step2b = 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,
+ visible=False,
+ )
+
+ f0method8.change(
+ fn=lambda radio: (
+ {
+ "visible": radio in ['mangio-crepe', 'mangio-crepe-tiny'],
+ "__type__": "update"
+ }
+ ),
+ inputs=[f0method8],
+ outputs=[extraction_crepe_hop_length]
+ )
+ but2 = gr.Button(i18n("特征提取"), variant="primary")
+ info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8, interactive=False)
+ 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=1,
- maximum=512,
+ maximum=50,
step=1,
- label=i18n("crepe_hop_length"),
- value=120,
+ label=i18n("保存频率save_every_epoch"),
+ value=5,
interactive=True,
- visible=False,
- )
- f0method0.change(
- fn=lambda radio: (
- {
- "visible": radio in ['mangio-crepe', 'mangio-crepe-tiny'],
- "__type__": "update"
- }
- ),
- inputs=[f0method0],
- outputs=[crepe_hop_length]
+ visible=True,
)
- filter_radius0 = gr.Slider(
- minimum=0,
- maximum=7,
- label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"),
- value=3,
+ total_epoch11 = gr.Slider(
+ minimum=1,
+ maximum=10000,
step=1,
+ label=i18n("总训练轮数total_epoch"),
+ value=20,
interactive=True,
)
- with gr.Column():
- file_index1 = gr.Textbox(
- label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"),
- value="",
+ batch_size12 = gr.Slider(
+ minimum=1,
+ maximum=40,
+ step=1,
+ label=i18n("每张显卡的batch_size"),
+ value=default_batch_size,
interactive=True,
)
-
- file_index2 = gr.Dropdown(
- label="3. Path to your added.index file (if it didn't automatically find it.)",
- choices=get_indexes(),
+ if_save_latest13 = gr.Checkbox(
+ label="Whether to save only the latest .ckpt file to save hard drive space",
+ value=True,
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,
+ )
+ 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,
)
- with gr.Column():
- resample_sr0 = gr.Slider(
- minimum=0,
- maximum=48000,
- label=i18n("后处理重采样至最终采样率,0为不进行重采样"),
- value=0,
- step=1,
+ if_save_every_weights18 = gr.Checkbox(
+ label="Save a small final model to the 'weights' folder at each save point",
+ value=True,
interactive=True,
)
- rms_mix_rate0 = gr.Slider(
- minimum=0,
- maximum=1,
- label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"),
- value=0.25,
+ with gr.Row():
+ pretrained_G14 = gr.Textbox(
+ lines=2,
+ label=i18n("加载预训练底模G路径"),
+ value="pretrained/f0G40k.pth",
interactive=True,
)
- protect0 = gr.Slider(
- minimum=0,
- maximum=0.5,
- label=i18n(
- "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果"
- ),
- value=0.33,
- step=0.01,
+ pretrained_D15 = gr.Textbox(
+ lines=2,
+ label=i18n("加载预训练底模D路径"),
+ value="pretrained/f0D40k.pth",
interactive=True,
)
- formanting = gr.Checkbox(
- value=bool(DoFormant),
- label="[EXPERIMENTAL] Formant shift inference audio",
- info="Used for male to female and vice-versa conversions",
+ 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(
+ fn=change_f0,
+ inputs=[if_f0_3, sr2, version19],
+ outputs=[f0method8, pretrained_G14, pretrained_D15],
+ )
+ if_f0_3.change(fn=lambda radio: (
+ {
+ "visible": radio in ['mangio-crepe', 'mangio-crepe-tiny'],
+ "__type__": "update"
+ }
+ ), inputs=[f0method8], outputs=[extraction_crepe_hop_length])
+ gpus16 = gr.Textbox(
+ label=i18n("以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"),
+ value=gpus,
interactive=True,
- visible=True,
)
-
- formant_preset = gr.Dropdown(
- value='',
- choices=get_fshift_presets(),
- label='Browse presets for formanting',
- info='Presets are located in formantshiftcfg/ folder',
- visible=bool(DoFormant),
+ 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])
+
- formant_refresh_button = gr.Button(
- value='\U0001f504',
- visible=bool(DoFormant),
- variant='primary',
+ 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=lambda if_save_every_weights: (
+ {
+ "visible": if_save_every_weights,
+ "__type__": "update"
+ }
+ ),
+ inputs=[if_save_every_weights18],
+ outputs=[save_epoch10]
)
- qfrency = gr.Slider(
- value=Quefrency,
- info="Default value is 1.0",
- label="Quefrency for formant shifting",
- minimum=0.0,
- maximum=16.0,
- step=0.1,
- visible=bool(DoFormant),
- interactive=True,
+ 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, butstop, but3],
)
- tmbre = gr.Slider(
- value=Timbre,
- info="Default value is 1.0",
- label="Timbre for formant shifting",
- minimum=0.0,
- maximum=16.0,
- step=0.1,
- visible=bool(DoFormant),
- interactive=True,
- )
+ but4.click(train_index, [exp_dir1, version19], info3)
- formant_preset.change(fn=preset_apply, inputs=[formant_preset, qfrency, tmbre], outputs=[qfrency, tmbre])
- frmntbut = gr.Button("Apply", variant="primary", visible=bool(DoFormant))
- 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])
- 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],
+
+ #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.Group():
+
+ gr.Markdown(value=
+ 'Step 4: Export lowest points on a graph of the model '
+ 'After clicking on Export lowest points of a model, '
+ 'The new files will be located in logs/[yourmodelname]/lowestvals/ folder'
)
- 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,
- )
+
+ with gr.Row():
+ with gr.Accordion(label='Lowest points export'):
- filter_radius1 = gr.Slider(
+ lowestval_weight_dir = gr.Textbox(visible=False)
+ ds = gr.Textbox(visible=False)
+ weights_dir1 = gr.Textbox(visible=False, value=weights_dir)
+
+
+ with gr.Row():
+ amntlastmdls = gr.Slider(
+ minimum=1,
+ maximum=25,
+ label='How many lowest points to save',
+ value=3,
+ step=1,
+ interactive=True,
+ )
+ lpexport = gr.Button(
+ value='Export lowest points of a model',
+ variant='primary',
+ )
+ lw_mdls = gr.File(
+ file_count="multiple",
+ label="Output models",
+ interactive=False,
+ ) #####
+
+ with gr.Row():
+ infolpex = gr.Textbox(label="Output information:", value="", max_lines=10)
+ mdlbl = gr.Dataframe(label='Stats of selected models', datatype='number', type='pandas')
+
+ lpexport.click(
+ lambda model_name: os.path.join("logs", model_name, "lowestvals"),
+ inputs=[exp_dir1],
+ outputs=[lowestval_weight_dir]
+ )
+
+ lpexport.click(fn=tensorlowest.main, inputs=[exp_dir1, save_epoch10, amntlastmdls], outputs=[ds])
+
+ ds.change(
+ fn=tensorlowest.selectweights,
+ inputs=[exp_dir1, ds, weights_dir1, lowestval_weight_dir],
+ outputs=[infolpex, lw_mdls, mdlbl],
+ )
+ 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, 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=7,
- label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"),
- value=3,
- step=1,
- interactive=True,
- )
- with gr.Column():
- file_index3 = gr.Textbox(
- label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"),
- value="",
+ maximum=1,
+ label=i18n("A模型权重"),
+ value=0.5,
interactive=True,
)
- file_index4 = gr.Dropdown( #file index dropdown for batch
- label=i18n("自动检测index路径,下拉式选择(dropdown)"),
- choices=get_indexes(),
+ with gr.Row():
+ sr_ = gr.Radio(
+ label=i18n("目标采样率"),
+ choices=["40k", "48k"],
+ value="40k",
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,
+ if_f0_ = gr.Checkbox(
+ label="Whether the model has pitch guidance.",
+ value=True,
interactive=True,
)
- with gr.Column():
- resample_sr1 = gr.Slider(
- minimum=0,
- maximum=48000,
- label=i18n("后处理重采样至最终采样率,0为不进行重采样"),
- value=0,
- step=1,
- interactive=True,
+ info__ = gr.Textbox(
+ label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True, placeholder="Model information to be placed."
)
- rms_mix_rate1 = gr.Slider(
- minimum=0,
- maximum=1,
- label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"),
- value=1,
+ name_to_save0 = gr.Textbox(
+ label=i18n("保存的模型名不带后缀"),
+ value="",
+ placeholder="Name for saving.",
+ max_lines=1,
interactive=True,
)
- protect1 = gr.Slider(
- minimum=0,
- maximum=0.5,
- label=i18n(
- "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果"
- ),
- value=0.33,
- step=0.01,
+ version_2 = gr.Radio(
+ label=i18n("模型版本型号"),
+ choices=["v1", "v2"],
+ value="v1",
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,
+ but6 = gr.Button(i18n("融合"), variant="primary")
+ info4 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
+ but6.click(
+ merge,
[
- 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,
+ ckpt_a,
+ ckpt_b,
+ alpha_a,
+ sr_,
+ if_f0_,
+ info__,
+ name_to_save0,
+ version_2,
],
- [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/")
+ 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("模型路径"), placeholder="Path to your Model.", value="", interactive=True
)
- 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,
+ info_ = gr.Textbox(
+ 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,
- visible=False, # 先不开放调整
)
- opt_vocal_root = gr.Textbox(
- label=i18n("指定输出主人声文件夹"), value="opt"
+ 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, placeholder="Model path here."
)
- opt_ins_root = gr.Textbox(
- label=i18n("指定输出非主人声文件夹"), value="opt"
+ 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文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况"
)
- format0 = gr.Radio(
- label=i18n("导出文件格式"),
- choices=["wav", "flac", "mp3", "m4a"],
- value="flac",
+ )
+ 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,
)
- 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", "32k"],
- value="40k",
- interactive=True,
- )
- if_f0_3 = gr.Checkbox(
- label="Whether the model has pitch guidance.",
- value=True,
- interactive=True,
- )
- version19 = gr.Radio(
- label=i18n("版本"),
- choices=["v1", "v2"],
- value="v2",
- 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():
- step2b = 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,
+ save_name = gr.Textbox(
+ label=i18n("保存名"), value="", interactive=True,
+ placeholder="Your filename here.",
+ )
+ sr__ = gr.Radio(
+ label=i18n("目标采样率"),
+ choices=["32k", "40k", "48k"],
+ value="40k",
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",
+ if_f0__ = gr.Checkbox(
+ label="Whether the model has pitch guidance.",
+ value=True,
interactive=True,
)
-
- extraction_crepe_hop_length = gr.Slider(
- minimum=1,
- maximum=512,
- step=1,
- label=i18n("crepe_hop_length"),
- value=64,
+ version_1 = gr.Radio(
+ label=i18n("模型版本型号"),
+ choices=["v1", "v2"],
+ value="v2",
interactive=True,
- visible=False,
)
-
- f0method8.change(
- fn=lambda radio: (
- {
- "visible": radio in ['mangio-crepe', 'mangio-crepe-tiny'],
- "__type__": "update"
- }
- ),
- inputs=[f0method8],
- outputs=[extraction_crepe_hop_length]
+ info___ = gr.Textbox(
+ label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True, placeholder="Model info here."
)
- but2 = gr.Button(i18n("特征提取"), variant="primary")
- info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8, interactive=False)
- 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=1,
- maximum=50,
- step=1,
- label=i18n("保存频率save_every_epoch"),
- value=5,
- interactive=True,
- visible=True,
- )
- total_epoch11 = gr.Slider(
- minimum=1,
- 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.Checkbox(
- label="Whether to save only the latest .ckpt file to save hard drive space",
- value=True,
- interactive=True,
- )
- 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.Checkbox(
- label="Save a small final model to the 'weights' folder at each save point",
- value=True,
- 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(
- fn=change_f0,
- inputs=[if_f0_3, sr2, version19],
- outputs=[f0method8, pretrained_G14, pretrained_D15],
- )
- if_f0_3.change(fn=lambda radio: (
- {
- "visible": radio in ['mangio-crepe', 'mangio-crepe-tiny'],
- "__type__": "update"
- }
- ), inputs=[f0method8], outputs=[extraction_crepe_hop_length])
- 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)
-
- if_save_every_weights18.change(
- fn=lambda if_save_every_weights: (
- {
- "visible": if_save_every_weights,
- "__type__": "update"
- }
- ),
- inputs=[if_save_every_weights18],
- outputs=[save_epoch10]
- )
-
- 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, butstop, but3],
- )
-
- 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.Group():
-
- gr.Markdown(value=
- 'Step 4: Export lowest points on a graph of the model '
- 'After clicking on Export lowest points of a model, '
- 'The new files will be located in logs/[yourmodelname]/lowestvals/ folder'
- )
-
- with gr.Row():
- with gr.Accordion(label='Lowest points export'):
-
- lowestval_weight_dir = gr.Textbox(visible=False)
- ds = gr.Textbox(visible=False)
- weights_dir1 = gr.Textbox(visible=False, value=weights_dir)
-
-
- with gr.Row():
- amntlastmdls = gr.Slider(
- minimum=1,
- maximum=25,
- label='How many lowest points to save',
- value=3,
- step=1,
- interactive=True,
- )
- lpexport = gr.Button(
- value='Export lowest points of a model',
- variant='primary',
- )
- lw_mdls = gr.File(
- file_count="multiple",
- label="Output models",
- interactive=False,
- ) #####
-
- with gr.Row():
- infolpex = gr.Textbox(label="Output information:", value="", max_lines=10)
- mdlbl = gr.Dataframe(label='Stats of selected models', datatype='number', type='pandas')
-
- lpexport.click(
- lambda model_name: os.path.join("logs", model_name, "lowestvals"),
- inputs=[exp_dir1],
- outputs=[lowestval_weight_dir]
+ 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]
)
-
- lpexport.click(fn=tensorlowest.main, inputs=[exp_dir1, save_epoch10, amntlastmdls], outputs=[ds])
-
- ds.change(
- fn=tensorlowest.selectweights,
- inputs=[exp_dir1, ds, weights_dir1, lowestval_weight_dir],
- outputs=[infolpex, lw_mdls, mdlbl],
- )
- 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, 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,
- label=i18n("A模型权重"),
- value=0.5,
- interactive=True,
+ but9.click(
+ extract_small_model,
+ [ckpt_path2, save_name, sr__, if_f0__, info___, version_1],
+ info7,
)
+
+ with gr.TabItem(i18n("Onnx导出")):
with gr.Row():
- sr_ = gr.Radio(
- label=i18n("目标采样率"),
- choices=["40k", "48k"],
- value="40k",
- interactive=True,
- )
- 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, placeholder="Model information to be placed."
- )
- name_to_save0 = gr.Textbox(
- label=i18n("保存的模型名不带后缀"),
- value="",
- placeholder="Name for saving.",
- max_lines=1,
- interactive=True,
- )
- version_2 = gr.Radio(
- label=i18n("模型版本型号"),
- choices=["v1", "v2"],
- value="v1",
- interactive=True,
- )
+ ckpt_dir = gr.Textbox(label=i18n("RVC模型路径"), value="", interactive=True, placeholder="RVC model path.")
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("模型路径"), placeholder="Path to your Model.", value="", interactive=True
- )
- info_ = gr.Textbox(
- 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,
+ onnx_dir = gr.Textbox(
+ label=i18n("Onnx输出路径"), value="", interactive=True, placeholder="Onnx model output path."
)
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文件夹下提取的小模型文件)"))
+ infoOnnx = gr.Label(label="info")
with gr.Row():
- ckpt_path1 = gr.Textbox(
- label=i18n("模型路径"), value="", interactive=True, placeholder="Model path here."
- )
- 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,
- placeholder="Your filename here.",
- )
- sr__ = gr.Radio(
- label=i18n("目标采样率"),
- choices=["32k", "40k", "48k"],
- value="40k",
- interactive=True,
- )
- if_f0__ = gr.Checkbox(
- label="Whether the model has pitch guidance.",
- value=True,
- 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, placeholder="Model info here."
- )
- 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,
- )
+ butOnnx = gr.Button(i18n("导出Onnx模型"), variant="primary")
+ butOnnx.click(export_onnx, [ckpt_dir, onnx_dir], infoOnnx)
- with gr.TabItem(i18n("Onnx导出")):
- with gr.Row():
- 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, placeholder="Onnx model output path."
- )
- 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)
+ with gr.TabItem(tab_faq):
+ try:
+ with open(faq_file, "r", encoding="utf8") as f:
+ info = f.read()
+ gr.Markdown(value=info)
+ except:
+ gr.Markdown(traceback.format_exc())
- with gr.TabItem(tab_faq):
- try:
- with open(faq_file, "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,
- )
+ #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
+
+if __name__ == "__main__":
+ GradioSetup()
\ No newline at end of file