From 3d65166b35167a9b260169f537df9712ab900021 Mon Sep 17 00:00:00 2001 From: XTer Date: Thu, 21 Mar 2024 19:52:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BA=86webui=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E4=BA=86=E5=8F=A6=E4=B8=80=E7=A7=8D=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 2 + tools/srt_slicer/webui.py | 7 +- webui.py | 398 ++++++++++++++++++++++---------------- 3 files changed, 235 insertions(+), 172 deletions(-) diff --git a/config.py b/config.py index 1f741285..a989f098 100644 --- a/config.py +++ b/config.py @@ -26,6 +26,7 @@ webui_port_main = 9874 webui_port_uvr5 = 9873 webui_port_infer_tts = 9872 webui_port_subfix = 9871 +webui_port_srt_slicer = 9870 api_port = 9880 @@ -62,5 +63,6 @@ class Config: self.webui_port_uvr5 = webui_port_uvr5 self.webui_port_infer_tts = webui_port_infer_tts self.webui_port_subfix = webui_port_subfix + self.webui_port_srt_slicer = webui_port_srt_slicer self.api_port = api_port diff --git a/tools/srt_slicer/webui.py b/tools/srt_slicer/webui.py index bd586a6d..938248f8 100644 --- a/tools/srt_slicer/webui.py +++ b/tools/srt_slicer/webui.py @@ -15,6 +15,11 @@ from srt_utils import ( merge_list_folders ) +port = 8991 + +if len(sys.argv) > 1: + port = int(sys.argv[1]) + from i18n.i18n import I18nAuto @@ -371,4 +376,4 @@ with gr.Blocks() as app: [save_folder, character], [character_warning], ) -app.launch(inbrowser=True, server_port=8991, debug=True) +app.launch(inbrowser=True, server_port=port, debug=True) diff --git a/webui.py b/webui.py index e1c36e1e..bf476b36 100644 --- a/webui.py +++ b/webui.py @@ -48,7 +48,7 @@ import pdb import gradio as gr from subprocess import Popen import signal -from config import python_exec,infer_device,is_half,exp_root,webui_port_main,webui_port_infer_tts,webui_port_uvr5,webui_port_subfix,is_share +from config import python_exec,infer_device,is_half,exp_root,webui_port_main,webui_port_infer_tts,webui_port_uvr5,webui_port_subfix,is_share,webui_port_srt_slicer from tools.i18n.i18n import I18nAuto i18n = I18nAuto() from scipy.io import wavfile @@ -120,6 +120,7 @@ p_uvr5=None p_asr=None p_denoise=None p_tts_inference=None +p_srt_slicer=None def kill_proc_tree(pid, including_parent=True): try: @@ -162,6 +163,18 @@ def change_label(if_label,path_list): p_label=None yield i18n("打标工具WebUI已关闭") +def change_srt_slicer(if_srt_slicer): + global p_srt_slicer + if(if_srt_slicer==True and p_srt_slicer==None): + cmd = '"%s" tools/srt_slicer/webui.py %s'%(python_exec,webui_port_srt_slicer) + yield i18n("SRT切割工具WebUI已开启") + print(cmd) + p_srt_slicer = Popen(cmd, shell=True) + elif(if_srt_slicer==False and p_srt_slicer!=None): + kill_process(p_srt_slicer.pid) + p_srt_slicer=None + yield i18n("SRT切割工具WebUI已关闭") + def change_uvr5(if_uvr5): global p_uvr5 if(if_uvr5==True and p_uvr5==None): @@ -680,143 +693,168 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: i18n("中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e") ) + # 重构前端WebUI的展示方式,by XTer: https://github.com/X-T-E-R with gr.Tabs(): - with gr.TabItem(i18n("0-前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标 - gr.Markdown(value=i18n("0a-UVR5人声伴奏分离&去混响去延迟工具")) + with gr.Tab(i18n("0-前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标 with gr.Row(): - if_uvr5 = gr.Checkbox(label=i18n("是否开启UVR5-WebUI"),show_label=True) - uvr5_info = gr.Textbox(label=i18n("UVR5进程输出信息")) - gr.Markdown(value=i18n("0b-语音切分工具")) - with gr.Row(): - with gr.Row(): - slice_inp_path=gr.Textbox(label=i18n("音频自动切分输入路径,可文件可文件夹"),value="") - slice_opt_root=gr.Textbox(label=i18n("切分后的子音频的输出根目录"),value="output/slicer_opt") - threshold=gr.Textbox(label=i18n("threshold:音量小于这个值视作静音的备选切割点"),value="-34") - min_length=gr.Textbox(label=i18n("min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值"),value="4000") - min_interval=gr.Textbox(label=i18n("min_interval:最短切割间隔"),value="300") - hop_size=gr.Textbox(label=i18n("hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)"),value="10") - max_sil_kept=gr.Textbox(label=i18n("max_sil_kept:切完后静音最多留多长"),value="500") - with gr.Row(): - open_slicer_button=gr.Button(i18n("开启语音切割"), variant="primary",visible=True) - close_slicer_button=gr.Button(i18n("终止语音切割"), variant="primary",visible=False) - _max=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("max:归一化后最大值多少"),value=0.9,interactive=True) - alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True) - n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True) - slicer_info = gr.Textbox(label=i18n("语音切割进程输出信息")) - gr.Markdown(value=i18n("0bb-语音降噪工具")) - with gr.Row(): - open_denoise_button = gr.Button(i18n("开启语音降噪"), variant="primary",visible=True) - close_denoise_button = gr.Button(i18n("终止语音降噪进程"), variant="primary",visible=False) - denoise_input_dir=gr.Textbox(label=i18n("降噪音频文件输入文件夹"),value="") - denoise_output_dir=gr.Textbox(label=i18n("降噪结果输出文件夹"),value="output/denoise_opt") - denoise_info = gr.Textbox(label=i18n("语音降噪进程输出信息")) - gr.Markdown(value=i18n("0c-中文批量离线ASR工具")) - with gr.Row(): - open_asr_button = gr.Button(i18n("开启离线批量ASR"), variant="primary",visible=True) - close_asr_button = gr.Button(i18n("终止ASR进程"), variant="primary",visible=False) - with gr.Column(): - with gr.Row(): - asr_inp_dir = gr.Textbox( - label=i18n("输入文件夹路径"), - value="D:\\GPT-SoVITS\\raw\\xxx", - interactive=True, - ) - asr_opt_dir = gr.Textbox( - label = i18n("输出文件夹路径"), - value = "output/asr_opt", - interactive = True, - ) - with gr.Row(): - asr_model = gr.Dropdown( - label = i18n("ASR 模型"), - choices = list(asr_dict.keys()), - interactive = True, - value="达摩 ASR (中文)" - ) - asr_size = gr.Dropdown( - label = i18n("ASR 模型尺寸"), - choices = ["large"], - interactive = True, - value="large" - ) - asr_lang = gr.Dropdown( - label = i18n("ASR 语言设置"), - choices = ["zh"], - interactive = True, - value="zh" - ) - with gr.Row(): - asr_info = gr.Textbox(label=i18n("ASR进程输出信息")) + with gr.Column(scale=2): + with gr.Tabs(): + with gr.Tab(i18n("0a-UVR5人声伴奏分离&去混响去延迟工具")): + if_uvr5 = gr.Checkbox(label=i18n("是否开启UVR5-WebUI"),show_label=True) + uvr5_info = gr.Textbox(label=i18n("UVR5进程输出信息")) + with gr.Tab(i18n("0b-语音切分工具")): + with gr.Row(): + slice_inp_path=gr.Textbox(label=i18n("音频自动切分输入路径,可文件可文件夹"),value="") + slice_opt_root=gr.Textbox(label=i18n("切分后的子音频的输出根目录"),value="output/slicer_opt") + threshold=gr.Textbox(label=i18n("threshold:音量小于这个值视作静音的备选切割点"),value="-34") + min_length=gr.Textbox(label=i18n("min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值"),value="4000") + min_interval=gr.Textbox(label=i18n("min_interval:最短切割间隔"),value="300") + hop_size=gr.Textbox(label=i18n("hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)"),value="10") + max_sil_kept=gr.Textbox(label=i18n("max_sil_kept:切完后静音最多留多长"),value="500") + with gr.Row(): + _max=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("max:归一化后最大值多少"),value=0.9,interactive=True) + alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True) + n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True) + with gr.Row(): + with gr.Group(): + slicer_info = gr.Textbox(label=i18n("语音切割进程输出信息")) + open_slicer_button=gr.Button(i18n("开启语音切割"), variant="primary",visible=True) + close_slicer_button=gr.Button(i18n("终止语音切割"), variant="primary",visible=False) + with gr.Tab(i18n("0bb-语音降噪工具")): + with gr.Row(): + + denoise_input_dir=gr.Textbox(label=i18n("降噪音频文件输入文件夹"),value="") + denoise_output_dir=gr.Textbox(label=i18n("降噪结果输出文件夹"),value="output/denoise_opt") + with gr.Row(): + with gr.Group(): + denoise_info = gr.Textbox(label=i18n("语音降噪进程输出信息")) + open_denoise_button = gr.Button(i18n("开启语音降噪"), variant="primary",visible=True) + close_denoise_button = gr.Button(i18n("终止语音降噪进程"), variant="primary",visible=False) + with gr.Column(scale=2): + with gr.Tabs(): + with gr.Tab(i18n("0c-离线批量ASR工具")): + + with gr.Column(): + with gr.Row(): + asr_inp_dir = gr.Textbox( + label=i18n("输入文件夹路径"), + value="D:\\GPT-SoVITS\\raw\\xxx", + interactive=True, + ) + asr_opt_dir = gr.Textbox( + label = i18n("输出文件夹路径"), + value = "output/asr_opt", + interactive = True, + ) + with gr.Row(): + asr_model = gr.Dropdown( + label = i18n("ASR 模型"), + choices = list(asr_dict.keys()), + interactive = True, + value="达摩 ASR (中文)" + ) + asr_size = gr.Dropdown( + label = i18n("ASR 模型尺寸"), + choices = ["large"], + interactive = True, + value="large" + ) + asr_lang = gr.Dropdown( + label = i18n("ASR 语言设置"), + choices = ["zh"], + interactive = True, + value="zh" + ) + with gr.Row(): + with gr.Group(): + asr_info = gr.Textbox(label=i18n("ASR进程输出信息")) + open_asr_button = gr.Button(i18n("开启离线批量ASR"), variant="primary",visible=True) + close_asr_button = gr.Button(i18n("终止ASR进程"), variant="primary",visible=False) - def change_lang_choices(key): #根据选择的模型修改可选的语言 - # return gr.Dropdown(choices=asr_dict[key]['lang']) - return {"__type__": "update", "choices": asr_dict[key]['lang'],"value":asr_dict[key]['lang'][0]} - def change_size_choices(key): # 根据选择的模型修改可选的模型尺寸 - # return gr.Dropdown(choices=asr_dict[key]['size']) - return {"__type__": "update", "choices": asr_dict[key]['size']} - asr_model.change(change_lang_choices, [asr_model], [asr_lang]) - asr_model.change(change_size_choices, [asr_model], [asr_size]) - - gr.Markdown(value=i18n("0d-语音文本校对标注工具")) - with gr.Row(): - if_label = gr.Checkbox(label=i18n("是否开启打标WebUI"),show_label=True) - path_list = gr.Textbox( - label=i18n(".list标注文件的路径"), - value="D:\\RVC1006\\GPT-SoVITS\\raw\\xxx.list", - interactive=True, - ) - label_info = gr.Textbox(label=i18n("打标工具进程输出信息")) - if_label.change(change_label, [if_label,path_list], [label_info]) - if_uvr5.change(change_uvr5, [if_uvr5], [uvr5_info]) - open_asr_button.click(open_asr, [asr_inp_dir, asr_opt_dir, asr_model, asr_size, asr_lang], [asr_info,open_asr_button,close_asr_button]) - close_asr_button.click(close_asr, [], [asr_info,open_asr_button,close_asr_button]) - open_slicer_button.click(open_slice, [slice_inp_path,slice_opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_process], [slicer_info,open_slicer_button,close_slicer_button]) - close_slicer_button.click(close_slice, [], [slicer_info,open_slicer_button,close_slicer_button]) - open_denoise_button.click(open_denoise, [denoise_input_dir,denoise_output_dir], [denoise_info,open_denoise_button,close_denoise_button]) - close_denoise_button.click(close_denoise, [], [denoise_info,open_denoise_button,close_denoise_button]) + def change_lang_choices(key): #根据选择的模型修改可选的语言 + # return gr.Dropdown(choices=asr_dict[key]['lang']) + return {"__type__": "update", "choices": asr_dict[key]['lang'],"value":asr_dict[key]['lang'][0]} + def change_size_choices(key): # 根据选择的模型修改可选的模型尺寸 + # return gr.Dropdown(choices=asr_dict[key]['size']) + return {"__type__": "update", "choices": asr_dict[key]['size']} + asr_model.change(change_lang_choices, [asr_model], [asr_lang]) + asr_model.change(change_size_choices, [asr_model], [asr_size]) + + with gr.Tab(i18n("0d-语音文本校对标注工具")): + if_label = gr.Checkbox(label=i18n("是否开启打标WebUI"),show_label=True) + path_list = gr.Textbox( + label=i18n(".list标注文件的路径"), + value="D:\\RVC1006\\GPT-SoVITS\\raw\\xxx.list", + interactive=True, + ) + label_info = gr.Textbox(label=i18n("打标工具进程输出信息")) + + with gr.Tab(i18n("0c-基于SRT的音频切分工具")): + if_srt_slicer = gr.Checkbox(label=i18n("是否开启SRT切分工具"),show_label=True) + srt_slicer_info = gr.Textbox(label=i18n("SRT切分工具进程输出信息")) + if_label.change(change_label, [if_label,path_list], [label_info]) + if_srt_slicer.change(change_srt_slicer, [if_srt_slicer], [srt_slicer_info]) + if_uvr5.change(change_uvr5, [if_uvr5], [uvr5_info]) + open_asr_button.click(open_asr, [asr_inp_dir, asr_opt_dir, asr_model, asr_size, asr_lang], [asr_info,open_asr_button,close_asr_button]) + close_asr_button.click(close_asr, [], [asr_info,open_asr_button,close_asr_button]) + open_slicer_button.click(open_slice, [slice_inp_path,slice_opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_process], [slicer_info,open_slicer_button,close_slicer_button]) + close_slicer_button.click(close_slice, [], [slicer_info,open_slicer_button,close_slicer_button]) + open_denoise_button.click(open_denoise, [denoise_input_dir,denoise_output_dir], [denoise_info,open_denoise_button,close_denoise_button]) + close_denoise_button.click(close_denoise, [], [denoise_info,open_denoise_button,close_denoise_button]) - with gr.TabItem(i18n("1-GPT-SoVITS-TTS")): + with gr.Tab(i18n("1-GPT-SoVITS-TTS")): with gr.Row(): exp_name = gr.Textbox(label=i18n("*实验/模型名"), value="xxx", interactive=True) gpu_info = gr.Textbox(label=i18n("显卡信息"), value=gpu_info, visible=True, interactive=False) pretrained_s2G = gr.Textbox(label=i18n("预训练的SoVITS-G模型路径"), value="GPT_SoVITS/pretrained_models/s2G488k.pth", interactive=True) pretrained_s2D = gr.Textbox(label=i18n("预训练的SoVITS-D模型路径"), value="GPT_SoVITS/pretrained_models/s2D488k.pth", interactive=True) pretrained_s1 = gr.Textbox(label=i18n("预训练的GPT模型路径"), value="GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt", interactive=True) - with gr.TabItem(i18n("1A-训练集格式化工具")): - gr.Markdown(value=i18n("输出logs/实验名目录下应有23456开头的文件和文件夹")) + with gr.Tab(i18n("1A-训练集格式化工具")): + with gr.Tabs(): + with gr.Tab(i18n("输出logs/实验名目录下应有23456开头的文件和文件夹")): + with gr.Group(): + inp_text = gr.Textbox(label=i18n("*文本标注文件"),value=r"D:\RVC1006\GPT-SoVITS\raw\xxx.list",interactive=True) + inp_wav_dir = gr.Textbox( + label=i18n("*训练集音频文件目录"), + # value=r"D:\RVC1006\GPT-SoVITS\raw\xxx", + interactive=True, + placeholder=i18n("填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。") + ) + with gr.Tabs(): + with gr.Tab(i18n("1Aabc-训练集格式化一键三连")): + with gr.Group(): + info1abc=gr.Textbox(label=i18n("一键三连进程输出信息")) + button1abc_open = gr.Button(i18n("开启一键三连"), variant="primary",visible=True) + button1abc_close = gr.Button(i18n("终止一键三连"), variant="primary",visible=False) with gr.Row(): - inp_text = gr.Textbox(label=i18n("*文本标注文件"),value=r"D:\RVC1006\GPT-SoVITS\raw\xxx.list",interactive=True) - inp_wav_dir = gr.Textbox( - label=i18n("*训练集音频文件目录"), - # value=r"D:\RVC1006\GPT-SoVITS\raw\xxx", - interactive=True, - placeholder=i18n("填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。") - ) - gr.Markdown(value=i18n("1Aa-文本内容")) - with gr.Row(): - gpu_numbers1a = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True) - bert_pretrained_dir = gr.Textbox(label=i18n("预训练的中文BERT模型路径"),value="GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large",interactive=False) - button1a_open = gr.Button(i18n("开启文本获取"), variant="primary",visible=True) - button1a_close = gr.Button(i18n("终止文本获取进程"), variant="primary",visible=False) - info1a=gr.Textbox(label=i18n("文本进程输出信息")) - gr.Markdown(value=i18n("1Ab-SSL自监督特征提取")) - with gr.Row(): - gpu_numbers1Ba = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True) - cnhubert_base_dir = gr.Textbox(label=i18n("预训练的SSL模型路径"),value="GPT_SoVITS/pretrained_models/chinese-hubert-base",interactive=False) - button1b_open = gr.Button(i18n("开启SSL提取"), variant="primary",visible=True) - button1b_close = gr.Button(i18n("终止SSL提取进程"), variant="primary",visible=False) - info1b=gr.Textbox(label=i18n("SSL进程输出信息")) - gr.Markdown(value=i18n("1Ac-语义token提取")) - with gr.Row(): - gpu_numbers1c = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True) - button1c_open = gr.Button(i18n("开启语义token提取"), variant="primary",visible=True) - button1c_close = gr.Button(i18n("终止语义token提取进程"), variant="primary",visible=False) - info1c=gr.Textbox(label=i18n("语义token提取进程输出信息")) - gr.Markdown(value=i18n("1Aabc-训练集格式化一键三连")) - with gr.Row(): - button1abc_open = gr.Button(i18n("开启一键三连"), variant="primary",visible=True) - button1abc_close = gr.Button(i18n("终止一键三连"), variant="primary",visible=False) - info1abc=gr.Textbox(label=i18n("一键三连进程输出信息")) + with gr.Column(): + with gr.Tabs(): + with gr.Tab(i18n("1Aa-文本内容")): + gpu_numbers1a = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True) + bert_pretrained_dir = gr.Textbox(label=i18n("预训练的中文BERT模型路径"),value="GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large",interactive=False) + with gr.Group(): + info1a=gr.Textbox(label=i18n("文本进程输出信息")) + button1a_open = gr.Button(i18n("开启文本获取"), variant="primary",visible=True) + button1a_close = gr.Button(i18n("终止文本获取进程"), variant="primary",visible=False) + with gr.Column(): + with gr.Tabs(): + with gr.Tab(i18n("1Ab-SSL自监督特征提取")): + gpu_numbers1Ba = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True) + cnhubert_base_dir = gr.Textbox(label=i18n("预训练的SSL模型路径"),value="GPT_SoVITS/pretrained_models/chinese-hubert-base",interactive=False) + with gr.Group(): + info1b=gr.Textbox(label=i18n("SSL进程输出信息")) + button1b_open = gr.Button(i18n("开启SSL提取"), variant="primary",visible=True) + button1b_close = gr.Button(i18n("终止SSL提取进程"), variant="primary",visible=False) + with gr.Column(): + with gr.Tabs(): + with gr.Tab(i18n("1Ac-语义token提取")): + + gpu_numbers1c = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True) + with gr.Group(): + info1c=gr.Textbox(label=i18n("语义token提取进程输出信息")) + button1c_open = gr.Button(i18n("开启语义token提取"), variant="primary",visible=True) + button1c_close = gr.Button(i18n("终止语义token提取进程"), variant="primary",visible=False) + button1a_open.click(open1a, [inp_text,inp_wav_dir,exp_name,gpu_numbers1a,bert_pretrained_dir], [info1a,button1a_open,button1a_close]) button1a_close.click(close1a, [], [info1a,button1a_open,button1a_close]) button1b_open.click(open1b, [inp_text,inp_wav_dir,exp_name,gpu_numbers1Ba,cnhubert_base_dir], [info1b,button1b_open,button1b_close]) @@ -825,54 +863,72 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: button1c_close.click(close1c, [], [info1c,button1c_open,button1c_close]) button1abc_open.click(open1abc, [inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,cnhubert_base_dir,pretrained_s2G], [info1abc,button1abc_open,button1abc_close]) button1abc_close.click(close1abc, [], [info1abc,button1abc_open,button1abc_close]) - with gr.TabItem(i18n("1B-微调训练")): - gr.Markdown(value=i18n("1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。")) + with gr.Tab(i18n("1B-微调训练")): with gr.Row(): - batch_size = gr.Slider(minimum=1,maximum=40,step=1,label=i18n("每张显卡的batch_size"),value=default_batch_size,interactive=True) - total_epoch = gr.Slider(minimum=1,maximum=25,step=1,label=i18n("总训练轮数total_epoch,不建议太高"),value=8,interactive=True) - text_low_lr_rate = gr.Slider(minimum=0.2,maximum=0.6,step=0.05,label=i18n("文本模块学习率权重"),value=0.4,interactive=True) - save_every_epoch = gr.Slider(minimum=1,maximum=25,step=1,label=i18n("保存频率save_every_epoch"),value=4,interactive=True) - if_save_latest = gr.Checkbox(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), value=True, interactive=True, show_label=True) - if_save_every_weights = gr.Checkbox(label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), value=True, interactive=True, show_label=True) - gpu_numbers1Ba = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"), value="%s" % (gpus), interactive=True) - with gr.Row(): - button1Ba_open = gr.Button(i18n("开启SoVITS训练"), variant="primary",visible=True) - button1Ba_close = gr.Button(i18n("终止SoVITS训练"), variant="primary",visible=False) - info1Ba=gr.Textbox(label=i18n("SoVITS训练进程输出信息")) - gr.Markdown(value=i18n("1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。")) - with gr.Row(): - batch_size1Bb = gr.Slider(minimum=1,maximum=40,step=1,label=i18n("每张显卡的batch_size"),value=default_batch_size,interactive=True) - total_epoch1Bb = gr.Slider(minimum=2,maximum=50,step=1,label=i18n("总训练轮数total_epoch"),value=15,interactive=True) - if_dpo = gr.Checkbox(label=i18n("是否开启dpo训练选项(实验性)"), value=False, interactive=True, show_label=True) - if_save_latest1Bb = gr.Checkbox(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), value=True, interactive=True, show_label=True) - if_save_every_weights1Bb = gr.Checkbox(label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), value=True, interactive=True, show_label=True) - save_every_epoch1Bb = gr.Slider(minimum=1,maximum=50,step=1,label=i18n("保存频率save_every_epoch"),value=5,interactive=True) - gpu_numbers1Bb = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"), value="%s" % (gpus), interactive=True) - with gr.Row(): - button1Bb_open = gr.Button(i18n("开启GPT训练"), variant="primary",visible=True) - button1Bb_close = gr.Button(i18n("终止GPT训练"), variant="primary",visible=False) - info1Bb=gr.Textbox(label=i18n("GPT训练进程输出信息")) + with gr.Column(): + with gr.Tabs(): + with gr.Tab(i18n("1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。")): + with gr.Group(): + batch_size = gr.Slider(minimum=1,maximum=40,step=1,label=i18n("每张显卡的batch_size"),value=default_batch_size,interactive=True) + total_epoch = gr.Slider(minimum=1,maximum=25,step=1,label=i18n("总训练轮数total_epoch,不建议太高"),value=8,interactive=True) + text_low_lr_rate = gr.Slider(minimum=0.2,maximum=0.6,step=0.05,label=i18n("文本模块学习率权重"),value=0.4,interactive=True) + save_every_epoch = gr.Slider(minimum=1,maximum=25,step=1,label=i18n("保存频率save_every_epoch"),value=4,interactive=True) + if_save_latest = gr.Checkbox(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), value=True, interactive=True, show_label=True) + if_save_every_weights = gr.Checkbox(label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), value=True, interactive=True, show_label=True) + gpu_numbers1Ba = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"), value="%s" % (gpus), interactive=True) + with gr.Group(): + info1Ba=gr.Textbox(label=i18n("SoVITS训练进程输出信息")) + button1Ba_open = gr.Button(i18n("开启SoVITS训练"), variant="primary",visible=True) + button1Ba_close = gr.Button(i18n("终止SoVITS训练"), variant="primary",visible=False) + with gr.Column(): + with gr.Tabs(): + with gr.Tab(i18n("1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。")): + with gr.Group(): + batch_size1Bb = gr.Slider(minimum=1,maximum=40,step=1,label=i18n("每张显卡的batch_size"),value=default_batch_size,interactive=True) + total_epoch1Bb = gr.Slider(minimum=2,maximum=50,step=1,label=i18n("总训练轮数total_epoch"),value=15,interactive=True) + if_dpo = gr.Checkbox(label=i18n("是否开启dpo训练选项(实验性)"), value=False, interactive=True, show_label=True) + if_save_latest1Bb = gr.Checkbox(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), value=True, interactive=True, show_label=True) + if_save_every_weights1Bb = gr.Checkbox(label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), value=True, interactive=True, show_label=True) + save_every_epoch1Bb = gr.Slider(minimum=1,maximum=50,step=1,label=i18n("保存频率save_every_epoch"),value=5,interactive=True) + gpu_numbers1Bb = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"), value="%s" % (gpus), interactive=True) + with gr.Group(): + info1Bb=gr.Textbox(label=i18n("GPT训练进程输出信息")) + button1Bb_open = gr.Button(i18n("开启GPT训练"), variant="primary",visible=True) + button1Bb_close = gr.Button(i18n("终止GPT训练"), variant="primary",visible=False) button1Ba_open.click(open1Ba, [batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers1Ba,pretrained_s2G,pretrained_s2D], [info1Ba,button1Ba_open,button1Ba_close]) button1Ba_close.click(close1Ba, [], [info1Ba,button1Ba_open,button1Ba_close]) button1Bb_open.click(open1Bb, [batch_size1Bb,total_epoch1Bb,exp_name,if_dpo,if_save_latest1Bb,if_save_every_weights1Bb,save_every_epoch1Bb,gpu_numbers1Bb,pretrained_s1], [info1Bb,button1Bb_open,button1Bb_close]) button1Bb_close.click(close1Bb, [], [info1Bb,button1Bb_open,button1Bb_close]) - with gr.TabItem(i18n("1C-推理")): + with gr.Tab(i18n("1C-推理")): gr.Markdown(value=i18n("选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。")) with gr.Row(): - GPT_dropdown = gr.Dropdown(label=i18n("*GPT模型列表"), choices=sorted(GPT_names,key=custom_sort_key),value=pretrained_gpt_name,interactive=True) - SoVITS_dropdown = gr.Dropdown(label=i18n("*SoVITS模型列表"), choices=sorted(SoVITS_names,key=custom_sort_key),value=pretrained_sovits_name,interactive=True) - gpu_number_1C=gr.Textbox(label=i18n("GPU卡号,只能填1个整数"), value=gpus, interactive=True) - refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary") - refresh_button.click(fn=change_choices,inputs=[],outputs=[SoVITS_dropdown,GPT_dropdown]) - with gr.Row(): - if_tts = gr.Checkbox(label=i18n("是否开启TTS推理WebUI"), show_label=True) - tts_info = gr.Textbox(label=i18n("TTS推理WebUI进程输出信息")) - if_tts.change(change_tts_inference, [if_tts,bert_pretrained_dir,cnhubert_base_dir,gpu_number_1C,GPT_dropdown,SoVITS_dropdown], [tts_info]) - with gr.TabItem(i18n("2-GPT-SoVITS-变声")):gr.Markdown(value=i18n("施工中,请静候佳音")) - app.queue(concurrency_count=511, max_size=1022).launch( - server_name="0.0.0.0", - inbrowser=True, - share=is_share, - server_port=webui_port_main, - quiet=True, - ) + with gr.Column(): + gpu_number_1C=gr.Textbox(label=i18n("GPU卡号,只能填1个整数"), value=gpus, interactive=True) + with gr.Group(): + GPT_dropdown = gr.Dropdown(label=i18n("*GPT模型列表"), choices=sorted(GPT_names,key=custom_sort_key),value=pretrained_gpt_name,interactive=True) + SoVITS_dropdown = gr.Dropdown(label=i18n("*SoVITS模型列表"), choices=sorted(SoVITS_names,key=custom_sort_key),value=pretrained_sovits_name,interactive=True) + refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary") + refresh_button.click(fn=change_choices,inputs=[],outputs=[SoVITS_dropdown,GPT_dropdown]) + with gr.Column(): + if_tts = gr.Checkbox(label=i18n("是否开启TTS推理WebUI"), show_label=True) + tts_info = gr.Textbox(label=i18n("TTS推理WebUI进程输出信息")) + if_tts.change(change_tts_inference, [if_tts,bert_pretrained_dir,cnhubert_base_dir,gpu_number_1C,GPT_dropdown,SoVITS_dropdown], [tts_info]) + with gr.Tab(i18n("2-GPT-SoVITS-变声")):gr.Markdown(value=i18n("施工中,请静候佳音")) + + if gr.__version__.split(".")[0] == "4": + app.launch( + server_name="0.0.0.0", + inbrowser=True, + share=is_share, + server_port=webui_port_main, + quiet=True, + ) + else: + app.queue(concurrency_count=511, max_size=1022).launch( + server_name="0.0.0.0", + inbrowser=True, + share=is_share, + server_port=webui_port_main, + quiet=True, + ) +