fix: i18n导致无法启动 & 增加 --noautoopen 参数 (#39)

* optimize: 精简未用到的配置项并在特征提取初步引入mps

* add cmd argument: --noautoopen

* fix: i18n

* fix

* fix

* add genlocale workflow

* add unitest

* fix

* fix

* fix
This commit is contained in:
源文雨 2023-04-12 16:53:50 +08:00 committed by GitHub
parent 19a83b7664
commit 33e1a0f1d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 262 additions and 159 deletions

24
.github/workflows/genlocale.yml vendored Normal file
View File

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

36
.github/workflows/unitest.yml vendored Normal file
View File

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

View File

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

View File

@ -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:

28
gui.py
View File

@ -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')]
]

View File

@ -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
###煞笔grpopen 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
###煞笔grpopen 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)
###煞笔grpopen 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协议开源作者不对软件具备任何控制力使用软件者传播软件导出的声音者自负全责<br>
如不认可该条款则不能使用或引用软件包内任何代码和文件详见根目录"使用需遵守的协议-LICENSE.txt"
"""))
gr.Markdown(value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>."))
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模型<br>
不带和声用HP2带和声且提取的人声不需要和声用HP5<br>
合格的文件夹路径格式举例E:\codes\py39\\vits_vc_gpu\白鹭霜华测试样例去文件管理器地址栏拷就行了
"""))
gr.Markdown(value=i18n("人声伴奏分离批量处理, 使用UVR5模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: 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)
app.queue(concurrency_count=511, max_size=1022).launch(server_name="0.0.0.0",inbrowser=not noautoopen,server_port=listen_port,quiet=True)

View File

@ -1,49 +1,58 @@
{
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>.",
"模型推理": "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模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)": "人声伴奏分离批量处理, 使用UVR5模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: 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",
"性能设置": "性能设置",
"开始音频转换": "开始音频转换",
"停止音频转换": "停止音频转换"
}

View File

@ -1,49 +1,58 @@
{
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>.",
"模型推理": "モデル推論",
"推理音色": "",
"刷新音色列表": "",
"卸载音色省显存": "",
"请选择说话人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模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)": "人声伴奏分离批量处理, 使用UVR5模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: 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",
"性能设置": "性能设置",
"开始音频转换": "开始音频转换",
"停止音频转换": "停止音频转换"
}

View File

@ -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])))

View File

@ -1,49 +1,58 @@
{
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>.",
"模型推理": "模型推理",
"推理音色": "推理音色",
"刷新音色列表": "刷新音色列表",
"卸载音色省显存": "卸载音色省显存",
"请选择说话人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模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)": "人声伴奏分离批量处理, 使用UVR5模型. <br>不带和声用HP2, 带和声且提取的人声不需要和声用HP5<br>合格的文件夹路径格式举例: 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",
"性能设置": "性能设置",
"开始音频转换": "开始音频转换",
"停止音频转换": "停止音频转换"
}

View File

@ -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]