From ccbc93f4fc9f0d25c843ae93fda5cfb0f8ff151e Mon Sep 17 00:00:00 2001 From: Kenn Zhang Date: Mon, 22 Jan 2024 20:21:18 +0800 Subject: [PATCH 01/36] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docker/damo.sha256 | 3 +++ Docker/download.sh | 11 +++++++++++ Docker/links.sha256 | 12 ++++++++++++ Docker/links.txt | 34 +++++++++++++++++++++++++++++++++ Dockerfile | 46 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 106 insertions(+) create mode 100644 Docker/damo.sha256 create mode 100644 Docker/download.sh create mode 100644 Docker/links.sha256 create mode 100644 Docker/links.txt create mode 100644 Dockerfile diff --git a/Docker/damo.sha256 b/Docker/damo.sha256 new file mode 100644 index 00000000..6e9804da --- /dev/null +++ b/Docker/damo.sha256 @@ -0,0 +1,3 @@ +5bba782a5e9196166233b9ab12ba04cadff9ef9212b4ff6153ed9290ff679025 /workspace/tools/damo_asr/models/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/model.pb +b3be75be477f0780277f3bae0fe489f48718f585f3a6e45d7dd1fbb1a4255fc5 /workspace/tools/damo_asr/models/speech_fsmn_vad_zh-cn-16k-common-pytorch/model.pb +a5818bb9d933805a916eebe41eb41648f7f9caad30b4bd59d56f3ca135421916 /workspace/tools/damo_asr/models/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/model.pb \ No newline at end of file diff --git a/Docker/download.sh b/Docker/download.sh new file mode 100644 index 00000000..447e018e --- /dev/null +++ b/Docker/download.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +echo "Downloading models..." + +aria2c --disable-ipv6 --input-file /workspace/Docker/links.txt --dir /workspace --continue + +echo "Checking SHA256..." + +parallel --will-cite -a /workspace/Docker/links.sha256 "echo -n {} | sha256sum -c" diff --git a/Docker/links.sha256 b/Docker/links.sha256 new file mode 100644 index 00000000..cda6dc15 --- /dev/null +++ b/Docker/links.sha256 @@ -0,0 +1,12 @@ +b1c1e17e9c99547a89388f72048cd6e1b41b5a18b170e86a46dfde0324d63eb1 /workspace/GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt +fc579c1db3c1e21b721001cf99d7a584214280df19b002e200b630a34fa06eb8 /workspace/GPT_SoVITS/pretrained_models/s2D488k.pth +020a014e1e01e550e510f2f61fae5e5f5b6aab40f15c22f1f12f724df507e835 /workspace/GPT_SoVITS/pretrained_models/s2G488k.pth +24164f129c66499d1346e2aa55f183250c223161ec2770c0da3d3b08cf432d3c /workspace/GPT_SoVITS/pretrained_models/chinese-hubert-base/pytorch_model.bin +e53a693acc59ace251d143d068096ae0d7b79e4b1b503fa84c9dcf576448c1d8 /workspace/GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large/pytorch_model.bin +39796caa5db18d7f9382d8ac997ac967bfd85f7761014bb807d2543cc844ef05 /workspace/tools/uvr5/uvr5_weights/HP2_all_vocals.pth +45e6b65199e781b4a6542002699be9f19cd3d1cb7d1558bc2bfbcd84674dfe28 /workspace/tools/uvr5/uvr5_weights/HP3_all_vocals.pth +5908891829634926119720241e8573d97cbeb8277110a7512bdb0bd7563258ee /workspace/tools/uvr5/uvr5_weights/HP5_only_main_vocal.pth +8c8fd1582f9aabc363e47af62ddb88df6cae7e064cae75bbf041a067a5e0aee2 /workspace/tools/uvr5/uvr5_weights/VR-DeEchoAggressive.pth +01376dd2a571bf3cb9cced680732726d2d732609d09216a610b0d110f133febe /workspace/tools/uvr5/uvr5_weights/VR-DeEchoDeReverb.pth +56aba59db3bcdd14a14464e62f3129698ecdea62eee0f003b9360923eb3ac79e /workspace/tools/uvr5/uvr5_weights/VR-DeEchoNormal.pth +233bb5c6aaa365e568659a0a81211746fa881f8f47f82d9e864fce1f7692db80 /workspace/tools/uvr5/uvr5_weights/onnx_dereverb_By_FoxJoy/vocals.onnx \ No newline at end of file diff --git a/Docker/links.txt b/Docker/links.txt new file mode 100644 index 00000000..e6603db0 --- /dev/null +++ b/Docker/links.txt @@ -0,0 +1,34 @@ +# GPT-SoVITS models +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/s1bert25hz-2kh-longer-epoch%3D68e-step%3D50232.ckpt + out=GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/s2D488k.pth + out=GPT_SoVITS/pretrained_models/s2D488k.pth +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/s2G488k.pth + out=GPT_SoVITS/pretrained_models/s2G488k.pth +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/chinese-hubert-base/config.json + out=GPT_SoVITS/pretrained_models/chinese-hubert-base/config.json +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/chinese-hubert-base/preprocessor_config.json + out=GPT_SoVITS/pretrained_models/chinese-hubert-base/preprocessor_config.json +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/chinese-hubert-base/pytorch_model.bin + out=GPT_SoVITS/pretrained_models/chinese-hubert-base/pytorch_model.bin +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/chinese-roberta-wwm-ext-large/config.json + out=GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large/config.json +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/chinese-roberta-wwm-ext-large/pytorch_model.bin + out=GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large/pytorch_model.bin +https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/chinese-roberta-wwm-ext-large/tokenizer.json + out=GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large/tokenizer.json +# UVR5 +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2_all_vocals.pth + out=tools/uvr5/uvr5_weights/HP2_all_vocals.pth +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP3_all_vocals.pth + out=tools/uvr5/uvr5_weights/HP3_all_vocals.pth +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5_only_main_vocal.pth + out=tools/uvr5/uvr5_weights/HP5_only_main_vocal.pth +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoAggressive.pth + out=tools/uvr5/uvr5_weights/VR-DeEchoAggressive.pth +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoDeReverb.pth + out=tools/uvr5/uvr5_weights/VR-DeEchoDeReverb.pth +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoNormal.pth + out=tools/uvr5/uvr5_weights/VR-DeEchoNormal.pth +https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/onnx_dereverb_By_FoxJoy/vocals.onnx + out=tools/uvr5/uvr5_weights/onnx_dereverb_By_FoxJoy/vocals.onnx \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..d39bf217 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +# Base CUDA image +FROM cnstark/pytorch:2.0.1-py3.9.17-cuda11.8.0-ubuntu20.04 + +# Install 3rd party apps +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Etc/UTC +RUN apt-get update && \ + apt-get install -y --no-install-recommends tzdata ffmpeg libsox-dev parallel aria2 git git-lfs && \ + rm -rf /var/lib/apt/lists/* && \ + git lfs install + + +# Install python packages +WORKDIR /temp +COPY ./requirements.txt /temp/requirements.txt +RUN pip install --no-cache-dir -r requirements.txt + + +# Copy application +WORKDIR /workspace +COPY . /workspace + + +# Download models +RUN chmod +x /workspace/Docker/download.sh && /workspace/Docker/download.sh + +# Clone 3rd repos +WORKDIR /workspace/tools/damo_asr/models +RUN git clone --depth 1 https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch && \ + (cd speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch && git lfs pull) +RUN git clone --depth 1 https://www.modelscope.cn/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch.git speech_fsmn_vad_zh-cn-16k-common-pytorch && \ + (cd speech_fsmn_vad_zh-cn-16k-common-pytorch && git lfs pull) +RUN git clone --depth 1 https://www.modelscope.cn/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git punc_ct-transformer_zh-cn-common-vocab272727-pytorch && \ + (cd punc_ct-transformer_zh-cn-common-vocab272727-pytorch && git lfs pull) + +RUN parallel --will-cite -a /workspace/Docker/damo.sha256 "echo -n {} | sha256sum -c" + +WORKDIR /workspace + +EXPOSE 9870 +EXPOSE 9871 +EXPOSE 9872 +EXPOSE 9873 +EXPOSE 9874 + +CMD ["python", "webui.py"] \ No newline at end of file From 5c60ad634c4db1b9bcaca72108c95bdbc5f0330c Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Mon, 22 Jan 2024 20:21:29 +0800 Subject: [PATCH 02/36] Add files via upload --- webui.py | 118 ++++++++++++++++++++++++++----------------------------- 1 file changed, 55 insertions(+), 63 deletions(-) diff --git a/webui.py b/webui.py index 60c6e1b6..e23353c4 100644 --- a/webui.py +++ b/webui.py @@ -1,22 +1,16 @@ -import os,shutil,sys,pdb -now_dir = os.getcwd() -sys.path.append(now_dir) import json,yaml,warnings,torch import platform import psutil +import os import signal warnings.filterwarnings("ignore") torch.manual_seed(233333) +import os,pdb,sys +now_dir = os.getcwd() tmp = os.path.join(now_dir, "TEMP") os.makedirs(tmp, exist_ok=True) os.environ["TEMP"] = tmp -if(os.path.exists(tmp)): - for name in os.listdir(tmp): - if(name=="jieba.cache"):continue - path="%s/%s"%(tmp,name) - delete=os.remove if os.path.isfile(path) else shutil.rmtree - delete(path) import site site_packages_roots = [] for path in site.getsitepackages(): @@ -32,15 +26,15 @@ for site_packages_root in site_packages_roots: "%s\n%s/tools\n%s/tools/damo_asr\n%s/GPT_SoVITS\n%s/tools/uvr5" % (now_dir, now_dir, now_dir, now_dir, now_dir) ) -from tools import my_utils import traceback +sys.path.append(now_dir) import shutil 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 tools.i18n.i18n import I18nAuto +from config import python_exec,infer_device,is_half,exp_root,webui_port_main,webui_port_infer_tts,webui_port_uvr5,webui_port_subfix +from i18n.i18n import I18nAuto i18n = I18nAuto() from scipy.io import wavfile from tools.my_utils import load_audio @@ -125,7 +119,7 @@ def kill_process(pid): def change_label(if_label,path_list): global p_label if(if_label==True and p_label==None): - cmd = '"%s" tools/subfix_webui.py --load_list "%s" --webui_port %s --is_share %s'%(python_exec,path_list,webui_port_subfix,is_share) + cmd = '"%s" tools/subfix_webui.py --load_list "%s" --webui_port %s'%(python_exec,path_list,webui_port_subfix) yield i18n("打标工具WebUI已开启") print(cmd) p_label = Popen(cmd, shell=True) @@ -137,7 +131,7 @@ def change_label(if_label,path_list): def change_uvr5(if_uvr5): global p_uvr5 if(if_uvr5==True and p_uvr5==None): - cmd = '"%s" tools/uvr5/webui.py "%s" %s %s %s'%(python_exec,infer_device,is_half,webui_port_uvr5,is_share) + cmd = '"%s" tools/uvr5/webui.py "%s" %s %s'%(python_exec,infer_device,is_half,webui_port_uvr5) yield i18n("UVR5已开启") print(cmd) p_uvr5 = Popen(cmd, shell=True) @@ -156,7 +150,6 @@ def change_tts_inference(if_tts,bert_path,cnhubert_base_path,gpu_number,gpt_path os.environ["_CUDA_VISIBLE_DEVICES"]=gpu_number os.environ["is_half"]=str(is_half) os.environ["infer_ttswebui"]=str(webui_port_infer_tts) - os.environ["is_share"]=str(is_share) cmd = '"%s" GPT_SoVITS/inference_webui.py'%(python_exec) yield i18n("TTS推理进程已开启") print(cmd) @@ -171,21 +164,21 @@ def open_asr(asr_inp_dir): global p_asr if(p_asr==None): cmd = '"%s" tools/damo_asr/cmd-asr.py "%s"'%(python_exec,asr_inp_dir) - yield "ASR任务开启:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("ASR任务开启:%s")%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_asr = Popen(cmd, shell=True) p_asr.wait() p_asr=None - yield "ASR任务完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("ASR任务完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的ASR任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("已有正在进行的ASR任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close_asr(): global p_asr if(p_asr!=None): kill_process(p_asr.pid) p_asr=None - return "已终止ASR进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return i18n("已终止ASR进程"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} p_train_SoVITS=None def 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): @@ -212,21 +205,21 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s with open(tmp_config_path,"w")as f:f.write(json.dumps(data)) cmd = '"%s" GPT_SoVITS/s2_train.py --config "%s"'%(python_exec,tmp_config_path) - yield "SoVITS训练开始:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("SoVITS训练开始:%s")%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_train_SoVITS = Popen(cmd, shell=True) p_train_SoVITS.wait() p_train_SoVITS=None - yield "SoVITS训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("SoVITS训练完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close1Ba(): global p_train_SoVITS if(p_train_SoVITS!=None): kill_process(p_train_SoVITS.pid) p_train_SoVITS=None - return "已终止SoVITS训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return i18n("已终止SoVITS训练"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} p_train_GPT=None def open1Bb(batch_size,total_epoch,exp_name,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers,pretrained_s1): @@ -255,34 +248,32 @@ def open1Bb(batch_size,total_epoch,exp_name,if_save_latest,if_save_every_weights with open(tmp_config_path, "w") as f:f.write(yaml.dump(data, default_flow_style=False)) # cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" --train_semantic_path "%s/6-name2semantic.tsv" --train_phoneme_path "%s/2-name2text.txt" --output_dir "%s/logs_s1"'%(python_exec,tmp_config_path,s1_dir,s1_dir,s1_dir) cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" '%(python_exec,tmp_config_path) - yield "GPT训练开始:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("GPT训练开始:%s")%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_train_GPT = Popen(cmd, shell=True) p_train_GPT.wait() p_train_GPT=None - yield "GPT训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("GPT训练完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的GPT训练任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("已有正在进行的GPT训练任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close1Bb(): global p_train_GPT if(p_train_GPT!=None): kill_process(p_train_GPT.pid) p_train_GPT=None - return "已终止GPT训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return i18n("已终止GPT训练"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} ps_slice=[] def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts): global ps_slice - inp = my_utils.clean_path(inp) - opt_root = my_utils.clean_path(opt_root) if(os.path.exists(inp)==False): - yield "输入路径不存在",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("输入路径不存在"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} return if os.path.isfile(inp):n_parts=1 elif os.path.isdir(inp):pass else: - yield "输入路径存在但既不是文件也不是文件夹",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("输入路径存在但既不是文件也不是文件夹"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} return if (ps_slice == []): for i_part in range(n_parts): @@ -290,13 +281,13 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k print(cmd) p = Popen(cmd, shell=True) ps_slice.append(p) - yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("切割执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps_slice: p.wait() ps_slice=[] - yield "切割结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("切割结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的切割任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close_slice(): global ps_slice @@ -307,7 +298,7 @@ def close_slice(): except: traceback.print_exc() ps_slice=[] - return "已终止所有切割进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有切割进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1a=[] def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): @@ -337,7 +328,7 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): print(cmd) p = Popen(cmd, shell=True) ps1a.append(p) - yield "文本进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("文本进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1a: p.wait() opt = [] @@ -350,9 +341,9 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): with open(path_text, "w", encoding="utf8") as f: f.write("\n".join(opt) + "\n") ps1a=[] - yield "文本进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("文本进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的文本任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的文本任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1a(): global ps1a @@ -363,7 +354,7 @@ def close1a(): except: traceback.print_exc() ps1a=[] - return "已终止所有1a进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有1a进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1b=[] def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir): @@ -392,13 +383,13 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir): print(cmd) p = Popen(cmd, shell=True) ps1b.append(p) - yield "SSL提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("SSL提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1b: p.wait() ps1b=[] - yield "SSL提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("SSL提取进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的SSL提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的SSL提取任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1b(): global ps1b @@ -409,7 +400,7 @@ def close1b(): except: traceback.print_exc() ps1b=[] - return "已终止所有1b进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有1b进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1c=[] def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): @@ -439,7 +430,7 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): print(cmd) p = Popen(cmd, shell=True) ps1c.append(p) - yield "语义token提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("语义token提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1c: p.wait() opt = ["item_name semantic_audio"] @@ -452,9 +443,9 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): with open(path_semantic, "w", encoding="utf8") as f: f.write("\n".join(opt) + "\n") ps1c=[] - yield "语义token提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("语义token提取进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的语义token提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的语义token提取任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1c(): global ps1c @@ -465,7 +456,7 @@ def close1c(): except: traceback.print_exc() ps1c=[] - return "已终止所有语义token进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有语义token进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} #####inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,cnhubert_base_dir,pretrained_s2G ps1abc=[] def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,ssl_pretrained_dir,pretrained_s2G_path): @@ -499,7 +490,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield "进度:1a-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("进度:1a-ing"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() opt = [] @@ -511,7 +502,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb with open(path_text, "w",encoding="utf8") as f: f.write("\n".join(opt) + "\n") - yield "进度:1a-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("进度:1a-done"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc=[] #############################1b config={ @@ -536,9 +527,9 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield "进度:1a-done, 1b-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("进度:1a-done, 1b-ing"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() - yield "进度:1a1b-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("进度:1a1b-done"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc=[] #############################1c path_semantic = "%s/6-name2semantic.tsv" % opt_dir @@ -565,7 +556,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield "进度:1a1b-done, 1cing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("进度:1a1b-done, 1cing"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() opt = ["item_name semantic_audio"] @@ -576,15 +567,15 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb os.remove(semantic_path) with open(path_semantic, "w",encoding="utf8") as f: f.write("\n".join(opt) + "\n") - yield "进度:all-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("进度:all-done"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc = [] - yield "一键三连进程结束", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + yield i18n("一键三连进程结束"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} except: traceback.print_exc() close1abc() - yield "一键三连中途报错", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + yield i18n("一键三连中途报错"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} else: - yield "已有正在进行的一键三连任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的一键三连任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1abc(): global ps1abc @@ -595,12 +586,13 @@ def close1abc(): except: traceback.print_exc() ps1abc=[] - return "已终止所有一键三连进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有一键三连进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} with gr.Blocks(title="GPT-SoVITS WebUI") as app: gr.Markdown( - value= + value=i18n( i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.") + ) ) with gr.Tabs(): with gr.TabItem(i18n("0-前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标 @@ -650,7 +642,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: 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]) - with gr.TabItem(i18n("1-GPT-SoVITS-TTS")): + with gr.TabItem("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) @@ -665,9 +657,9 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: label=i18n("*训练集音频文件目录"), # value=r"D:\RVC1006\GPT-SoVITS\raw\xxx", interactive=True, - placeholder=i18n("训练集音频文件目录-拼接-list文件里波形对应的文件名(不是全路径)。") + placeholder=i18n("训练集音频文件目录 拼接 list文件里波形对应的文件名。") ) - gr.Markdown(value=i18n("1Aa-文本内容")) + gr.Markdown(value="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) @@ -705,7 +697,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: 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=20,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) + text_low_lr_rate = gr.Slider(minimum=0.2,maximum=0.6,step=0.05,label="文本模块学习率权重",value=0.4,interactive=True) save_every_epoch = gr.Slider(minimum=1,maximum=50,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) @@ -746,7 +738,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: app.queue(concurrency_count=511, max_size=1022).launch( server_name="0.0.0.0", inbrowser=True, - share=is_share, + share=True, server_port=webui_port_main, quiet=True, ) From 191f27f699f53d6f27e1f6f74c2f36371730b773 Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Mon, 22 Jan 2024 20:24:45 +0800 Subject: [PATCH 03/36] Add files via upload --- i18n/locale/en_US.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/locale/en_US.json b/i18n/locale/en_US.json index 160f1034..b7ea99ad 100644 --- a/i18n/locale/en_US.json +++ b/i18n/locale/en_US.json @@ -3,7 +3,7 @@ "UVR5已开启": "UVR5 opened ", "UVR5已关闭": "UVR5 closed", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "This software is open source under the MIT license. The author does not have any control over the software. Users who use the software and distribute the sounds exported by the software are solely responsible.
If you do not agree with this clause, you cannot use or reference any codes and files within the software package. See the root directory Agreement-LICENSE.txt for details.", - "0-前置数据集获取工具": "0-Fech dataset", + "0-前置数据集获取工具": "0-Fetch dataset", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 webui (for vocal separation, deecho, dereverb and denoise)", "是否开启UVR5-WebUI": "Open UVR5-WebUI", "UVR5进程输出信息": "UVR5 process output log", @@ -128,7 +128,7 @@ "已终止所有一键三连进程": "All one-clicking formatting tasks has been stopped", "已终止所有切割进程": "All audio slicing tasks has been stopped", "已终止所有语义token进程": "All semantics token tasks has been stopped", - "按中文句号。切": "按中文句号。切", + "按中文句号。切": "Slice by Chinese punct", "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Text slicer tool, since there will be issues when infering long texts, so it is advised to cut first. When infering, it will infer respectively then combined together.", "文本进程执行中": "Text processing", "文本进程结束": "Finished text processing", From 40603d00c2d37df2f170a1519e3e1a594a8702b4 Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Mon, 22 Jan 2024 20:25:13 +0800 Subject: [PATCH 04/36] Add files via upload --- tools/uvr5/webui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/uvr5/webui.py b/tools/uvr5/webui.py index 1ede1b4c..71e7ebcc 100644 --- a/tools/uvr5/webui.py +++ b/tools/uvr5/webui.py @@ -119,7 +119,7 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format with gr.Blocks(title="RVC WebUI") as app: gr.Markdown( value= - "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE." + i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.") ) with gr.Tabs(): with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")): @@ -144,7 +144,7 @@ with gr.Blocks(title="RVC WebUI") as app: minimum=0, maximum=20, step=1, - label="人声提取激进程度", + label=i18n("人声提取激进程度"), value=10, interactive=True, visible=False, # 先不开放调整 From 20e7be87c6d8a7a6375681f954048b80a2dcf889 Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Mon, 22 Jan 2024 20:35:46 +0800 Subject: [PATCH 05/36] Add files via upload --- webui.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/webui.py b/webui.py index e23353c4..4eaf901d 100644 --- a/webui.py +++ b/webui.py @@ -1,3 +1,6 @@ +import os,shutil,sys,pdb +now_dir = os.getcwd() +sys.path.append(now_dir) import json,yaml,warnings,torch import platform import psutil @@ -11,6 +14,12 @@ now_dir = os.getcwd() tmp = os.path.join(now_dir, "TEMP") os.makedirs(tmp, exist_ok=True) os.environ["TEMP"] = tmp +if(os.path.exists(tmp)): + for name in os.listdir(tmp): + if(name=="jieba.cache"):continue + path="%s/%s"%(tmp,name) + delete=os.remove if os.path.isfile(path) else shutil.rmtree + delete(path) import site site_packages_roots = [] for path in site.getsitepackages(): @@ -26,14 +35,14 @@ for site_packages_root in site_packages_roots: "%s\n%s/tools\n%s/tools/damo_asr\n%s/GPT_SoVITS\n%s/tools/uvr5" % (now_dir, now_dir, now_dir, now_dir, now_dir) ) +from tools import my_utils import traceback -sys.path.append(now_dir) import shutil 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 +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 i18n.i18n import I18nAuto i18n = I18nAuto() from scipy.io import wavfile @@ -119,7 +128,7 @@ def kill_process(pid): def change_label(if_label,path_list): global p_label if(if_label==True and p_label==None): - cmd = '"%s" tools/subfix_webui.py --load_list "%s" --webui_port %s'%(python_exec,path_list,webui_port_subfix) + cmd = '"%s" tools/subfix_webui.py --load_list "%s" --webui_port %s --is_share %s'%(python_exec,path_list,webui_port_subfix,is_share) yield i18n("打标工具WebUI已开启") print(cmd) p_label = Popen(cmd, shell=True) @@ -131,7 +140,7 @@ def change_label(if_label,path_list): def change_uvr5(if_uvr5): global p_uvr5 if(if_uvr5==True and p_uvr5==None): - cmd = '"%s" tools/uvr5/webui.py "%s" %s %s'%(python_exec,infer_device,is_half,webui_port_uvr5) + cmd = '"%s" tools/uvr5/webui.py "%s" %s %s %s'%(python_exec,infer_device,is_half,webui_port_uvr5,is_share) yield i18n("UVR5已开启") print(cmd) p_uvr5 = Popen(cmd, shell=True) @@ -150,6 +159,7 @@ def change_tts_inference(if_tts,bert_path,cnhubert_base_path,gpu_number,gpt_path os.environ["_CUDA_VISIBLE_DEVICES"]=gpu_number os.environ["is_half"]=str(is_half) os.environ["infer_ttswebui"]=str(webui_port_infer_tts) + os.environ["is_share"]=str(is_share) cmd = '"%s" GPT_SoVITS/inference_webui.py'%(python_exec) yield i18n("TTS推理进程已开启") print(cmd) @@ -267,6 +277,8 @@ def close1Bb(): ps_slice=[] def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts): global ps_slice + inp = my_utils.clean_path(inp) + opt_root = my_utils.clean_path(opt_root) if(os.path.exists(inp)==False): yield i18n("输入路径不存在"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} return @@ -588,11 +600,10 @@ def close1abc(): ps1abc=[] return i18n("已终止所有一键三连进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} -with gr.Blocks(title="GPT-SoVITS WebUI") as app: +with gr.Blocks(title=i18n("GPT-SoVITS WebUI")) as app: gr.Markdown( - value=i18n( + value= i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.") - ) ) with gr.Tabs(): with gr.TabItem(i18n("0-前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标 @@ -657,9 +668,9 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: label=i18n("*训练集音频文件目录"), # value=r"D:\RVC1006\GPT-SoVITS\raw\xxx", interactive=True, - placeholder=i18n("训练集音频文件目录 拼接 list文件里波形对应的文件名。") + placeholder=i18n("训练集音频文件目录-拼接-list文件里波形对应的文件名(不是全路径)。") ) - gr.Markdown(value="1Aa-文本内容") + 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) @@ -697,7 +708,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: 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=20,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="文本模块学习率权重",value=0.4,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=50,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) From 8deb526b5b5ff2e147fdfa4b546a46f63c42df2c Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Mon, 22 Jan 2024 20:40:44 +0800 Subject: [PATCH 06/36] update i18n --- webui.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/webui.py b/webui.py index 4eaf901d..ebd1dc7d 100644 --- a/webui.py +++ b/webui.py @@ -4,13 +4,10 @@ sys.path.append(now_dir) import json,yaml,warnings,torch import platform import psutil -import os import signal warnings.filterwarnings("ignore") torch.manual_seed(233333) -import os,pdb,sys -now_dir = os.getcwd() tmp = os.path.join(now_dir, "TEMP") os.makedirs(tmp, exist_ok=True) os.environ["TEMP"] = tmp @@ -43,7 +40,7 @@ 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 i18n.i18n import I18nAuto +from tools.i18n.i18n import I18nAuto i18n = I18nAuto() from scipy.io import wavfile from tools.my_utils import load_audio @@ -653,7 +650,7 @@ with gr.Blocks(title=i18n("GPT-SoVITS WebUI")) as app: 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]) - with gr.TabItem("1-GPT-SoVITS-TTS"): + with gr.TabItem(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) @@ -749,7 +746,7 @@ with gr.Blocks(title=i18n("GPT-SoVITS WebUI")) as app: app.queue(concurrency_count=511, max_size=1022).launch( server_name="0.0.0.0", inbrowser=True, - share=True, + share=is_share, server_port=webui_port_main, quiet=True, ) From e61136f144836f53f45a571fb76cf9a490906bef Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:52:04 +0800 Subject: [PATCH 07/36] Update my_utils.py --- tools/my_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/my_utils.py b/tools/my_utils.py index abb2a44f..ce619847 100644 --- a/tools/my_utils.py +++ b/tools/my_utils.py @@ -1,4 +1,4 @@ -import platform +import platform,os import ffmpeg import numpy as np From 38245a2baa533d75cfaf78682e2a831f3dd14605 Mon Sep 17 00:00:00 2001 From: Yuan-Man <68322456+Yuan-ManX@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:57:53 +0800 Subject: [PATCH 08/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 127aebff..7649d7ba 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ sudo apt-get install python3.9-distutils #### Pip Packages ```bash -pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers +pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers jieba ``` #### Additional Requirements From 1dba692448c55542a7e01e3c1ad615ec70f2fd60 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:52:48 +0800 Subject: [PATCH 09/36] Delete GPT_SoVITS/prepare_datasets/0-pipeline.py --- GPT_SoVITS/prepare_datasets/0-pipeline.py | 81 ----------------------- 1 file changed, 81 deletions(-) delete mode 100644 GPT_SoVITS/prepare_datasets/0-pipeline.py diff --git a/GPT_SoVITS/prepare_datasets/0-pipeline.py b/GPT_SoVITS/prepare_datasets/0-pipeline.py deleted file mode 100644 index 4979ed26..00000000 --- a/GPT_SoVITS/prepare_datasets/0-pipeline.py +++ /dev/null @@ -1,81 +0,0 @@ -import os, torch, sys -from subprocess import Popen - -now_dir = os.getcwd() -sys.path.append(now_dir) -from config import ( - text_path, - wav_dir, - n_card, - exp_name, - n_parts, - exp_dir, -) - -os.makedirs("%s/logs_s1" % exp_dir, exist_ok=True) -os.makedirs("%s/logs_s2" % exp_dir, exist_ok=True) -##############step1 -ps = [] -for i_part in range(n_parts): - cmd = "python prepare/1-get-text.py %s %s %s %s %s %s" % ( - text_path, - wav_dir, - exp_name, - i_part, - n_parts, - i_part % n_card, - ) - print(cmd) - p = Popen(cmd, shell=True) - ps.append(p) -for p in ps: - p.wait() - -opt = [] -for i_part in range(n_parts): - txt_path = "%s/2-name2text-%s.txt" % (exp_dir, i_part) - with open(txt_path, "r") as f: - opt += f.read().strip("\n").split("\n") - os.remove(txt_path) -with open("%s/2-name2text.txt" % exp_dir, "w") as f: - f.write("\n".join(opt) + "\n") - -############step2 -ps = [] -for i_part in range(n_parts): - cmd = "python prepare/2-get-hubert-wav32k.py %s %s %s %s %s %s" % ( - text_path, - wav_dir, - exp_name, - i_part, - n_parts, - i_part % n_card, - ) - print(cmd) - p = Popen(cmd, shell=True) - ps.append(p) -for p in ps: - p.wait() -#############step3 -ps = [] -for i_part in range(n_parts): - cmd = "python prepare/3-get-semantic.py %s %s %s %s %s" % ( - text_path, - exp_name, - i_part, - n_parts, - i_part % n_card, - ) - print(cmd) - p = Popen(cmd, shell=True) - ps.append(p) -for p in ps: - p.wait() -opt = ["item_name semantic_audio"] -for i_part in range(n_parts): - semantic_path = "%s/6-name2semantic-%s.tsv" % (exp_dir, i_part) - with open(semantic_path, "r") as f: - opt += f.read().strip("\n").split("\n") - os.remove(semantic_path) -with open("%s/6-name2semantic.tsv" % exp_dir, "w") as f: - f.write("\n".join(opt) + "\n") From 65ee0385363ee19e1751b75c6e52cbd61c076836 Mon Sep 17 00:00:00 2001 From: koji Date: Mon, 22 Jan 2024 09:34:47 -0500 Subject: [PATCH 10/36] fix typo in jp doc --- docs/ja/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ja/README.md b/docs/ja/README.md index 1e7eebf7..d58d0901 100644 --- a/docs/ja/README.md +++ b/docs/ja/README.md @@ -24,7 +24,7 @@ https://github.com/RVC-Boss/GPT-SoVITS/assets/129054828/05bee1fa-bdd8-4d85-9350-80c060ab47fb ## 機能: -1. **セロショット TTS:** 5秒間のボーカルサンプルを入力すると、即座にテキストから音声に変換されます。 +1. **ゼロショット TTS:** 5秒間のボーカルサンプルを入力すると、即座にテキストから音声に変換されます。 2. **数ショット TTS:** わずか1分間のトレーニングデータでモデルを微調整し、音声の類似性とリアリズムを向上。 From c1a24ad37079252da7a9ee1e87038ef285bf8fac Mon Sep 17 00:00:00 2001 From: Shouta Yoshikai Date: Tue, 23 Jan 2024 00:10:39 +0900 Subject: [PATCH 11/36] update ja_JP.json update webui.py for i18n --- i18n/locale/ja_JP.json | 159 ++++++++++++++++++++++++++++++++++++++++- tools/uvr5/webui.py | 2 +- webui.py | 82 ++++++++++----------- 3 files changed, 198 insertions(+), 45 deletions(-) diff --git a/i18n/locale/ja_JP.json b/i18n/locale/ja_JP.json index c5b33ff2..03143d12 100644 --- a/i18n/locale/ja_JP.json +++ b/i18n/locale/ja_JP.json @@ -111,12 +111,12 @@ "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "処理対象音声フォルダーのパスを入力してください(エクスプローラーのアドレスバーからコピーしてください)", "输入待处理音频文件路径(默认是正确格式示例)": "処理対象音声ファイルのパスを入力してください(デフォルトは正しいフォーマットの例です)", "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "入力ソースの音量エンベロープと出力音量エンベロープの融合率 1に近づくほど、出力音量エンベロープの割合が高くなる", - "输入监听": "输入监听", + "输入监听": "入力を監視", "输入训练文件夹路径": "トレーニング用フォルダのパスを入力してください", "输入设备": "入力デバイス", "输入降噪": "入力ノイズの低減", "输出信息": "出力情報", - "输出变声": "输出变声", + "输出变声": "音声変換の出力", "输出设备": "出力デバイス", "输出降噪": "出力ノイズの低減", "输出音频(右下角三个点,点了可以下载)": "出力音声(右下の三点をクリックしてダウンロードできます)", @@ -131,5 +131,158 @@ "音调设置": "音程設定", "音频设备(请使用同种类驱动)": "オーディオデバイス(同じ種類のドライバーを使用してください)", "音高算法": "ピッチアルゴリズム", - "额外推理时长": "追加推論時間" + "额外推理时长": "追加推論時間", + "打标工具WebUI已开启": "ラベリングツールWebUIが開始されました", + "打标工具WebUI已关闭": "ラベリングツールWebUIが終了しました", + "UVR5已开启": "UVR5が開始されました", + "UVR5已关闭": "UVR5が終了しました", + "TTS推理进程已开启": "TTS推論プロセスが開始されました", + "TTS推理进程已关闭": "TTS推理プロセスが終了しました", + "ASR任务开启": "ASRタスクが開始されました", + "ASR任务完成": "ASRタスクが完了しました", + "已有正在进行的ASR任务,需先终止才能开启下一次任务": "既に進行中のASRタスクがあります。新たなタスクを開始する前に終了させてください", + "已终止ASR进程": "ASRプロセスが終了しました", + "SoVITS训练开始": "SoVITSのトレーニングが開始されました", + "SoVITS训练完成": "SoVITSのトレーニングが完了しました", + "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务": "既に進行中のSoVITSのトレーニングタスクがあります。新たなタスクを開始する前に終了させてください", + "已终止SoVITS训练": "SoVITSのトレーニングが終了しました", + "GPT训练开始": "GPTトレーニング開始", + "GPT训练完成": "GPTトレーニング完了", + "已有正在进行的GPT训练任务,需先终止才能开启下一次任务": "既に進行中のGPTトレーニングタスクがあります。新たなタスクを開始する前に終了させてください", + "已终止GPT训练": "GPTトレーニングが終了しました", + "切割执行中": "カット中", + "切割结束": "カット終了", + "已有正在进行的切割任务,需先终止才能开启下一次任务": "既に進行中のカットタスクがあります。新たなタスクを開始する前に終了させてください", + "已终止所有切割进程": "すべてのカットプロセスが終了しました", + "文本进程执行中": "テキストプロセス実行中", + "文本进程结束": "テキストプロセス終了", + "已有正在进行的文本任务,需先终止才能开启下一次任务": "既に進行中のテキストタスクがあります。新たなタスクを開始する前に終了させてください", + "已终止所有文本进程": "すべてのテキストプロセスが終了しました", + "SSL提取进程执行中": "SSL抽出プロセス実行中", + "SSL提取进程结束": "SSL抽出プロセス終了", + "已有正在进行的SSL提取任务,需先终止才能开启下一次任务": "既に進行中のSSL抽出タスクがあります。新たなタスクを開始する前に終了させてください", + "已终止所有1b进程": "すべての1bプロセスが終了しました", + "语义token提取进程执行中": "意味トークン抽出プロセス実行中", + "语义token提取进程结束": "意味トークン抽出プロセス終了", + "已有正在进行的语义token提取任务,需先终止才能开启下一次任务": "既に進行中の意味トークン抽出タスクがあります。新たなタスクを開始する前に終了させてください", + "已终止所有语义token进程": "すべての意味トークンプロセスが終了しました", + "语义token提取进程已开始": "意味トークン抽出プロセスが開始されました", + "语义token提取进程已结束": "意味トークン抽出プロセスが終了しました", + "语义token提取进程已终止": "意味トークン抽出プロセスが終了しました", + "语义token提取进程正在进行中": "意味トークン抽出プロセスが進行中です", + "语义token提取任务已完成": "意味トークン抽出タスクが完了しました", + "语义token提取任务正在进行中": "意味トークン抽出タスクが進行中です", + "语义token提取任务已开始": "意味トークン抽出タスクが開始されました", + "语义token提取任务已终止": "意味トークン抽出タスクが終了しました", + "ワンクリックで三つのプロセスを開始": "ワンクリックで三つのプロセスを開始します", + "ワンクリックで三つのプロセスを終了": "ワンクリックで三つのプロセスを終了します", + "ワンクリックで三つのプロセスを中止": "ワンクリックで三つのプロセスを中止します", + "ワンクリックで三つのプロセスが進行中": "ワンクリックで三つのプロセスが進行中です", + "ワンクリックで三つのタスクが完了": "ワンクリックで三つのタスクが完了しました", + "ワンクリックで三つのタスクが進行中": "ワンクリックで三つのタスクが進行中です", + "ワンクリックで三つのタスクを開始": "ワンクリックで三つのタスクを開始します", + "ワンクリックで三つのタスクを中止": "ワンクリックで三つのタスクを中止します", + "0-前置数据集获取工具": "0-前置データセット取得ツール", + "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5ボーカル伴奏分離&リバーブディレイ除去ツール", + "是否开启UVR5-WebUI": "UVR5-WebUIを開始しますか", + "UVR5进程输出信息": "UVR5プロセス出力情報", + "0b-语音切分工具": "0b-音声切断ツール", + "音频自动切分输入路径,可文件可文件夹": "オーディオ自動切断入力パス、ファイルまたはフォルダー可", + "切分后的子音频的输出根目录": "切断後のサブオーディオの出力ルートディレクトリ", + "threshold:音量小于这个值视作静音的备选切割点": "threshold:音量がこの値より小さい場合は、サイレントと見なされる代替切断点", + "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:各セクションの最小長さ、最初のセクションが短すぎる場合は、この値を超えるまで後続のセクションと連続しています", + "min_interval:最短切割间隔": "min_interval:最短切断間隔", + "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:音量曲線の計算方法、小さいほど精度が高く計算量が多くなります(精度が高いほど効果が良いとは限りません)", + "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切断後のサイレントの最大保持長", + "开启语音切割": "音声切断を開始", + "终止语音切割": "音声切断を終了", + "max:归一化后最大值多少": "max:正規化後の最大値", + "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:どの程度の割合で正規化後のオーディオを混合するか", + "切割使用的进程数": "切断に使用されるプロセス数", + "语音切割进程输出信息": "音声切断プロセス出力情報", + "0c-中文批量离线ASR工具": "0c-中国語バッチオフラインASRツール", + "开启离线批量ASR": "オフラインバッチASRを開始", + "终止ASR进程": "ASRプロセスを終了", + "批量ASR(中文only)输入文件夹路径": "バッチASR(中国語のみ)入力フォルダパス", + "ASR进程输出信息": "ASRプロセス出力情報", + "0d-语音文本校对标注工具": "0d-音声テキスト校正アノテーションツール", + "是否开启打标WebUI": "ラベリングWebUIを開始しますか", + "打标数据标注文件路径": "ラベリングデータアノテーションファイルパス", + "打标工具进程输出信息": "ラベリングツールプロセス出力情報", + "文本进程结束, SSL提取进程执行中": "テキストプロセス終了、SSL抽出プロセス実行中", + "文本进程结束, SSL提取进程结束": "テキストプロセス終了、SSL抽出プロセス終了", + "一键三连进程执行中": "ワンクリック三連プロセス実行中", + "一键三连进程结束": "ワンクリック三連プロセス終了", + "SoVITS训练进程执行中": "SoVITS訓練プロセス実行中", + "SoVITS训练进程结束": "SoVITS訓練プロセス終了", + "GPT训练进程执行中": "GPT訓練プロセス実行中", + "GPT训练进程结束": "GPT訓練プロセス終了", + "推理进程执行中": "推論プロセス実行中", + "推理进程结束": "推論プロセス終了", + "预训练的SoVITS-G模型路径": "事前学習済みのSoVITS-Gモデルのパス", + "预训练的SoVITS-D模型路径": "事前学習済みのSoVITS-Dモデルのパス", + "预训练的GPT模型路径": "事前学習済みのGPTモデルのパス", + "GPU卡号以-分割,每个卡号一个进程": "GPUカード番号は-で区切り、各カード番号に1つのプロセス", + "预训练的中文BERT模型路径": "事前学習済みの中国語BERTモデルのパス", + "开启文本获取": "テキスト取得を開始", + "终止文本获取进程": "テキスト取得プロセスを終了", + "文本进程输出信息": "テキストプロセス出力情報", + "预训练的SSL模型路径": "事前学習済みのSSLモデルのパス", + "开启SSL提取": "SSL抽出を開始", + "终止SSL提取进程": "SSL抽出プロセスを終了", + "SSL进程输出信息": "SSLプロセス出力情報", + "开启语义token提取": "セマンティックトークン抽出を開始", + "终止语义token提取进程": "セマンティックトークン抽出プロセスを終了", + "语义token提取进程输出信息": "セマンティックトークン抽出プロセス出力情報", + "开启一键三连": "ワンクリック三連を開始", + "终止一键三连": "ワンクリック三連を終了", + "一键三连进程输出信息": "ワンクリック三連プロセス出力情報", + "1A-訓練集格式化工具": "1A-トレーニングセットフォーマットツール", + "输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/実験名ディレクトリには、23456で始まるファイルとフォルダが存在する必要があります", + "*文本标注文件": "*テキストアノテーションファイル", + "*训练集音频文件目录": "*トレーニングセットオーディオファイルディレクトリ", + "训练集音频文件目录-拼接-list文件里波形对应的文件名(不是全路径)。": "トレーニングセットオーディオファイルディレクトリ-結合-listファイル内の波形に対応するファイル名(フルパスではありません)。", + "1Aa-文本内容": "1Aa-テキスト内容", + "1Ac-语义token提取": "1Ac-セマンティックトークン抽出", + "1Aabc-训练集格式化一键三连": "1Aabc-トレーニングセットフォーマットワンクリック三連", + "1B-微调训练": "1B-微調整訓練", + "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。共有モデルファイルはSoVITS_weightsに出力されます。", + "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。共有モデルファイルはGPT_weightsに出力されます。", + "1C-推理": "1C-推論", + "2-GPT-SoVITS-变声": "2-GPT-SoVITS-ボイスチェンジ", + "开启SoVITS训练": "SoVITS訓練を開始", + "终止SoVITS训练": "SoVITS訓練を終了", + "SoVITS训练进程输出信息": "SoVITS訓練プロセス出力情報", + "开启GPT训练": "GPT訓練を開始", + "终止GPT训练": "GPT訓練を終了", + "GPT训练进程输出信息": "GPT訓練プロセス出力情報", + "是否开启TTS推理WebUI": "TTS推理WebUIを開始しますか", + "TTS推理WebUI进程输出信息": "TTS推理WebUIプロセス出力情報", + "施工中,请静候佳音": "工事中、お待ちください", + "*实验/模型名": "実験/モデル名", + "1A-训练集格式化工具": "1A-トレーニングセットフォーマットツール", + "1Ab-SSL自监督特征提取": "1Ab-SSL自己監督による特徴抽出", + "总训练轮数total_epoch,不建议太高": "トータルトレーニングラウンド数total_epoch、あまり高く設定しないことをお勧めします", + "文本模块学习率权重": "テキストモジュールの学習率の重み", + "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "SoVITS_weightsとGPT_weightsに保存された訓練済みモデルを選択します。デフォルトの1つはベースモデルで、5秒間のZero Shot TTSを体験するために使用されます。", + "*GPT模型列表": "*GPTモデルリスト", + "*SoVITS模型列表": "*SoVITSモデルリスト", + "GPU卡号,只能填1个整数": "GPUカード番号、整数のみ入力可能", + "刷新模型路径": "モデルパスを更新", + "*请上传并填写参考信息": "*参考情報をアップロードして記入してください", + "请上传参考音频": "*参考音声をアップロードしてください", + "参考音频的文本": "*参考音声のテキスト", + "参考音频的语种": "参考音声の言語", + "*请填写需要合成的目标文本": "*合成する目標テキストを入力してください", + "需要合成的文本": "*合成するテキスト", + "需要合成的语种": "*合成する言語", + "合成语音": "音声合成", + "输出的语音": "*出力音声", + "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "テキスト分割ツール。長すぎるテキストを合成すると結果が必ずしも良くない可能性があるため、長すぎる場合は先に切ることをお勧めします。合成はテキストの改行に基づいて分割してから再結合します。", + "需要合成的切分前文本": "合成する前の分割テキストが必要", + "凑五句一切": "五文を一つにまとめる", + "凑50字一切": "50文字を一つにまとめる", + "按中文句号。切": "中国語の句点で切る。", + "切分后文本": "分割後のテキスト", + "后续将支持混合语种编码文本输入。": "今後、混合言語エンコードテキストの入力をサポートします。" } diff --git a/tools/uvr5/webui.py b/tools/uvr5/webui.py index 1ede1b4c..17603e0e 100644 --- a/tools/uvr5/webui.py +++ b/tools/uvr5/webui.py @@ -119,7 +119,7 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format with gr.Blocks(title="RVC WebUI") as app: gr.Markdown( value= - "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE." + i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.") ) with gr.Tabs(): with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")): diff --git a/webui.py b/webui.py index 60c6e1b6..386cfa06 100644 --- a/webui.py +++ b/webui.py @@ -171,21 +171,21 @@ def open_asr(asr_inp_dir): global p_asr if(p_asr==None): cmd = '"%s" tools/damo_asr/cmd-asr.py "%s"'%(python_exec,asr_inp_dir) - yield "ASR任务开启:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield f"{i18n('ASR任务开启')}:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_asr = Popen(cmd, shell=True) p_asr.wait() p_asr=None - yield "ASR任务完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("ASR任务完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的ASR任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield f"{i18n('已有正在进行的ASR任务,需先终止才能开启下一次任务')}",{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close_asr(): global p_asr if(p_asr!=None): kill_process(p_asr.pid) p_asr=None - return "已终止ASR进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return i18n("已终止ASR进程"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} p_train_SoVITS=None def 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): @@ -212,21 +212,21 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s with open(tmp_config_path,"w")as f:f.write(json.dumps(data)) cmd = '"%s" GPT_SoVITS/s2_train.py --config "%s"'%(python_exec,tmp_config_path) - yield "SoVITS训练开始:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("SoVITS训练开始:%s"%cmd),{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_train_SoVITS = Popen(cmd, shell=True) p_train_SoVITS.wait() p_train_SoVITS=None - yield "SoVITS训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("SoVITS训练完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield f"{i18n('已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务')}",{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close1Ba(): global p_train_SoVITS if(p_train_SoVITS!=None): kill_process(p_train_SoVITS.pid) p_train_SoVITS=None - return "已终止SoVITS训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return i18n("已终止SoVITS训练"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} p_train_GPT=None def open1Bb(batch_size,total_epoch,exp_name,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers,pretrained_s1): @@ -255,21 +255,21 @@ def open1Bb(batch_size,total_epoch,exp_name,if_save_latest,if_save_every_weights with open(tmp_config_path, "w") as f:f.write(yaml.dump(data, default_flow_style=False)) # cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" --train_semantic_path "%s/6-name2semantic.tsv" --train_phoneme_path "%s/2-name2text.txt" --output_dir "%s/logs_s1"'%(python_exec,tmp_config_path,s1_dir,s1_dir,s1_dir) cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" '%(python_exec,tmp_config_path) - yield "GPT训练开始:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield f"{i18n('GPT训练开始')}:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_train_GPT = Popen(cmd, shell=True) p_train_GPT.wait() p_train_GPT=None - yield "GPT训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("GPT训练完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的GPT训练任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield i18n("已有正在进行的GPT训练任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close1Bb(): global p_train_GPT if(p_train_GPT!=None): kill_process(p_train_GPT.pid) p_train_GPT=None - return "已终止GPT训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return i18n("已终止GPT训练"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} ps_slice=[] def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts): @@ -277,12 +277,12 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k inp = my_utils.clean_path(inp) opt_root = my_utils.clean_path(opt_root) if(os.path.exists(inp)==False): - yield "输入路径不存在",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("输入路径不存在"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} return if os.path.isfile(inp):n_parts=1 elif os.path.isdir(inp):pass else: - yield "输入路径存在但既不是文件也不是文件夹",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("输入路径存在但既不是文件也不是文件夹"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} return if (ps_slice == []): for i_part in range(n_parts): @@ -290,13 +290,13 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k print(cmd) p = Popen(cmd, shell=True) ps_slice.append(p) - yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("切割执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps_slice: p.wait() ps_slice=[] - yield "切割结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("切割结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的切割任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close_slice(): global ps_slice @@ -307,7 +307,7 @@ def close_slice(): except: traceback.print_exc() ps_slice=[] - return "已终止所有切割进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有切割进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1a=[] def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): @@ -337,7 +337,7 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): print(cmd) p = Popen(cmd, shell=True) ps1a.append(p) - yield "文本进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("文本进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1a: p.wait() opt = [] @@ -350,9 +350,9 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): with open(path_text, "w", encoding="utf8") as f: f.write("\n".join(opt) + "\n") ps1a=[] - yield "文本进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("文本进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的文本任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的文本任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1a(): global ps1a @@ -363,7 +363,7 @@ def close1a(): except: traceback.print_exc() ps1a=[] - return "已终止所有1a进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有文本进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1b=[] def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir): @@ -392,13 +392,13 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir): print(cmd) p = Popen(cmd, shell=True) ps1b.append(p) - yield "SSL提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("SSL提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1b: p.wait() ps1b=[] - yield "SSL提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("SSL提取进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的SSL提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的SSL提取任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1b(): global ps1b @@ -409,7 +409,7 @@ def close1b(): except: traceback.print_exc() ps1b=[] - return "已终止所有1b进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有1b进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1c=[] def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): @@ -439,7 +439,7 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): print(cmd) p = Popen(cmd, shell=True) ps1c.append(p) - yield "语义token提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("语义token提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1c: p.wait() opt = ["item_name semantic_audio"] @@ -452,9 +452,9 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): with open(path_semantic, "w", encoding="utf8") as f: f.write("\n".join(opt) + "\n") ps1c=[] - yield "语义token提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield i18n("语义token提取进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield "已有正在进行的语义token提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的语义token提取任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1c(): global ps1c @@ -465,7 +465,7 @@ def close1c(): except: traceback.print_exc() ps1c=[] - return "已终止所有语义token进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有语义token进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} #####inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,cnhubert_base_dir,pretrained_s2G ps1abc=[] def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,ssl_pretrained_dir,pretrained_s2G_path): @@ -499,11 +499,11 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield "进度:1a-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("文本进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() opt = [] - for i_part in range(all_parts):#txt_path="%s/2-name2text-%s.txt"%(opt_dir,i_part) + for i_part in range(all_parts): txt_path = "%s/2-name2text-%s.txt" % (opt_dir, i_part) with open(txt_path, "r",encoding="utf8") as f: opt += f.read().strip("\n").split("\n") @@ -511,7 +511,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb with open(path_text, "w",encoding="utf8") as f: f.write("\n".join(opt) + "\n") - yield "进度:1a-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("文本进程结束"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc=[] #############################1b config={ @@ -536,9 +536,9 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield "进度:1a-done, 1b-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("文本进程结束, SSL提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() - yield "进度:1a1b-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("文本进程结束, SSL提取进程结束"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc=[] #############################1c path_semantic = "%s/6-name2semantic.tsv" % opt_dir @@ -565,7 +565,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield "进度:1a1b-done, 1cing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("SSL提取进程结束, 语义token提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() opt = ["item_name semantic_audio"] @@ -576,15 +576,15 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb os.remove(semantic_path) with open(path_semantic, "w",encoding="utf8") as f: f.write("\n".join(opt) + "\n") - yield "进度:all-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("语义token提取进程结束"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc = [] - yield "一键三连进程结束", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + yield i18n("一键三连进程结束"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} except: traceback.print_exc() close1abc() - yield "一键三连中途报错", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + yield i18n("一键三连中途报错"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} else: - yield "已有正在进行的一键三连任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield i18n("已有正在进行的一键三连任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1abc(): global ps1abc @@ -595,7 +595,7 @@ def close1abc(): except: traceback.print_exc() ps1abc=[] - return "已终止所有一键三连进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return i18n("已终止所有一键三连进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} with gr.Blocks(title="GPT-SoVITS WebUI") as app: gr.Markdown( From 34b4e02092566ef1c7b56d88b5efb29503c16073 Mon Sep 17 00:00:00 2001 From: Yuan-Man <68322456+Yuan-ManX@users.noreply.github.com> Date: Mon, 22 Jan 2024 23:19:09 +0800 Subject: [PATCH 12/36] Update README.md --- docs/cn/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/README.md b/docs/cn/README.md index 4c7f530e..27c56689 100644 --- a/docs/cn/README.md +++ b/docs/cn/README.md @@ -51,7 +51,7 @@ bash install.sh #### Pip包 ```bash -pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet +pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers ``` #### 额外要求 From 9e56f2b6b0d4c30c27416ae48ac4487b33733ef8 Mon Sep 17 00:00:00 2001 From: Yuan-Man <68322456+Yuan-ManX@users.noreply.github.com> Date: Mon, 22 Jan 2024 23:22:03 +0800 Subject: [PATCH 13/36] Update README.md --- docs/ja/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ja/README.md b/docs/ja/README.md index 1e7eebf7..34c673b8 100644 --- a/docs/ja/README.md +++ b/docs/ja/README.md @@ -57,7 +57,7 @@ sudo apt-get install python3.9-distutils #### Pip パッケージ ```bash -pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet +pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers ``` #### 追加要件 From 872134c846bcb8f1909a3f5aff68a6aa67643f68 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Mon, 22 Jan 2024 23:26:18 +0800 Subject: [PATCH 14/36] Update t2s_model.py --- GPT_SoVITS/AR/models/t2s_model.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GPT_SoVITS/AR/models/t2s_model.py b/GPT_SoVITS/AR/models/t2s_model.py index 9f8330b1..083dc099 100644 --- a/GPT_SoVITS/AR/models/t2s_model.py +++ b/GPT_SoVITS/AR/models/t2s_model.py @@ -302,6 +302,8 @@ class Text2SemanticDecoder(nn.Module): xy_dec[:, -1] ) ##不用改,如果用了cache的默认就是只有一帧,取最后一帧一样的 # samples = topk_sampling(logits, top_k=top_k, top_p=1.0, temperature=temperature) + if(idx==0):###第一次跑不能EOS否则没有了 + logits = logits[:, :-1] ###刨除1024终止符号的概率 samples = sample( logits[0], y, top_k=top_k, top_p=1.0, repetition_penalty=1.35 )[0].unsqueeze(0) From 7bd33f9c8b8892497ec642f1297f9139c2bca107 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Mon, 22 Jan 2024 23:42:33 +0800 Subject: [PATCH 15/36] Add files via upload --- webui.py | 94 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/webui.py b/webui.py index ebd1dc7d..15202267 100644 --- a/webui.py +++ b/webui.py @@ -171,21 +171,21 @@ def open_asr(asr_inp_dir): global p_asr if(p_asr==None): cmd = '"%s" tools/damo_asr/cmd-asr.py "%s"'%(python_exec,asr_inp_dir) - yield i18n("ASR任务开启:%s")%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield "ASR任务开启:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_asr = Popen(cmd, shell=True) p_asr.wait() p_asr=None - yield i18n("ASR任务完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "ASR任务完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的ASR任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield "已有正在进行的ASR任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close_asr(): global p_asr if(p_asr!=None): kill_process(p_asr.pid) p_asr=None - return i18n("已终止ASR进程"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return "已终止ASR进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False} p_train_SoVITS=None def 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): @@ -212,21 +212,21 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s with open(tmp_config_path,"w")as f:f.write(json.dumps(data)) cmd = '"%s" GPT_SoVITS/s2_train.py --config "%s"'%(python_exec,tmp_config_path) - yield i18n("SoVITS训练开始:%s")%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield "SoVITS训练开始:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_train_SoVITS = Popen(cmd, shell=True) p_train_SoVITS.wait() p_train_SoVITS=None - yield i18n("SoVITS训练完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "SoVITS训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close1Ba(): global p_train_SoVITS if(p_train_SoVITS!=None): kill_process(p_train_SoVITS.pid) p_train_SoVITS=None - return i18n("已终止SoVITS训练"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return "已终止SoVITS训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} p_train_GPT=None def open1Bb(batch_size,total_epoch,exp_name,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers,pretrained_s1): @@ -255,21 +255,21 @@ def open1Bb(batch_size,total_epoch,exp_name,if_save_latest,if_save_every_weights with open(tmp_config_path, "w") as f:f.write(yaml.dump(data, default_flow_style=False)) # cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" --train_semantic_path "%s/6-name2semantic.tsv" --train_phoneme_path "%s/2-name2text.txt" --output_dir "%s/logs_s1"'%(python_exec,tmp_config_path,s1_dir,s1_dir,s1_dir) cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" '%(python_exec,tmp_config_path) - yield i18n("GPT训练开始:%s")%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield "GPT训练开始:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} print(cmd) p_train_GPT = Popen(cmd, shell=True) p_train_GPT.wait() p_train_GPT=None - yield i18n("GPT训练完成"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "GPT训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的GPT训练任务,需先终止才能开启下一次任务"),{"__type__":"update","visible":False},{"__type__":"update","visible":True} + yield "已有正在进行的GPT训练任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} def close1Bb(): global p_train_GPT if(p_train_GPT!=None): kill_process(p_train_GPT.pid) p_train_GPT=None - return i18n("已终止GPT训练"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + return "已终止GPT训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} ps_slice=[] def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts): @@ -277,12 +277,12 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k inp = my_utils.clean_path(inp) opt_root = my_utils.clean_path(opt_root) if(os.path.exists(inp)==False): - yield i18n("输入路径不存在"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "输入路径不存在",{"__type__":"update","visible":True},{"__type__":"update","visible":False} return if os.path.isfile(inp):n_parts=1 elif os.path.isdir(inp):pass else: - yield i18n("输入路径存在但既不是文件也不是文件夹"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "输入路径存在但既不是文件也不是文件夹",{"__type__":"update","visible":True},{"__type__":"update","visible":False} return if (ps_slice == []): for i_part in range(n_parts): @@ -290,13 +290,13 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k print(cmd) p = Popen(cmd, shell=True) ps_slice.append(p) - yield i18n("切割执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps_slice: p.wait() ps_slice=[] - yield i18n("切割结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "切割结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的切割任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close_slice(): global ps_slice @@ -307,7 +307,7 @@ def close_slice(): except: traceback.print_exc() ps_slice=[] - return i18n("已终止所有切割进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return "已终止所有切割进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1a=[] def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): @@ -337,7 +337,7 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): print(cmd) p = Popen(cmd, shell=True) ps1a.append(p) - yield i18n("文本进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "文本进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1a: p.wait() opt = [] @@ -350,9 +350,9 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir): with open(path_text, "w", encoding="utf8") as f: f.write("\n".join(opt) + "\n") ps1a=[] - yield i18n("文本进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "文本进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的文本任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "已有正在进行的文本任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1a(): global ps1a @@ -363,7 +363,7 @@ def close1a(): except: traceback.print_exc() ps1a=[] - return i18n("已终止所有1a进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return "已终止所有1a进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1b=[] def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir): @@ -392,13 +392,13 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir): print(cmd) p = Popen(cmd, shell=True) ps1b.append(p) - yield i18n("SSL提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "SSL提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1b: p.wait() ps1b=[] - yield i18n("SSL提取进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "SSL提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的SSL提取任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "已有正在进行的SSL提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1b(): global ps1b @@ -409,7 +409,7 @@ def close1b(): except: traceback.print_exc() ps1b=[] - return i18n("已终止所有1b进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return "已终止所有1b进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} ps1c=[] def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): @@ -439,10 +439,10 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): print(cmd) p = Popen(cmd, shell=True) ps1c.append(p) - yield i18n("语义token提取进程执行中"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "语义token提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1c: p.wait() - opt = ["item_name semantic_audio"] + opt = ["item_name\tsemantic_audio"] path_semantic = "%s/6-name2semantic.tsv" % opt_dir for i_part in range(all_parts): semantic_path = "%s/6-name2semantic-%s.tsv" % (opt_dir, i_part) @@ -452,9 +452,9 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): with open(path_semantic, "w", encoding="utf8") as f: f.write("\n".join(opt) + "\n") ps1c=[] - yield i18n("语义token提取进程结束"),{"__type__":"update","visible":True},{"__type__":"update","visible":False} + yield "语义token提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} else: - yield i18n("已有正在进行的语义token提取任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "已有正在进行的语义token提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1c(): global ps1c @@ -465,7 +465,7 @@ def close1c(): except: traceback.print_exc() ps1c=[] - return i18n("已终止所有语义token进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return "已终止所有语义token进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} #####inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,cnhubert_base_dir,pretrained_s2G ps1abc=[] def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,ssl_pretrained_dir,pretrained_s2G_path): @@ -475,7 +475,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb try: #############################1a path_text="%s/2-name2text.txt" % opt_dir - if(os.path.exists(path_text)==False or (os.path.exists(path_text)==True and os.path.getsize(path_text)<10)): + if(os.path.exists(path_text)==False or (os.path.exists(path_text)==True and len(open(path_text,"r",encoding="utf8").read().strip("\n").split("\n"))<2)): config={ "inp_text":inp_text, "inp_wav_dir":inp_wav_dir, @@ -499,7 +499,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield i18n("进度:1a-ing"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "进度:1a-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() opt = [] @@ -511,7 +511,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb with open(path_text, "w",encoding="utf8") as f: f.write("\n".join(opt) + "\n") - yield i18n("进度:1a-done"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "进度:1a-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc=[] #############################1b config={ @@ -536,9 +536,9 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield i18n("进度:1a-done, 1b-ing"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "进度:1a-done, 1b-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() - yield i18n("进度:1a1b-done"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "进度:1a1b-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc=[] #############################1c path_semantic = "%s/6-name2semantic.tsv" % opt_dir @@ -565,10 +565,10 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb print(cmd) p = Popen(cmd, shell=True) ps1abc.append(p) - yield i18n("进度:1a1b-done, 1cing"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "进度:1a1b-done, 1cing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} for p in ps1abc:p.wait() - opt = ["item_name semantic_audio"] + opt = ["item_name\tsemantic_audio"] for i_part in range(all_parts): semantic_path = "%s/6-name2semantic-%s.tsv" % (opt_dir, i_part) with open(semantic_path, "r",encoding="utf8") as f: @@ -576,15 +576,15 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb os.remove(semantic_path) with open(path_semantic, "w",encoding="utf8") as f: f.write("\n".join(opt) + "\n") - yield i18n("进度:all-done"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "进度:all-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} ps1abc = [] - yield i18n("一键三连进程结束"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + yield "一键三连进程结束", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} except: traceback.print_exc() close1abc() - yield i18n("一键三连中途报错"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + yield "一键三连中途报错", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} else: - yield i18n("已有正在进行的一键三连任务,需先终止才能开启下一次任务"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} + yield "已有正在进行的一键三连任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} def close1abc(): global ps1abc @@ -595,9 +595,9 @@ def close1abc(): except: traceback.print_exc() ps1abc=[] - return i18n("已终止所有一键三连进程"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} + return "已终止所有一键三连进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} -with gr.Blocks(title=i18n("GPT-SoVITS WebUI")) as app: +with gr.Blocks(title="GPT-SoVITS WebUI") as app: gr.Markdown( value= i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.") @@ -704,9 +704,9 @@ with gr.Blocks(title=i18n("GPT-SoVITS WebUI")) as app: gr.Markdown(value=i18n("1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。")) 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=20,step=1,label=i18n("总训练轮数total_epoch,不建议太高"),value=8,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=50,step=1,label=i18n("保存频率save_every_epoch"),value=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) @@ -717,7 +717,7 @@ with gr.Blocks(title=i18n("GPT-SoVITS WebUI")) as app: 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=100,step=1,label=i18n("总训练轮数total_epoch"),value=15,interactive=True) + total_epoch1Bb = gr.Slider(minimum=2,maximum=50,step=1,label=i18n("总训练轮数total_epoch"),value=15,interactive=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) From 810a031fd01275f567c8fc74d3afd8d71ed2f8e0 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 00:11:28 +0800 Subject: [PATCH 16/36] Update Changelog_CN.md --- docs/cn/Changelog_CN.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/cn/Changelog_CN.md b/docs/cn/Changelog_CN.md index 71d3c72c..abb61f11 100644 --- a/docs/cn/Changelog_CN.md +++ b/docs/cn/Changelog_CN.md @@ -12,14 +12,13 @@ 6-在参考音频结尾留空0.3s,削弱合成音频包含参考音频结尾的问题 -待修复: +### 20240122更新 -1-过短输出文件返回重复参考音频的问题 +1-修复过短输出文件返回重复参考音频的问题。 -2-batch size超过条数导致微调有问题 +2-经测试,英文日文训练原生支持(日文训练需要根目录不含非英文等特殊字符)。 -3-hubert提取在half下出现nan概率更高的问题 +3-音频路径检查。如果尝试读取输入错的路径报错路径不存在,而非ffmpeg错误。 -高优: +待修复:-hubert提取在half下出现nan概率更高的问题 -支持英文日文训练 From 948e7fc086dc68310ff09b2a897233cffb609f1b Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 10:30:49 +0800 Subject: [PATCH 17/36] Update Changelog_CN.md --- docs/cn/Changelog_CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/Changelog_CN.md b/docs/cn/Changelog_CN.md index abb61f11..589b0f6b 100644 --- a/docs/cn/Changelog_CN.md +++ b/docs/cn/Changelog_CN.md @@ -10,7 +10,7 @@ 5-清理TEMP文件夹缓存音频等文件 -6-在参考音频结尾留空0.3s,削弱合成音频包含参考音频结尾的问题 +6-大幅削弱合成音频包含参考音频结尾的问题 ### 20240122更新 From 93c47cd9f0c53439536eada18879b4ec5a812ae1 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:59:25 +0800 Subject: [PATCH 18/36] fix nan issue(causing sovits zerodivision) fix nan issue(which will cause sovits zerodivision) --- .../prepare_datasets/2-get-hubert-wav32k.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py index a5075ff4..bf3ab49e 100644 --- a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py +++ b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py @@ -49,10 +49,13 @@ maxx=0.95 alpha=0.5 device="cuda:0" model=cnhubert.get_model() +# is_half=False if(is_half==True): model=model.half().to(device) else: model = model.to(device) + +nan_fails=[] def name2go(wav_name): hubert_path="%s/%s.pt"%(hubert_dir,wav_name) if(os.path.exists(hubert_path)):return @@ -60,25 +63,27 @@ def name2go(wav_name): tmp_audio = load_audio(wav_path, 32000) tmp_max = np.abs(tmp_audio).max() if tmp_max > 2.2: - print("%s-%s-%s-filtered" % (idx0, idx1, tmp_max)) + print("%s-filtered" % (wav_name, tmp_max)) return tmp_audio32 = (tmp_audio / tmp_max * (maxx * alpha*32768)) + ((1 - alpha)*32768) * tmp_audio tmp_audio = librosa.resample( tmp_audio32, orig_sr=32000, target_sr=16000 - ) + )#不是重采样问题 tensor_wav16 = torch.from_numpy(tmp_audio) if (is_half == True): tensor_wav16=tensor_wav16.half().to(device) else: tensor_wav16 = tensor_wav16.to(device) ssl=model.model(tensor_wav16.unsqueeze(0))["last_hidden_state"].transpose(1,2).cpu()#torch.Size([1, 768, 215]) - if np.isnan(ssl.detach().numpy()).sum()!= 0:return + if np.isnan(ssl.detach().numpy()).sum()!= 0: + nan_fails.append(wav_name) + print("nan filtered:%s"%wav_name) + return wavfile.write( "%s/%s"%(wav32dir,wav_name), 32000, tmp_audio32.astype("int16"), ) - # torch.save(ssl,hubert_path ) my_save(ssl,hubert_path ) with open(inp_text,"r",encoding="utf8")as f: @@ -92,3 +97,12 @@ for line in lines[int(i_part)::int(all_parts)]: name2go(wav_name) except: print(line,traceback.format_exc()) + +if(len(nan_fails)>0 and is_half==True): + is_half=False + model=model.float() + for wav_name in nan_fails: + try: + name2go(wav_name) + except: + print(wav_name,traceback.format_exc()) \ No newline at end of file From 252cb3799ffb69ffc2e07dda6cd1c82f0ef7c14c Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 17:00:03 +0800 Subject: [PATCH 19/36] Update Changelog_CN.md --- docs/cn/Changelog_CN.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/cn/Changelog_CN.md b/docs/cn/Changelog_CN.md index 589b0f6b..bbd51f8c 100644 --- a/docs/cn/Changelog_CN.md +++ b/docs/cn/Changelog_CN.md @@ -20,5 +20,6 @@ 3-音频路径检查。如果尝试读取输入错的路径报错路径不存在,而非ffmpeg错误。 -待修复:-hubert提取在half下出现nan概率更高的问题 +### 20240123更新 +1-hubert提取在half下出现nan概率更高的问题 From d96b7d65ece9a89978dda13d6104d5623b57912e Mon Sep 17 00:00:00 2001 From: Kenn Zhang Date: Tue, 23 Jan 2024 17:00:31 +0800 Subject: [PATCH 20/36] =?UTF-8?q?Docker=E5=8C=96=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 43 +++++++++++++++++++++++++------------------ README.md | 25 +++++++++++++++++++++++++ config.py | 4 ++-- docker-compose.yaml | 31 +++++++++++++++++++++++++++++++ docs/cn/README.md | 26 ++++++++++++++++++++++++++ docs/ja/README.md | 24 ++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 docker-compose.yaml diff --git a/Dockerfile b/Dockerfile index d39bf217..cbf92cb5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,11 @@ # Base CUDA image FROM cnstark/pytorch:2.0.1-py3.9.17-cuda11.8.0-ubuntu20.04 +LABEL maintainer="breakstring@hotmail.com" +LABEL version="dev-20240123.03" +LABEL description="Docker image for GPT-SoVITS" + + # Install 3rd party apps ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Etc/UTC @@ -9,33 +14,31 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* && \ git lfs install - -# Install python packages -WORKDIR /temp -COPY ./requirements.txt /temp/requirements.txt -RUN pip install --no-cache-dir -r requirements.txt - - # Copy application WORKDIR /workspace COPY . /workspace - # Download models RUN chmod +x /workspace/Docker/download.sh && /workspace/Docker/download.sh -# Clone 3rd repos -WORKDIR /workspace/tools/damo_asr/models -RUN git clone --depth 1 https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch && \ - (cd speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch && git lfs pull) -RUN git clone --depth 1 https://www.modelscope.cn/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch.git speech_fsmn_vad_zh-cn-16k-common-pytorch && \ - (cd speech_fsmn_vad_zh-cn-16k-common-pytorch && git lfs pull) -RUN git clone --depth 1 https://www.modelscope.cn/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git punc_ct-transformer_zh-cn-common-vocab272727-pytorch && \ - (cd punc_ct-transformer_zh-cn-common-vocab272727-pytorch && git lfs pull) +# 本应该从 requirements.txt 里面安装package,但是由于funasr和modelscope的问题,暂时先在后面手工安装依赖包吧 +RUN pip install --no-cache-dir torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers jieba psutil PyYAML +# 这里强制指定了modelscope和funasr的版本,后面damo_asr的模型让它们自己下载 +RUN pip install --no-cache-dir modelscope~=1.10.0 torchaudio sentencepiece funasr~=0.8.7 -RUN parallel --will-cite -a /workspace/Docker/damo.sha256 "echo -n {} | sha256sum -c" +# 先屏蔽掉,让容器里自己下载 +# Clone damo_asr +#WORKDIR /workspace/tools/damo_asr/models +#RUN git clone --depth 1 https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch && \ +# (cd speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch && git lfs pull) +#RUN git clone --depth 1 https://www.modelscope.cn/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch.git speech_fsmn_vad_zh-cn-16k-common-pytorch && \ +# (cd speech_fsmn_vad_zh-cn-16k-common-pytorch && git lfs pull) +#RUN git clone --depth 1 https://www.modelscope.cn/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git punc_ct-transformer_zh-cn-common-vocab272727-pytorch && \ +# (cd punc_ct-transformer_zh-cn-common-vocab272727-pytorch && git lfs pull) -WORKDIR /workspace +#RUN parallel --will-cite -a /workspace/Docker/damo.sha256 "echo -n {} | sha256sum -c" + +#WORKDIR /workspace EXPOSE 9870 EXPOSE 9871 @@ -43,4 +46,8 @@ EXPOSE 9872 EXPOSE 9873 EXPOSE 9874 +VOLUME /workspace/output +VOLUME /workspace/logs +VOLUME /workspace/SoVITS_weights + CMD ["python", "webui.py"] \ No newline at end of file diff --git a/README.md b/README.md index 7649d7ba..59089eab 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,31 @@ For Chinese ASR (additionally), download models from [Damo ASR Model](https://mo For UVR5 (Vocals/Accompaniment Separation & Reverberation Removal, additionally), download models from [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) and place them in `tools/uvr5/uvr5_weights`. +### Using Docker + +#### docker-compose.yaml configuration + +1. Environment Variables: + - is_half: Controls half-precision/double-precision. This is typically the cause if the content under the directories 4-cnhubert/5-wav32k is not generated correctly during the "SSL extracting" step. Adjust to True or False based on your actual situation. + +2. Volumes Configuration,The application's root directory inside the container is set to /workspace. The default docker-compose.yaml lists some practical examples for uploading/downloading content. +3. shm_size: The default available memory for Docker Desktop on Windows is too small, which can cause abnormal operations. Adjust according to your own situation. +4. Under the deploy section, GPU-related settings should be adjusted cautiously according to your system and actual circumstances. + + +#### Running with docker compose +``` +docker compose -f "docker-compose.yaml" up -d +``` + +#### Running with docker command + +As above, modify the corresponding parameters based on your actual situation, then run the following command: +``` +docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-DockerTest\output:/workspace/output --volume=G:\GPT-SoVITS-DockerTest\logs:/workspace/logs --volume=G:\GPT-SoVITS-DockerTest\SoVITS_weights:/workspace/SoVITS_weights --workdir=/workspace -p 9870:9870 -p 9871:9871 -p 9872:9872 -p 9873:9873 -p 9874:9874 --shm-size="16G" -d breakstring/gpt-sovits:dev-20240123.03 +``` + + ## Dataset Format The TTS annotation .list file format: diff --git a/config.py b/config.py index ec846b3c..75db9bc8 100644 --- a/config.py +++ b/config.py @@ -1,10 +1,10 @@ -import sys +import sys,os # 推理用的指定模型 sovits_path = "" gpt_path = "" -is_half = True +is_half = eval(os.environ.get("is_half",True)) is_share=False cnhubert_path = "GPT_SoVITS/pretrained_models/chinese-hubert-base" diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..a772c823 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,31 @@ +version: '3.8' + +services: + gpt-sovits: + image: breakstring/gpt-sovits:dev-20240123.03 + container_name: gpt-sovits-container + environment: + - is_half=False + volumes: + - G:/GPT-SoVITS-DockerTest/output:/workspace/output + - G:/GPT-SoVITS-DockerTest/logs:/workspace/logs + - G:/GPT-SoVITS-DockerTest/SoVITS_weights:/workspace/SoVITS_weights + - G:/GPT-SoVITS-DockerTest/reference:/workspace/reference + working_dir: /workspace + ports: + - "9870:9870" + - "9871:9871" + - "9872:9872" + - "9873:9873" + - "9874:9874" + shm_size: 16G + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: "all" + capabilities: [gpu] + stdin_open: true + tty: true + restart: unless-stopped diff --git a/docs/cn/README.md b/docs/cn/README.md index 27c56689..072dc0d0 100644 --- a/docs/cn/README.md +++ b/docs/cn/README.md @@ -87,6 +87,32 @@ brew install ffmpeg 下载并将 [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) 和 [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) 放置在 GPT-SoVITS 根目录下。 +### 在 Docker 中使用 + +#### docker-compose.yaml 设置 + +1. 环境变量: + - is_half: 半精度/双精度控制。在进行 "SSL extracting" 步骤时如果无法正确生成 4-cnhubert/5-wav32k 目录下的内容时,一般都是它引起的,可以根据实际情况来调整为True或者False。 + +2. Volume设置,容器内的应用根目录设置为 /workspace。 默认的 docker-compose.yaml 中列出了一些实际的例子,便于上传/下载内容。 +3. shm_size:Windows下的Docker Desktop默认可用内存过小,会导致运行异常,根据自己情况酌情设置。 +4. deploy小节下的gpu相关内容,请根据您的系统和实际情况酌情设置。 + + + +#### 通过 docker compose运行 +``` +docker compose -f "docker-compose.yaml" up -d +``` + +#### 通过 docker 命令运行 + +同上,根据您自己的实际情况修改对应的参数,然后运行如下命令: +``` +docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-DockerTest\output:/workspace/output --volume=G:\GPT-SoVITS-DockerTest\logs:/workspace/logs --volume=G:\GPT-SoVITS-DockerTest\SoVITS_weights:/workspace/SoVITS_weights --workdir=/workspace -p 9870:9870 -p 9871:9871 -p 9872:9872 -p 9873:9873 -p 9874:9874 --shm-size="16G" -d breakstring/gpt-sovits:dev-20240123.03 +``` + + ### 预训练模型 diff --git a/docs/ja/README.md b/docs/ja/README.md index d0987a82..cadb68b1 100644 --- a/docs/ja/README.md +++ b/docs/ja/README.md @@ -93,6 +93,30 @@ brew install ffmpeg [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) と [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) をダウンロードし、GPT-SoVITS のルートディレクトリに置きます。 +### Dockerの使用 + +#### docker-compose.yamlの設定 + +1. 環境変数: + - `is_half`:半精度/倍精度の制御。"SSL抽出"ステップ中に`4-cnhubert/5-wav32k`ディレクトリ内の内容が正しく生成されない場合、通常これが原因です。実際の状況に応じてTrueまたはFalseに調整してください。 + +2. ボリューム設定:コンテナ内のアプリケーションのルートディレクトリは`/workspace`に設定されます。デフォルトの`docker-compose.yaml`には、アップロード/ダウンロードの内容の実例がいくつか記載されています。 +3. `shm_size`:WindowsのDocker Desktopのデフォルトの利用可能メモリが小さすぎるため、異常な動作を引き起こす可能性があります。状況に応じて適宜設定してください。 +4. `deploy`セクションのGPUに関連する内容は、システムと実際の状況に応じて慎重に設定してください。 + +#### docker composeで実行する +```markdown +docker compose -f "docker-compose.yaml" up -d +``` + +#### dockerコマンドで実行する + +上記と同様に、実際の状況に基づいて対応するパラメータを変更し、次のコマンドを実行します: +```markdown +docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-DockerTest\output:/workspace/output --volume=G:\GPT-SoVITS-DockerTest\logs:/workspace/logs --volume=G:\GPT-SoVITS-DockerTest\SoVITS_weights:/workspace/SoVITS_weights --workdir=/workspace -p 9870:9870 -p 9871:9871 -p 9872:9872 -p 9873:9873 -p 9874:9874 --shm-size="16G" -d breakstring/gpt-sovits:dev-20240123.03 +``` + + ### 事前訓練済みモデル From d1ec88193f592ecc50d6ded7508f37ba258fc5c8 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:41:05 +0800 Subject: [PATCH 21/36] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 75db9bc8..8b5f378f 100644 --- a/config.py +++ b/config.py @@ -4,7 +4,7 @@ import sys,os # 推理用的指定模型 sovits_path = "" gpt_path = "" -is_half = eval(os.environ.get("is_half",True)) +is_half = eval(os.environ.get("is_half","True")) is_share=False cnhubert_path = "GPT_SoVITS/pretrained_models/chinese-hubert-base" From 396043a2ed852288fc736f9fe72c737c014e24ef Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:43:15 +0800 Subject: [PATCH 22/36] Add files via upload --- GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py index bf3ab49e..71b48a96 100644 --- a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py +++ b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py @@ -66,8 +66,9 @@ def name2go(wav_name): print("%s-filtered" % (wav_name, tmp_max)) return tmp_audio32 = (tmp_audio / tmp_max * (maxx * alpha*32768)) + ((1 - alpha)*32768) * tmp_audio + tmp_audio32b = (tmp_audio / tmp_max * (maxx * alpha*1145.14)) + ((1 - alpha)*1145.14) * tmp_audio tmp_audio = librosa.resample( - tmp_audio32, orig_sr=32000, target_sr=16000 + tmp_audio32b, orig_sr=32000, target_sr=16000 )#不是重采样问题 tensor_wav16 = torch.from_numpy(tmp_audio) if (is_half == True): From da19013b06f856213e9404371a3cff0a142e9090 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:52:03 +0800 Subject: [PATCH 23/36] Add files via upload --- GPT_SoVITS/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GPT_SoVITS/utils.py b/GPT_SoVITS/utils.py index e1a66ea1..0ce03b33 100644 --- a/GPT_SoVITS/utils.py +++ b/GPT_SoVITS/utils.py @@ -18,7 +18,7 @@ logging.getLogger("matplotlib").setLevel(logging.ERROR) MATPLOTLIB_FLAG = False -logging.basicConfig(stream=sys.stdout, level=logging.WARNING) +logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) logger = logging @@ -310,13 +310,13 @@ def check_git_hash(model_dir): def get_logger(model_dir, filename="train.log"): global logger logger = logging.getLogger(os.path.basename(model_dir)) - logger.setLevel(logging.WARNING) + logger.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s\t%(name)s\t%(levelname)s\t%(message)s") if not os.path.exists(model_dir): os.makedirs(model_dir) h = logging.FileHandler(os.path.join(model_dir, filename)) - h.setLevel(logging.WARNING) + h.setLevel(logging.DEBUG) h.setFormatter(formatter) logger.addHandler(h) return logger From 2e834b305fa33c44416794b7f55e95456684ce4d Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 18:56:08 +0800 Subject: [PATCH 24/36] Add files via upload --- tools/subfix_webui.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/subfix_webui.py b/tools/subfix_webui.py index ad4907b0..d6624d03 100644 --- a/tools/subfix_webui.py +++ b/tools/subfix_webui.py @@ -110,6 +110,7 @@ def b_submit_change(*text_list): def b_delete_audio(*checkbox_list): global g_data_json, g_index, g_max_json_index + b_save_file() change = False for i, checkbox in reversed(list(enumerate(checkbox_list))): if g_index + i < len(g_data_json): @@ -121,8 +122,8 @@ def b_delete_audio(*checkbox_list): if g_index > g_max_json_index: g_index = g_max_json_index g_index = g_index if g_index >= 0 else 0 - # if change: - # b_save_file() + if change: + b_save_file() # return gr.Slider(value=g_index, maximum=(g_max_json_index if g_max_json_index>=0 else 0)), *b_change_index(g_index, g_batch) return {"value":g_index,"__type__":"update","maximum":(g_max_json_index if g_max_json_index>=0 else 0)},*b_change_index(g_index, g_batch) @@ -172,6 +173,7 @@ def b_audio_split(audio_breakpoint, *checkbox_list): def b_merge_audio(interval_r, *checkbox_list): global g_data_json , g_max_json_index + b_save_file() checked_index = [] audios_path = [] audios_text = [] From 73cf11e04dcb94fba47376cd127b6bccaab28002 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:19:37 +0800 Subject: [PATCH 25/36] Update chinese.py --- GPT_SoVITS/text/chinese.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPT_SoVITS/text/chinese.py b/GPT_SoVITS/text/chinese.py index 64c8818f..de3ef011 100644 --- a/GPT_SoVITS/text/chinese.py +++ b/GPT_SoVITS/text/chinese.py @@ -18,7 +18,7 @@ pinyin_to_symbol_map = { for line in open(os.path.join(current_file_path, "opencpop-strict.txt")).readlines() } -import jieba.posseg as psg +import jieba_fast.posseg as psg rep_map = { From 80fffb0ad46e4e7f27948d5a57c88cf342088d50 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:19:46 +0800 Subject: [PATCH 26/36] Update tone_sandhi.py --- GPT_SoVITS/text/tone_sandhi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPT_SoVITS/text/tone_sandhi.py b/GPT_SoVITS/text/tone_sandhi.py index f987a3f4..eafb179e 100644 --- a/GPT_SoVITS/text/tone_sandhi.py +++ b/GPT_SoVITS/text/tone_sandhi.py @@ -14,7 +14,7 @@ from typing import List from typing import Tuple -import jieba +import jieba_fast as jieba from pypinyin import lazy_pinyin from pypinyin import Style From 7a32d77782f26ab8f284643f050ce11c65344dfb Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:20:26 +0800 Subject: [PATCH 27/36] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fedce8ab..a8e72ea9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,4 +20,4 @@ transformers chardet PyYAML psutil -jieba +jieba_fast From 63cfc839834f73e89f21c2c81b7c6fd949c25f3d Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:20:39 +0800 Subject: [PATCH 28/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 59089eab..0e80304d 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ sudo apt-get install python3.9-distutils #### Pip Packages ```bash -pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers jieba +pip install torch numpy scipy tensorboard librosa==0.9.2 numba==0.56.4 pytorch-lightning gradio==3.14.0 ffmpeg-python onnxruntime tqdm cn2an pypinyin pyopenjtalk g2p_en chardet transformers jieba_fast ``` #### Additional Requirements From 63625758a99e645f3218dd167924e01a0e3cf0dc Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:57:47 +0800 Subject: [PATCH 29/36] Add files via upload --- webui.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/webui.py b/webui.py index 15202267..4461056b 100644 --- a/webui.py +++ b/webui.py @@ -1,4 +1,4 @@ -import os,shutil,sys,pdb +import os,shutil,sys,pdb,re now_dir = os.getcwd() sys.path.append(now_dir) import json,yaml,warnings,torch @@ -85,9 +85,16 @@ os.makedirs(SoVITS_weight_root,exist_ok=True) os.makedirs(GPT_weight_root,exist_ok=True) SoVITS_names,GPT_names = get_weights_names() +def custom_sort_key(s): + # 使用正则表达式提取字符串中的数字部分和非数字部分 + parts = re.split('(\d+)', s) + # 将数字部分转换为整数,非数字部分保持不变 + parts = [int(part) if part.isdigit() else part for part in parts] + return parts + def change_choices(): SoVITS_names, GPT_names = get_weights_names() - return {"choices": sorted(SoVITS_names), "__type__": "update"}, {"choices": sorted(GPT_names), "__type__": "update"} + return {"choices": sorted(SoVITS_names,key=custom_sort_key), "__type__": "update"}, {"choices": sorted(GPT_names,key=custom_sort_key), "__type__": "update"} p_label=None p_uvr5=None @@ -733,8 +740,8 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: with gr.TabItem(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),value=pretrained_gpt_name) - SoVITS_dropdown = gr.Dropdown(label=i18n("*SoVITS模型列表"), choices=sorted(SoVITS_names),value=pretrained_sovits_name) + 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]) From 0c691191e894c15686e88279745712b3c6dc232f Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:57:51 +0800 Subject: [PATCH 30/36] Add files via upload --- GPT_SoVITS/inference_webui.py | 110 ++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 39 deletions(-) diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py index 246748ae..3046d7af 100644 --- a/GPT_SoVITS/inference_webui.py +++ b/GPT_SoVITS/inference_webui.py @@ -1,4 +1,5 @@ -import os +import os,re +import pdb gpt_path = os.environ.get( "gpt_path", "pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt" @@ -42,8 +43,6 @@ if is_half == True: else: bert_model = bert_model.to(device) - -# bert_model=bert_model.to(device) def get_bert_feature(text, word2ph): with torch.no_grad(): inputs = tokenizer(text, return_tensors="pt") @@ -57,15 +56,8 @@ def get_bert_feature(text, word2ph): repeat_feature = res[i].repeat(word2ph[i], 1) phone_level_feature.append(repeat_feature) phone_level_feature = torch.cat(phone_level_feature, dim=0) - # if(is_half==True):phone_level_feature=phone_level_feature.half() return phone_level_feature.T - -n_semantic = 1024 - -dict_s2=torch.load(sovits_path,map_location="cpu") -hps=dict_s2["config"] - class DictToAttrRecursive(dict): def __init__(self, input_dict): super().__init__(input_dict) @@ -94,40 +86,48 @@ class DictToAttrRecursive(dict): raise AttributeError(f"Attribute {item} not found") -hps = DictToAttrRecursive(hps) - -hps.model.semantic_frame_rate = "25hz" -dict_s1 = torch.load(gpt_path, map_location="cpu") -config = dict_s1["config"] ssl_model = cnhubert.get_model() if is_half == True: ssl_model = ssl_model.half().to(device) else: ssl_model = ssl_model.to(device) -vq_model = SynthesizerTrn( - hps.data.filter_length // 2 + 1, - hps.train.segment_size // hps.data.hop_length, - n_speakers=hps.data.n_speakers, - **hps.model -) -if is_half == True: - vq_model = vq_model.half().to(device) -else: - vq_model = vq_model.to(device) -vq_model.eval() -print(vq_model.load_state_dict(dict_s2["weight"], strict=False)) -hz = 50 -max_sec = config["data"]["max_sec"] -t2s_model = Text2SemanticLightningModule(config, "ojbk", is_train=False) -t2s_model.load_state_dict(dict_s1["weight"]) -if is_half == True: - t2s_model = t2s_model.half() -t2s_model = t2s_model.to(device) -t2s_model.eval() -total = sum([param.nelement() for param in t2s_model.parameters()]) -print("Number of parameter: %.2fM" % (total / 1e6)) +def change_sovits_weights(sovits_path): + global vq_model,hps + dict_s2=torch.load(sovits_path,map_location="cpu") + hps=dict_s2["config"] + hps = DictToAttrRecursive(hps) + hps.model.semantic_frame_rate = "25hz" + vq_model = SynthesizerTrn( + hps.data.filter_length // 2 + 1, + hps.train.segment_size // hps.data.hop_length, + n_speakers=hps.data.n_speakers, + **hps.model + ) + del vq_model.enc_q + if is_half == True: + vq_model = vq_model.half().to(device) + else: + vq_model = vq_model.to(device) + vq_model.eval() + print(vq_model.load_state_dict(dict_s2["weight"], strict=False)) +change_sovits_weights(sovits_path) +def change_gpt_weights(gpt_path): + global hz,max_sec,t2s_model,config + hz = 50 + dict_s1 = torch.load(gpt_path, map_location="cpu") + config = dict_s1["config"] + max_sec = config["data"]["max_sec"] + t2s_model = Text2SemanticLightningModule(config, "****", is_train=False) + t2s_model.load_state_dict(dict_s1["weight"]) + if is_half == True: + t2s_model = t2s_model.half() + t2s_model = t2s_model.to(device) + t2s_model.eval() + total = sum([param.nelement() for param in t2s_model.parameters()]) + print("Number of parameter: %.2fM" % (total / 1e6)) +change_gpt_weights(gpt_path) def get_spepc(hps, filename): audio = load_audio(filename, int(hps.data.sampling_rate)) @@ -325,14 +325,46 @@ def cut3(inp): inp = inp.strip("\n") return "\n".join(["%s。" % item for item in inp.strip("。").split("。")]) +def custom_sort_key(s): + # 使用正则表达式提取字符串中的数字部分和非数字部分 + parts = re.split('(\d+)', s) + # 将数字部分转换为整数,非数字部分保持不变 + parts = [int(part) if part.isdigit() else part for part in parts] + return parts + +def change_choices(): + SoVITS_names, GPT_names = get_weights_names() + return {"choices": sorted(SoVITS_names,key=custom_sort_key), "__type__": "update"}, {"choices": sorted(GPT_names,key=custom_sort_key), "__type__": "update"} + +pretrained_sovits_name="GPT_SoVITS/pretrained_models/s2G488k.pth" +pretrained_gpt_name="GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt" +SoVITS_weight_root="SoVITS_weights" +GPT_weight_root="GPT_weights" +os.makedirs(SoVITS_weight_root,exist_ok=True) +os.makedirs(GPT_weight_root,exist_ok=True) +def get_weights_names(): + SoVITS_names = [pretrained_sovits_name] + for name in os.listdir(SoVITS_weight_root): + if name.endswith(".pth"):SoVITS_names.append("%s/%s"%(SoVITS_weight_root,name)) + GPT_names = [pretrained_gpt_name] + for name in os.listdir(GPT_weight_root): + if name.endswith(".ckpt"): GPT_names.append("%s/%s"%(GPT_weight_root,name)) + return SoVITS_names,GPT_names +SoVITS_names,GPT_names = get_weights_names() with gr.Blocks(title="GPT-SoVITS WebUI") as app: gr.Markdown( value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.") ) - # with gr.Tabs(): - # with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")): with gr.Group(): + gr.Markdown(value=i18n("模型切换")) + with gr.Row(): + GPT_dropdown = gr.Dropdown(label=i18n("GPT模型列表"), choices=sorted(GPT_names, key=custom_sort_key), value=gpt_path,interactive=True) + SoVITS_dropdown = gr.Dropdown(label=i18n("SoVITS模型列表"), choices=sorted(SoVITS_names, key=custom_sort_key), value=sovits_path,interactive=True) + refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary") + refresh_button.click(fn=change_choices, inputs=[], outputs=[SoVITS_dropdown, GPT_dropdown]) + SoVITS_dropdown.change(change_sovits_weights,[SoVITS_dropdown],[]) + GPT_dropdown.change(change_gpt_weights,[GPT_dropdown],[]) gr.Markdown(value=i18n("*请上传并填写参考信息")) with gr.Row(): inp_ref = gr.Audio(label=i18n("请上传参考音频"), type="filepath") From 69f588dfd8abc5b41df82aaef5c4a02b86b59795 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 21:00:40 +0800 Subject: [PATCH 31/36] Update Changelog_CN.md --- docs/cn/Changelog_CN.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/cn/Changelog_CN.md b/docs/cn/Changelog_CN.md index bbd51f8c..93fc8be7 100644 --- a/docs/cn/Changelog_CN.md +++ b/docs/cn/Changelog_CN.md @@ -21,5 +21,11 @@ 3-音频路径检查。如果尝试读取输入错的路径报错路径不存在,而非ffmpeg错误。 ### 20240123更新 -1-hubert提取在half下出现nan概率更高的问题 +1-解决hubert提取nan导致SoVITS/GPT训练报错ZeroDivisionError的问题 + +2-支持推理界面快速切换模型 + +3-优化模型文件排序逻辑 + +4-中文分词使用jieba_fast代替jieba From 1fa37308616c610daffa8244cce829d4f999fda3 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 22:45:00 +0800 Subject: [PATCH 32/36] Update README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 0e80304d..4bf65815 100644 --- a/README.md +++ b/README.md @@ -52,11 +52,6 @@ conda activate GPTSoVits bash install.sh ``` ### Install Manually -#### Make sure you have the distutils for python3.9 installed - -```bash -sudo apt-get install python3.9-distutils -``` #### Pip Packages From 7c7fed1135a9b07aba32457ed2260ffa6456d30e Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 22:45:19 +0800 Subject: [PATCH 33/36] Update README.md --- docs/ja/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/ja/README.md b/docs/ja/README.md index cadb68b1..9d2e9adc 100644 --- a/docs/ja/README.md +++ b/docs/ja/README.md @@ -48,11 +48,6 @@ conda activate GPTSoVits bash install.sh ``` ### 手動インストール -#### python3.9 用の distutils がインストールされていることを確認する - -```bash -sudo apt-get install python3.9-distutils -``` #### Pip パッケージ From e6a71877fe28fc9224449f4ccbef3f359f55f354 Mon Sep 17 00:00:00 2001 From: Yuan-Man <68322456+Yuan-ManX@users.noreply.github.com> Date: Tue, 23 Jan 2024 22:52:04 +0800 Subject: [PATCH 34/36] Update zh_CN.json --- i18n/locale/zh_CN.json | 408 +++++++++++++++++++++++++++-------------- 1 file changed, 275 insertions(+), 133 deletions(-) diff --git a/i18n/locale/zh_CN.json b/i18n/locale/zh_CN.json index 32ca5ef3..c04d656c 100644 --- a/i18n/locale/zh_CN.json +++ b/i18n/locale/zh_CN.json @@ -1,135 +1,277 @@ { - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", - "A模型权重": "A模型权重", - "A模型路径": "A模型路径", - "B模型路径": "B模型路径", - "E:\\语音音频+标注\\米津玄师\\src": "E:\\语音音频+标注\\米津玄师\\src", - "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", - "Index Rate": "Index Rate", - "Onnx导出": "Onnx导出", - "Onnx输出路径": "Onnx输出路径", - "RVC模型路径": "RVC模型路径", - "ckpt处理": "ckpt处理", - "harvest进程数": "harvest进程数", - "index文件路径不可包含中文": "index文件路径不可包含中文", - "pth文件路径不可包含中文": "pth文件路径不可包含中文", - "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程", - "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ", - "step1:正在处理数据": "step1:正在处理数据", - "step2:正在提取音高&正在提取特征": "step2:正在提取音高&正在提取特征", - "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", - "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", - "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", - "step3a:正在训练模型": "step3a:正在训练模型", - "一键训练": "一键训练", - "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", - "人声伴奏分离批量处理, 使用UVR5模型。
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。
模型分为三类:
1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点;
2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型;
3、去混响、去延迟模型(by FoxJoy):
  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;
 (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。
去混响/去延迟,附:
1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;
2、MDX-Net-Dereverb模型挺慢的;
3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "人声伴奏分离批量处理, 使用UVR5模型。
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。
模型分为三类:
1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点;
2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型;
3、去混响、去延迟模型(by FoxJoy):
  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;
 (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。
去混响/去延迟,附:
1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;
2、MDX-Net-Dereverb模型挺慢的;
3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。", - "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", - "伴奏人声分离&去混响&去回声": "伴奏人声分离&去混响&去回声", - "使用模型采样率": "使用模型采样率", - "使用设备采样率": "使用设备采样率", - "保存名": "保存名", - "保存的文件名, 默认空为和源文件同名": "保存的文件名, 默认空为和源文件同名", - "保存的模型名不带后缀": "保存的模型名不带后缀", - "保存频率save_every_epoch": "保存频率save_every_epoch", - "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果", - "修改": "修改", - "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", - "停止音频转换": "停止音频转换", - "全流程结束!": "全流程结束!", - "刷新音色列表和索引路径": "刷新音色列表和索引路径", - "加载模型": "加载模型", - "加载预训练底模D路径": "加载预训练底模D路径", - "加载预训练底模G路径": "加载预训练底模G路径", - "单次推理": "单次推理", - "卸载音色省显存": "卸载音色省显存", - "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", - "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", - "否": "否", - "启用相位声码器": "启用相位声码器", - "响应阈值": "响应阈值", - "响度因子": "响度因子", - "处理数据": "处理数据", - "导出Onnx模型": "导出Onnx模型", - "导出文件格式": "导出文件格式", - "常见问题解答": "常见问题解答", - "常规设置": "常规设置", - "开始音频转换": "开始音频转换", - "很遗憾您这没有能用的显卡来支持您训练": "很遗憾您这没有能用的显卡来支持您训练", - "性能设置": "性能设置", - "总训练轮数total_epoch": "总训练轮数total_epoch", - "批量推理": "批量推理", - "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ", - "指定输出主人声文件夹": "指定输出主人声文件夹", - "指定输出文件夹": "指定输出文件夹", - "指定输出非主人声文件夹": "指定输出非主人声文件夹", - "推理时间(ms):": "推理时间(ms):", - "推理音色": "推理音色", - "提取": "提取", - "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", - "是": "是", - "是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", - "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", - "显卡信息": "显卡信息", - "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.", - "查看": "查看", - "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "查看模型信息(仅支持weights文件夹下提取的小模型文件)", - "检索特征占比": "检索特征占比", - "模型": "模型", - "模型推理": "模型推理", - "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况", - "模型是否带音高指导": "模型是否带音高指导", - "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", - "模型是否带音高指导,1是0否": "模型是否带音高指导,1是0否", - "模型版本型号": "模型版本型号", - "模型融合, 可用于测试音色融合": "模型融合, 可用于测试音色融合", - "模型路径": "模型路径", - "每张显卡的batch_size": "每张显卡的batch_size", - "淡入淡出长度": "淡入淡出长度", - "版本": "版本", - "特征提取": "特征提取", - "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", - "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", - "目标采样率": "目标采样率", - "算法延迟(ms):": "算法延迟(ms):", - "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", - "融合": "融合", - "要改的模型信息": "要改的模型信息", - "要置入的模型信息": "要置入的模型信息", - "训练": "训练", - "训练模型": "训练模型", - "训练特征索引": "训练特征索引", - "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log", - "请指定说话人id": "请指定说话人id", - "请选择index文件": "请选择index文件", - "请选择pth文件": "请选择pth文件", - "请选择说话人id": "请选择说话人id", - "转换": "转换", - "输入实验名": "输入实验名", - "输入待处理音频文件夹路径": "输入待处理音频文件夹路径", - "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)", - "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", - "输入监听": "输入监听", - "输入训练文件夹路径": "输入训练文件夹路径", - "输入设备": "输入设备", - "输入降噪": "输入降噪", - "输出信息": "输出信息", - "输出变声": "输出变声", - "输出设备": "输出设备", - "输出降噪": "输出降噪", - "输出音频(右下角三个点,点了可以下载)": "输出音频(右下角三个点,点了可以下载)", - "选择.index文件": "选择.index文件", - "选择.pth文件": "选择.pth文件", - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU", - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU", - "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU", - "采样率:": "采样率:", - "采样长度": "采样长度", - "重载设备列表": "重载设备列表", - "音调设置": "音调设置", - "音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)", - "音高算法": "音高算法", - "额外推理时长": "额外推理时长" + "很遗憾您这没有能用的显卡来支持您训练": "很遗憾您这没有能用的显卡来支持您训练", + "UVR5已开启": "UVR5已开启", + "UVR5已关闭": "UVR5已关闭", + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.", + "0-前置数据集获取工具": "0-前置数据集获取工具", + "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人声伴奏分离&去混响去延迟工具", + "是否开启UVR5-WebUI": "是否开启UVR5-WebUI", + "UVR5进程输出信息": "UVR5进程输出信息", + "0b-语音切分工具": "0b-语音切分工具", + "音频自动切分输入路径,可文件可文件夹": "音频自动切分输入路径,可文件可文件夹", + "切分后的子音频的输出根目录": "切分后的子音频的输出根目录", + "threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小于这个值视作静音的备选切割点", + "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值", + "min_interval:最短切割间隔": "min_interval:最短切割间隔", + "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", + "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切完后静音最多留多长", + "开启语音切割": "开启语音切割", + "终止语音切割": "终止语音切割", + "max:归一化后最大值多少": "max:归一化后最大值多少", + "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例归一化后音频进来", + "切割使用的进程数": "切割使用的进程数", + "语音切割进程输出信息": "语音切割进程输出信息", + "0c-中文批量离线ASR工具": "0c-中文批量离线ASR工具", + "开启离线批量ASR": "开启离线批量ASR", + "终止ASR进程": "终止ASR进程", + "批量ASR(中文only)输入文件夹路径": "批量ASR(中文only)输入文件夹路径", + "ASR进程输出信息": "ASR进程输出信息", + "0d-语音文本校对标注工具": "0d-语音文本校对标注工具", + "是否开启打标WebUI": "是否开启打标WebUI", + "打标数据标注文件路径": "打标数据标注文件路径", + "打标工具进程输出信息": "打标工具进程输出信息", + "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", + "*实验/模型名": "*实验/模型名", + "显卡信息": "显卡信息", + "预训练的SoVITS-G模型路径": "预训练的SoVITS-G模型路径", + "预训练的SoVITS-D模型路径": "预训练的SoVITS-D模型路径", + "预训练的GPT模型路径": "预训练的GPT模型路径", + "1A-训练集格式化工具": "1A-训练集格式化工具", + "输出logs/实验名目录下应有23456开头的文件和文件夹": "输出logs/实验名目录下应有23456开头的文件和文件夹", + "*文本标注文件": "*文本标注文件", + "*训练集音频文件目录": "*训练集音频文件目录", + "训练集音频文件目录 拼接 list文件里波形对应的文件名。": "训练集音频文件目录 拼接 list文件里波形对应的文件名。", + "1Aa-文本内容": "1Aa-文本内容", + "GPU卡号以-分割,每个卡号一个进程": "GPU卡号以-分割,每个卡号一个进程", + "预训练的中文BERT模型路径": "预训练的中文BERT模型路径", + "开启文本获取": "开启文本获取", + "终止文本获取进程": "终止文本获取进程", + "文本进程输出信息": "文本进程输出信息", + "1Ab-SSL自监督特征提取": "1Ab-SSL自监督特征提取", + "预训练的SSL模型路径": "预训练的SSL模型路径", + "开启SSL提取": "开启SSL提取", + "终止SSL提取进程": "终止SSL提取进程", + "SSL进程输出信息": "SSL进程输出信息", + "1Ac-语义token提取": "1Ac-语义token提取", + "开启语义token提取": "开启语义token提取", + "终止语义token提取进程": "终止语义token提取进程", + "语义token提取进程输出信息": "语义token提取进程输出信息", + "1Aabc-训练集格式化一键三连": "1Aabc-训练集格式化一键三连", + "开启一键三连": "开启一键三连", + "终止一键三连": "终止一键三连", + "一键三连进程输出信息": "一键三连进程输出信息", + "1B-微调训练": "1B-微调训练", + "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", + "每张显卡的batch_size": "每张显卡的batch_size", + "总训练轮数total_epoch,不建议太高": "总训练轮数total_epoch,不建议太高", + "文本模块学习率权重": "文本模块学习率权重", + "保存频率save_every_epoch": "保存频率save_every_epoch", + "是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", + "开启SoVITS训练": "开启SoVITS训练", + "终止SoVITS训练": "终止SoVITS训练", + "SoVITS训练进程输出信息": "SoVITS训练进程输出信息", + "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", + "总训练轮数total_epoch": "总训练轮数total_epoch", + "开启GPT训练": "开启GPT训练", + "终止GPT训练": "终止GPT训练", + "GPT训练进程输出信息": "GPT训练进程输出信息", + "1C-推理": "1C-推理", + "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。", + "*GPT模型列表": "*GPT模型列表", + "*SoVITS模型列表": "*SoVITS模型列表", + "GPU卡号,只能填1个整数": "GPU卡号,只能填1个整数", + "刷新模型路径": "刷新模型路径", + "是否开启TTS推理WebUI": "是否开启TTS推理WebUI", + "TTS推理WebUI进程输出信息": "TTS推理WebUI进程输出信息", + "2-GPT-SoVITS-变声": "2-GPT-SoVITS-变声", + "施工中,请静候佳音": "施工中,请静候佳音", + "TTS推理进程已开启": "TTS推理进程已开启", + "TTS推理进程已关闭": "TTS推理进程已关闭", + "打标工具WebUI已开启": "打标工具WebUI已开启", + "打标工具WebUI已关闭": "打标工具WebUI已关闭", + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.", + "*请上传并填写参考信息": "*请上传并填写参考信息", + "*请填写需要合成的目标文本": "*请填写需要合成的目标文本", + "ASR任务开启:%s": "ASR任务开启:%s", + "GPT训练完成": "GPT训练完成", + "GPT训练开始:%s": "GPT训练开始:%s", + "SSL提取进程执行中": "SSL提取进程执行中", + "SSL提取进程结束": "SSL提取进程结束", + "SoVITS训练完成": "SoVITS训练完成", + "SoVITS训练开始:%s": "SoVITS训练开始:%s", + "一键三连中途报错": "一键三连中途报错", + "一键三连进程结束": "一键三连进程结束", + "中文": "中文", + "凑50字一切": "凑50字一切", + "凑五句一切": "凑五句一切", + "切分后文本": "切分后文本", + "切割执行中": "切割执行中", + "切割结束": "切割结束", + "参考音频的文本": "参考音频的文本", + "参考音频的语种": "参考音频的语种", + "合成语音": "合成语音", + "后续将支持混合语种编码文本输入。": "后续将支持混合语种编码文本输入。", + "已有正在进行的ASR任务,需先终止才能开启下一次任务": "已有正在进行的ASR任务,需先终止才能开启下一次任务", + "已有正在进行的GPT训练任务,需先终止才能开启下一次任务": "已有正在进行的GPT训练任务,需先终止才能开启下一次任务", + "已有正在进行的SSL提取任务,需先终止才能开启下一次任务": "已有正在进行的SSL提取任务,需先终止才能开启下一次任务", + "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务": "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务", + "已有正在进行的一键三连任务,需先终止才能开启下一次任务": "已有正在进行的一键三连任务,需先终止才能开启下一次任务", + "已有正在进行的切割任务,需先终止才能开启下一次任务": "已有正在进行的切割任务,需先终止才能开启下一次任务", + "已有正在进行的文本任务,需先终止才能开启下一次任务": "已有正在进行的文本任务,需先终止才能开启下一次任务", + "已有正在进行的语义token提取任务,需先终止才能开启下一次任务": "已有正在进行的语义token提取任务,需先终止才能开启下一次任务", + "已终止ASR进程": "已终止ASR进程", + "已终止GPT训练": "已终止GPT训练", + "已终止SoVITS训练": "已终止SoVITS训练", + "已终止所有1a进程": "已终止所有1a进程", + "已终止所有1b进程": "已终止所有1b进程", + "已终止所有一键三连进程": "已终止所有一键三连进程", + "已终止所有切割进程": "已终止所有切割进程", + "已终止所有语义token进程": "已终止所有语义token进程", + "按中文句号。切": "按中文句号。切", + "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", + "文本进程执行中": "文本进程执行中", + "文本进程结束": "文本进程结束", + "日文": "日文", + "英文": "英文", + "语义token提取进程执行中": "语义token提取进程执行中", + "语义token提取进程结束": "语义token提取进程结束", + "请上传参考音频": "请上传参考音频", + "输入路径不存在": "输入路径不存在", + "输入路径存在但既不是文件也不是文件夹": "输入路径存在但既不是文件也不是文件夹", + "输出的语音": "输出的语音", + "进度:1a-done": "进度:1a-done", + "进度:1a-done, 1b-ing": "进度:1a-done, 1b-ing", + "进度:1a-ing": "进度:1a-ing", + "进度:1a1b-done": "进度:1a1b-done", + "进度:1a1b-done, 1cing": "进度:1a1b-done, 1cing", + "进度:all-done": "进度:all-done", + "需要合成的切分前文本": "需要合成的切分前文本", + "需要合成的文本": "需要合成的文本", + "需要合成的语种": "需要合成的语种", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", + "A模型权重": "A模型权重", + "A模型路径": "A模型路径", + "B模型路径": "B模型路径", + "E:\\语音音频+标注\\米津玄师\\src": "E:\\语音音频+标注\\米津玄师\\src", + "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", + "Index Rate": "Index Rate", + "Onnx导出": "Onnx导出", + "Onnx输出路径": "Onnx输出路径", + "RVC模型路径": "RVC模型路径", + "ckpt处理": "ckpt处理", + "harvest进程数": "harvest进程数", + "index文件路径不可包含中文": "index文件路径不可包含中文", + "pth文件路径不可包含中文": "pth文件路径不可包含中文", + "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程", + "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ", + "step1:正在处理数据": "step1:正在处理数据", + "step2:正在提取音高&正在提取特征": "step2:正在提取音高&正在提取特征", + "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", + "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", + "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", + "step3a:正在训练模型": "step3a:正在训练模型", + "一键训练": "一键训练", + "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", + "人声伴奏分离批量处理, 使用UVR5模型。
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。
模型分为三类:
1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点;
2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型;
3、去混响、去延迟模型(by FoxJoy):
  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;
 (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。
去混响/去延迟,附:
1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;
2、MDX-Net-Dereverb模型挺慢的;
3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "人声伴奏分离批量处理, 使用UVR5模型。
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。
模型分为三类:
1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点;
2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型;
3、去混响、去延迟模型(by FoxJoy):
  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;
 (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。
去混响/去延迟,附:
1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;
2、MDX-Net-Dereverb模型挺慢的;
3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。", + "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", + "伴奏人声分离&去混响&去回声": "伴奏人声分离&去混响&去回声", + "使用模型采样率": "使用模型采样率", + "使用设备采样率": "使用设备采样率", + "保存名": "保存名", + "保存的文件名, 默认空为和源文件同名": "保存的文件名, 默认空为和源文件同名", + "保存的模型名不带后缀": "保存的模型名不带后缀", + "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果", + "修改": "修改", + "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", + "停止音频转换": "停止音频转换", + "全流程结束!": "全流程结束!", + "刷新音色列表和索引路径": "刷新音色列表和索引路径", + "加载模型": "加载模型", + "加载预训练底模D路径": "加载预训练底模D路径", + "加载预训练底模G路径": "加载预训练底模G路径", + "单次推理": "单次推理", + "卸载音色省显存": "卸载音色省显存", + "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", + "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", + "否": "否", + "启用相位声码器": "启用相位声码器", + "响应阈值": "响应阈值", + "响度因子": "响度因子", + "处理数据": "处理数据", + "导出Onnx模型": "导出Onnx模型", + "导出文件格式": "导出文件格式", + "常见问题解答": "常见问题解答", + "常规设置": "常规设置", + "开始音频转换": "开始音频转换", + "性能设置": "性能设置", + "批量推理": "批量推理", + "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ", + "指定输出主人声文件夹": "指定输出主人声文件夹", + "指定输出文件夹": "指定输出文件夹", + "指定输出非主人声文件夹": "指定输出非主人声文件夹", + "推理时间(ms):": "推理时间(ms):", + "推理音色": "推理音色", + "提取": "提取", + "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", + "是": "是", + "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", + "查看": "查看", + "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "查看模型信息(仅支持weights文件夹下提取的小模型文件)", + "检索特征占比": "检索特征占比", + "模型": "模型", + "模型推理": "模型推理", + "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况", + "模型是否带音高指导": "模型是否带音高指导", + "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", + "模型是否带音高指导,1是0否": "模型是否带音高指导,1是0否", + "模型版本型号": "模型版本型号", + "模型融合, 可用于测试音色融合": "模型融合, 可用于测试音色融合", + "模型路径": "模型路径", + "淡入淡出长度": "淡入淡出长度", + "版本": "版本", + "特征提取": "特征提取", + "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", + "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", + "目标采样率": "目标采样率", + "算法延迟(ms):": "算法延迟(ms):", + "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", + "融合": "融合", + "要改的模型信息": "要改的模型信息", + "要置入的模型信息": "要置入的模型信息", + "训练": "训练", + "训练模型": "训练模型", + "训练特征索引": "训练特征索引", + "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log", + "请指定说话人id": "请指定说话人id", + "请选择index文件": "请选择index文件", + "请选择pth文件": "请选择pth文件", + "请选择说话人id": "请选择说话人id", + "转换": "转换", + "输入实验名": "输入实验名", + "输入待处理音频文件夹路径": "输入待处理音频文件夹路径", + "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)", + "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", + "输入监听": "输入监听", + "输入训练文件夹路径": "输入训练文件夹路径", + "输入设备": "输入设备", + "输入降噪": "输入降噪", + "输出信息": "输出信息", + "输出变声": "输出变声", + "输出设备": "输出设备", + "输出降噪": "输出降噪", + "输出音频(右下角三个点,点了可以下载)": "输出音频(右下角三个点,点了可以下载)", + "选择.index文件": "选择.index文件", + "选择.pth文件": "选择.pth文件", + "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU", + "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU", + "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU", + "采样率:": "采样率:", + "采样长度": "采样长度", + "重载设备列表": "重载设备列表", + "音调设置": "音调设置", + "音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)", + "音高算法": "音高算法", + "额外推理时长": "额外推理时长" } From a61a0b9631f8d44121291db1548a2e046a6bdc38 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Tue, 23 Jan 2024 23:33:48 +0800 Subject: [PATCH 35/36] Update inference_webui.py --- GPT_SoVITS/inference_webui.py | 1 + 1 file changed, 1 insertion(+) diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py index 3046d7af..fd04ac8f 100644 --- a/GPT_SoVITS/inference_webui.py +++ b/GPT_SoVITS/inference_webui.py @@ -401,6 +401,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app: app.queue(concurrency_count=511, max_size=1022).launch( server_name="0.0.0.0", inbrowser=True, + share=is_share, server_port=infer_ttswebui, quiet=True, ) From 52a915b08a0417b878732bc31ee5b3f49d60ec75 Mon Sep 17 00:00:00 2001 From: Yuan-Man <68322456+Yuan-ManX@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:09:21 +0800 Subject: [PATCH 36/36] Update ja_JP.json --- i18n/locale/ja_JP.json | 543 ++++++++++++++++++++--------------------- 1 file changed, 265 insertions(+), 278 deletions(-) diff --git a/i18n/locale/ja_JP.json b/i18n/locale/ja_JP.json index 03143d12..bd553b60 100644 --- a/i18n/locale/ja_JP.json +++ b/i18n/locale/ja_JP.json @@ -1,288 +1,275 @@ { - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3 次に、harvestピッチの認識結果に対してメディアンフィルタを使用します。値はフィルター半径で、ミュートを減衰させるために使用します。", - "A模型权重": "Aモデルの重み", - "A模型路径": "Aモデルのパス", - "B模型路径": "Bモデルのパス", - "E:\\语音音频+标注\\米津玄师\\src": "E:\\语音音频+标注\\米津玄师\\src", - "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0(最低共振周波数)カーブファイル(オプション、1行に1ピッチ、デフォルトのF0(最低共振周波数)とエレベーションを置き換えます。)", - "Index Rate": "Index Rate", - "Onnx导出": "Onnxエクスポート", - "Onnx输出路径": "Onnx出力パス", - "RVC模型路径": "RVCモデルパス", - "ckpt处理": "ckptファイルの処理", - "harvest进程数": "harvestプロセス数", - "index文件路径不可包含中文": "indexファイルのパスに漢字を含んではいけません", - "pth文件路径不可包含中文": "pthファイルのパスに漢字を含んではいけません", - "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "rmvpeカード番号設定:異なるプロセスに使用するカード番号を入力する。例えば、0-0-1でカード0に2つのプロセス、カード1に1つのプロセスを実行する。", - "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "ステップ1:実験設定を入力します。実験データはlogsに保存され、各実験にはフォルダーがあります。実験名のパスを手動で入力する必要があり、実験設定、ログ、トレーニングされたモデルファイルが含まれます。", - "step1:正在处理数据": "step1:処理中のデータ", - "step2:正在提取音高&正在提取特征": "step2:ピッチ抽出と特徴抽出", - "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "ステップ2a: 訓練フォルダー内のすべての音声ファイルを自動的に探索し、スライスと正規化を行い、2つのwavフォルダーを実験ディレクトリに生成します。現在は一人でのトレーニングのみをサポートしています。", - "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "ステップ2b: CPUを使用して音高を抽出する(モデルに音高がある場合)、GPUを使用して特徴を抽出する(GPUの番号を選択する)", - "step3: 填写训练设置, 开始训练模型和索引": "ステップ3: トレーニング設定を入力して、モデルとインデックスのトレーニングを開始します", - "step3a:正在训练模型": "step3a:トレーニング中のモデル", - "一键训练": "ワンクリックトレーニング", - "也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルをインポートすることもできます。フォルダパスが存在する場合、この入力は無視されます。", - "人声伴奏分离批量处理, 使用UVR5模型。
合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。
模型分为三类:
1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点;
2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型;
3、去混响、去延迟模型(by FoxJoy):
  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;
 (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。
去混响/去延迟,附:
1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;
2、MDX-Net-Dereverb模型挺慢的;
3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "UVR5モデルを使用したボーカル伴奏の分離バッチ処理。
有効なフォルダーパスフォーマットの例: D:\\path\\to\\input\\folder (エクスプローラーのアドレスバーからコピーします)。
モデルは三つのカテゴリに分かれています:
1. ボーカルを保持: ハーモニーのないオーディオに対してこれを選択します。HP5よりもボーカルをより良く保持します。HP2とHP3の二つの内蔵モデルが含まれています。HP3は伴奏をわずかに漏らす可能性がありますが、HP2よりもわずかにボーカルをより良く保持します。
2. 主なボーカルのみを保持: ハーモニーのあるオーディオに対してこれを選択します。主なボーカルを弱める可能性があります。HP5の一つの内蔵モデルが含まれています。
3. ディリバーブとディレイモデル (by FoxJoy):
  (1) MDX-Net: ステレオリバーブの除去に最適な選択肢ですが、モノリバーブは除去できません;
 (234) DeEcho: ディレイ効果を除去します。AggressiveモードはNormalモードよりも徹底的に除去します。DeReverbはさらにリバーブを除去し、モノリバーブを除去することができますが、高周波のリバーブが強い内容に対しては非常に効果的ではありません。
ディリバーブ/ディレイに関する注意点:
1. DeEcho-DeReverbモデルの処理時間は、他の二つのDeEchoモデルの約二倍です。
2. MDX-Net-Dereverbモデルは非常に遅いです。
3. 推奨される最もクリーンな設定は、最初にMDX-Netを適用し、その後にDeEcho-Aggressiveを適用することです。", - "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "ハイフンで区切って使用するGPUの番号を入力します。例えば0-1-2はGPU0、GPU1、GPU2を使用します", - "伴奏人声分离&去混响&去回声": "伴奏ボーカル分離&残響除去&エコー除去", - "使用模型采样率": "使用模型采样率", - "使用设备采样率": "使用设备采样率", - "保存名": "保存ファイル名", - "保存的文件名, 默认空为和源文件同名": "保存するファイル名、デフォルトでは空欄で元のファイル名と同じ名前になります", - "保存的模型名不带后缀": "拡張子のない保存するモデル名", - "保存频率save_every_epoch": "エポックごとの保存頻度", - "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "明確な子音と呼吸音を保護し、電子音の途切れやその他のアーティファクトを防止します。0.5でオフになります。下げると保護が強化されますが、indexの効果が低下する可能性があります。", - "修改": "変更", - "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報の修正(weightsフォルダから抽出された小さなモデルファイルのみ対応)", - "停止音频转换": "音声変換を停止", - "全流程结束!": "全工程が完了!", - "刷新音色列表和索引路径": "音源リストとインデックスパスの更新", - "加载模型": "モデルをロード", - "加载预训练底模D路径": "事前学習済みのDモデルのパス", - "加载预训练底模G路径": "事前学習済みのGモデルのパス", - "单次推理": "单次推理", - "卸载音色省显存": "音源を削除してメモリを節約", - "变调(整数, 半音数量, 升八度12降八度-12)": "ピッチ変更(整数、半音数、上下オクターブ12-12)", - "后处理重采样至最终采样率,0为不进行重采样": "最終的なサンプリングレートへのポストプロセッシングのリサンプリング リサンプリングしない場合は0", - "否": "いいえ", - "启用相位声码器": "启用相位声码器", - "响应阈值": "反応閾値", - "响度因子": "ラウドネス係数", - "处理数据": "データ処理", - "导出Onnx模型": "Onnxに変換", - "导出文件格式": "エクスポート形式", - "常见问题解答": "よくある質問", - "常规设置": "一般設定", - "开始音频转换": "音声変換を開始", - "很遗憾您这没有能用的显卡来支持您训练": "トレーニングに対応したGPUが動作しないのは残念です。", - "性能设置": "パフォーマンス設定", - "总训练轮数total_epoch": "総エポック数", - "批量推理": "批量推理", - "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "一括変換、変換する音声フォルダを入力、または複数の音声ファイルをアップロードし、指定したフォルダ(デフォルトのopt)に変換した音声を出力します。", - "指定输出主人声文件夹": "マスターの出力音声フォルダーを指定する", - "指定输出文件夹": "出力フォルダを指定してください", - "指定输出非主人声文件夹": "マスター以外の出力音声フォルダーを指定する", - "推理时间(ms):": "推論時間(ms):", - "推理音色": "音源推論", - "提取": "抽出", - "提取音高和处理数据使用的CPU进程数": "ピッチの抽出やデータ処理に使用するCPUスレッド数", - "是": "はい", - "是否仅保存最新的ckpt文件以节省硬盘空间": "ハードディスク容量を節約するため、最新のckptファイルのみを保存しますか?", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "各保存時点の小モデルを全部weightsフォルダに保存するかどうか", - "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "すべてのトレーニングデータをメモリにキャッシュするかどうか。10分以下の小さなデータはキャッシュしてトレーニングを高速化できますが、大きなデータをキャッシュするとメモリが破裂し、あまり速度が上がりません。", - "显卡信息": "GPU情報", - "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "本ソフトウェアはMITライセンスに基づくオープンソースであり、製作者は本ソフトウェアに対していかなる責任を持ちません。本ソフトウェアの利用者および本ソフトウェアから派生した音源(成果物)を配布する者は、本ソフトウェアに対して自身で責任を負うものとします。
この条項に同意しない場合、パッケージ内のコードやファイルを使用や参照を禁じます。詳しくはLICENSEをご覧ください。", - "查看": "表示", - "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報を表示する(小さいモデルファイルはweightsフォルダーからのみサポートされています)", - "检索特征占比": "検索特徴率", - "模型": "モデル", - "模型推理": "モデル推論", - "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "モデル抽出(ログフォルダー内の大きなファイルのモデルパスを入力)、モデルを半分までトレーニングし、自動的に小さいファイルモデルを保存しなかったり、中間モデルをテストしたい場合に適用されます。", - "模型是否带音高指导": "モデルに音高ガイドを付けるかどうか", - "模型是否带音高指导(唱歌一定要, 语音可以不要)": "モデルに音高ガイドがあるかどうか(歌唱には必要ですが、音声には必要ありません)", - "模型是否带音高指导,1是0否": "モデルに音高ガイドを付けるかどうか、1は付ける、0は付けない", - "模型版本型号": "モデルのバージョン", - "模型融合, 可用于测试音色融合": "モデルのマージ、音源のマージテストに使用できます", - "模型路径": "モデルパス", - "每张显卡的batch_size": "GPUごとのバッチサイズ", - "淡入淡出长度": "フェードイン/フェードアウト長", - "版本": "バージョン", - "特征提取": "特徴抽出", - "特征检索库文件路径,为空则使用下拉的选择结果": "特徴検索ライブラリへのパス 空の場合はドロップダウンで選択", - "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性へは+12キーをお勧めします。女性から男性へは-12キーをお勧めします。音域が広すぎて音質が劣化した場合は、適切な音域に自分で調整してください。", - "目标采样率": "目標サンプリングレート", - "算法延迟(ms):": "算法延迟(ms):", - "自动检测index路径,下拉式选择(dropdown)": "インデックスパスの自動検出 ドロップダウンで選択", - "融合": "マージ", - "要改的模型信息": "変更するモデル情報", - "要置入的模型信息": "挿入するモデル情報", - "训练": "トレーニング", - "训练模型": "モデルのトレーニング", - "训练特征索引": "特徴インデックスのトレーニング", - "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "トレーニング終了時に、トレーニングログやフォルダ内のtrain.logを確認することができます", - "请指定说话人id": "話者IDを指定してください", - "请选择index文件": "indexファイルを選択してください", - "请选择pth文件": "pthファイルを選択してください", - "请选择说话人id": "話者IDを選択してください", - "转换": "変換", - "输入实验名": "モデル名", - "输入待处理音频文件夹路径": "処理するオーディオファイルのフォルダパスを入力してください", - "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "処理対象音声フォルダーのパスを入力してください(エクスプローラーのアドレスバーからコピーしてください)", - "输入待处理音频文件路径(默认是正确格式示例)": "処理対象音声ファイルのパスを入力してください(デフォルトは正しいフォーマットの例です)", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "入力ソースの音量エンベロープと出力音量エンベロープの融合率 1に近づくほど、出力音量エンベロープの割合が高くなる", - "输入监听": "入力を監視", - "输入训练文件夹路径": "トレーニング用フォルダのパスを入力してください", - "输入设备": "入力デバイス", - "输入降噪": "入力ノイズの低減", - "输出信息": "出力情報", - "输出变声": "音声変換の出力", - "输出设备": "出力デバイス", - "输出降噪": "出力ノイズの低減", - "输出音频(右下角三个点,点了可以下载)": "出力音声(右下の三点をクリックしてダウンロードできます)", - "选择.index文件": ".indexファイルを選択", - "选择.pth文件": ".pthファイルを選択", - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "ピッチ抽出アルゴリズムの選択、歌声はpmで高速化でき、harvestは低音が良いが信じられないほど遅く、crepeは良く動くがGPUを食います。", - "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "ピッチ抽出アルゴリズムの選択、歌声はpmで高速化でき、harvestは低音が良いが信じられないほど遅く、crepeは良く動くがGPUを喰います", - "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "ピッチ抽出アルゴリズムの選択:歌声はpmで高速化でき、入力した音声が高音質でCPUが貧弱な場合はdioで高速化でき、harvestの方が良いが遅く、rmvpeがベストだがCPU/GPUを若干食います。", - "采样率:": "采样率:", - "采样长度": "サンプル長", - "重载设备列表": "デバイスリストをリロードする", - "音调设置": "音程設定", - "音频设备(请使用同种类驱动)": "オーディオデバイス(同じ種類のドライバーを使用してください)", - "音高算法": "ピッチアルゴリズム", - "额外推理时长": "追加推論時間", - "打标工具WebUI已开启": "ラベリングツールWebUIが開始されました", - "打标工具WebUI已关闭": "ラベリングツールWebUIが終了しました", - "UVR5已开启": "UVR5が開始されました", - "UVR5已关闭": "UVR5が終了しました", - "TTS推理进程已开启": "TTS推論プロセスが開始されました", - "TTS推理进程已关闭": "TTS推理プロセスが終了しました", - "ASR任务开启": "ASRタスクが開始されました", - "ASR任务完成": "ASRタスクが完了しました", - "已有正在进行的ASR任务,需先终止才能开启下一次任务": "既に進行中のASRタスクがあります。新たなタスクを開始する前に終了させてください", - "已终止ASR进程": "ASRプロセスが終了しました", - "SoVITS训练开始": "SoVITSのトレーニングが開始されました", - "SoVITS训练完成": "SoVITSのトレーニングが完了しました", - "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务": "既に進行中のSoVITSのトレーニングタスクがあります。新たなタスクを開始する前に終了させてください", - "已终止SoVITS训练": "SoVITSのトレーニングが終了しました", - "GPT训练开始": "GPTトレーニング開始", - "GPT训练完成": "GPTトレーニング完了", - "已有正在进行的GPT训练任务,需先终止才能开启下一次任务": "既に進行中のGPTトレーニングタスクがあります。新たなタスクを開始する前に終了させてください", - "已终止GPT训练": "GPTトレーニングが終了しました", - "切割执行中": "カット中", - "切割结束": "カット終了", - "已有正在进行的切割任务,需先终止才能开启下一次任务": "既に進行中のカットタスクがあります。新たなタスクを開始する前に終了させてください", - "已终止所有切割进程": "すべてのカットプロセスが終了しました", - "文本进程执行中": "テキストプロセス実行中", - "文本进程结束": "テキストプロセス終了", - "已有正在进行的文本任务,需先终止才能开启下一次任务": "既に進行中のテキストタスクがあります。新たなタスクを開始する前に終了させてください", - "已终止所有文本进程": "すべてのテキストプロセスが終了しました", - "SSL提取进程执行中": "SSL抽出プロセス実行中", - "SSL提取进程结束": "SSL抽出プロセス終了", - "已有正在进行的SSL提取任务,需先终止才能开启下一次任务": "既に進行中のSSL抽出タスクがあります。新たなタスクを開始する前に終了させてください", - "已终止所有1b进程": "すべての1bプロセスが終了しました", - "语义token提取进程执行中": "意味トークン抽出プロセス実行中", - "语义token提取进程结束": "意味トークン抽出プロセス終了", - "已有正在进行的语义token提取任务,需先终止才能开启下一次任务": "既に進行中の意味トークン抽出タスクがあります。新たなタスクを開始する前に終了させてください", - "已终止所有语义token进程": "すべての意味トークンプロセスが終了しました", - "语义token提取进程已开始": "意味トークン抽出プロセスが開始されました", - "语义token提取进程已结束": "意味トークン抽出プロセスが終了しました", - "语义token提取进程已终止": "意味トークン抽出プロセスが終了しました", - "语义token提取进程正在进行中": "意味トークン抽出プロセスが進行中です", - "语义token提取任务已完成": "意味トークン抽出タスクが完了しました", - "语义token提取任务正在进行中": "意味トークン抽出タスクが進行中です", - "语义token提取任务已开始": "意味トークン抽出タスクが開始されました", - "语义token提取任务已终止": "意味トークン抽出タスクが終了しました", - "ワンクリックで三つのプロセスを開始": "ワンクリックで三つのプロセスを開始します", - "ワンクリックで三つのプロセスを終了": "ワンクリックで三つのプロセスを終了します", - "ワンクリックで三つのプロセスを中止": "ワンクリックで三つのプロセスを中止します", - "ワンクリックで三つのプロセスが進行中": "ワンクリックで三つのプロセスが進行中です", - "ワンクリックで三つのタスクが完了": "ワンクリックで三つのタスクが完了しました", - "ワンクリックで三つのタスクが進行中": "ワンクリックで三つのタスクが進行中です", - "ワンクリックで三つのタスクを開始": "ワンクリックで三つのタスクを開始します", - "ワンクリックで三つのタスクを中止": "ワンクリックで三つのタスクを中止します", - "0-前置数据集获取工具": "0-前置データセット取得ツール", - "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5ボーカル伴奏分離&リバーブディレイ除去ツール", - "是否开启UVR5-WebUI": "UVR5-WebUIを開始しますか", - "UVR5进程输出信息": "UVR5プロセス出力情報", - "0b-语音切分工具": "0b-音声切断ツール", - "音频自动切分输入路径,可文件可文件夹": "オーディオ自動切断入力パス、ファイルまたはフォルダー可", - "切分后的子音频的输出根目录": "切断後のサブオーディオの出力ルートディレクトリ", - "threshold:音量小于这个值视作静音的备选切割点": "threshold:音量がこの値より小さい場合は、サイレントと見なされる代替切断点", - "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:各セクションの最小長さ、最初のセクションが短すぎる場合は、この値を超えるまで後続のセクションと連続しています", - "min_interval:最短切割间隔": "min_interval:最短切断間隔", - "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:音量曲線の計算方法、小さいほど精度が高く計算量が多くなります(精度が高いほど効果が良いとは限りません)", - "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切断後のサイレントの最大保持長", - "开启语音切割": "音声切断を開始", - "终止语音切割": "音声切断を終了", - "max:归一化后最大值多少": "max:正規化後の最大値", - "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:どの程度の割合で正規化後のオーディオを混合するか", - "切割使用的进程数": "切断に使用されるプロセス数", - "语音切割进程输出信息": "音声切断プロセス出力情報", + "很遗憾您这没有能用的显卡来支持您训练": "残念ながら、トレーニングをサポートする利用可能なグラフィックカードがありません", + "UVR5已开启": "UVR5がオンになっています", + "UVR5已关闭": "UVR5がオフになっています", + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアから導出される音声を広める者は、自己責任で行ってください。
この条件を認めない場合、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はルートディレクトリのLICENSEを参照してください。", + "0-前置数据集获取工具": "0-データセット取得ツールの事前処理", + "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5ボーカルアカンパニメント分離&リバーブおよびディレイ除去ツール", + "是否开启UVR5-WebUI": "UVR5-WebUIをオンにしますか", + "UVR5进程输出信息": "UVR5プロセスの出力情報", + "0b-语音切分工具": "0b-音声分割ツール", + "音频自动切分输入路径,可文件可文件夹": "オーディオの自動分割入力パス、ファイルまたはフォルダを指定できます", + "切分后的子音频的输出根目录": "分割後のサブオーディオの出力ルートディレクトリ", + "threshold:音量小于这个值视作静音的备选切割点": "閾値:この値未満の音量は静音と見なされ、代替のカットポイントとして扱われます", + "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:各セグメントの最小長さ。最初のセグメントが短すぎる場合、連続して後続のセグメントに接続され、この値を超えるまで続きます。", + "min_interval:最短切割间隔": "min_interval:最短カット間隔", + "hop_size:怎么算音量曲线,越小精度越大計算量越高(不是精度越大效果越好)": "hop_size:音量曲線を計算する方法。値が小さいほど精度が高くなり、計算量が増加します(精度が高いほど効果が良いわけではありません)。", + "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切り終えた後、最大でどれだけ静かにするか", + "开启语音切割": "音声の分割を開始", + "终止语音切割": "音声の分割を停止", + "max:归一化后最大值多少": "max:正規化後の最大値", + "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:正規化後のオーディオが入る割合", + "切割使用的进程数": "分割に使用されるプロセス数", + "语音切割进程输出信息": "音声分割プロセスの出力情報", "0c-中文批量离线ASR工具": "0c-中国語バッチオフラインASRツール", "开启离线批量ASR": "オフラインバッチASRを開始", - "终止ASR进程": "ASRプロセスを終了", - "批量ASR(中文only)输入文件夹路径": "バッチASR(中国語のみ)入力フォルダパス", - "ASR进程输出信息": "ASRプロセス出力情報", - "0d-语音文本校对标注工具": "0d-音声テキスト校正アノテーションツール", - "是否开启打标WebUI": "ラベリングWebUIを開始しますか", - "打标数据标注文件路径": "ラベリングデータアノテーションファイルパス", - "打标工具进程输出信息": "ラベリングツールプロセス出力情報", - "文本进程结束, SSL提取进程执行中": "テキストプロセス終了、SSL抽出プロセス実行中", - "文本进程结束, SSL提取进程结束": "テキストプロセス終了、SSL抽出プロセス終了", - "一键三连进程执行中": "ワンクリック三連プロセス実行中", - "一键三连进程结束": "ワンクリック三連プロセス終了", - "SoVITS训练进程执行中": "SoVITS訓練プロセス実行中", - "SoVITS训练进程结束": "SoVITS訓練プロセス終了", - "GPT训练进程执行中": "GPT訓練プロセス実行中", - "GPT训练进程结束": "GPT訓練プロセス終了", - "推理进程执行中": "推論プロセス実行中", - "推理进程结束": "推論プロセス終了", - "预训练的SoVITS-G模型路径": "事前学習済みのSoVITS-Gモデルのパス", - "预训练的SoVITS-D模型路径": "事前学習済みのSoVITS-Dモデルのパス", - "预训练的GPT模型路径": "事前学習済みのGPTモデルのパス", - "GPU卡号以-分割,每个卡号一个进程": "GPUカード番号は-で区切り、各カード番号に1つのプロセス", - "预训练的中文BERT模型路径": "事前学習済みの中国語BERTモデルのパス", - "开启文本获取": "テキスト取得を開始", - "终止文本获取进程": "テキスト取得プロセスを終了", - "文本进程输出信息": "テキストプロセス出力情報", - "预训练的SSL模型路径": "事前学習済みのSSLモデルのパス", + "终止ASR进程": "ASRプロセスを停止", + "批量ASR(中文only)输入文件夹路径": "バッチASR(中国語のみ)の入力フォルダパス", + "ASR进程输出信息": "ASRプロセスの出力情報", + "0d-语音文本校对标注工具": "0d-音声テキストの校正アノテーションツール", + "是否开启打标WebUI": "WebUIを使用したアノテーションを開始しますか", + "打标数据标注文件路径": "アノテーションデータのファイルパス", + "打标工具进程输出信息": "アノテーションツールプロセスの出力情報", + "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", + "*实验/模型名": "*実験/モデル名", + "显卡信息": "グラフィックカード情報", + "预训练的SoVITS-G模型路径": "事前にトレーニングされたSoVITS-Gモデルのパス", + "预训练的SoVITS-D模型路径": "事前にトレーニングされたSoVITS-Dモデルのパス", + "预训练的GPT模型路径": "事前にトレーニングされたGPTモデルのパス", + "1A-训练集格式化工具": "1A-トレーニングデータのフォーマットツール", + "输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/実験名ディレクトリには23456で始まるファイルとフォルダが含まれている必要があります", + "*文本标注文件": "*テキスト注釈ファイル", + "*训练集音频文件目录": "*トレーニングデータのオーディオファイルディレクトリ", + "训练集音频文件目录 拼接 list文件里波形对应的文件名。": "トレーニングデータのオーディオファイルディレクトリ。リストファイル内の波形に対応するファイル名を連結します。", + "1Aa-文本内容": "1Aa-テキストの内容", + "GPU卡号以-分割,每个卡号一个进程": "GPUカード番号はハイフンで区切り、各カード番号ごとに1つのプロセスが実行されます", + "预训练的中文BERT模型路径": "事前にトレーニングされた中文BERTモデルのパス", + "开启文本获取": "テキストの取得を開始", + "终止文本获取进程": "テキスト取得プロセスを停止", + "文本进程输出信息": "テキストプロセスの出力情報", + "1Ab-SSL自监督特征提取": "1Ab-SSLセルフスーパーバイズ特徴抽出", + "预训练的SSL模型路径": "事前にトレーニングされたSSLモデルのパス", "开启SSL提取": "SSL抽出を開始", - "终止SSL提取进程": "SSL抽出プロセスを終了", - "SSL进程输出信息": "SSLプロセス出力情報", - "开启语义token提取": "セマンティックトークン抽出を開始", - "终止语义token提取进程": "セマンティックトークン抽出プロセスを終了", - "语义token提取进程输出信息": "セマンティックトークン抽出プロセス出力情報", - "开启一键三连": "ワンクリック三連を開始", - "终止一键三连": "ワンクリック三連を終了", - "一键三连进程输出信息": "ワンクリック三連プロセス出力情報", - "1A-訓練集格式化工具": "1A-トレーニングセットフォーマットツール", - "输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/実験名ディレクトリには、23456で始まるファイルとフォルダが存在する必要があります", - "*文本标注文件": "*テキストアノテーションファイル", - "*训练集音频文件目录": "*トレーニングセットオーディオファイルディレクトリ", - "训练集音频文件目录-拼接-list文件里波形对应的文件名(不是全路径)。": "トレーニングセットオーディオファイルディレクトリ-結合-listファイル内の波形に対応するファイル名(フルパスではありません)。", - "1Aa-文本内容": "1Aa-テキスト内容", + "终止SSL提取进程": "SSL抽出プロセスを停止", + "SSL进程输出信息": "SSLプロセスの出力情報", "1Ac-语义token提取": "1Ac-セマンティックトークン抽出", - "1Aabc-训练集格式化一键三连": "1Aabc-トレーニングセットフォーマットワンクリック三連", - "1B-微调训练": "1B-微調整訓練", - "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。共有モデルファイルはSoVITS_weightsに出力されます。", - "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。共有モデルファイルはGPT_weightsに出力されます。", - "1C-推理": "1C-推論", - "2-GPT-SoVITS-变声": "2-GPT-SoVITS-ボイスチェンジ", - "开启SoVITS训练": "SoVITS訓練を開始", - "终止SoVITS训练": "SoVITS訓練を終了", - "SoVITS训练进程输出信息": "SoVITS訓練プロセス出力情報", - "开启GPT训练": "GPT訓練を開始", - "终止GPT训练": "GPT訓練を終了", - "GPT训练进程输出信息": "GPT訓練プロセス出力情報", - "是否开启TTS推理WebUI": "TTS推理WebUIを開始しますか", - "TTS推理WebUI进程输出信息": "TTS推理WebUIプロセス出力情報", - "施工中,请静候佳音": "工事中、お待ちください", - "*实验/模型名": "実験/モデル名", - "1A-训练集格式化工具": "1A-トレーニングセットフォーマットツール", - "1Ab-SSL自监督特征提取": "1Ab-SSL自己監督による特徴抽出", - "总训练轮数total_epoch,不建议太高": "トータルトレーニングラウンド数total_epoch、あまり高く設定しないことをお勧めします", + "开启语义token提取": "セマンティックトークン抽出を開始", + "终止语义token提取进程": "セマンティックトークン抽出プロセスを停止", + "语义token提取进程输出信息": "セマンティックトークン抽出プロセスの出力情報", + "1Aabc-训练集格式化一键三连": "1Aabc-トレーニングデータのフォーマットワンクリック三連", + "开启一键三连": "ワンクリック三連を開始", + "终止一键三连": "ワンクリック三連を停止", + "一键三连进程输出信息": "ワンクリック三連プロセスの出力情報", + "1B-微调训练": "1B-ファインチューニングトレーニング", + "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITSトレーニング。共有用のモデルファイルはSoVITS_weightsディレクトリに出力されます。", + "每张显卡的batch_size": "各グラフィックカードのバッチサイズ", + "总训练轮数total_epoch,不建议太高": "総トレーニングエポック数total_epoch、高すぎないようにお勧めします", "文本模块学习率权重": "テキストモジュールの学習率の重み", - "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "SoVITS_weightsとGPT_weightsに保存された訓練済みモデルを選択します。デフォルトの1つはベースモデルで、5秒間のZero Shot TTSを体験するために使用されます。", + "保存频率save_every_epoch": "保存頻度save_every_epoch", + "是否仅保存最新的ckpt文件以节省硬盘空间": "最新のckptファイルのみを保存してディスクスペースを節約するかどうか", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "各保存時間点で最終的な小さなモデルをweightsフォルダに保存するかどうか", + "开启SoVITS训练": "SoVITSトレーニングを開始", + "终止SoVITS训练": "SoVITSトレーニングを停止", + "SoVITS训练进程输出信息": "SoVITSトレーニングプロセスの出力情報", + "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPTトレーニング。共有用のモデルファイルはGPT_weightsディレクトリに出力されます。", + "总训练轮数total_epoch": "総トレーニングエポック数total_epoch", + "开启GPT训练": "GPTトレーニングを開始", + "终止GPT训练": "GPTトレーニングを停止", + "GPT训练进程输出信息": "GPTトレーニングプロセスの出力情報", + "1C-推理": "1C-推論", + "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "SoVITS_weightsおよびGPT_weightsに保存されたモデルを選択します。デフォルトのものはプレトレインであり、ゼロショットTTSを体験できます。", "*GPT模型列表": "*GPTモデルリスト", "*SoVITS模型列表": "*SoVITSモデルリスト", - "GPU卡号,只能填1个整数": "GPUカード番号、整数のみ入力可能", - "刷新模型路径": "モデルパスを更新", - "*请上传并填写参考信息": "*参考情報をアップロードして記入してください", - "请上传参考音频": "*参考音声をアップロードしてください", - "参考音频的文本": "*参考音声のテキスト", - "参考音频的语种": "参考音声の言語", - "*请填写需要合成的目标文本": "*合成する目標テキストを入力してください", - "需要合成的文本": "*合成するテキスト", - "需要合成的语种": "*合成する言語", - "合成语音": "音声合成", - "输出的语音": "*出力音声", - "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "テキスト分割ツール。長すぎるテキストを合成すると結果が必ずしも良くない可能性があるため、長すぎる場合は先に切ることをお勧めします。合成はテキストの改行に基づいて分割してから再結合します。", - "需要合成的切分前文本": "合成する前の分割テキストが必要", - "凑五句一切": "五文を一つにまとめる", - "凑50字一切": "50文字を一つにまとめる", - "按中文句号。切": "中国語の句点で切る。", + "GPU卡号,只能填1个整数": "GPU番号、1つの整数しか入力できません", + "刷新模型路径": "モデルのパスを更新", + "是否开启TTS推理WebUI": "TTS推論WebUIを開く", + "TTS推理WebUI进程输出信息": "TTS推論WebUIプロセスの出力情報", + "2-GPT-SoVITS-变声": "2-GPT-SoVITS-ボイスチェンジャー", + "施工中,请静候佳音": "施工中、お待ちください", + "TTS推理进程已开启": "TTS推論プロセスが開始されました", + "TTS推理进程已关闭": "TTS推論プロセスが終了しました", + "打标工具WebUI已开启": "校正ツールWebUIが開始されました", + "打标工具WebUI已关闭": "校正ツールWebUIが終了しました", + "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアからエクスポートされた音声を伝播する者は、自己の責任を負います。この条件を受け入れない場合は、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はLICENSEを参照してください。", + "*请上传并填写参考信息": "*参照情報をアップロードして記入してください", + "*请填写需要合成的目标文本": "*合成が必要な対象のテキストを記入してください", + "ASR任务开启:%s": "ASRタスクが開始されました:%s", + "GPT训练完成": "GPTトレーニングが完了しました", + "GPT训练开始:%s": "GPTトレーニングが開始されました:%s", + "SSL提取进程执行中": "SSL抽出プロセス実行中", + "SSL提取进程结束": "SSL抽出プロセスが終了しました", + "SoVITS训练完成": "SoVITSトレーニングが完了しました", + "SoVITS训练开始:%s": "SoVITSトレーニングが開始されました:%s", + "一键三连中途报错": "ワンクリックフォーマット中にエラーが発生しました", + "一键三连进程结束": "ワンクリックフォーマットが終了しました", + "中文": "中国語", + "凑50字一切": "50文字ずつカット", + "凑五句一切": "5つの文ごとにカット", "切分后文本": "分割後のテキスト", - "后续将支持混合语种编码文本输入。": "今後、混合言語エンコードテキストの入力をサポートします。" + "切割执行中": "オーディオの分割中", + "切割结束": "オーディオの分割が完了しました", + "参考音频的文本": "参照オーディオのテキスト", + "参考音频的语种": "参照オーディオの言語", + "合成语音": "推論を開始", + "后续将支持混合语种编码文本输入。": "後で混合言語コードテキストの入力がサポートされるようになります。", + "已有正在进行的ASR任务,需先终止才能开启下一次任务": "すでに進行中のASRタスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的GPT训练任务,需先终止才能开启下一次任务": "すでに進行中のGPTトレーニングタスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的SSL提取任务,需先终止才能开启下一次任务": "すでに進行中のSSL抽出タスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务": "すでに進行中のSoVITSトレーニングタスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的一键三连任务,需先终止才能开启下一次任务": "すでに進行中のワンクリックフォーマットタスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的切割任务,需先终止才能开启下一次任务": "すでに進行中のオーディオの分割タスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的文本任务,需先终止才能开启下一次任务": "すでに進行中のTTS校正タスクがあります。次のタスクを開始する前に停止してください", + "已有正在进行的语义token提取任务,需先终止才能开启下一次任务": "すでに進行中の意味トークン抽出タスクがあります。次のタスクを開始する前に停止してください", + "已终止ASR进程": "ASRタスクが終了しました", + "已终止GPT训练": "GPTトレーニングが終了しました", + "已终止SoVITS训练": "SoVITSトレーニングが終了しました", + "已终止所有1a进程": "すべての1aタスクが終了しました", + "已终止所有1b进程": "すべての1bタスクが終了しました", + "已终止所有一键三连进程": "すべてのワンクリックフォーマットタスクが終了しました", + "已终止所有切割进程": "すべてのオーディオの分割タスクが終了しました", + "已终止所有语义token进程": "すべての意味トークンタスクが終了しました", + "按中文句号。切": "中国語の句点でカット", + "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "テキストスライサーツール。長文を変換すると効果が不安定になる可能性があるため、長文の場合は事前に切り分けることをお勧めします。推論時には、テキストを個別に推論し、それを組み合わせて再構築します。", + "文本进程执行中": "テキスト処理中", + "文本进程结束": "テキスト処理が終了しました", + "日文": "日本語", + "英文": "英語", + "语义token提取进程执行中": "意味トークン抽出実行中", + "语义token提取进程结束": "意味トークン抽出が終了しました", + "请上传参考音频": "参照オーディオをアップロードしてください", + "输入路径不存在": "入力パスが存在しません", + "输入路径存在但既不是文件也不是文件夹": "入力ディレクトリが存在しますが、ファイルでもフォルダでもありません", + "输出的语音": "推論結果", + "进度:1a-done": "進捗:1a完了", + "进度:1a-done, 1b-ing": "進捗:1a完了、1b進行中", + "进度:1a-ing": "進捗:1a進行中", + "进度:1a1b-done": "進捗:1a1b完了", + "进度:1a1b-done, 1cing": "進捗:1a1b完了、1c進行中", + "进度:all-done": "進捗:all-done", + "需要合成的切分前文本": "推論が必要な分割前のテキスト", + "需要合成的文本": "推論テキスト", + "需要合成的语种": "推論テキストの言語", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": "3以上の場合:収穫音高の認識結果に中央値フィルタリングを適用します。値はフィルターの半径を表し、息遣いを減少させることができます。", + "A模型权重": "モデルAの重み (w):", + "A模型路径": "モデルAのパス:", + "B模型路径": "モデルBのパス:", + "E:\\语音音频+标注\\米津玄师\\src": "C:\\Users\\Desktop\\src", + "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線ファイル(オプション)。1行に1つの音高があります。デフォルトのF0とピッチ変調の代わりに使用します:", + "Index Rate": "インデックスレート", + "Onnx导出": "Onnxエクスポート", + "Onnx输出路径": "Onnxエクスポートパス:", + "RVC模型路径": "RVCモデルパス:", + "ckpt处理": "ckpt処理", + "harvest进程数": "harvestピッチアルゴリズムに使用するCPUプロセス数", + "index文件路径不可包含中文": "インデックスファイルパスには中文を含めないでください", + "pth文件路径不可包含中文": "pthファイルパスには中文を含めないでください", + "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "異なるプロセスカードの入力に使用するGPUインデックスを'-'で区切って入力します。例:0-0-1はGPU0で2つのプロセスを実行し、GPU1で1つのプロセスを実行します", + "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "ステップ1:実験構成を記入します。実験データは「logs」フォルダに保存され、各実験には別々のフォルダがあります。実験名のパスを手動で入力する必要があり、実験構成、ログ、トレーニングされたモデルファイルが含まれています。", + "step1:正在处理数据": "ステップ1:データ処理中", + "step2:正在提取音高&正在提取特征": "ステップ2:ピッチ抽出と特徴抽出中", + "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "ステップ2a:トレーニングフォルダ内のデコード可能なすべてのファイルを自動的にトラバースし、スライス正規化を実行します。実験ディレクトリに2つのwavフォルダが生成されます。現時点では、単一の歌手/スピーカーのトレーニングのみがサポートされています。", + "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "ステップ2b:CPUを使用してピッチを抽出します(モデルにピッチがある場合)、GPUを使用して特徴を抽出します(GPUインデックスを選択します):", + "step3: 填写训练设置, 开始训练模型和索引": "ステップ3:トレーニング設定を入力し、モデルとインデックスのトレーニングを開始します", + "step3a:正在训练模型": "ステップ3a:モデルのトレーニングが開始されました", + "一键训练": "ワンクリックトレーニング", + "也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルもインポートできます。フォルダパスが存在する場合、この入力は無視されます。", + "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "GPUインデックスを'-'で区切って入力します。例:0-1-2はGPU 0、1、および2を使用します。", + "伴奏人声分离&去混响&去回声": "ボーカル/伴奏の分離と残響の除去", + "使用模型采样率": "使用するモデルのサンプルレート", + "使用设备采样率": "使用デバイスのサンプルレート", + "保存名": "保存名:", + "保存的文件名, 默认空为和源文件同名": "保存ファイル名(デフォルト:元のファイルと同じ):", + "保存的模型名不带后缀": "保存されるモデル名(拡張子なし):", + "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "清濁音と呼吸音を保護し、電子音楽の撕裂などのアーティファクトを防ぎます。0.5まで引っ張ると無効になり、保護力を高めるには値を下げますが、索引の精度が低下する可能性があります。", + "修改": "変更", + "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報の変更('weights'フォルダから抽出された小さなモデルファイルのみサポート)", + "停止音频转换": "オーディオ変換を停止", + "全流程结束!": "すべてのプロセスが完了しました!", + "刷新音色列表和索引路径": "ボイスリストとインデックスパスをリフレッシュ", + "加载模型": "モデルの読み込み", + "加载预训练底模D路径": "事前にトレーニングされたベースモデルDのパスをロード:", + "加载预训练底模G路径": "事前にトレーニングされたベースモデルGのパスをロード:", + "单次推理": "単一推論", + "卸载音色省显存": "GPUメモリを節約するためにボイスをアンロード:", + "变调(整数, 半音数量, 升八度12降八度-12)": "トランスポーズ(整数、半音の数、8度上げ: 12、8度下げ: -12):", + "后处理重采样至最终采样率,0为不进行重采样": "後処理でオーディオを最終のサンプルレートに再サンプリングします。リサンプリングを行わない場合は0に設定してください:", + "否": "いいえ", + "启用相位声码器": "位相音声コーダーを有効にする", + "响应阈值": "応答閾値", + "响度因子": "音量ファクター", + "处理数据": "データ処理", + "导出Onnx模型": "Onnxモデルのエクスポート", + "导出文件格式": "エクスポートファイル形式", + "常见问题解答": "よくある質問 (FAQ)", + "常规设置": "一般的な設定", + "开始音频转换": "オーディオ変換を開始", + "性能设置": "性能設定", + "批量推理": "一括推論", + "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "一括変換。変換するオーディオファイルが含まれるフォルダを入力するか、複数のオーディオファイルをアップロードします。変換されたオーディオは指定されたフォルダ (デフォルト: 'opt') に出力されます。", + "指定输出主人声文件夹": "ボーカルの出力フォルダを指定:", + "指定输出文件夹": "出力フォルダの指定:", + "指定输出非主人声文件夹": "伴奏の出力フォルダを指定:", + "推理时间(ms):": "推論時間 (ms):", + "推理音色": "推論ボイス:", + "提取": "抽出", + "提取音高和处理数据使用的CPU进程数": "ピッチ抽出およびデータ処理に使用されるCPUプロセスの数:", + "是": "はい", + "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "すべてのトレーニングセットをGPUメモリにキャッシュするかどうか。小さなデータセット (10分以下) をキャッシュするとトレーニングが高速化されますが、大きなデータセットをキャッシュするとGPUメモリが消費され、あまり速度が向上しないかもしれません:", + "查看": "表示", + "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報を表示します ( 'weights' フォルダから抽出された小さなモデルファイルにのみ対応):", + "检索特征占比": "特徴の検索比率 (アクセントの強度を制御、高すぎるとアーティファクトが発生します):", + "模型": "モデル", + "模型推理": "モデル推論", + "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "モデル抽出 ( 'logs' フォルダ内の大きなファイルモデルのパスを入力)。トレーニングを途中で停止して手動で小さなモデルファイルを抽出および保存したい場合、または中間モデルをテストしたい場合に使用します:", + "模型是否带音高指导": "モデルにピッチガイダンスがあるかどうか:", + "模型是否带音高指导(唱歌一定要, 语音可以不要)": "モデルにピッチガイダンスがあるかどうか (歌唱には必須、音声にはオプション):", + "模型是否带音高指导,1是0否": "モデルにピッチガイダンスがあるかどうか (1: はい、0: いいえ):", + "模型版本型号": "モデルアーキテクチャバージョン:", + "模型融合, 可用于测试音色融合": "モデルフュージョン、音色フュージョンをテストするために使用できます", + "模型路径": "モデルへのパス:", + "淡入淡出长度": "フェードの長さ", + "版本": "バージョン", + "特徴提取": "特徴抽出", + "特徴检索库文件路径,为空则使用下拉的选择结果": "特徴インデックスファイルへのパス。空白の場合はドロップダウンから選択された結果が使用されます:", + "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性への変換では+12キーが推奨され、女性から男性への変換では-12キーが推奨されます。音域が広すぎて音声が歪む場合は、適切な音域に手動で調整することもできます。", + "目标采样率": "目標サンプルレート:", + "算法延迟(ms):": "アルゴリズムの遅延(ms):", + "自动检测index路径,下拉式选择(dropdown)": "indexパスを自動検出し、ドロップダウンから選択します:", + "融合": "フュージョン", + "要改的模型信息": "変更するモデル情報:", + "要置入的模型信息": "挿入するモデル情報:", + "训练": "トレーニング", + "训练模型": "モデルのトレーニング", + "训练特征索引": "特徴索引のトレーニング", + "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "トレーニングが完了しました。トレーニングログはコンソールまたは実験フォルダの 'train.log' ファイルで確認できます。", + "请指定说话人id": "話者/歌手のIDを指定してください:", + "请选择index文件": ".index ファイルを選択してください", + "请选择pth文件": ".pth ファイルを選択してください", + "请选择说话人id": "話者/歌手のIDを選択してください:", + "转换": "変換", + "输入实验名": "実験名を入力:", + "输入待处理音频文件夹路径": "処理するオーディオフォルダのパスを入力してください:", + "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "処理するオーディオフォルダのパスを入力してください (ファイルマネージャのアドレスバーからコピーしてください):", + "输入待处理音频文件路径(默认是正确格式示例)": "処理するオーディオファイルのパスを入力してください (デフォルトは正しい形式の例です):", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "音量エンベロープのスケーリングを調整します。0に近いほど、元のボーカルの音量に似ます。相対的に低い値に設定すると、ノイズをマスキングし、音量がより自然に聞こえるようになります。1に近いほど、一貫して大きな音量になります:", + "输入监听": "入力ボイスモニター", + "输入训练文件夹路径": "トレーニングフォルダのパスを入力してください:", + "输入设备": "入力デバイス", + "输入降噪": "ノイズリダクションの入力", + "输出信息": "出力情報", + "输出变声": "変換されたボイスの出力", + "输出设备": "出力デバイス", + "输出降噪": "ノイズリダクションの出力", + "输出音频(右下角三个点,点了可以下载)": "オーディオの出力 (右下隅の三点をクリックしてダウンロード)", + "选择.index文件": ".index ファイルを選択してください", + "选择.pth文件": ".pth ファイルを選択してください", + "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "音高抽出アルゴリズムを選択します。歌声を抽出する場合は 'pm' を使用して高速化できます。高品質な音声でパフォーマンスが向上するが、CPUの使用が悪化する場合は 'dio' を使用できます。 'harvest' は品質が向上しますが、遅いです。 'rmvpe' は最高の品質で、少ないGPUが必要です", + "选择音高提取算法,输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "音高抽出アルゴリズムを選択します。歌声を抽出する場合は 'pm' を使用して高速化できます。高品質な音声でパフォーマンスが向上するが、CPUの使用が悪化する場合は 'dio' を使用できます。 'harvest' は品質が向上しますが、遅いです。 'rmvpe' は最高の品質で、CPU/GPUの使用が少ないです", + "采样率:": "サンプルレート:", + "采样长度": "サンプル長", + "重载设备列表": "デバイスリストを再読み込み", + "音调设置": "ピッチ設定", + "音频设备(请使用同种类驱动)": "オーディオデバイス (同じタイプのドライバを使用してください)", + "音高算法": "音程検出アルゴリズム", + "额外推理时长": "追加推論時間" }