From 33e1a0f1d274be243acf3fb4905421c158b9a98a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 12 Apr 2023 16:53:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20i18n=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=20&=20=E5=A2=9E=E5=8A=A0=20--noautoopen=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=20(#39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * optimize: 精简未用到的配置项并在特征提取初步引入mps * add cmd argument: --noautoopen * fix: i18n * fix * fix * add genlocale workflow * add unitest * fix * fix * fix --- .github/workflows/genlocale.yml | 24 ++++++++ .github/workflows/unitest.yml | 36 ++++++++++++ config.py | 2 + extract_locale.py | 30 +++++----- gui.py | 28 ++++----- infer-web.py | 101 +++++++++++++------------------- locale/en_US.json | 58 ++++++++++++------ locale/ja_JP.json | 58 ++++++++++++------ locale/locale_diff.py | 7 ++- locale/zh_CN.json | 69 +++++++++++++--------- webui_locale.py | 8 +-- 11 files changed, 262 insertions(+), 159 deletions(-) create mode 100644 .github/workflows/genlocale.yml create mode 100644 .github/workflows/unitest.yml diff --git a/.github/workflows/genlocale.yml b/.github/workflows/genlocale.yml new file mode 100644 index 0000000..e64f6cd --- /dev/null +++ b/.github/workflows/genlocale.yml @@ -0,0 +1,24 @@ +name: genlocale +on: [ push ] +jobs: + golangci: + name: genlocale + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@master + + - name: Run locale generation + run: | + python3 extract_locale.py + cd locale + python3 locale_diff.py + + - name: Commit back + if: ${{ !github.head_ref }} + continue-on-error: true + run: | + git config --local user.name 'github-actions[bot]' + git config --local user.email '41898282+github-actions[bot]@users.noreply.github.com' + git add --all + git commit -m "🎨 同步 locale" diff --git a/.github/workflows/unitest.yml b/.github/workflows/unitest.yml new file mode 100644 index 0000000..ee691d1 --- /dev/null +++ b/.github/workflows/unitest.yml @@ -0,0 +1,36 @@ +name: unitest +on: [ push, pull_request ] +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10"] + os: [ubuntu-latest] + fail-fast: false + + steps: + - uses: actions/checkout@master + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + sudo apt update + sudo apt -y install ffmpeg + sudo apt -y install -qq aria2 + aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -d ./ -o hubert_base.pt + python -m pip install --upgrade pip + python -m pip install --upgrade setuptools + python -m pip install --upgrade wheel + pip install torch torchvision torchaudio + pip install -r requirements.txt + - name: Test step 1 & 2 + run: | + mkdir -p logs/mi-test + touch logs/mi-test/preprocess.log + python trainset_preprocess_pipeline_print.py logs/mute/0_gt_wavs 48000 8 logs/mi-test True + touch logs/mi-test/extract_f0_feature.log + python extract_f0_print.py logs/mi-test $(nproc) pm + python extract_feature_print.py cpu 1 0 0 logs/mi-test diff --git a/config.py b/config.py index bffccf7..20c90a1 100644 --- a/config.py +++ b/config.py @@ -21,12 +21,14 @@ parser.add_argument("--port", type=int, default=7865, help="Listen port") parser.add_argument("--pycmd", type=str, default="python", help="Python command") parser.add_argument("--colab", action='store_true', help="Launch in colab") parser.add_argument("--noparallel", action='store_true', help="Disable parallel processing") +parser.add_argument("--noautoopen", action='store_true', help="Do not open in browser automatically") cmd_opts = parser.parse_args() python_cmd=cmd_opts.pycmd listen_port=cmd_opts.port iscolab=cmd_opts.colab noparallel=cmd_opts.noparallel +noautoopen=cmd_opts.noautoopen ########################命令行参数######################## import sys diff --git a/extract_locale.py b/extract_locale.py index 366d19d..1bb9e32 100644 --- a/extract_locale.py +++ b/extract_locale.py @@ -2,26 +2,26 @@ import json import re # Define regular expression patterns -pattern = r'i18n\([^)]*\)' +pattern = r"""i18n\((["'][^"']+["'])\)""" # Initialize the dictionary to store key-value pairs data = {} -# Extract labels from infer-webui.py -with open('infer-web.py', 'r', encoding='utf-8') as f: - contents = f.read() - matches = re.findall(pattern, contents) - for match in matches: - key = match.strip('()"') - data[key] = key +def process(fn: str): + global data + with open(fn, 'r', encoding='utf-8') as f: + contents = f.read() + matches = re.findall(pattern, contents) + for key in matches: + key = eval(key) + print("extract:", key) + data[key] = key -# Extract labels from gui.py -with open('gui.py', 'r', encoding='utf-8') as f: - contents = f.read() - matches = re.findall(pattern, contents) - for match in matches: - key = match.strip('()"') - data[key] = key +print("processing infer-web.py") +process('infer-web.py') + +print("processing gui.py") +process('gui.py') # Save as a JSON file with open('./locale/zh_CN.json', 'w', encoding='utf-8') as f: diff --git a/gui.py b/gui.py index b80a2ba..054c188 100644 --- a/gui.py +++ b/gui.py @@ -161,30 +161,30 @@ class GUI: input_devices,output_devices,_, _=self.get_devices() layout=[ [ - sg.Frame(title=i18n('加载模型/Load Model'),layout=[ - [sg.Input(default_text='TEMP\\atri.pth',key='pth_path'),sg.FileBrowse(i18n('选择.pth文件/.pth File'))], - [sg.Input(default_text='TEMP\\added_IVF512_Flat_atri_baseline_src_feat.index',key='index_path'),sg.FileBrowse(i18n('选择.index文件/.index File'))], - [sg.Input(default_text='TEMP\\big_src_feature_atri.npy',key='npy_path'),sg.FileBrowse(i18n('选择.npy文件/.npy File'))] + sg.Frame(title=i18n('加载模型'),layout=[ + [sg.Input(default_text='TEMP\\atri.pth',key='pth_path'),sg.FileBrowse(i18n('选择.pth文件'))], + [sg.Input(default_text='TEMP\\added_IVF512_Flat_atri_baseline_src_feat.index',key='index_path'),sg.FileBrowse(i18n('选择.index文件'))], + [sg.Input(default_text='TEMP\\big_src_feature_atri.npy',key='npy_path'),sg.FileBrowse(i18n('选择.npy文件'))] ]) ], [ sg.Frame(layout=[ - [sg.Text(i18n("输入设备/Input Device")),sg.Combo(input_devices,key='sg_input_device',default_value=input_devices[sd.default.device[0]])], - [sg.Text(i18n("输出设备/Output Device")),sg.Combo(output_devices,key='sg_output_device',default_value=output_devices[sd.default.device[1]])] - ],title=i18n("音频设备(请使用同种类驱动)/Audio Devices")) + [sg.Text(i18n("输入设备")),sg.Combo(input_devices,key='sg_input_device',default_value=input_devices[sd.default.device[0]])], + [sg.Text(i18n("输出设备")),sg.Combo(output_devices,key='sg_output_device',default_value=output_devices[sd.default.device[1]])] + ],title=i18n("音频设备(请使用同种类驱动)")) ], [ sg.Frame(layout=[ - [sg.Text(i18n("响应阈值/Silence Threhold")),sg.Slider(range=(-60,0),key='threhold',resolution=1,orientation='h',default_value=-30)], - [sg.Text(i18n("音调设置/Pitch Offset")),sg.Slider(range=(-24,24),key='pitch',resolution=1,orientation='h',default_value=12)] + [sg.Text(i18n("响应阈值")),sg.Slider(range=(-60,0),key='threhold',resolution=1,orientation='h',default_value=-30)], + [sg.Text(i18n("音调设置")),sg.Slider(range=(-24,24),key='pitch',resolution=1,orientation='h',default_value=12)] - ],title=i18n("常规设置/Common")), + ],title=i18n("常规设置")), sg.Frame(layout=[ - [sg.Text(i18n("采样长度/Sample Length")),sg.Slider(range=(0.1,3.0),key='block_time',resolution=0.1,orientation='h',default_value=1.0)], - [sg.Text(i18n("淡入淡出长度/Crossfade Length")),sg.Slider(range=(0.01,0.15),key='crossfade_length',resolution=0.01,orientation='h',default_value=0.08)], - [sg.Text(i18n("额外推理时长/Extra Length")),sg.Slider(range=(0.05,3.00),key='extra_time',resolution=0.01,orientation='h',default_value=0.05)], + [sg.Text(i18n("采样长度")),sg.Slider(range=(0.1,3.0),key='block_time',resolution=0.1,orientation='h',default_value=1.0)], + [sg.Text(i18n("淡入淡出长度")),sg.Slider(range=(0.01,0.15),key='crossfade_length',resolution=0.01,orientation='h',default_value=0.08)], + [sg.Text(i18n("额外推理时长")),sg.Slider(range=(0.05,3.00),key='extra_time',resolution=0.01,orientation='h',default_value=0.05)], [sg.Checkbox(i18n('输出降噪/Output Noisereduce'),key='noise_reduce')] - ],title=i18n("性能设置/Performance")) + ],title=i18n("性能设置")) ], [sg.Button(i18n("开始音频转换"),key='start_vc'),sg.Button(i18n("停止音频转换"),key='stop_vc')] ] diff --git a/infer-web.py b/infer-web.py index 31e412c..2bc59b5 100644 --- a/infer-web.py +++ b/infer-web.py @@ -38,7 +38,7 @@ from fairseq import checkpoint_utils import gradio as gr import logging from vc_infer_pipeline import VC -from config import is_half,device,python_cmd,listen_port,iscolab,noparallel +from config import is_half,device,python_cmd,listen_port,iscolab,noparallel,noautoopen from infer_uvr5 import _audio_pre_ from my_utils import load_audio from train.process_ckpt import show_info,change_info,merge,extract_small_model @@ -150,7 +150,7 @@ def get_vc(sid): global n_spk,tgt_sr,net_g,vc,cpt if(sid==[]): global hubert_model - if (hubert_model != None): # 考虑到轮询,需要加个判断看是否 sid 是由有模型切换到无模型的 + if (hubert_model != None): # 考虑到轮询, 需要加个判断看是否 sid 是由有模型切换到无模型的 print("clean_empty_cache") del net_g, n_spk, vc, hubert_model,tgt_sr#,cpt hubert_model = net_g=n_spk=vc=hubert_model=tgt_sr=None @@ -176,7 +176,7 @@ def get_vc(sid): else: net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) del net_g.enc_q - print(net_g.load_state_dict(cpt["weight"], strict=False)) # 不加这一行清不干净,真奇葩 + print(net_g.load_state_dict(cpt["weight"], strict=False)) # 不加这一行清不干净, 真奇葩 net_g.eval().to(device) if (is_half):net_g = net_g.half() else:net_g = net_g.float() @@ -228,7 +228,7 @@ def preprocess_dataset(trainset_dir,exp_dir,sr,n_p=ncpu): cmd=python_cmd + " trainset_preprocess_pipeline_print.py %s %s %s %s/logs/%s "%(trainset_dir,sr,n_p,now_dir,exp_dir)+str(noparallel) print(cmd) p = Popen(cmd, shell=True)#, stdin=PIPE, stdout=PIPE,stderr=PIPE,cwd=now_dir - ###煞笔gr,popen read都非得全跑完了再一次性读取,不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 done=[False] threading.Thread(target=if_done,args=(done,p,)).start() while(1): @@ -248,7 +248,7 @@ def extract_f0_feature(gpus,n_p,f0method,if_f0,exp_dir): cmd=python_cmd + " extract_f0_print.py %s/logs/%s %s %s"%(now_dir,exp_dir,n_p,f0method) print(cmd) p = Popen(cmd, shell=True,cwd=now_dir)#, stdin=PIPE, stdout=PIPE,stderr=PIPE - ###煞笔gr,popen read都非得全跑完了再一次性读取,不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 done=[False] threading.Thread(target=if_done,args=(done,p,)).start() while(1): @@ -273,7 +273,7 @@ def extract_f0_feature(gpus,n_p,f0method,if_f0,exp_dir): print(cmd) p = Popen(cmd, shell=True, cwd=now_dir)#, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=now_dir ps.append(p) - ###煞笔gr,popen read都非得全跑完了再一次性读取,不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 + ###煞笔gr, popen read都非得全跑完了再一次性读取, 不用gr就正常读一句输出一句;只能额外弄出一个文本流定时读 done = [False] threading.Thread(target=if_done_multi, args=(done, ps,)).start() while (1): @@ -321,7 +321,7 @@ def click_train(exp_dir1,sr2,if_f0_3,spk_id5,save_epoch10,total_epoch11,batch_si print(cmd) p = Popen(cmd, shell=True, cwd=now_dir) p.wait() - return "训练结束,您可查看控制台训练日志或实验文件夹下的train.log" + return "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log" # but4.click(train_index, [exp_dir1], info3) def train_index(exp_dir1): exp_dir="%s/logs/%s"%(now_dir,exp_dir1) @@ -351,7 +351,7 @@ def train_index(exp_dir1): yield "\n".join(infos) index.add(big_npy) faiss.write_index(index, '%s/added_IVF%s_Flat_nprobe_%s.index'%(exp_dir,n_ivf,index_ivf.nprobe)) - infos.append("成功构建索引,added_IVF%s_Flat_nprobe_%s.index"%(n_ivf,index_ivf.nprobe)) + infos.append("成功构建索引, added_IVF%s_Flat_nprobe_%s.index"%(n_ivf,index_ivf.nprobe)) yield "\n".join(infos) #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, 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): @@ -421,7 +421,7 @@ def train1key(exp_dir1, sr2, if_f0_3, trainset_dir4, spk_id5, gpus6, np7, f0meth yield get_info_str(cmd) p = Popen(cmd, shell=True, cwd=now_dir) p.wait() - yield get_info_str("训练结束,您可查看控制台训练日志或实验文件夹下的train.log") + yield get_info_str("训练结束, 您可查看控制台训练日志或实验文件夹下的train.log") #######step3b:训练索引 feature_dir="%s/3_feature256"%(exp_dir) npys = [] @@ -442,7 +442,7 @@ def train1key(exp_dir1, sr2, if_f0_3, trainset_dir4, spk_id5, gpus6, np7, f0meth yield get_info_str("adding index") index.add(big_npy) faiss.write_index(index, '%s/added_IVF%s_Flat_nprobe_%s.index'%(exp_dir,n_ivf,index_ivf.nprobe)) - yield get_info_str("成功构建索引,added_IVF%s_Flat_nprobe_%s.index"%(n_ivf,index_ivf.nprobe)) + yield get_info_str("成功构建索引, added_IVF%s_Flat_nprobe_%s.index"%(n_ivf,index_ivf.nprobe)) yield get_info_str("全流程结束!") # ckpt_path2.change(change_info_,[ckpt_path2],[sr__,if_f0__]) @@ -459,10 +459,7 @@ def change_info_(ckpt_path): with gr.Blocks() as app: - gr.Markdown(value=i18n(""" - 本软件以MIT协议开源,作者不对软件具备任何控制力,使用软件者、传播软件导出的声音者自负全责。
- 如不认可该条款,则不能使用或引用软件包内任何代码和文件。详见根目录"使用需遵守的协议-LICENSE.txt"。 - """)) + gr.Markdown(value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.")) with gr.Tabs(): with gr.TabItem(i18n("模型推理")): with gr.Row(): @@ -486,54 +483,46 @@ with gr.Blocks() as app: outputs=[spk_item], ) with gr.Group(): - gr.Markdown(value=i18n(""" - 男转女推荐+12key,女转男推荐-12key,如果音域爆炸导致音色失真也可以自己调整到合适音域。 - """)) + 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("输入待处理音频文件路径(默认是正确格式示例)"),value="E:\codes\py39\\vits_vc_gpu_train\\todo-songs\冬之花clip1.wav") + vc_transform0 = gr.Number(label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"), value=0) + input_audio0 = gr.Textbox(label=i18n("输入待处理音频文件路径(默认是正确格式示例)"),value="E:\\codes\\py39\\vits_vc_gpu_train\\todo-songs\\冬之花clip1.wav") f0method0=gr.Radio(label=i18n("选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比"), choices=["pm","harvest"],value="pm", interactive=True) with gr.Column(): - file_index1 = gr.Textbox(label=i18n("特征检索库文件路径"),value="E:\codes\py39\\vits_vc_gpu_train\logs\mi-test-1key\\added_IVF677_Flat_nprobe_7.index", interactive=True) - file_big_npy1 = gr.Textbox(label=i18n("特征文件路径"),value="E:\codes\py39\\vits_vc_gpu_train\logs\mi-test-1key\\total_fea.npy", interactive=True) + file_index1 = gr.Textbox(label=i18n("特征检索库文件路径"),value="E:\\codes\\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\added_IVF677_Flat_nprobe_7.index", interactive=True) + 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='检索特征占比', value=1,interactive=True) - f0_file = gr.File(label=i18n("F0曲线文件,可选,一行一个音高,代替默认F0及升降调")) + f0_file = gr.File(label=i18n("F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调")) but0=gr.Button(i18n("转换"), variant="primary") with gr.Column(): vc_output1 = gr.Textbox(label=i18n("输出信息")) vc_output2 = gr.Audio(label=i18n("输出音频(右下角三个点,点了可以下载)")) but0.click(vc_single, [spk_item, input_audio0, vc_transform0,f0_file,f0method0,file_index1,file_big_npy1,index_rate1], [vc_output1, vc_output2]) with gr.Group(): - gr.Markdown(value=i18n(""" - 批量转换,输入待转换音频文件夹,或上传多个音频文件,在指定文件夹(默认opt)下输出转换的音频。 - """)) + gr.Markdown(value=i18n("批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ")) with gr.Row(): with gr.Column(): - vc_transform1 = gr.Number(label=i18n("变调(整数,半音数量,升八度12降八度-12)"), value=0) + 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低音好但巨慢无比"), choices=["pm","harvest"],value="pm", interactive=True) with gr.Column(): - file_index2 = gr.Textbox(label=i18n("特征检索库文件路径"),value="E:\codes\py39\\vits_vc_gpu_train\logs\mi-test-1key\\added_IVF677_Flat_nprobe_7.index", interactive=True) - file_big_npy2 = gr.Textbox(label=i18n("特征文件路径"),value="E:\codes\py39\\vits_vc_gpu_train\logs\mi-test-1key\\total_fea.npy", interactive=True) + file_index2 = gr.Textbox(label=i18n("特征检索库文件路径"),value="E:\\codes\\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\added_IVF677_Flat_nprobe_7.index", interactive=True) + 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(): dir_input = gr.Textbox(label=i18n("输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)"),value="E:\codes\py39\\vits_vc_gpu_train\\todo-songs") - inputs = gr.File(file_count="multiple", label=i18n("也可批量输入音频文件,二选一,优先读文件夹")) + inputs = gr.File(file_count="multiple", label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹")) 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_index2,file_big_npy2,index_rate2], [vc_output3]) with gr.TabItem(i18n("伴奏人声分离")): with gr.Group(): - gr.Markdown(value=i18n(""" - 人声伴奏分离批量处理,使用UVR5模型。
- 不带和声用HP2,带和声且提取的人声不需要和声用HP5
- 合格的文件夹路径格式举例:E:\codes\py39\\vits_vc_gpu\白鹭霜华测试样例(去文件管理器地址栏拷就行了) - """)) + gr.Markdown(value=i18n("人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)")) with gr.Row(): with gr.Column(): - dir_wav_input = gr.Textbox(label=i18n("输入待处理音频文件夹路径"),value="E:\codes\py39\\vits_vc_gpu_train\\todo-songs") - wav_inputs = gr.File(file_count="multiple", label=i18n("也可批量输入音频文件,二选一,优先读文件夹")) + dir_wav_input = gr.Textbox(label=i18n("输入待处理音频文件夹路径"),value="E:\\codes\\py39\\vits_vc_gpu_train\\todo-songs") + wav_inputs = gr.File(file_count="multiple", label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹")) with gr.Column(): model_choose = gr.Dropdown(label=i18n("模型"), choices=uvr5_names) opt_vocal_root = gr.Textbox(label=i18n("指定输出人声文件夹"),value="opt") @@ -542,30 +531,24 @@ with gr.Blocks() as app: vc_output4 = gr.Textbox(label=i18n("输出信息")) but2.click(uvr, [model_choose, dir_wav_input,opt_vocal_root,wav_inputs,opt_ins_root], [vc_output4]) with gr.TabItem(i18n("训练")): - gr.Markdown(value=i18n(""" - step1:填写实验配置。实验数据放在logs下,每个实验一个文件夹,需手工输入实验名路径,内含实验配置,日志,训练得到的模型文件。 - """)) + gr.Markdown(value=i18n("step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ")) with gr.Row(): exp_dir1 = gr.Textbox(label=i18n("输入实验名"),value="mi-test") sr2 = gr.Radio(label=i18n("目标采样率"), choices=["32k","40k","48k"],value="40k", interactive=True) - if_f0_3 = gr.Radio(label=i18n("模型是否带音高指导(唱歌一定要,语音可以不要)"), choices=["是","否"],value="是", interactive=True) - with gr.Group():#暂时单人的,后面支持最多4人的#数据处理 - gr.Markdown(value=i18n(""" - step2a:自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化,在实验目录下生成2个wav文件夹;暂时只支持单人训练。 - """)) + if_f0_3 = gr.Radio(label=i18n("模型是否带音高指导(唱歌一定要, 语音可以不要)"), choices=["是","否"],value="是", interactive=True) + with gr.Group():#暂时单人的, 后面支持最多4人的#数据处理 + gr.Markdown(value=i18n("step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ")) with gr.Row(): - trainset_dir4 = gr.Textbox(label=i18n("输入训练文件夹路径"),value="E:\语音音频+标注\米津玄师\src") + trainset_dir4 = gr.Textbox(label=i18n("输入训练文件夹路径"),value="E:\\语音音频+标注\\米津玄师\\src") 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],[info1]) with gr.Group(): - gr.Markdown(value=i18n(""" - step2b:使用CPU提取音高(如果模型带音高),使用GPU提取特征(选择卡号) - """)) + 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) + 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(): np7 = gr.Slider(minimum=0, maximum=ncpu, step=1, label=i18n("提取音高使用的CPU进程数"), value=ncpu,interactive=True) @@ -574,21 +557,19 @@ with gr.Blocks() as app: info2=gr.Textbox(label=i18n("输出信息"),value="",max_lines=8) but2.click(extract_f0_feature,[gpus6,np7,f0method8,if_f0_3,exp_dir1],[info2]) with gr.Group(): - gr.Markdown(value=i18n(""" - step3:填写训练设置,开始训练模型和索引 - """)) + 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=1000, step=1, label=i18n("总训练轮数total_epoch"), value=20,interactive=True) batch_size12 = gr.Slider(minimum=0, maximum=32, step=1, label='每张显卡的batch_size', value=4,interactive=True) if_save_latest13 = gr.Radio(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), choices=["是", "否"], value="否", interactive=True) - if_cache_gpu17 = gr.Radio(label=i18n("是否缓存所有训练集至显存。10min以下小数据可缓存以加速训练,大数据缓存会炸显存也加不了多少速"), choices=["是", "否"], value="否", interactive=True) + if_cache_gpu17 = gr.Radio(label=i18n("是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速"), choices=["是", "否"], value="否", interactive=True) with gr.Row(): pretrained_G14 = gr.Textbox(label=i18n("加载预训练底模G路径"), value="pretrained/f0G40k.pth",interactive=True) pretrained_D15 = gr.Textbox(label=i18n("加载预训练底模D路径"), value="pretrained/f0D40k.pth",interactive=True) sr2.change(change_sr2, [sr2,if_f0_3], [pretrained_G14,pretrained_D15]) if_f0_3.change(change_f0, [if_f0_3, sr2], [np7, f0method8, pretrained_G14, pretrained_D15]) - gpus16 = gr.Textbox(label=i18n("以-分隔输入使用的卡号,例如 0-1-2 使用卡0和卡1和卡2"), value=gpus,interactive=True) + gpus16 = gr.Textbox(label=i18n("以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"), value=gpus,interactive=True) but3 = gr.Button(i18n("训练模型"), variant="primary") but4 = gr.Button(i18n("训练特征索引"), variant="primary") but5 = gr.Button(i18n("一键训练"), variant="primary") @@ -599,7 +580,7 @@ with gr.Blocks() as app: with gr.TabItem(i18n("ckpt处理")): with gr.Group(): - gr.Markdown(value=i18n("""模型融合,可用于测试音色融合""")) + 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) @@ -618,7 +599,7 @@ with gr.Blocks() as app: 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) + 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) @@ -633,7 +614,7 @@ with gr.Blocks() as app: with gr.Group(): gr.Markdown(value=i18n("模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况")) with gr.Row(): - ckpt_path2 = gr.Textbox(label=i18n("模型路径"), value="E:\codes\py39\logs\mi-test_f0_48k\\G_23333.pth", interactive=True) + ckpt_path2 = gr.Textbox(label=i18n("模型路径"), value="E:\\codes\\py39\\logs\\mi-test_f0_48k\\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) @@ -644,11 +625,11 @@ with gr.Blocks() as app: but9.click(extract_small_model, [ckpt_path2,save_name,sr__,if_f0__,info___], info7) with gr.TabItem(i18n("招募音高曲线前端编辑器")): - gr.Markdown(value=i18n("""加开发群联系我xxxxx""")) + gr.Markdown(value=i18n("加开发群联系我xxxxx")) with gr.TabItem(i18n("点击查看交流、问题反馈群号")): - gr.Markdown(value=i18n("""xxxxx""")) + gr.Markdown(value=i18n("xxxxx")) if iscolab: 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=True,server_port=listen_port,quiet=True) \ No newline at end of file + app.queue(concurrency_count=511, max_size=1022).launch(server_name="0.0.0.0",inbrowser=not noautoopen,server_port=listen_port,quiet=True) diff --git a/locale/en_US.json b/locale/en_US.json index 8d8ca89..5b724d0 100644 --- a/locale/en_US.json +++ b/locale/en_US.json @@ -1,49 +1,58 @@ { + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "Model inference", "推理音色": "Inferencing timbre", "刷新音色列表": "Refresh timbre list", "卸载音色省显存": "Unload timbre to save GPU memory", "请选择说话人id": "Please select a speaker id", - "变调(整数,半音数量,升八度12降八度-12)": "Pitch shift (integer, number of semitones, up to 12 octaves or down to -12 octaves)", - "输入待处理音频文件路径(默认是正确格式示例": "Input the path of the audio file to be processed (the default format is an example of the correct format)", + "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", + "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", + "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "Select the algorithm for pitch extraction. Use 'pm' to speed up for singing voices, or use 'harvest' for better low-pitched voices, but it is extremely slow.", "特征检索库文件路径": "Feature search database file path", "特征文件路径": "Feature file path", - "F0曲线文件,可选,一行一个音高,代替默认F0及升降调": "F0 curve file, optional. One pitch per line to replace default F0 and pitch shifting.", + "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", "转换": "Conversion", "输出信息": "Output information", - "输出音频(右下角三个点,点了可以下载": "Output audio (three dots in the lower right corner, click to download)", + "输出音频(右下角三个点,点了可以下载)": "输出音频(右下角三个点,点了可以下载)", + "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ", "指定输出文件夹": "Specify output folder", "检索特征占比": "Search feature ratio", - "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了": "Input the path of the audio file folder to be processed (just copy it from the address bar of the file manager)", - "也可批量输入音频文件,二选一,优先读文件夹": "Batch input of audio files is also available. Choose one of them, and the folder has a higher priority.", + "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)", + "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "伴奏人声分离": "Accompaniment and vocal separation", + "人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)": "人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)", "输入待处理音频文件夹路径": "Input audio folder path", "模型": "Model", "指定输出人声文件夹": "Specify output vocal folder", "指定输出乐器文件夹": "Specify output instrumental folder", "训练": "Train", + "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ", "输入实验名": "Input experiment name", "目标采样率": "Target sample rate", - "模型是否带音高指导(唱歌一定要,语音可以不要": "Does the model have pitch guidance? (Necessary for singing, not necessary for speech)", + "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", + "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", "输入训练文件夹路径": "Input training folder path", "请指定说话人id": "Please specify speaker ID", "处理数据": "Process data", - "以-分隔输入使用的卡号,例如 0-1-2 使用卡0和卡1和卡2": "Input card numbers to use, separated by '-'. For example, '0-1-2' means using card 0, card 1, and card 2.", + "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", + "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "GPU information", "提取音高使用的CPU进程数": "Number of CPU processes used for pitch extraction", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "Select pitch extraction algorithm: Use 'pm' for faster processing of singing voice, 'dio' for high-quality speech but slower processing, and 'harvest' for the best quality but slowest processing.", "特征提取": "Feature extraction", + "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", "保存频率save_every_epoch": "Save frequency (save_every_epoch)", "总训练轮数total_epoch": "Total training epochs (total_epoch)", "是否仅保存最新的ckpt文件以节省硬盘空间": "Whether to save only the latest ckpt file to save disk space", - "是否缓存所有训练集至显存。10min以下小数据可缓存以加速训练,大数据缓存会炸显存也加不了多少速": "Whether to cache all training sets in the video memory. Small data less than 10 minutes can be cached to speed up training, but caching large data will cause the video memory to explode and not add much speed.", + "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", "加载预训练底模G路径": "Load pre-trained base model G path.", "加载预训练底模D路径": "Load pre-trained base model D path.", "训练模型": "Train model.", "训练特征索引": "Train feature index.", "一键训练": "One-click training.", "ckpt处理": "ckpt processing.", + "模型融合, 可用于测试音色融合": "模型融合, 可用于测试音色融合", "A模型路径": "A model path.", "B模型路径": "B model path.", "A模型权重": "A model weight.", @@ -51,21 +60,36 @@ "要置入的模型信息": "Model information to be placed.", "保存的模型名不带后缀": "Saved model name without extension.", "融合": "Fusion.", - "修改模型信息(仅支持weights文件夹下提取的小模型文件": "Modify model information (only supports small model files extracted under the weights folder)", + "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", "模型路径": "Model path", "要改的模型信息": "Model information to be modified", - "保存的文件名,默认空为和源文件同名": "Saved file name, empty by default to use the same name as the source file", + "保存的文件名, 默认空为和源文件同名": "保存的文件名, 默认空为和源文件同名", "修改": "Modify", - "查看模型信息(仅支持weights文件夹下提取的小模型文件": "View model information (only supports small model files extracted under the weights folder)", + "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "查看模型信息(仅支持weights文件夹下提取的小模型文件)", "查看": "View", - "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "Model extraction (input the path of the large file model under the logs folder), suitable for situations where you do not want to continue training halfway and the model has not automatically extracted and saved a small file model, or when you want to test intermediate models", + "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况", "保存名": "Save Name", "模型是否带音高指导,1是0否": "Whether the model comes with pitch guidance, 1 for yes, 0 for no", "提取": "Extract", "招募音高曲线前端编辑器": "Recruit front-end editors for pitch curves", + "加开发群联系我xxxxx": "加开发群联系我xxxxx", "点击查看交流、问题反馈群号": "Click to view the communication and problem feedback group number", - "输入设备/Input Device": "Input device", - "输出设备/Output Device": "Output device", - "音频设备(请使用同种类驱动)/Audio Devices": "Audio devices (please use the same type of driver)", - "音调设置/Pitch Offset": "Pitch setting / Pitch Offset" + "xxxxx": "xxxxx", + "加载模型": "加载模型", + "选择.pth文件": "选择.pth文件", + "选择.index文件": "选择.index文件", + "选择.npy文件": "选择.npy文件", + "输入设备": "输入设备", + "输出设备": "输出设备", + "音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)", + "响应阈值": "响应阈值", + "音调设置": "音调设置", + "常规设置": "常规设置", + "采样长度": "采样长度", + "淡入淡出长度": "淡入淡出长度", + "额外推理时长": "额外推理时长", + "输出降噪/Output Noisereduce": "输出降噪/Output Noisereduce", + "性能设置": "性能设置", + "开始音频转换": "开始音频转换", + "停止音频转换": "停止音频转换" } \ No newline at end of file diff --git a/locale/ja_JP.json b/locale/ja_JP.json index 1b79852..641270c 100644 --- a/locale/ja_JP.json +++ b/locale/ja_JP.json @@ -1,49 +1,58 @@ { + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "モデル推論", "推理音色": "", "刷新音色列表": "", "卸载音色省显存": "", "请选择说话人id": "話者IDを選択してください", - "变调(整数,半音数量,升八度12降八度-12)": "音程変更(整数、半音数、12半音の上昇/下降)", - "输入待处理音频文件路径(默认是正确格式示例": "処理対象のオーディオファイルのパスを入力してください(デフォルトは正しいフォーマットの例です)", + "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", + "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", + "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "ピッチ抽出アルゴリズムを選択してください。歌声の場合は、pmを使用して速度を上げることができます。低音が重要な場合は、harvestを使用できますが、非常に遅くなります。", "特征检索库文件路径": "特徴量検索データベースのファイルパス", "特征文件路径": "特徴量ファイルのパス", - "F0曲线文件,可选,一行一个音高,代替默认F0及升降调": "F0曲線ファイル(オプション)、1行に1つのピッチが含まれます。デフォルトのF0および音程を置き換えます。", + "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", "转换": "変換", "输出信息": "出力情報", - "输出音频(右下角三个点,点了可以下载": "オーディオ出力(右下の3つの点をクリックするとダウンロードできます)", + "输出音频(右下角三个点,点了可以下载)": "输出音频(右下角三个点,点了可以下载)", + "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ", "指定输出文件夹": "出力フォルダを指定してください", "检索特征占比": "検索特徴率", - "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了": "処理対象のオーディオフォルダのパスを入力してください(ファイルマネージャーのアドレスバーからコピーしてください)", - "也可批量输入音频文件,二选一,优先读文件夹": "オーディオファイルを一括入力することもできます。2つのオプションから1つを選択し、フォルダの読み込みを優先します。", + "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)", + "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "伴奏人声分离": "伴奏とボーカルの分離", + "人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)": "人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)", "输入待处理音频文件夹路径": "処理するオーディオファイルのフォルダパスを入力してください", "模型": "モデル", "指定输出人声文件夹": "人の声を出力するフォルダを指定してください", "指定输出乐器文件夹": "楽器の出力フォルダを指定してください", "训练": "トレーニング", + "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ", "输入实验名": "実験名を入力してください", "目标采样率": "目標サンプリングレート", - "模型是否带音高指导(唱歌一定要,语音可以不要": "モデルに音高ガイドを付けるかどうか(歌を歌う場合は必要ですが、音声は必要ありません)", + "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", + "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", "输入训练文件夹路径": "トレーニング用フォルダのパスを入力してください", "请指定说话人id": "話者IDを指定してください", "处理数据": "データ処理", - "以-分隔输入使用的卡号,例如 0-1-2 使用卡0和卡1和卡2": "使用するカード番号を-で区切って入力してください。例:0-1-2は、カード0、カード1、カード2を使用します", + "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", + "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "カード情報", "提取音高使用的CPU进程数": "抽出に使用するCPUプロセス数", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "", "特征提取": "特徴抽出", + "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", "保存频率save_every_epoch": "エポックごとの保存頻度", "总训练轮数total_epoch": "総トレーニング回数", "是否仅保存最新的ckpt文件以节省硬盘空间": "ハードディスク容量を節約するため、最新のckptファイルのみを保存するかどうか", - "是否缓存所有训练集至显存。10min以下小数据可缓存以加速训练,大数据缓存会炸显存也加不了多少速": "すべてのトレーニングセットをキャッシュしてGPUメモリに保存するかどうか。10分以下の小さなデータはキャッシュしてトレーニングを高速化できますが、大きなデータをキャッシュするとGPUメモリが不足して速度が上がりません。", + "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", "加载预训练底模G路径": "事前学習済みのGモデルのパスをロードしてください", "加载预训练底模D路径": "事前学習済みのDモデルのパスをロードしてください", "训练模型": "モデルのトレーニング", "训练特征索引": "特徴インデックスのトレーニング", "一键训练": "ワンクリックトレーニング", "ckpt处理": "ckptファイルの処理", + "模型融合, 可用于测试音色融合": "模型融合, 可用于测试音色融合", "A模型路径": "Aモデルのパス", "B模型路径": "Bモデルのパス", "A模型权重": "Aモデルの重み", @@ -51,21 +60,36 @@ "要置入的模型信息": "挿入するモデル情報", "保存的模型名不带后缀": "拡張子のない保存するモデル名", "融合": "フュージョン", - "修改模型信息(仅支持weights文件夹下提取的小模型文件": "モデル情報の変更(小さなモデルファイルのみ、weightsフォルダーから抽出)", + "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", "模型路径": "モデルパス", "要改的模型信息": "変更するモデル情報", - "保存的文件名,默认空为和源文件同名": "保存するファイル名。デフォルトは元のファイル名と同じです", + "保存的文件名, 默认空为和源文件同名": "保存的文件名, 默认空为和源文件同名", "修改": "変更", - "查看模型信息(仅支持weights文件夹下提取的小模型文件": "モデル情報の表示(小さなモデルファイルのみ、weightsフォルダーから抽出)", + "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "查看模型信息(仅支持weights文件夹下提取的小模型文件)", "查看": "表示", - "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "モデル抽出(logsフォルダー内の大きなファイルモデルパスを入力)。トレーニングが途中で止まり、自動的に小さなモデルファイルを保存していない場合、または中間モデルをテストしたい場合に使用できます。", + "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况", "保存名": "保存するファイル名", "模型是否带音高指导,1是0否": "モデルに音高ガイドを付けるかどうか、1は付ける、0は付けない", "提取": "抽出", "招募音高曲线前端编辑器": "音高曲線フロントエンドエディターを募集", + "加开发群联系我xxxxx": "加开发群联系我xxxxx", "点击查看交流、问题反馈群号": "クリックして交流、問題フィードバックグループ番号を表示", - "输入设备/Input Device": "入力デバイス", - "输出设备/Output Device": "出力デバイス", - "音频设备(请使用同种类驱动)/Audio Devices": "音声デバイス", - "音调设置/Pitch Offset": "音程オフセット" + "xxxxx": "xxxxx", + "加载模型": "加载模型", + "选择.pth文件": "选择.pth文件", + "选择.index文件": "选择.index文件", + "选择.npy文件": "选择.npy文件", + "输入设备": "输入设备", + "输出设备": "输出设备", + "音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)", + "响应阈值": "响应阈值", + "音调设置": "音调设置", + "常规设置": "常规设置", + "采样长度": "采样长度", + "淡入淡出长度": "淡入淡出长度", + "额外推理时长": "额外推理时长", + "输出降噪/Output Noisereduce": "输出降噪/Output Noisereduce", + "性能设置": "性能设置", + "开始音频转换": "开始音频转换", + "停止音频转换": "停止音频转换" } \ No newline at end of file diff --git a/locale/locale_diff.py b/locale/locale_diff.py index 46a51cc..de00aec 100644 --- a/locale/locale_diff.py +++ b/locale/locale_diff.py @@ -1,5 +1,4 @@ import json -import os from collections import OrderedDict # Define the standard file name @@ -21,10 +20,16 @@ for lang_file in languages: # Find the difference between the language file and the standard file diff = set(standard_data.keys()) - set(lang_data.keys()) + miss = set(lang_data.keys()) - set(standard_data.keys()) + # Add any missing keys to the language file for key in diff: lang_data[key] = key + # Del any extra keys to the language file + for key in miss: + del lang_data[key] + # Sort the keys of the language file to match the order of the standard file lang_data = OrderedDict(sorted(lang_data.items(), key=lambda x: list(standard_data.keys()).index(x[0]))) diff --git a/locale/zh_CN.json b/locale/zh_CN.json index 9f68ad1..01ee149 100644 --- a/locale/zh_CN.json +++ b/locale/zh_CN.json @@ -1,49 +1,58 @@ { + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "模型推理", "推理音色": "推理音色", "刷新音色列表": "刷新音色列表", "卸载音色省显存": "卸载音色省显存", "请选择说话人id": "请选择说话人id", - "变调(整数,半音数量,升八度12降八度-12)": "变调(整数,半音数量,升八度12降八度-12)", - "输入待处理音频文件路径(默认是正确格式示例": "输入待处理音频文件路径(默认是正确格式示例", + "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", + "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", + "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比", "特征检索库文件路径": "特征检索库文件路径", "特征文件路径": "特征文件路径", - "F0曲线文件,可选,一行一个音高,代替默认F0及升降调": "F0曲线文件,可选,一行一个音高,代替默认F0及升降调", + "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", "转换": "转换", "输出信息": "输出信息", - "输出音频(右下角三个点,点了可以下载": "输出音频(右下角三个点,点了可以下载", + "输出音频(右下角三个点,点了可以下载)": "输出音频(右下角三个点,点了可以下载)", + "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ", "指定输出文件夹": "指定输出文件夹", "检索特征占比": "检索特征占比", - "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了": "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了", - "也可批量输入音频文件,二选一,优先读文件夹": "也可批量输入音频文件,二选一,优先读文件夹", + "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)", + "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "伴奏人声分离": "伴奏人声分离", + "人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)": "人声伴奏分离批量处理, 使用UVR5模型.
不带和声用HP2, 带和声且提取的人声不需要和声用HP5
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)", "输入待处理音频文件夹路径": "输入待处理音频文件夹路径", "模型": "模型", "指定输出人声文件夹": "指定输出人声文件夹", "指定输出乐器文件夹": "指定输出乐器文件夹", "训练": "训练", + "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ", "输入实验名": "输入实验名", "目标采样率": "目标采样率", - "模型是否带音高指导(唱歌一定要,语音可以不要": "模型是否带音高指导(唱歌一定要,语音可以不要", + "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", + "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", "输入训练文件夹路径": "输入训练文件夹路径", "请指定说话人id": "请指定说话人id", "处理数据": "处理数据", - "以-分隔输入使用的卡号,例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号,例如 0-1-2 使用卡0和卡1和卡2", + "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", + "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "显卡信息", "提取音高使用的CPU进程数": "提取音高使用的CPU进程数", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢", "特征提取": "特征提取", + "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", "保存频率save_every_epoch": "保存频率save_every_epoch", "总训练轮数total_epoch": "总训练轮数total_epoch", "是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间", - "是否缓存所有训练集至显存。10min以下小数据可缓存以加速训练,大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存。10min以下小数据可缓存以加速训练,大数据缓存会炸显存也加不了多少速", + "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", "加载预训练底模G路径": "加载预训练底模G路径", "加载预训练底模D路径": "加载预训练底模D路径", "训练模型": "训练模型", "训练特征索引": "训练特征索引", "一键训练": "一键训练", "ckpt处理": "ckpt处理", + "模型融合, 可用于测试音色融合": "模型融合, 可用于测试音色融合", "A模型路径": "A模型路径", "B模型路径": "B模型路径", "A模型权重": "A模型权重", @@ -51,34 +60,36 @@ "要置入的模型信息": "要置入的模型信息", "保存的模型名不带后缀": "保存的模型名不带后缀", "融合": "融合", - "修改模型信息(仅支持weights文件夹下提取的小模型文件": "修改模型信息(仅支持weights文件夹下提取的小模型文件", + "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", "模型路径": "模型路径", "要改的模型信息": "要改的模型信息", - "保存的文件名,默认空为和源文件同名": "保存的文件名,默认空为和源文件同名", + "保存的文件名, 默认空为和源文件同名": "保存的文件名, 默认空为和源文件同名", "修改": "修改", - "查看模型信息(仅支持weights文件夹下提取的小模型文件": "查看模型信息(仅支持weights文件夹下提取的小模型文件", + "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "查看模型信息(仅支持weights文件夹下提取的小模型文件)", "查看": "查看", "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况", "保存名": "保存名", "模型是否带音高指导,1是0否": "模型是否带音高指导,1是0否", "提取": "提取", "招募音高曲线前端编辑器": "招募音高曲线前端编辑器", + "加开发群联系我xxxxx": "加开发群联系我xxxxx", "点击查看交流、问题反馈群号": "点击查看交流、问题反馈群号", - "加载模型/Load Model":"加载模型", - "选择.pth文件/.pth File":"选择.pth文件", - "选择.index文件/.index File":"选择.index文件", - "选择.npy文件/.npy File":"选择.npy文件", - "输入设备/Input Device": "输入设备", - "输出设备/Output Device": "输出设备", - "音频设备(请使用同种类驱动)/Audio Devices": "音频设备(请使用同种类驱动)", - "响应阈值/Silence Threhold":"响应阈值", - "音调设置/Pitch Offset": "音调设置", - "常规设置/Common":"常规设置", - "采样长度/Sample Length":"采样长度", - "淡入淡出长度/Crossfade Length":"淡入淡出长度", - "额外推理时长/Extra Length":"额外推理时长", - "输出降噪/Output Noisereduce":"输出降噪", - "性能设置/Performance":"性能设置", - "开始音频转换":"开始音频转换", - "停止音频转换":"停止音频转换" + "xxxxx": "xxxxx", + "加载模型": "加载模型", + "选择.pth文件": "选择.pth文件", + "选择.index文件": "选择.index文件", + "选择.npy文件": "选择.npy文件", + "输入设备": "输入设备", + "输出设备": "输出设备", + "音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)", + "响应阈值": "响应阈值", + "音调设置": "音调设置", + "常规设置": "常规设置", + "采样长度": "采样长度", + "淡入淡出长度": "淡入淡出长度", + "额外推理时长": "额外推理时长", + "输出降噪/Output Noisereduce": "输出降噪/Output Noisereduce", + "性能设置": "性能设置", + "开始音频转换": "开始音频转换", + "停止音频转换": "停止音频转换" } \ No newline at end of file diff --git a/webui_locale.py b/webui_locale.py index b665c3d..999eb6f 100644 --- a/webui_locale.py +++ b/webui_locale.py @@ -8,17 +8,13 @@ def load_language_list(language): class I18nAuto: def __init__(self, language=None): - self.language_map = {} if language is None: language = 'auto' if language == 'auto': language = locale.getdefaultlocale()[0] self.language = language - self.language_list = load_language_list(language) - self.read_language(self.language_list) - - def read_language(self, lang_dict: dict): - self.language_map.update(lang_dict) + print("Use Languane:", language) + self.language_map = load_language_list(language) def __call__(self, key): return self.language_map[key]