mirror of
https://github.com/RVC-Boss/GPT-SoVITS.git
synced 2025-12-19 03:29:15 +08:00
Merge branch 'main' of https://github.com/KakaruHayate/GPT-SoVITS
This commit is contained in:
commit
721ecd92f1
3
Docker/damo.sha256
Normal file
3
Docker/damo.sha256
Normal file
@ -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
|
||||
11
Docker/download.sh
Normal file
11
Docker/download.sh
Normal file
@ -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"
|
||||
12
Docker/links.sha256
Normal file
12
Docker/links.sha256
Normal file
@ -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
|
||||
34
Docker/links.txt
Normal file
34
Docker/links.txt
Normal file
@ -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
|
||||
53
Dockerfile
Normal file
53
Dockerfile
Normal file
@ -0,0 +1,53 @@
|
||||
# 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
|
||||
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
|
||||
|
||||
# Copy application
|
||||
WORKDIR /workspace
|
||||
COPY . /workspace
|
||||
|
||||
# Download models
|
||||
RUN chmod +x /workspace/Docker/download.sh && /workspace/Docker/download.sh
|
||||
|
||||
# 本应该从 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
|
||||
|
||||
# 先屏蔽掉,让容器里自己下载
|
||||
# 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)
|
||||
|
||||
#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
|
||||
|
||||
VOLUME /workspace/output
|
||||
VOLUME /workspace/logs
|
||||
VOLUME /workspace/SoVITS_weights
|
||||
|
||||
CMD ["python", "webui.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)
|
||||
|
||||
@ -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"
|
||||
@ -32,8 +33,6 @@ from time import time as ttime
|
||||
from module.mel_processing import spectrogram_torch
|
||||
from my_utils import load_audio
|
||||
from tools.i18n.i18n import I18nAuto
|
||||
import random
|
||||
import pandas as pd
|
||||
i18n = I18nAuto()
|
||||
|
||||
device = "cuda"
|
||||
@ -44,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")
|
||||
@ -59,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)
|
||||
@ -96,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))
|
||||
@ -327,48 +325,49 @@ 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 select_random_file(folder_path):
|
||||
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
|
||||
return os.path.join(folder_path, random.choice(files))
|
||||
|
||||
|
||||
def get_labels(csv_path):
|
||||
if csv_path:
|
||||
df = pd.read_csv(csv_path)
|
||||
return {"choices": df['clust'].unique().tolist(), "__type__": "update"}
|
||||
else:
|
||||
return {"choices": [], "__type__": "update"}
|
||||
|
||||
|
||||
def select_random_file_from_csv(csv_path, label, folder_path):
|
||||
if csv_path:
|
||||
df = pd.read_csv(csv_path)
|
||||
files = df[df['clust'] == label]['filename'].apply(os.path.basename).tolist()
|
||||
return os.path.join(folder_path, random.choice(files))
|
||||
else:
|
||||
return select_random_file(folder_path)
|
||||
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协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
|
||||
)
|
||||
# with gr.Tabs():
|
||||
# with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")):
|
||||
with gr.Group():
|
||||
gr.Markdown(value="随机抽取参考音频,可以导入csv文件限定抽取范围,csv第一列为filename,第二列为clust(类别标签)")
|
||||
gr.Markdown(value=i18n("模型切换"))
|
||||
with gr.Row():
|
||||
folder_path = gr.Textbox(label="请输入音频文件夹路径", value="")
|
||||
csv_path = gr.Textbox(label="请输入CSV文件路径(可选)", value="")
|
||||
label = gr.Dropdown(label="请选择一个标签(可选)", choices=[], value="")
|
||||
update_labels_button = gr.Button("更新标签", variant="primary")
|
||||
update_labels_button.click(get_labels, [csv_path], [label])
|
||||
random_file_button = gr.Button("随机选择音频文件", variant="primary")
|
||||
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")
|
||||
random_file_button.click(select_random_file_from_csv, [csv_path, label, folder_path], [inp_ref])
|
||||
prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="")
|
||||
prompt_language = gr.Dropdown(
|
||||
label=i18n("参考音频的语种"),choices=[i18n("中文"),i18n("英文"),i18n("日文")],value=i18n("中文")
|
||||
@ -402,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,
|
||||
)
|
||||
@ -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")
|
||||
@ -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,28 @@ 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_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):
|
||||
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 +98,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())
|
||||
@ -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 = {
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
32
README.md
32
README.md
@ -52,16 +52,11 @@ 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
|
||||
|
||||
```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_fast
|
||||
```
|
||||
|
||||
#### Additional Requirements
|
||||
@ -107,6 +102,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:
|
||||
|
||||
@ -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"
|
||||
|
||||
31
docker-compose.yaml
Normal file
31
docker-compose.yaml
Normal file
@ -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
|
||||
@ -10,16 +10,22 @@
|
||||
|
||||
5-清理TEMP文件夹缓存音频等文件
|
||||
|
||||
6-在参考音频结尾留空0.3s,削弱合成音频包含参考音频结尾的问题
|
||||
6-大幅削弱合成音频包含参考音频结尾的问题
|
||||
|
||||
待修复:
|
||||
### 20240122更新
|
||||
|
||||
1-过短输出文件返回重复参考音频的问题
|
||||
1-修复过短输出文件返回重复参考音频的问题。
|
||||
|
||||
2-batch size超过条数导致微调有问题
|
||||
2-经测试,英文日文训练原生支持(日文训练需要根目录不含非英文等特殊字符)。
|
||||
|
||||
3-hubert提取在half下出现nan概率更高的问题
|
||||
3-音频路径检查。如果尝试读取输入错的路径报错路径不存在,而非ffmpeg错误。
|
||||
|
||||
高优:
|
||||
### 20240123更新
|
||||
|
||||
支持英文日文训练
|
||||
1-解决hubert提取nan导致SoVITS/GPT训练报错ZeroDivisionError的问题
|
||||
|
||||
2-支持推理界面快速切换模型
|
||||
|
||||
3-优化模型文件排序逻辑
|
||||
|
||||
4-中文分词使用jieba_fast代替jieba
|
||||
|
||||
@ -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
|
||||
```
|
||||
|
||||
#### 额外要求
|
||||
@ -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
|
||||
```
|
||||
|
||||
|
||||
### 预训练模型
|
||||
|
||||
|
||||
|
||||
@ -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分間のトレーニングデータでモデルを微調整し、音声の類似性とリアリズムを向上。
|
||||
|
||||
@ -48,16 +48,11 @@ conda activate GPTSoVits
|
||||
bash install.sh
|
||||
```
|
||||
### 手動インストール
|
||||
#### python3.9 用の distutils がインストールされていることを確認する
|
||||
|
||||
```bash
|
||||
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
|
||||
```
|
||||
|
||||
#### 追加要件
|
||||
@ -93,6 +88,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
|
||||
```
|
||||
|
||||
|
||||
### 事前訓練済みモデル
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
"UVR5已开启": "UVR5 opened ",
|
||||
"UVR5已关闭": "UVR5 closed",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "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. <br>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 <b>Agreement-LICENSE.txt</b> 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",
|
||||
|
||||
@ -1,135 +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",
|
||||
"很遗憾您这没有能用的显卡来支持您训练": "残念ながら、トレーニングをサポートする利用可能なグラフィックカードがありません",
|
||||
"UVR5已开启": "UVR5がオンになっています",
|
||||
"UVR5已关闭": "UVR5がオフになっています",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアから導出される音声を広める者は、自己責任で行ってください。<br>この条件を認めない場合、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はルートディレクトリの<b>LICENSE</b>を参照してください。",
|
||||
"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を使用したアノテーションを開始しますか",
|
||||
"打标数据标注文件路径": "アノテーションデータのファイルパス",
|
||||
"打标工具进程输出信息": "アノテーションツールプロセスの出力情報",
|
||||
"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プロセスの出力情報",
|
||||
"1Ac-语义token提取": "1Ac-セマンティックトークン抽出",
|
||||
"开启语义token提取": "セマンティックトークン抽出を開始",
|
||||
"终止语义token提取进程": "セマンティックトークン抽出プロセスを停止",
|
||||
"语义token提取进程输出信息": "セマンティックトークン抽出プロセスの出力情報",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-トレーニングデータのフォーマットワンクリック三連",
|
||||
"开启一键三连": "ワンクリック三連を開始",
|
||||
"终止一键三连": "ワンクリック三連を停止",
|
||||
"一键三连进程输出信息": "ワンクリック三連プロセスの出力情報",
|
||||
"1B-微调训练": "1B-ファインチューニングトレーニング",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITSトレーニング。共有用のモデルファイルはSoVITS_weightsディレクトリに出力されます。",
|
||||
"每张显卡的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に保存されたモデルを選択します。デフォルトのものはプレトレインであり、ゼロショット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文字ずつカット",
|
||||
"凑五句一切": "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プロセス数",
|
||||
"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:トレーニング中のモデル",
|
||||
"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:モデルのトレーニングが開始されました",
|
||||
"一键训练": "ワンクリックトレーニング",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルをインポートすることもできます。フォルダパスが存在する場合、この入力は無視されます。",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。 <br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br> (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br> (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "UVR5モデルを使用したボーカル伴奏の分離バッチ処理。<br>有効なフォルダーパスフォーマットの例: D:\\path\\to\\input\\folder (エクスプローラーのアドレスバーからコピーします)。<br>モデルは三つのカテゴリに分かれています:<br>1. ボーカルを保持: ハーモニーのないオーディオに対してこれを選択します。HP5よりもボーカルをより良く保持します。HP2とHP3の二つの内蔵モデルが含まれています。HP3は伴奏をわずかに漏らす可能性がありますが、HP2よりもわずかにボーカルをより良く保持します。<br>2. 主なボーカルのみを保持: ハーモニーのあるオーディオに対してこれを選択します。主なボーカルを弱める可能性があります。HP5の一つの内蔵モデルが含まれています。<br>3. ディリバーブとディレイモデル (by FoxJoy):<br> (1) MDX-Net: ステレオリバーブの除去に最適な選択肢ですが、モノリバーブは除去できません;<br> (234) DeEcho: ディレイ効果を除去します。AggressiveモードはNormalモードよりも徹底的に除去します。DeReverbはさらにリバーブを除去し、モノリバーブを除去することができますが、高周波のリバーブが強い内容に対しては非常に効果的ではありません。<br>ディリバーブ/ディレイに関する注意点:<br>1. DeEcho-DeReverbモデルの処理時間は、他の二つのDeEchoモデルの約二倍です。<br>2. MDX-Net-Dereverbモデルは非常に遅いです。<br>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の効果が低下する可能性があります。",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルもインポートできます。フォルダパスが存在する場合、この入力は無視されます。",
|
||||
"以-分隔输入使用的卡号, 例如 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モデルのパス",
|
||||
"单次推理": "单次推理",
|
||||
"卸载音色省显存": "音源を削除してメモリを節約",
|
||||
"变调(整数, 半音数量, 升八度12降八度-12)": "ピッチ変更(整数、半音数、上下オクターブ12-12)",
|
||||
"后处理重采样至最终采样率,0为不进行重采样": "最終的なサンプリングレートへのポストプロセッシングのリサンプリング リサンプリングしない場合は0",
|
||||
"修改模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報の変更('weights'フォルダから抽出された小さなモデルファイルのみサポート)",
|
||||
"停止音频转换": "オーディオ変換を停止",
|
||||
"全流程结束!": "すべてのプロセスが完了しました!",
|
||||
"刷新音色列表和索引路径": "ボイスリストとインデックスパスをリフレッシュ",
|
||||
"加载模型": "モデルの読み込み",
|
||||
"加载预训练底模D路径": "事前にトレーニングされたベースモデルDのパスをロード:",
|
||||
"加载预训练底模G路径": "事前にトレーニングされたベースモデルGのパスをロード:",
|
||||
"单次推理": "単一推論",
|
||||
"卸载音色省显存": "GPUメモリを節約するためにボイスをアンロード:",
|
||||
"变调(整数, 半音数量, 升八度12降八度-12)": "トランスポーズ(整数、半音の数、8度上げ: 12、8度下げ: -12):",
|
||||
"后处理重采样至最终采样率,0为不进行重采样": "後処理でオーディオを最終のサンプルレートに再サンプリングします。リサンプリングを行わない場合は0に設定してください:",
|
||||
"否": "いいえ",
|
||||
"启用相位声码器": "启用相位声码器",
|
||||
"响应阈值": "反応閾値",
|
||||
"响度因子": "ラウドネス係数",
|
||||
"启用相位声码器": "位相音声コーダーを有効にする",
|
||||
"响应阈值": "応答閾値",
|
||||
"响度因子": "音量ファクター",
|
||||
"处理数据": "データ処理",
|
||||
"导出Onnx模型": "Onnxに変換",
|
||||
"导出文件格式": "エクスポート形式",
|
||||
"常见问题解答": "よくある質問",
|
||||
"常规设置": "一般設定",
|
||||
"开始音频转换": "音声変換を開始",
|
||||
"很遗憾您这没有能用的显卡来支持您训练": "トレーニングに対応したGPUが動作しないのは残念です。",
|
||||
"性能设置": "パフォーマンス設定",
|
||||
"总训练轮数total_epoch": "総エポック数",
|
||||
"批量推理": "批量推理",
|
||||
"批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "一括変換、変換する音声フォルダを入力、または複数の音声ファイルをアップロードし、指定したフォルダ(デフォルトのopt)に変換した音声を出力します。",
|
||||
"指定输出主人声文件夹": "マスターの出力音声フォルダーを指定する",
|
||||
"指定输出文件夹": "出力フォルダを指定してください",
|
||||
"指定输出非主人声文件夹": "マスター以外の出力音声フォルダーを指定する",
|
||||
"推理时间(ms):": "推論時間(ms):",
|
||||
"推理音色": "音源推論",
|
||||
"导出Onnx模型": "Onnxモデルのエクスポート",
|
||||
"导出文件格式": "エクスポートファイル形式",
|
||||
"常见问题解答": "よくある質問 (FAQ)",
|
||||
"常规设置": "一般的な設定",
|
||||
"开始音频转换": "オーディオ変換を開始",
|
||||
"性能设置": "性能設定",
|
||||
"批量推理": "一括推論",
|
||||
"批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "一括変換。変換するオーディオファイルが含まれるフォルダを入力するか、複数のオーディオファイルをアップロードします。変換されたオーディオは指定されたフォルダ (デフォルト: 'opt') に出力されます。",
|
||||
"指定输出主人声文件夹": "ボーカルの出力フォルダを指定:",
|
||||
"指定输出文件夹": "出力フォルダの指定:",
|
||||
"指定输出非主人声文件夹": "伴奏の出力フォルダを指定:",
|
||||
"推理时间(ms):": "推論時間 (ms):",
|
||||
"推理音色": "推論ボイス:",
|
||||
"提取": "抽出",
|
||||
"提取音高和处理数据使用的CPU进程数": "ピッチの抽出やデータ処理に使用するCPUスレッド数",
|
||||
"提取音高和处理数据使用的CPU进程数": "ピッチ抽出およびデータ処理に使用されるCPUプロセスの数:",
|
||||
"是": "はい",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "ハードディスク容量を節約するため、最新のckptファイルのみを保存しますか?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "各保存時点の小モデルを全部weightsフォルダに保存するかどうか",
|
||||
"是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "すべてのトレーニングデータをメモリにキャッシュするかどうか。10分以下の小さなデータはキャッシュしてトレーニングを高速化できますが、大きなデータをキャッシュするとメモリが破裂し、あまり速度が上がりません。",
|
||||
"显卡信息": "GPU情報",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本ソフトウェアはMITライセンスに基づくオープンソースであり、製作者は本ソフトウェアに対していかなる責任を持ちません。本ソフトウェアの利用者および本ソフトウェアから派生した音源(成果物)を配布する者は、本ソフトウェアに対して自身で責任を負うものとします。 <br>この条項に同意しない場合、パッケージ内のコードやファイルを使用や参照を禁じます。詳しくは<b>LICENSE</b>をご覧ください。",
|
||||
"是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "すべてのトレーニングセットをGPUメモリにキャッシュするかどうか。小さなデータセット (10分以下) をキャッシュするとトレーニングが高速化されますが、大きなデータセットをキャッシュするとGPUメモリが消費され、あまり速度が向上しないかもしれません:",
|
||||
"查看": "表示",
|
||||
"查看模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報を表示する(小さいモデルファイルはweightsフォルダーからのみサポートされています)",
|
||||
"检索特征占比": "検索特徴率",
|
||||
"查看模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報を表示します ( 'weights' フォルダから抽出された小さなモデルファイルにのみ対応):",
|
||||
"检索特征占比": "特徴の検索比率 (アクセントの強度を制御、高すぎるとアーティファクトが発生します):",
|
||||
"模型": "モデル",
|
||||
"模型推理": "モデル推論",
|
||||
"模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "モデル抽出(ログフォルダー内の大きなファイルのモデルパスを入力)、モデルを半分までトレーニングし、自動的に小さいファイルモデルを保存しなかったり、中間モデルをテストしたい場合に適用されます。",
|
||||
"模型是否带音高指导": "モデルに音高ガイドを付けるかどうか",
|
||||
"模型是否带音高指导(唱歌一定要, 语音可以不要)": "モデルに音高ガイドがあるかどうか(歌唱には必要ですが、音声には必要ありません)",
|
||||
"模型是否带音高指导,1是0否": "モデルに音高ガイドを付けるかどうか、1は付ける、0は付けない",
|
||||
"模型版本型号": "モデルのバージョン",
|
||||
"模型融合, 可用于测试音色融合": "モデルのマージ、音源のマージテストに使用できます",
|
||||
"模型路径": "モデルパス",
|
||||
"每张显卡的batch_size": "GPUごとのバッチサイズ",
|
||||
"淡入淡出长度": "フェードイン/フェードアウト長",
|
||||
"模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "モデル抽出 ( 'logs' フォルダ内の大きなファイルモデルのパスを入力)。トレーニングを途中で停止して手動で小さなモデルファイルを抽出および保存したい場合、または中間モデルをテストしたい場合に使用します:",
|
||||
"模型是否带音高指导": "モデルにピッチガイダンスがあるかどうか:",
|
||||
"模型是否带音高指导(唱歌一定要, 语音可以不要)": "モデルにピッチガイダンスがあるかどうか (歌唱には必須、音声にはオプション):",
|
||||
"模型是否带音高指导,1是0否": "モデルにピッチガイダンスがあるかどうか (1: はい、0: いいえ):",
|
||||
"模型版本型号": "モデルアーキテクチャバージョン:",
|
||||
"模型融合, 可用于测试音色融合": "モデルフュージョン、音色フュージョンをテストするために使用できます",
|
||||
"模型路径": "モデルへのパス:",
|
||||
"淡入淡出长度": "フェードの長さ",
|
||||
"版本": "バージョン",
|
||||
"特征提取": "特徴抽出",
|
||||
"特征检索库文件路径,为空则使用下拉的选择结果": "特徴検索ライブラリへのパス 空の場合はドロップダウンで選択",
|
||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性へは+12キーをお勧めします。女性から男性へは-12キーをお勧めします。音域が広すぎて音質が劣化した場合は、適切な音域に自分で調整してください。",
|
||||
"目标采样率": "目標サンプリングレート",
|
||||
"算法延迟(ms):": "算法延迟(ms):",
|
||||
"自动检测index路径,下拉式选择(dropdown)": "インデックスパスの自動検出 ドロップダウンで選択",
|
||||
"融合": "マージ",
|
||||
"要改的模型信息": "変更するモデル情報",
|
||||
"要置入的模型信息": "挿入するモデル情報",
|
||||
"特徴提取": "特徴抽出",
|
||||
"特徴检索库文件路径,为空则使用下拉的选择结果": "特徴インデックスファイルへのパス。空白の場合はドロップダウンから選択された結果が使用されます:",
|
||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性への変換では+12キーが推奨され、女性から男性への変換では-12キーが推奨されます。音域が広すぎて音声が歪む場合は、適切な音域に手動で調整することもできます。",
|
||||
"目标采样率": "目標サンプルレート:",
|
||||
"算法延迟(ms):": "アルゴリズムの遅延(ms):",
|
||||
"自动检测index路径,下拉式选择(dropdown)": "indexパスを自動検出し、ドロップダウンから選択します:",
|
||||
"融合": "フュージョン",
|
||||
"要改的模型信息": "変更するモデル情報:",
|
||||
"要置入的模型信息": "挿入するモデル情報:",
|
||||
"训练": "トレーニング",
|
||||
"训练模型": "モデルのトレーニング",
|
||||
"训练特征索引": "特徴インデックスのトレーニング",
|
||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "トレーニング終了時に、トレーニングログやフォルダ内のtrain.logを確認することができます",
|
||||
"请指定说话人id": "話者IDを指定してください",
|
||||
"请选择index文件": "indexファイルを選択してください",
|
||||
"请选择pth文件": "pthファイルを選択してください",
|
||||
"请选择说话人id": "話者IDを選択してください",
|
||||
"训练特征索引": "特徴索引のトレーニング",
|
||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "トレーニングが完了しました。トレーニングログはコンソールまたは実験フォルダの 'train.log' ファイルで確認できます。",
|
||||
"请指定说话人id": "話者/歌手のIDを指定してください:",
|
||||
"请选择index文件": ".index ファイルを選択してください",
|
||||
"请选择pth文件": ".pth ファイルを選択してください",
|
||||
"请选择说话人id": "話者/歌手のIDを選択してください:",
|
||||
"转换": "変換",
|
||||
"输入实验名": "モデル名",
|
||||
"输入待处理音频文件夹路径": "処理するオーディオファイルのフォルダパスを入力してください",
|
||||
"输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "処理対象音声フォルダーのパスを入力してください(エクスプローラーのアドレスバーからコピーしてください)",
|
||||
"输入待处理音频文件路径(默认是正确格式示例)": "処理対象音声ファイルのパスを入力してください(デフォルトは正しいフォーマットの例です)",
|
||||
"输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "入力ソースの音量エンベロープと出力音量エンベロープの融合率 1に近づくほど、出力音量エンベロープの割合が高くなる",
|
||||
"输入监听": "输入监听",
|
||||
"输入训练文件夹路径": "トレーニング用フォルダのパスを入力してください",
|
||||
"输入实验名": "実験名を入力:",
|
||||
"输入待处理音频文件夹路径": "処理するオーディオフォルダのパスを入力してください:",
|
||||
"输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "処理するオーディオフォルダのパスを入力してください (ファイルマネージャのアドレスバーからコピーしてください):",
|
||||
"输入待处理音频文件路径(默认是正确格式示例)": "処理するオーディオファイルのパスを入力してください (デフォルトは正しい形式の例です):",
|
||||
"输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "音量エンベロープのスケーリングを調整します。0に近いほど、元のボーカルの音量に似ます。相対的に低い値に設定すると、ノイズをマスキングし、音量がより自然に聞こえるようになります。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を若干食います。",
|
||||
"采样率:": "采样率:",
|
||||
"输出降噪": "ノイズリダクションの出力",
|
||||
"输出音频(右下角三个点,点了可以下载)": "オーディオの出力 (右下隅の三点をクリックしてダウンロード)",
|
||||
"选择.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の使用が少ないです",
|
||||
"采样率:": "サンプルレート:",
|
||||
"采样长度": "サンプル長",
|
||||
"重载设备列表": "デバイスリストをリロードする",
|
||||
"音调设置": "音程設定",
|
||||
"音频设备(请使用同种类驱动)": "オーディオデバイス(同じ種類のドライバーを使用してください)",
|
||||
"音高算法": "ピッチアルゴリズム",
|
||||
"重载设备列表": "デバイスリストを再読み込み",
|
||||
"音调设置": "ピッチ設定",
|
||||
"音频设备(请使用同种类驱动)": "オーディオデバイス (同じタイプのドライバを使用してください)",
|
||||
"音高算法": "音程検出アルゴリズム",
|
||||
"额外推理时长": "追加推論時間"
|
||||
}
|
||||
|
||||
@ -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模型。 <br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br> (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br> (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "人声伴奏分离批量处理, 使用UVR5模型。 <br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br> (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br> (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>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协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.",
|
||||
"查看": "查看",
|
||||
"查看模型信息(仅支持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协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.",
|
||||
"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模型。 <br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br> (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br> (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "人声伴奏分离批量处理, 使用UVR5模型。 <br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br> (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br> (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>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",
|
||||
"采样率:": "采样率:",
|
||||
"采样长度": "采样长度",
|
||||
"重载设备列表": "重载设备列表",
|
||||
"音调设置": "音调设置",
|
||||
"音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)",
|
||||
"音高算法": "音高算法",
|
||||
"额外推理时长": "额外推理时长"
|
||||
}
|
||||
|
||||
@ -20,4 +20,4 @@ transformers
|
||||
chardet
|
||||
PyYAML
|
||||
psutil
|
||||
jieba
|
||||
jieba_fast
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import platform
|
||||
import platform,os
|
||||
import ffmpeg
|
||||
import numpy as np
|
||||
|
||||
|
||||
@ -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 = []
|
||||
|
||||
@ -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协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>."
|
||||
i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
|
||||
)
|
||||
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, # 先不开放调整
|
||||
|
||||
27
webui.py
27
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
|
||||
@ -442,7 +449,7 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
|
||||
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)
|
||||
@ -475,7 +482,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,
|
||||
@ -568,7 +575,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
||||
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:
|
||||
@ -704,9 +711,9 @@ with gr.Blocks(title="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 +724,7 @@ with gr.Blocks(title="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)
|
||||
@ -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])
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user