Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	.gitignore
#	requirements.txt
This commit is contained in:
Leon 2024-08-12 02:59:42 +08:00
commit 2b6e46f25e
73 changed files with 51144 additions and 1628 deletions

5
.gitignore vendored
View File

@ -1,4 +1,5 @@
.DS_Store .DS_Store
.vscode
__pycache__ __pycache__
*.pyc *.pyc
env env
@ -9,5 +10,7 @@ logs
reference reference
GPT_weights GPT_weights
SoVITS_weights SoVITS_weights
GPT_weights_v2
SoVITS_weights_v2
TEMP TEMP
outputs weight.json

View File

@ -15,6 +15,8 @@ from torch.utils.data import DataLoader
from torch.utils.data import Dataset from torch.utils.data import Dataset
from transformers import AutoTokenizer from transformers import AutoTokenizer
version = os.environ.get('version',None)
from text import cleaned_text_to_sequence from text import cleaned_text_to_sequence
# from config import exp_dir # from config import exp_dir
@ -149,7 +151,7 @@ class Text2SemanticDataset(Dataset):
phoneme = phoneme.split(" ") phoneme = phoneme.split(" ")
try: try:
phoneme_ids = cleaned_text_to_sequence(phoneme) phoneme_ids = cleaned_text_to_sequence(phoneme, version)
except: except:
traceback.print_exc() traceback.print_exc()
# print(f"{item_name} not in self.phoneme_data !") # print(f"{item_name} not in self.phoneme_data !")

View File

@ -0,0 +1,31 @@
train:
seed: 1234
epochs: 20
batch_size: 8
save_every_n_epoch: 1
precision: 16-mixed
gradient_clip: 1.0
optimizer:
lr: 0.01
lr_init: 0.00001
lr_end: 0.0001
warmup_steps: 2000
decay_steps: 40000
data:
max_eval_sample: 8
max_sec: 54
num_workers: 4
pad_val: 1024 # same with EOS in model
model:
vocab_size: 1025
phoneme_vocab_size: 732
embedding_dim: 512
hidden_dim: 512
head: 16
linear_units: 2048
n_layer: 24
dropout: 0
EOS: 1024
random_bert: 0
inference:
top_k: 15

5
GPT_SoVITS/download.py Normal file
View File

@ -0,0 +1,5 @@
import os, sys
now_dir = os.getcwd()
sys.path.insert(0, now_dir)
from .text.g2pw import G2PWPinyin
g2pw = G2PWPinyin(model_dir="GPT_SoVITS/text/G2PWModel",model_source="GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large",v_to_u=False, neutral_tone_with_five=True)

View File

@ -4,8 +4,11 @@ import librosa
import torch import torch
import torch.nn.functional as F import torch.nn.functional as F
import soundfile as sf import soundfile as sf
import logging import os
from transformers import logging as tf_logging
tf_logging.set_verbosity_error()
import logging
logging.getLogger("numba").setLevel(logging.WARNING) logging.getLogger("numba").setLevel(logging.WARNING)
from transformers import ( from transformers import (
@ -22,9 +25,11 @@ cnhubert_base_path = None
class CNHubert(nn.Module): class CNHubert(nn.Module):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.model = HubertModel.from_pretrained(cnhubert_base_path) if os.path.exists(cnhubert_base_path):...
else:raise FileNotFoundError(cnhubert_base_path)
self.model = HubertModel.from_pretrained(cnhubert_base_path, local_files_only=True)
self.feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained( self.feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(
cnhubert_base_path cnhubert_base_path, local_files_only=True
) )
def forward(self, x): def forward(self, x):

View File

@ -6,8 +6,9 @@
全部按英文识别 全部按英文识别
全部按日文识别 全部按日文识别
''' '''
import os, re, logging import logging
import LangSegment import traceback
logging.getLogger("markdown_it").setLevel(logging.ERROR) logging.getLogger("markdown_it").setLevel(logging.ERROR)
logging.getLogger("urllib3").setLevel(logging.ERROR) logging.getLogger("urllib3").setLevel(logging.ERROR)
logging.getLogger("httpcore").setLevel(logging.ERROR) logging.getLogger("httpcore").setLevel(logging.ERROR)
@ -15,28 +16,46 @@ logging.getLogger("httpx").setLevel(logging.ERROR)
logging.getLogger("asyncio").setLevel(logging.ERROR) logging.getLogger("asyncio").setLevel(logging.ERROR)
logging.getLogger("charset_normalizer").setLevel(logging.ERROR) logging.getLogger("charset_normalizer").setLevel(logging.ERROR)
logging.getLogger("torchaudio._extension").setLevel(logging.ERROR) logging.getLogger("torchaudio._extension").setLevel(logging.ERROR)
logging.getLogger("multipart.multipart").setLevel(logging.ERROR)
import LangSegment, os, re, sys, json
import pdb import pdb
import torch import torch
if os.path.exists("./gweight.txt"): version=os.environ.get("version","v2")
with open("./gweight.txt", 'r', encoding="utf-8") as file: pretrained_sovits_name=["GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth", "GPT_SoVITS/pretrained_models/s2G488k.pth"]
gweight_data = file.read() pretrained_gpt_name=["GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt", "GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt"]
gpt_path = os.environ.get(
"gpt_path", gweight_data)
else:
gpt_path = os.environ.get(
"gpt_path", "GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt")
if os.path.exists("./sweight.txt"): _ =[[],[]]
with open("./sweight.txt", 'r', encoding="utf-8") as file: for i in range(2):
sweight_data = file.read() if os.path.exists(pretrained_gpt_name[i]):
sovits_path = os.environ.get("sovits_path", sweight_data) _[0].append(pretrained_gpt_name[i])
if os.path.exists(pretrained_sovits_name[i]):
_[-1].append(pretrained_sovits_name[i])
pretrained_gpt_name,pretrained_sovits_name = _
if os.path.exists(f"./weight.json"):
pass
else: else:
sovits_path = os.environ.get("sovits_path", "GPT_SoVITS/pretrained_models/s2G488k.pth") with open(f"./weight.json", 'w', encoding="utf-8") as file:json.dump({'GPT':{},'SoVITS':{}},file)
with open(f"./weight.json", 'r', encoding="utf-8") as file:
weight_data = file.read()
weight_data=json.loads(weight_data)
gpt_path = os.environ.get(
"gpt_path", weight_data.get('GPT',{}).get(version,pretrained_gpt_name))
sovits_path = os.environ.get(
"sovits_path", weight_data.get('SoVITS',{}).get(version,pretrained_sovits_name))
if isinstance(gpt_path,list):
gpt_path = gpt_path[0]
if isinstance(sovits_path,list):
sovits_path = sovits_path[0]
# gpt_path = os.environ.get( # gpt_path = os.environ.get(
# "gpt_path", "pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt" # "gpt_path", pretrained_gpt_name
# ) # )
# sovits_path = os.environ.get("sovits_path", "pretrained_models/s2G488k.pth") # sovits_path = os.environ.get("sovits_path", pretrained_sovits_name)
cnhubert_base_path = os.environ.get( cnhubert_base_path = os.environ.get(
"cnhubert_base_path", "GPT_SoVITS/pretrained_models/chinese-hubert-base" "cnhubert_base_path", "GPT_SoVITS/pretrained_models/chinese-hubert-base"
) )
@ -66,9 +85,11 @@ from text.cleaner import clean_text
from time import time as ttime from time import time as ttime
from module.mel_processing import spectrogram_torch from module.mel_processing import spectrogram_torch
from tools.my_utils import load_audio from tools.my_utils import load_audio
from tools.i18n.i18n import I18nAuto from tools.i18n.i18n import I18nAuto, scan_language_list
i18n = I18nAuto() language=os.environ.get("language","Auto")
language=sys.argv[-1] if sys.argv[-1] in scan_language_list() else language
i18n = I18nAuto(language=language)
# os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 确保直接启动推理UI时也能够设置。 # os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 确保直接启动推理UI时也能够设置。
@ -77,6 +98,29 @@ if torch.cuda.is_available():
else: else:
device = "cpu" device = "cpu"
dict_language_v1 = {
i18n("中文"): "all_zh",#全部按中文识别
i18n("英文"): "en",#全部按英文识别#######不变
i18n("日文"): "all_ja",#全部按日文识别
i18n("中英混合"): "zh",#按中英混合识别####不变
i18n("日英混合"): "ja",#按日英混合识别####不变
i18n("多语种混合"): "auto",#多语种启动切分识别语种
}
dict_language_v2 = {
i18n("中文"): "all_zh",#全部按中文识别
i18n("英文"): "en",#全部按英文识别#######不变
i18n("日文"): "all_ja",#全部按日文识别
i18n("粤语"): "all_yue",#全部按中文识别
i18n("韩文"): "all_ko",#全部按韩文识别
i18n("中英混合"): "zh",#按中英混合识别####不变
i18n("日英混合"): "ja",#按日英混合识别####不变
i18n("粤英混合"): "yue",#按粤英混合识别####不变
i18n("韩英混合"): "ko",#按韩英混合识别####不变
i18n("多语种混合"): "auto",#多语种启动切分识别语种
i18n("多语种混合(粤语)"): "auto_yue",#多语种启动切分识别语种
}
dict_language = dict_language_v1 if version =='v1' else dict_language_v2
tokenizer = AutoTokenizer.from_pretrained(bert_path) tokenizer = AutoTokenizer.from_pretrained(bert_path)
bert_model = AutoModelForMaskedLM.from_pretrained(bert_path) bert_model = AutoModelForMaskedLM.from_pretrained(bert_path)
if is_half == True: if is_half == True:
@ -136,12 +180,18 @@ else:
ssl_model = ssl_model.to(device) ssl_model = ssl_model.to(device)
def change_sovits_weights(sovits_path): def change_sovits_weights(sovits_path,prompt_language=None,text_language=None):
global vq_model, hps global vq_model, hps, version, dict_language
dict_s2 = torch.load(sovits_path, map_location="cpu") dict_s2 = torch.load(sovits_path, map_location="cpu")
hps = dict_s2["config"] hps = dict_s2["config"]
hps = DictToAttrRecursive(hps) hps = DictToAttrRecursive(hps)
hps.model.semantic_frame_rate = "25hz" hps.model.semantic_frame_rate = "25hz"
if dict_s2['weight']['enc_p.text_embedding.weight'].shape[0] == 322:
hps.model.version = "v1"
else:
hps.model.version = "v2"
version = hps.model.version
# print("sovits版本:",hps.model.version)
vq_model = SynthesizerTrn( vq_model = SynthesizerTrn(
hps.data.filter_length // 2 + 1, hps.data.filter_length // 2 + 1,
hps.train.segment_size // hps.data.hop_length, hps.train.segment_size // hps.data.hop_length,
@ -156,8 +206,25 @@ def change_sovits_weights(sovits_path):
vq_model = vq_model.to(device) vq_model = vq_model.to(device)
vq_model.eval() vq_model.eval()
print(vq_model.load_state_dict(dict_s2["weight"], strict=False)) print(vq_model.load_state_dict(dict_s2["weight"], strict=False))
with open("./sweight.txt", "w", encoding="utf-8") as f: dict_language = dict_language_v1 if version =='v1' else dict_language_v2
f.write(sovits_path) with open("./weight.json")as f:
data=f.read()
data=json.loads(data)
data["SoVITS"][version]=sovits_path
with open("./weight.json","w")as f:f.write(json.dumps(data))
if prompt_language is not None and text_language is not None:
if prompt_language in list(dict_language.keys()):
prompt_text_update, prompt_language_update = {'__type__':'update'}, {'__type__':'update', 'value':prompt_language}
else:
prompt_text_update = {'__type__':'update', 'value':''}
prompt_language_update = {'__type__':'update', 'value':i18n("中文")}
if text_language in list(dict_language.keys()):
text_update, text_language_update = {'__type__':'update'}, {'__type__':'update', 'value':text_language}
else:
text_update = {'__type__':'update', 'value':''}
text_language_update = {'__type__':'update', 'value':i18n("中文")}
return {'__type__':'update', 'choices':list(dict_language.keys())}, {'__type__':'update', 'choices':list(dict_language.keys())}, prompt_text_update, prompt_language_update, text_update, text_language_update
change_sovits_weights(sovits_path) change_sovits_weights(sovits_path)
@ -177,7 +244,11 @@ def change_gpt_weights(gpt_path):
t2s_model.eval() t2s_model.eval()
total = sum([param.nelement() for param in t2s_model.parameters()]) total = sum([param.nelement() for param in t2s_model.parameters()])
print("Number of parameter: %.2fM" % (total / 1e6)) print("Number of parameter: %.2fM" % (total / 1e6))
with open("./gweight.txt", "w", encoding="utf-8") as f: f.write(gpt_path) with open("./weight.json")as f:
data=f.read()
data=json.loads(data)
data["GPT"][version]=gpt_path
with open("./weight.json","w")as f:f.write(json.dumps(data))
change_gpt_weights(gpt_path) change_gpt_weights(gpt_path)
@ -186,6 +257,8 @@ change_gpt_weights(gpt_path)
def get_spepc(hps, filename): def get_spepc(hps, filename):
audio = load_audio(filename, int(hps.data.sampling_rate)) audio = load_audio(filename, int(hps.data.sampling_rate))
audio = torch.FloatTensor(audio) audio = torch.FloatTensor(audio)
maxx=audio.abs().max()
if(maxx>1):audio/=min(2,maxx)
audio_norm = audio audio_norm = audio
audio_norm = audio_norm.unsqueeze(0) audio_norm = audio_norm.unsqueeze(0)
spec = spectrogram_torch( spec = spectrogram_torch(
@ -198,20 +271,9 @@ def get_spepc(hps, filename):
) )
return spec return spec
def clean_text_inf(text, language, version):
dict_language = { phones, word2ph, norm_text = clean_text(text, language, version)
i18n("中文"): "all_zh",#全部按中文识别 phones = cleaned_text_to_sequence(phones, version)
i18n("英文"): "en",#全部按英文识别#######不变
i18n("日文"): "all_ja",#全部按日文识别
i18n("中英混合"): "zh",#按中英混合识别####不变
i18n("日英混合"): "ja",#按日英混合识别####不变
i18n("多语种混合"): "auto",#多语种启动切分识别语种
}
def clean_text_inf(text, language):
phones, word2ph, norm_text = clean_text(text, language)
phones = cleaned_text_to_sequence(phones)
return phones, word2ph, norm_text return phones, word2ph, norm_text
dtype=torch.float16 if is_half == True else torch.float32 dtype=torch.float16 if is_half == True else torch.float32
@ -236,44 +298,56 @@ def get_first(text):
text = re.split(pattern, text)[0].strip() text = re.split(pattern, text)[0].strip()
return text return text
from text import chinese
def get_phones_and_bert(text,language): def get_phones_and_bert(text,language,version,final=False):
if language in {"en","all_zh","all_ja"}: if language in {"en", "all_zh", "all_ja", "all_ko", "all_yue"}:
language = language.replace("all_","") language = language.replace("all_","")
if language == "en": if language == "en":
LangSegment.setfilters(["en"]) LangSegment.setfilters(["en"])
formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text)) formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text))
else: else:
# 因无法区别中日文汉字,以用户输入为准 # 因无法区别中日文汉字,以用户输入为准
formattext = text formattext = text
while " " in formattext: while " " in formattext:
formattext = formattext.replace(" ", " ") formattext = formattext.replace(" ", " ")
phones, word2ph, norm_text = clean_text_inf(formattext, language)
if language == "zh": if language == "zh":
bert = get_bert_feature(norm_text, word2ph).to(device) if re.search(r'[A-Za-z]', formattext):
formattext = re.sub(r'[a-z]', lambda x: x.group(0).upper(), formattext)
formattext = chinese.mix_text_normalize(formattext)
return get_phones_and_bert(formattext,"zh",version)
else:
phones, word2ph, norm_text = clean_text_inf(formattext, language, version)
bert = get_bert_feature(norm_text, word2ph).to(device)
elif language == "yue" and re.search(r'[A-Za-z]', formattext):
formattext = re.sub(r'[a-z]', lambda x: x.group(0).upper(), formattext)
formattext = chinese.mix_text_normalize(formattext)
return get_phones_and_bert(formattext,"yue",version)
else: else:
phones, word2ph, norm_text = clean_text_inf(formattext, language, version)
bert = torch.zeros( bert = torch.zeros(
(1024, len(phones)), (1024, len(phones)),
dtype=torch.float16 if is_half == True else torch.float32, dtype=torch.float16 if is_half == True else torch.float32,
).to(device) ).to(device)
elif language in {"zh", "ja","auto"}: elif language in {"zh", "ja", "ko", "yue", "auto", "auto_yue"}:
textlist=[] textlist=[]
langlist=[] langlist=[]
LangSegment.setfilters(["zh","ja","en","ko"]) LangSegment.setfilters(["zh","ja","en","ko"])
if language == "auto": if language == "auto":
for tmp in LangSegment.getTexts(text): for tmp in LangSegment.getTexts(text):
if tmp["lang"] == "ko": langlist.append(tmp["lang"])
langlist.append("zh") textlist.append(tmp["text"])
textlist.append(tmp["text"]) elif language == "auto_yue":
else: for tmp in LangSegment.getTexts(text):
langlist.append(tmp["lang"]) if tmp["lang"] == "zh":
textlist.append(tmp["text"]) tmp["lang"] = "yue"
langlist.append(tmp["lang"])
textlist.append(tmp["text"])
else: else:
for tmp in LangSegment.getTexts(text): for tmp in LangSegment.getTexts(text):
if tmp["lang"] == "en": if tmp["lang"] == "en":
langlist.append(tmp["lang"]) langlist.append(tmp["lang"])
else: else:
# 因无法区别中日文汉字,以用户输入为准 # 因无法区别中日文汉字,以用户输入为准
langlist.append(language) langlist.append(language)
textlist.append(tmp["text"]) textlist.append(tmp["text"])
print(textlist) print(textlist)
@ -283,7 +357,7 @@ def get_phones_and_bert(text,language):
norm_text_list = [] norm_text_list = []
for i in range(len(textlist)): for i in range(len(textlist)):
lang = langlist[i] lang = langlist[i]
phones, word2ph, norm_text = clean_text_inf(textlist[i], lang) phones, word2ph, norm_text = clean_text_inf(textlist[i], lang, version)
bert = get_bert_inf(phones, word2ph, norm_text, lang) bert = get_bert_inf(phones, word2ph, norm_text, lang)
phones_list.append(phones) phones_list.append(phones)
norm_text_list.append(norm_text) norm_text_list.append(norm_text)
@ -292,6 +366,9 @@ def get_phones_and_bert(text,language):
phones = sum(phones_list, []) phones = sum(phones_list, [])
norm_text = ''.join(norm_text_list) norm_text = ''.join(norm_text_list)
if not final and len(phones) < 6:
return get_phones_and_bert("." + text,language,version,final=True)
return phones,bert.to(dtype),norm_text return phones,bert.to(dtype),norm_text
@ -312,19 +389,29 @@ def merge_short_text_in_array(texts, threshold):
result[len(result) - 1] += text result[len(result) - 1] += text
return result return result
def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language, how_to_cut=i18n("不切"), top_k=20, top_p=0.6, temperature=0.6, ref_free = False): ##ref_wav_path+prompt_text+prompt_language+text(单个)+text_language+top_k+top_p+temperature
# cache_tokens={}#暂未实现清理机制
cache= {}
def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language, how_to_cut=i18n("不切"), top_k=20, top_p=0.6, temperature=0.6, ref_free = False,speed=1,if_freeze=False,inp_refs=123):
global cache
if ref_wav_path:pass
else:gr.Warning(i18n('请上传参考音频'))
if text:pass
else:gr.Warning(i18n('请填入推理文本'))
t = []
if prompt_text is None or len(prompt_text) == 0: if prompt_text is None or len(prompt_text) == 0:
ref_free = True ref_free = True
t0 = ttime() t0 = ttime()
prompt_language = dict_language[prompt_language] prompt_language = dict_language[prompt_language]
text_language = dict_language[text_language] text_language = dict_language[text_language]
if not ref_free: if not ref_free:
prompt_text = prompt_text.strip("\n") prompt_text = prompt_text.strip("\n")
if (prompt_text[-1] not in splits): prompt_text += "" if prompt_language != "en" else "." if (prompt_text[-1] not in splits): prompt_text += "" if prompt_language != "en" else "."
print(i18n("实际输入的参考文本:"), prompt_text) print(i18n("实际输入的参考文本:"), prompt_text)
text = text.strip("\n") text = text.strip("\n")
text = replace_consecutive_punctuation(text) # if (text[0] not in splits and len(get_first(text)) < 4): text = "。" + text if text_language != "en" else "." + text
if (text[0] not in splits and len(get_first(text)) < 4): text = "" + text if text_language != "en" else "." + text
print(i18n("实际输入的目标文本:"), text) print(i18n("实际输入的目标文本:"), text)
zero_wav = np.zeros( zero_wav = np.zeros(
@ -335,6 +422,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
with torch.no_grad(): with torch.no_grad():
wav16k, sr = librosa.load(ref_wav_path, sr=16000) wav16k, sr = librosa.load(ref_wav_path, sr=16000)
if (wav16k.shape[0] > 160000 or wav16k.shape[0] < 48000): if (wav16k.shape[0] > 160000 or wav16k.shape[0] < 48000):
gr.Warning(i18n("参考音频在3~10秒范围外请更换"))
raise OSError(i18n("参考音频在3~10秒范围外请更换")) raise OSError(i18n("参考音频在3~10秒范围外请更换"))
wav16k = torch.from_numpy(wav16k) wav16k = torch.from_numpy(wav16k)
zero_wav_torch = torch.from_numpy(zero_wav) zero_wav_torch = torch.from_numpy(zero_wav)
@ -355,6 +443,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
prompt = prompt_semantic.unsqueeze(0).to(device) prompt = prompt_semantic.unsqueeze(0).to(device)
t1 = ttime() t1 = ttime()
t.append(t1-t0)
if (how_to_cut == i18n("凑四句一切")): if (how_to_cut == i18n("凑四句一切")):
text = cut1(text) text = cut1(text)
@ -374,15 +463,15 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
texts = merge_short_text_in_array(texts, 5) texts = merge_short_text_in_array(texts, 5)
audio_opt = [] audio_opt = []
if not ref_free: if not ref_free:
phones1,bert1,norm_text1=get_phones_and_bert(prompt_text, prompt_language) phones1,bert1,norm_text1=get_phones_and_bert(prompt_text, prompt_language, version)
for text in texts: for i_text,text in enumerate(texts):
# 解决输入目标文本的空行导致报错的问题 # 解决输入目标文本的空行导致报错的问题
if (len(text.strip()) == 0): if (len(text.strip()) == 0):
continue continue
if (text[-1] not in splits): text += "" if text_language != "en" else "." if (text[-1] not in splits): text += "" if text_language != "en" else "."
print(i18n("实际输入的目标文本(每句):"), text) print(i18n("实际输入的目标文本(每句):"), text)
phones2,bert2,norm_text2=get_phones_and_bert(text, text_language) phones2,bert2,norm_text2=get_phones_and_bert(text, text_language, version)
print(i18n("前端处理后的文本(每句):"), norm_text2) print(i18n("前端处理后的文本(每句):"), norm_text2)
if not ref_free: if not ref_free:
bert = torch.cat([bert1, bert2], 1) bert = torch.cat([bert1, bert2], 1)
@ -395,44 +484,45 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
all_phoneme_len = torch.tensor([all_phoneme_ids.shape[-1]]).to(device) all_phoneme_len = torch.tensor([all_phoneme_ids.shape[-1]]).to(device)
t2 = ttime() t2 = ttime()
with torch.no_grad(): # cache_key="%s-%s-%s-%s-%s-%s-%s-%s"%(ref_wav_path,prompt_text,prompt_language,text,text_language,top_k,top_p,temperature)
# pred_semantic = t2s_model.model.infer( # print(cache.keys(),if_freeze)
pred_semantic, idx = t2s_model.model.infer_panel( if(i_text in cache and if_freeze==True):pred_semantic=cache[i_text]
all_phoneme_ids,
all_phoneme_len,
None if ref_free else prompt,
bert,
# prompt_phone_len=ph_offset,
top_k=top_k,
top_p=top_p,
temperature=temperature,
early_stop_num=hz * max_sec,
)
t3 = ttime()
# print(pred_semantic.shape,idx)
pred_semantic = pred_semantic[:, -idx:].unsqueeze(
0
) # .unsqueeze(0)#mq要多unsqueeze一次
refer = get_spepc(hps, ref_wav_path) # .to(device)
if is_half == True:
refer = refer.half().to(device)
else: else:
refer = refer.to(device) with torch.no_grad():
# audio = vq_model.decode(pred_semantic, all_phoneme_ids, refer).detach().cpu().numpy()[0, 0] pred_semantic, idx = t2s_model.model.infer_panel(
audio = ( all_phoneme_ids,
vq_model.decode( all_phoneme_len,
pred_semantic, torch.LongTensor(phones2).to(device).unsqueeze(0), refer None if ref_free else prompt,
) bert,
.detach() # prompt_phone_len=ph_offset,
.cpu() top_k=top_k,
.numpy()[0, 0] top_p=top_p,
) ###试试重建不带上prompt部分 temperature=temperature,
early_stop_num=hz * max_sec,
)
pred_semantic = pred_semantic[:, -idx:].unsqueeze(0)
cache[i_text]=pred_semantic
t3 = ttime()
refers=[]
if(inp_refs):
for path in inp_refs:
try:
refer = get_spepc(hps, path.name).to(dtype).to(device)
refers.append(refer)
except:
traceback.print_exc()
if(len(refers)==0):refers = [get_spepc(hps, ref_wav_path).to(dtype).to(device)]
audio = (vq_model.decode(pred_semantic, torch.LongTensor(phones2).to(device).unsqueeze(0), refers,speed=speed).detach().cpu().numpy()[0, 0])
max_audio=np.abs(audio).max()#简单防止16bit爆音 max_audio=np.abs(audio).max()#简单防止16bit爆音
if max_audio>1:audio/=max_audio if max_audio>1:audio/=max_audio
audio_opt.append(audio) audio_opt.append(audio)
audio_opt.append(zero_wav) audio_opt.append(zero_wav)
t4 = ttime() t4 = ttime()
print("%.3f\t%.3f\t%.3f\t%.3f" % (t1 - t0, t2 - t1, t3 - t2, t4 - t3)) t.extend([t2 - t1,t3 - t2, t4 - t3])
t1 = ttime()
print("%.3f\t%.3f\t%.3f\t%.3f" %
(t[0], sum(t[1::3]), sum(t[2::3]), sum(t[3::3]))
)
yield hps.data.sampling_rate, (np.concatenate(audio_opt, 0) * 32768).astype( yield hps.data.sampling_rate, (np.concatenate(audio_opt, 0) * 32768).astype(
np.int16 np.int16
) )
@ -554,102 +644,116 @@ def process_text(texts):
return _text return _text
def replace_consecutive_punctuation(text):
punctuations = ''.join(re.escape(p) for p in punctuation)
pattern = f'([{punctuations}])([{punctuations}])+'
result = re.sub(pattern, r'\1', text)
return result
def change_choices(): def change_choices():
SoVITS_names, GPT_names = get_weights_names() SoVITS_names, GPT_names = get_weights_names(GPT_weight_root, SoVITS_weight_root)
return {"choices": sorted(SoVITS_names, key=custom_sort_key), "__type__": "update"}, {"choices": sorted(GPT_names, key=custom_sort_key), "__type__": "update"} 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" SoVITS_weight_root=["SoVITS_weights_v2","SoVITS_weights"]
pretrained_gpt_name = "GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt" GPT_weight_root=["GPT_weights_v2","GPT_weights"]
SoVITS_weight_root = "SoVITS_weights" for path in SoVITS_weight_root+GPT_weight_root:
GPT_weight_root = "GPT_weights" os.makedirs(path,exist_ok=True)
os.makedirs(SoVITS_weight_root, exist_ok=True)
os.makedirs(GPT_weight_root, exist_ok=True)
def get_weights_names(): def get_weights_names(GPT_weight_root, SoVITS_weight_root):
SoVITS_names = [pretrained_sovits_name] SoVITS_names = [i for i in pretrained_sovits_name]
for name in os.listdir(SoVITS_weight_root): for path in SoVITS_weight_root:
if name.endswith(".pth"): SoVITS_names.append("%s/%s" % (SoVITS_weight_root, name)) for name in os.listdir(path):
GPT_names = [pretrained_gpt_name] if name.endswith(".pth"): SoVITS_names.append("%s/%s" % (path, name))
for name in os.listdir(GPT_weight_root): GPT_names = [i for i in pretrained_gpt_name]
if name.endswith(".ckpt"): GPT_names.append("%s/%s" % (GPT_weight_root, name)) for path in GPT_weight_root:
for name in os.listdir(path):
if name.endswith(".ckpt"): GPT_names.append("%s/%s" % (path, name))
return SoVITS_names, GPT_names return SoVITS_names, GPT_names
SoVITS_names, GPT_names = get_weights_names() SoVITS_names, GPT_names = get_weights_names(GPT_weight_root, SoVITS_weight_root)
def html_center(text, label='p'):
return f"""<div style="text-align: center; margin: 100; padding: 50;">
<{label} style="margin: 0; padding: 0;">{text}</{label}>
</div>"""
def html_left(text, label='p'):
return f"""<div style="text-align: left; margin: 0; padding: 0;">
<{label} style="margin: 0; padding: 0;">{text}</{label}>
</div>"""
with gr.Blocks(title="GPT-SoVITS WebUI") as app: with gr.Blocks(title="GPT-SoVITS WebUI") as app:
gr.Markdown( gr.Markdown(
value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.") value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
) )
with gr.Group(): with gr.Group():
gr.Markdown(value=i18n("模型切换")) gr.Markdown(html_center(i18n("模型切换"),'h3'))
with gr.Row(): with gr.Row():
GPT_dropdown = gr.Dropdown(label=i18n("GPT模型列表"), choices=sorted(GPT_names, key=custom_sort_key), value=gpt_path, interactive=True) GPT_dropdown = gr.Dropdown(label=i18n("GPT模型列表"), choices=sorted(GPT_names, key=custom_sort_key), value=gpt_path, interactive=True, scale=14)
SoVITS_dropdown = gr.Dropdown(label=i18n("SoVITS模型列表"), choices=sorted(SoVITS_names, key=custom_sort_key), value=sovits_path, interactive=True) SoVITS_dropdown = gr.Dropdown(label=i18n("SoVITS模型列表"), choices=sorted(SoVITS_names, key=custom_sort_key), value=sovits_path, interactive=True, scale=14)
refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary") refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary", scale=14)
refresh_button.click(fn=change_choices, inputs=[], outputs=[SoVITS_dropdown, GPT_dropdown]) refresh_button.click(fn=change_choices, inputs=[], outputs=[SoVITS_dropdown, GPT_dropdown])
SoVITS_dropdown.change(change_sovits_weights, [SoVITS_dropdown], []) gr.Markdown(html_center(i18n("*请上传并填写参考信息"),'h3'))
GPT_dropdown.change(change_gpt_weights, [GPT_dropdown], [])
gr.Markdown(value=i18n("*请上传并填写参考信息"))
with gr.Row(): with gr.Row():
inp_ref = gr.Audio(label=i18n("请上传3~10秒内参考音频超过会报错"), type="filepath") inp_ref = gr.Audio(label=i18n("请上传3~10秒内参考音频超过会报错"), type="filepath", scale=13)
with gr.Column(): with gr.Column(scale=13):
ref_text_free = gr.Checkbox(label=i18n("开启无参考文本模式。不填参考文本亦相当于开启。"), value=False, interactive=True, show_label=True) ref_text_free = gr.Checkbox(label=i18n("开启无参考文本模式。不填参考文本亦相当于开启。"), value=False, interactive=True, show_label=True)
gr.Markdown(i18n("使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开开启后无视填写的参考文本。")) gr.Markdown(html_left(i18n("使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。")))
prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="") prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="", lines=3, max_lines=3)
prompt_language = gr.Dropdown( prompt_language = gr.Dropdown(
label=i18n("参考音频的语种"), choices=[i18n("中文"), i18n("英文"), i18n("日文"), i18n("中英混合"), i18n("日英混合"), i18n("多语种混合")], value=i18n("中文") label=i18n("参考音频的语种"), choices=list(dict_language.keys()), value=i18n("中文"), scale=14
) )
gr.Markdown(value=i18n("*请填写需要合成的目标文本和语种模式")) inp_refs = gr.File(label=i18n("可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。"),file_count="file_count",scale=13)
gr.Markdown(html_center(i18n("*请填写需要合成的目标文本和语种模式"),'h3'))
with gr.Row(): with gr.Row():
text = gr.Textbox(label=i18n("需要合成的文本"), value="") with gr.Column(scale=13):
text_language = gr.Dropdown( text = gr.Textbox(label=i18n("需要合成的文本"), value="", lines=26, max_lines=26)
label=i18n("需要合成的语种"), choices=[i18n("中文"), i18n("英文"), i18n("日文"), i18n("中英混合"), i18n("日英混合"), i18n("多语种混合")], value=i18n("中文") with gr.Column(scale=7):
) text_language = gr.Dropdown(
how_to_cut = gr.Radio( label=i18n("需要合成的语种")+i18n(".限制范围越小判别效果越好。"), choices=list(dict_language.keys()), value=i18n("中文"), scale=1
label=i18n("怎么切"), )
choices=[i18n("不切"), i18n("凑四句一切"), i18n("凑50字一切"), i18n("按中文句号。切"), i18n("按英文句号.切"), i18n("按标点符号切"), ], how_to_cut = gr.Dropdown(
value=i18n("凑四句一切"), label=i18n("怎么切"),
interactive=True, choices=[i18n("不切"), i18n("凑四句一切"), i18n("凑50字一切"), i18n("按中文句号。切"), i18n("按英文句号.切"), i18n("按标点符号切"), ],
) value=i18n("凑四句一切"),
with gr.Row(): interactive=True, scale=1
gr.Markdown(value=i18n("gpt采样参数(无参考文本时不要太低)")) )
top_k = gr.Slider(minimum=1,maximum=100,step=1,label=i18n("top_k"),value=5,interactive=True) gr.Markdown(value=html_center(i18n("语速调整,高为更快")))
top_p = gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("top_p"),value=1,interactive=True) if_freeze=gr.Checkbox(label=i18n("是否直接对上次合成结果调整语速和音色。防止随机性。"), value=False, interactive=True,show_label=True, scale=1)
temperature = gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("temperature"),value=1,interactive=True) speed = gr.Slider(minimum=0.6,maximum=1.65,step=0.05,label=i18n("语速"),value=1,interactive=True, scale=1)
inference_button = gr.Button(i18n("合成语音"), variant="primary") gr.Markdown(html_center(i18n("GPT采样参数(无参考文本时不要太低。不懂就用默认)")))
output = gr.Audio(label=i18n("输出的语音")) top_k = gr.Slider(minimum=1,maximum=100,step=1,label=i18n("top_k"),value=15,interactive=True, scale=1)
top_p = gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("top_p"),value=1,interactive=True, scale=1)
temperature = gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("temperature"),value=1,interactive=True, scale=1)
# with gr.Column():
# gr.Markdown(value=i18n("手工调整音素。当音素框不为空时使用手工音素输入推理,无视目标文本框。"))
# phoneme=gr.Textbox(label=i18n("音素框"), value="")
# get_phoneme_button = gr.Button(i18n("目标文本转音素"), variant="primary")
with gr.Row():
inference_button = gr.Button(i18n("合成语音"), variant="primary", size='lg', scale=25)
output = gr.Audio(label=i18n("输出的语音"), scale=14)
inference_button.click( inference_button.click(
get_tts_wav, get_tts_wav,
[inp_ref, prompt_text, prompt_language, text, text_language, how_to_cut, top_k, top_p, temperature, ref_text_free], [inp_ref, prompt_text, prompt_language, text, text_language, how_to_cut, top_k, top_p, temperature, ref_text_free,speed,if_freeze,inp_refs],
[output], [output],
) )
SoVITS_dropdown.change(change_sovits_weights, [SoVITS_dropdown,prompt_language,text_language], [prompt_language,text_language,prompt_text,prompt_language,text,text_language])
GPT_dropdown.change(change_gpt_weights, [GPT_dropdown], [])
gr.Markdown(value=i18n("文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。")) # gr.Markdown(value=i18n("文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。"))
with gr.Row(): # with gr.Row():
text_inp = gr.Textbox(label=i18n("需要合成的切分前文本"), value="") # text_inp = gr.Textbox(label=i18n("需要合成的切分前文本"), value="")
button1 = gr.Button(i18n("凑四句一切"), variant="primary") # button1 = gr.Button(i18n("凑四句一切"), variant="primary")
button2 = gr.Button(i18n("凑50字一切"), variant="primary") # button2 = gr.Button(i18n("凑50字一切"), variant="primary")
button3 = gr.Button(i18n("按中文句号。切"), variant="primary") # button3 = gr.Button(i18n("按中文句号。切"), variant="primary")
button4 = gr.Button(i18n("按英文句号.切"), variant="primary") # button4 = gr.Button(i18n("按英文句号.切"), variant="primary")
button5 = gr.Button(i18n("按标点符号切"), variant="primary") # button5 = gr.Button(i18n("按标点符号切"), variant="primary")
text_opt = gr.Textbox(label=i18n("切分后文本"), value="") # text_opt = gr.Textbox(label=i18n("切分后文本"), value="")
button1.click(cut1, [text_inp], [text_opt]) # button1.click(cut1, [text_inp], [text_opt])
button2.click(cut2, [text_inp], [text_opt]) # button2.click(cut2, [text_inp], [text_opt])
button3.click(cut3, [text_inp], [text_opt]) # button3.click(cut3, [text_inp], [text_opt])
button4.click(cut4, [text_inp], [text_opt]) # button4.click(cut4, [text_inp], [text_opt])
button5.click(cut5, [text_inp], [text_opt]) # button5.click(cut5, [text_inp], [text_opt])
gr.Markdown(value=i18n("后续将支持转音素、手工修改音素、语音合成分步执行。")) # gr.Markdown(html_center(i18n("后续将支持转音素、手工修改音素、语音合成分步执行。")))
if __name__ == '__main__': if __name__ == '__main__':
app.queue(max_size=1022).launch( app.queue(max_size=1022).launch(

View File

@ -18,7 +18,7 @@ import requests
from scipy.io import wavfile from scipy.io import wavfile
from io import BytesIO from io import BytesIO
from tools.my_utils import load_audio from tools.my_utils import load_audio
version = os.environ.get('version',None)
# ZeroDivisionError fixed by Tybost (https://github.com/RVC-Boss/GPT-SoVITS/issues/79) # ZeroDivisionError fixed by Tybost (https://github.com/RVC-Boss/GPT-SoVITS/issues/79)
class TextAudioSpeakerLoader(torch.utils.data.Dataset): class TextAudioSpeakerLoader(torch.utils.data.Dataset):
""" """
@ -77,7 +77,7 @@ class TextAudioSpeakerLoader(torch.utils.data.Dataset):
try: try:
phoneme = self.phoneme_data[audiopath][0] phoneme = self.phoneme_data[audiopath][0]
phoneme = phoneme.split(' ') phoneme = phoneme.split(' ')
phoneme_ids = cleaned_text_to_sequence(phoneme) phoneme_ids = cleaned_text_to_sequence(phoneme, version)
except Exception: except Exception:
print(f"{audiopath} not in self.phoneme_data !") print(f"{audiopath} not in self.phoneme_data !")
skipped_phone += 1 skipped_phone += 1

View File

@ -1,5 +1,10 @@
import warnings
warnings.filterwarnings("ignore")
import copy import copy
import math import math
import os
import pdb
import torch import torch
from torch import nn from torch import nn
from torch.nn import functional as F from torch.nn import functional as F
@ -13,7 +18,9 @@ from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm
from module.commons import init_weights, get_padding from module.commons import init_weights, get_padding
from module.mrte_model import MRTE from module.mrte_model import MRTE
from module.quantize import ResidualVectorQuantizer from module.quantize import ResidualVectorQuantizer
from text import symbols # from text import symbols
from text import symbols as symbols_v1
from text import symbols2 as symbols_v2
from torch.cuda.amp import autocast from torch.cuda.amp import autocast
import contextlib import contextlib
@ -183,6 +190,7 @@ class TextEncoder(nn.Module):
kernel_size, kernel_size,
p_dropout, p_dropout,
latent_channels=192, latent_channels=192,
version = "v2",
): ):
super().__init__() super().__init__()
self.out_channels = out_channels self.out_channels = out_channels
@ -193,6 +201,7 @@ class TextEncoder(nn.Module):
self.kernel_size = kernel_size self.kernel_size = kernel_size
self.p_dropout = p_dropout self.p_dropout = p_dropout
self.latent_channels = latent_channels self.latent_channels = latent_channels
self.version = version
self.ssl_proj = nn.Conv1d(768, hidden_channels, 1) self.ssl_proj = nn.Conv1d(768, hidden_channels, 1)
@ -208,6 +217,11 @@ class TextEncoder(nn.Module):
self.encoder_text = attentions.Encoder( self.encoder_text = attentions.Encoder(
hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
) )
if self.version == "v1":
symbols = symbols_v1.symbols
else:
symbols = symbols_v2.symbols
self.text_embedding = nn.Embedding(len(symbols), hidden_channels) self.text_embedding = nn.Embedding(len(symbols), hidden_channels)
self.mrte = MRTE() self.mrte = MRTE()
@ -223,7 +237,7 @@ class TextEncoder(nn.Module):
self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
def forward(self, y, y_lengths, text, text_lengths, ge, test=None): def forward(self, y, y_lengths, text, text_lengths, ge, speed=1,test=None):
y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to( y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to(
y.dtype y.dtype
) )
@ -240,9 +254,10 @@ class TextEncoder(nn.Module):
text = self.text_embedding(text).transpose(1, 2) text = self.text_embedding(text).transpose(1, 2)
text = self.encoder_text(text * text_mask, text_mask) text = self.encoder_text(text * text_mask, text_mask)
y = self.mrte(y, y_mask, text, text_mask, ge) y = self.mrte(y, y_mask, text, text_mask, ge)
y = self.encoder2(y * y_mask, y_mask) y = self.encoder2(y * y_mask, y_mask)
if(speed!=1):
y = F.interpolate(y, size=int(y.shape[-1] / speed)+1, mode="linear")
y_mask = F.interpolate(y_mask, size=y.shape[-1], mode="nearest")
stats = self.proj(y) * y_mask stats = self.proj(y) * y_mask
m, logs = torch.split(stats, self.out_channels, dim=1) m, logs = torch.split(stats, self.out_channels, dim=1)
return y, m, logs, y_mask return y, m, logs, y_mask
@ -824,6 +839,7 @@ class SynthesizerTrn(nn.Module):
use_sdp=True, use_sdp=True,
semantic_frame_rate=None, semantic_frame_rate=None,
freeze_quantizer=None, freeze_quantizer=None,
version = "v2",
**kwargs **kwargs
): ):
super().__init__() super().__init__()
@ -844,6 +860,7 @@ class SynthesizerTrn(nn.Module):
self.segment_size = segment_size self.segment_size = segment_size
self.n_speakers = n_speakers self.n_speakers = n_speakers
self.gin_channels = gin_channels self.gin_channels = gin_channels
self.version = version
self.use_sdp = use_sdp self.use_sdp = use_sdp
self.enc_p = TextEncoder( self.enc_p = TextEncoder(
@ -854,6 +871,7 @@ class SynthesizerTrn(nn.Module):
n_layers, n_layers,
kernel_size, kernel_size,
p_dropout, p_dropout,
version = version,
) )
self.dec = Generator( self.dec = Generator(
inter_channels, inter_channels,
@ -878,9 +896,11 @@ class SynthesizerTrn(nn.Module):
inter_channels, hidden_channels, 5, 1, 4, gin_channels=gin_channels inter_channels, hidden_channels, 5, 1, 4, gin_channels=gin_channels
) )
self.ref_enc = modules.MelStyleEncoder( # self.version=os.environ.get("version","v1")
spec_channels, style_vector_dim=gin_channels if(self.version=="v1"):
) self.ref_enc = modules.MelStyleEncoder(spec_channels, style_vector_dim=gin_channels)
else:
self.ref_enc = modules.MelStyleEncoder(704, style_vector_dim=gin_channels)
ssl_dim = 768 ssl_dim = 768
assert semantic_frame_rate in ["25hz", "50hz"] assert semantic_frame_rate in ["25hz", "50hz"]
@ -892,20 +912,15 @@ class SynthesizerTrn(nn.Module):
self.quantizer = ResidualVectorQuantizer(dimension=ssl_dim, n_q=1, bins=1024) self.quantizer = ResidualVectorQuantizer(dimension=ssl_dim, n_q=1, bins=1024)
self.freeze_quantizer = freeze_quantizer self.freeze_quantizer = freeze_quantizer
# if freeze_quantizer:
# self.ssl_proj.requires_grad_(False)
# self.quantizer.requires_grad_(False)
#self.quantizer.eval()
# self.enc_p.text_embedding.requires_grad_(False)
# self.enc_p.encoder_text.requires_grad_(False)
# self.enc_p.mrte.requires_grad_(False)
def forward(self, ssl, y, y_lengths, text, text_lengths): def forward(self, ssl, y, y_lengths, text, text_lengths):
y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to( y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to(
y.dtype y.dtype
) )
ge = self.ref_enc(y * y_mask, y_mask) if(self.version=="v1"):
ge = self.ref_enc(y * y_mask, y_mask)
else:
ge = self.ref_enc(y[:,:704] * y_mask, y_mask)
with autocast(enabled=False): with autocast(enabled=False):
maybe_no_grad = torch.no_grad() if self.freeze_quantizer else contextlib.nullcontext() maybe_no_grad = torch.no_grad() if self.freeze_quantizer else contextlib.nullcontext()
with maybe_no_grad: with maybe_no_grad:
@ -946,7 +961,10 @@ class SynthesizerTrn(nn.Module):
y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to( y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to(
y.dtype y.dtype
) )
ge = self.ref_enc(y * y_mask, y_mask) if(self.version=="v1"):
ge = self.ref_enc(y * y_mask, y_mask)
else:
ge = self.ref_enc(y[:,:704] * y_mask, y_mask)
ssl = self.ssl_proj(ssl) ssl = self.ssl_proj(ssl)
quantized, codes, commit_loss, _ = self.quantizer(ssl, layers=[0]) quantized, codes, commit_loss, _ = self.quantizer(ssl, layers=[0])
@ -966,14 +984,27 @@ class SynthesizerTrn(nn.Module):
return o, y_mask, (z, z_p, m_p, logs_p) return o, y_mask, (z, z_p, m_p, logs_p)
@torch.no_grad() @torch.no_grad()
def decode(self, codes, text, refer, noise_scale=0.5): def decode(self, codes, text, refer, noise_scale=0.5,speed=1):
ge = None def get_ge(refer):
if refer is not None: ge = None
refer_lengths = torch.LongTensor([refer.size(2)]).to(refer.device) if refer is not None:
refer_mask = torch.unsqueeze( refer_lengths = torch.LongTensor([refer.size(2)]).to(refer.device)
commons.sequence_mask(refer_lengths, refer.size(2)), 1 refer_mask = torch.unsqueeze(
).to(refer.dtype) commons.sequence_mask(refer_lengths, refer.size(2)), 1
ge = self.ref_enc(refer * refer_mask, refer_mask) ).to(refer.dtype)
if (self.version == "v1"):
ge = self.ref_enc(refer * refer_mask, refer_mask)
else:
ge = self.ref_enc(refer[:, :704] * refer_mask, refer_mask)
return ge
if(type(refer)==list):
ges=[]
for _refer in refer:
ge=get_ge(_refer)
ges.append(ge)
ge=torch.stack(ges,0).mean(0)
else:
ge=get_ge(refer)
y_lengths = torch.LongTensor([codes.size(2) * 2]).to(codes.device) y_lengths = torch.LongTensor([codes.size(2) * 2]).to(codes.device)
text_lengths = torch.LongTensor([text.size(-1)]).to(text.device) text_lengths = torch.LongTensor([text.size(-1)]).to(text.device)
@ -983,9 +1014,8 @@ class SynthesizerTrn(nn.Module):
quantized = F.interpolate( quantized = F.interpolate(
quantized, size=int(quantized.shape[-1] * 2), mode="nearest" quantized, size=int(quantized.shape[-1] * 2), mode="nearest"
) )
x, m_p, logs_p, y_mask = self.enc_p( x, m_p, logs_p, y_mask = self.enc_p(
quantized, y_lengths, text, text_lengths, ge quantized, y_lengths, text, text_lengths, ge,speed
) )
z_p = m_p + torch.randn_like(m_p) * torch.exp(logs_p) * noise_scale z_p = m_p + torch.randn_like(m_p) * torch.exp(logs_p) * noise_scale

View File

@ -10,15 +10,17 @@ all_parts = os.environ.get("all_parts")
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ.get("_CUDA_VISIBLE_DEVICES") os.environ["CUDA_VISIBLE_DEVICES"] = os.environ.get("_CUDA_VISIBLE_DEVICES")
opt_dir = os.environ.get("opt_dir") opt_dir = os.environ.get("opt_dir")
bert_pretrained_dir = os.environ.get("bert_pretrained_dir") bert_pretrained_dir = os.environ.get("bert_pretrained_dir")
is_half = eval(os.environ.get("is_half", "True")) import torch
is_half = eval(os.environ.get("is_half", "True")) and torch.cuda.is_available()
version = os.environ.get('version', None)
import sys, numpy as np, traceback, pdb import sys, numpy as np, traceback, pdb
import os.path import os.path
from glob import glob from glob import glob
from tqdm import tqdm from tqdm import tqdm
from text.cleaner import clean_text from text.cleaner import clean_text
import torch
from transformers import AutoModelForMaskedLM, AutoTokenizer from transformers import AutoModelForMaskedLM, AutoTokenizer
import numpy as np import numpy as np
from tools.my_utils import clean_path
# inp_text=sys.argv[1] # inp_text=sys.argv[1]
# inp_wav_dir=sys.argv[2] # inp_wav_dir=sys.argv[2]
@ -53,6 +55,8 @@ if os.path.exists(txt_path) == False:
# device = "mps" # device = "mps"
else: else:
device = "cpu" device = "cpu"
if os.path.exists(bert_pretrained_dir):...
else:raise FileNotFoundError(bert_pretrained_dir)
tokenizer = AutoTokenizer.from_pretrained(bert_pretrained_dir) tokenizer = AutoTokenizer.from_pretrained(bert_pretrained_dir)
bert_model = AutoModelForMaskedLM.from_pretrained(bert_pretrained_dir) bert_model = AutoModelForMaskedLM.from_pretrained(bert_pretrained_dir)
if is_half == True: if is_half == True:
@ -81,9 +85,11 @@ if os.path.exists(txt_path) == False:
def process(data, res): def process(data, res):
for name, text, lan in data: for name, text, lan in data:
try: try:
name=clean_path(name)
name = os.path.basename(name) name = os.path.basename(name)
print(name)
phones, word2ph, norm_text = clean_text( phones, word2ph, norm_text = clean_text(
text.replace("%", "-").replace("", ","), lan text.replace("%", "-").replace("", ","), lan, version
) )
path_bert = "%s/%s.pt" % (bert_dir, name) path_bert = "%s/%s.pt" % (bert_dir, name)
if os.path.exists(path_bert) == False and lan == "zh": if os.path.exists(path_bert) == False and lan == "zh":
@ -112,6 +118,12 @@ if os.path.exists(txt_path) == False:
"EN": "en", "EN": "en",
"en": "en", "en": "en",
"En": "en", "En": "en",
"KO": "ko",
"Ko": "ko",
"ko": "ko",
"yue": "yue",
"YUE": "yue",
"Yue": "yue",
} }
for line in lines[int(i_part) :: int(all_parts)]: for line in lines[int(i_part) :: int(all_parts)]:
try: try:

View File

@ -10,14 +10,15 @@ os.environ["CUDA_VISIBLE_DEVICES"]= os.environ.get("_CUDA_VISIBLE_DEVICES")
from feature_extractor import cnhubert from feature_extractor import cnhubert
opt_dir= os.environ.get("opt_dir") opt_dir= os.environ.get("opt_dir")
cnhubert.cnhubert_base_path= os.environ.get("cnhubert_base_dir") cnhubert.cnhubert_base_path= os.environ.get("cnhubert_base_dir")
is_half=eval(os.environ.get("is_half","True")) import torch
is_half = eval(os.environ.get("is_half", "True")) and torch.cuda.is_available()
import pdb,traceback,numpy as np,logging import pdb,traceback,numpy as np,logging
from scipy.io import wavfile from scipy.io import wavfile
import librosa,torch import librosa
now_dir = os.getcwd() now_dir = os.getcwd()
sys.path.append(now_dir) sys.path.append(now_dir)
from tools.my_utils import load_audio from tools.my_utils import load_audio,clean_path
# from config import cnhubert_base_path # from config import cnhubert_base_path
# cnhubert.cnhubert_base_path=cnhubert_base_path # cnhubert.cnhubert_base_path=cnhubert_base_path
@ -99,6 +100,7 @@ for line in lines[int(i_part)::int(all_parts)]:
try: try:
# wav_name,text=line.split("\t") # wav_name,text=line.split("\t")
wav_name, spk_name, language, text = line.split("|") wav_name, spk_name, language, text = line.split("|")
wav_name=clean_path(wav_name)
if (inp_wav_dir != "" and inp_wav_dir != None): if (inp_wav_dir != "" and inp_wav_dir != None):
wav_name = os.path.basename(wav_name) wav_name = os.path.basename(wav_name)
wav_path = "%s/%s"%(inp_wav_dir, wav_name) wav_path = "%s/%s"%(inp_wav_dir, wav_name)

View File

@ -8,7 +8,9 @@ os.environ["CUDA_VISIBLE_DEVICES"] = os.environ.get("_CUDA_VISIBLE_DEVICES")
opt_dir = os.environ.get("opt_dir") opt_dir = os.environ.get("opt_dir")
pretrained_s2G = os.environ.get("pretrained_s2G") pretrained_s2G = os.environ.get("pretrained_s2G")
s2config_path = os.environ.get("s2config_path") s2config_path = os.environ.get("s2config_path")
is_half = eval(os.environ.get("is_half", "True")) version=os.environ.get("version","v2")
import torch
is_half = eval(os.environ.get("is_half", "True")) and torch.cuda.is_available()
import math, traceback import math, traceback
import multiprocessing import multiprocessing
import sys, pdb import sys, pdb
@ -19,9 +21,9 @@ from random import shuffle
import torch.multiprocessing as mp import torch.multiprocessing as mp
from glob import glob from glob import glob
from tqdm import tqdm from tqdm import tqdm
import logging, librosa, utils, torch import logging, librosa, utils
from module.models import SynthesizerTrn from module.models import SynthesizerTrn
from tools.my_utils import clean_path
logging.getLogger("numba").setLevel(logging.WARNING) logging.getLogger("numba").setLevel(logging.WARNING)
# from config import pretrained_s2G # from config import pretrained_s2G
@ -32,6 +34,8 @@ logging.getLogger("numba").setLevel(logging.WARNING)
# os.environ["CUDA_VISIBLE_DEVICES"]=sys.argv[5] # os.environ["CUDA_VISIBLE_DEVICES"]=sys.argv[5]
# opt_dir="/data/docker/liujing04/gpt-vits/fine_tune_dataset/%s"%exp_name # opt_dir="/data/docker/liujing04/gpt-vits/fine_tune_dataset/%s"%exp_name
if os.path.exists(pretrained_s2G):...
else:raise FileNotFoundError(pretrained_s2G)
hubert_dir = "%s/4-cnhubert" % (opt_dir) hubert_dir = "%s/4-cnhubert" % (opt_dir)
semantic_path = "%s/6-name2semantic-%s.tsv" % (opt_dir, i_part) semantic_path = "%s/6-name2semantic-%s.tsv" % (opt_dir, i_part)
@ -49,6 +53,7 @@ if os.path.exists(semantic_path) == False:
hps.data.filter_length // 2 + 1, hps.data.filter_length // 2 + 1,
hps.train.segment_size // hps.data.hop_length, hps.train.segment_size // hps.data.hop_length,
n_speakers=hps.data.n_speakers, n_speakers=hps.data.n_speakers,
version=version,
**hps.model **hps.model
) )
if is_half == True: if is_half == True:
@ -86,6 +91,7 @@ if os.path.exists(semantic_path) == False:
try: try:
# wav_name,text=line.split("\t") # wav_name,text=line.split("\t")
wav_name, spk_name, language, text = line.split("|") wav_name, spk_name, language, text = line.split("|")
wav_name=clean_path(wav_name)
wav_name = os.path.basename(wav_name) wav_name = os.path.basename(wav_name)
# name2go(name,lines1) # name2go(name,lines1)
name2go(wav_name, lines1) name2go(wav_name, lines1)

View File

@ -1,5 +1,6 @@
import warnings
warnings.filterwarnings("ignore")
import utils, os import utils, os
hps = utils.get_hparams(stage=2) hps = utils.get_hparams(stage=2)
os.environ["CUDA_VISIBLE_DEVICES"] = hps.train.gpu_numbers.replace("-", ",") os.environ["CUDA_VISIBLE_DEVICES"] = hps.train.gpu_numbers.replace("-", ",")
import torch import torch
@ -119,7 +120,7 @@ def run(rank, n_gpus, hps):
collate_fn=collate_fn, collate_fn=collate_fn,
batch_sampler=train_sampler, batch_sampler=train_sampler,
persistent_workers=True, persistent_workers=True,
prefetch_factor=16, prefetch_factor=4,
) )
# if rank == 0: # if rank == 0:
# eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data, val=True) # eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data, val=True)
@ -211,7 +212,7 @@ def run(rank, n_gpus, hps):
# traceback.print_exc() # traceback.print_exc()
epoch_str = 1 epoch_str = 1
global_step = 0 global_step = 0
if hps.train.pretrained_s2G != "": if hps.train.pretrained_s2G != ""and hps.train.pretrained_s2G != None and os.path.exists(hps.train.pretrained_s2G):
if rank == 0: if rank == 0:
logger.info("loaded pretrained %s" % hps.train.pretrained_s2G) logger.info("loaded pretrained %s" % hps.train.pretrained_s2G)
print( print(
@ -223,7 +224,7 @@ def run(rank, n_gpus, hps):
strict=False, strict=False,
) )
) ##测试不加载优化器 ) ##测试不加载优化器
if hps.train.pretrained_s2D != "": if hps.train.pretrained_s2D != ""and hps.train.pretrained_s2D != None and os.path.exists(hps.train.pretrained_s2D):
if rank == 0: if rank == 0:
logger.info("loaded pretrained %s" % hps.train.pretrained_s2D) logger.info("loaded pretrained %s" % hps.train.pretrained_s2D)
print( print(

3
GPT_SoVITS/text/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
G2PWModel
__pycache__
*.zip

View File

@ -1,15 +1,27 @@
from text.symbols import * import os
# if os.environ.get("version","v1")=="v1":
# from text.symbols import symbols
# else:
# from text.symbols2 import symbols
from text import symbols as symbols_v1
from text import symbols2 as symbols_v2
_symbol_to_id = {s: i for i, s in enumerate(symbols)} _symbol_to_id_v1 = {s: i for i, s in enumerate(symbols_v1.symbols)}
_symbol_to_id_v2 = {s: i for i, s in enumerate(symbols_v2.symbols)}
def cleaned_text_to_sequence(cleaned_text): def cleaned_text_to_sequence(cleaned_text, version=None):
'''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text.
Args: Args:
text: string to convert to a sequence text: string to convert to a sequence
Returns: Returns:
List of integers corresponding to the symbols in the text List of integers corresponding to the symbols in the text
''' '''
phones = [_symbol_to_id[symbol] for symbol in cleaned_text] if version is None:version=os.environ.get('version', 'v2')
if version == "v1":
phones = [_symbol_to_id_v1[symbol] for symbol in cleaned_text]
else:
phones = [_symbol_to_id_v2[symbol] for symbol in cleaned_text]
return phones return phones

View File

@ -0,0 +1,209 @@
# reference: https://huggingface.co/spaces/Naozumi0512/Bert-VITS2-Cantonese-Yue/blob/main/text/chinese.py
import sys
import re
import cn2an
from pyjyutping import jyutping
from text.symbols import punctuation
from text.zh_normalization.text_normlization import TextNormalizer
normalizer = lambda x: cn2an.transform(x, "an2cn")
INITIALS = [
"aa",
"aai",
"aak",
"aap",
"aat",
"aau",
"ai",
"au",
"ap",
"at",
"ak",
"a",
"p",
"b",
"e",
"ts",
"t",
"dz",
"d",
"kw",
"k",
"gw",
"g",
"f",
"h",
"l",
"m",
"ng",
"n",
"s",
"y",
"w",
"c",
"z",
"j",
"ong",
"on",
"ou",
"oi",
"ok",
"o",
"uk",
"ung",
]
INITIALS += ["sp", "spl", "spn", "sil"]
rep_map = {
"": ",",
"": ",",
"": ",",
"": ".",
"": "!",
"": "?",
"\n": ".",
"·": ",",
"": ",",
"...": "",
"$": ".",
"": "'",
"": "'",
'"': "'",
"": "'",
"": "'",
"": "'",
"": "'",
"(": "'",
")": "'",
"": "'",
"": "'",
"": "'",
"": "'",
"[": "'",
"]": "'",
"": "-",
"": "-",
"~": "-",
"": "'",
"": "'",
}
def replace_punctuation(text):
# text = text.replace("嗯", "恩").replace("呣", "母")
pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys()))
replaced_text = pattern.sub(lambda x: rep_map[x.group()], text)
replaced_text = re.sub(
r"[^\u4e00-\u9fa5" + "".join(punctuation) + r"]+", "", replaced_text
)
return replaced_text
def text_normalize(text):
tx = TextNormalizer()
sentences = tx.normalize(text)
dest_text = ""
for sentence in sentences:
dest_text += replace_punctuation(sentence)
return dest_text
punctuation_set=set(punctuation)
def jyuping_to_initials_finals_tones(jyuping_syllables):
initials_finals = []
tones = []
word2ph = []
for syllable in jyuping_syllables:
if syllable in punctuation:
initials_finals.append(syllable)
tones.append(0)
word2ph.append(1) # Add 1 for punctuation
elif syllable == "_":
initials_finals.append(syllable)
tones.append(0)
word2ph.append(1) # Add 1 for underscore
else:
try:
tone = int(syllable[-1])
syllable_without_tone = syllable[:-1]
except ValueError:
tone = 0
syllable_without_tone = syllable
for initial in INITIALS:
if syllable_without_tone.startswith(initial):
if syllable_without_tone.startswith("nga"):
initials_finals.extend(
[
syllable_without_tone[:2],
syllable_without_tone[2:] or syllable_without_tone[-1],
]
)
# tones.extend([tone, tone])
tones.extend([-1, tone])
word2ph.append(2)
else:
final = syllable_without_tone[len(initial) :] or initial[-1]
initials_finals.extend([initial, final])
# tones.extend([tone, tone])
tones.extend([-1, tone])
word2ph.append(2)
break
assert len(initials_finals) == len(tones)
###魔改为辅音+带音调的元音
phones=[]
for a,b in zip(initials_finals,tones):
if(b not in [-1,0]):###防止粤语和普通话重合开头加Y如果是标点不加。
todo="%s%s"%(a,b)
else:todo=a
if(todo not in punctuation_set):todo="Y%s"%todo
phones.append(todo)
# return initials_finals, tones, word2ph
return phones, word2ph
def get_jyutping(text):
jp = jyutping.convert(text)
# print(1111111,jp)
for symbol in punctuation:
jp = jp.replace(symbol, " " + symbol + " ")
jp_array = jp.split()
return jp_array
def get_bert_feature(text, word2ph):
from text import chinese_bert
return chinese_bert.get_bert_feature(text, word2ph)
def g2p(text):
# word2ph = []
jyuping = get_jyutping(text)
# print(jyuping)
# phones, tones, word2ph = jyuping_to_initials_finals_tones(jyuping)
phones, word2ph = jyuping_to_initials_finals_tones(jyuping)
# phones = ["_"] + phones + ["_"]
# tones = [0] + tones + [0]
# word2ph = [1] + word2ph + [1]
return phones, word2ph
if __name__ == "__main__":
# text = "啊!但是《原神》是由,米哈\游自主, [研发]的一款全.新开放世界.冒险游戏"
text = "佢個鋤頭太短啦。"
text = text_normalize(text)
# phones, tones, word2ph = g2p(text)
phones, word2ph = g2p(text)
# print(phones, tones, word2ph)
print(phones, word2ph)

View File

@ -54,6 +54,26 @@ def replace_punctuation(text):
return replaced_text return replaced_text
def replace_punctuation_with_en(text):
text = text.replace("", "").replace("", "")
pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys()))
replaced_text = pattern.sub(lambda x: rep_map[x.group()], text)
replaced_text = re.sub(
r"[^\u4e00-\u9fa5A-Za-z" + "".join(punctuation) + r"]+", "", replaced_text
)
return replaced_text
def replace_consecutive_punctuation(text):
punctuations = ''.join(re.escape(p) for p in punctuation)
pattern = f'([{punctuations}])([{punctuations}])+'
result = re.sub(pattern, r'\1', text)
return result
def g2p(text): def g2p(text):
pattern = r"(?<=[{0}])\s*".format("".join(punctuation)) pattern = r"(?<=[{0}])\s*".format("".join(punctuation))
sentences = [i for i in re.split(pattern, text) if i.strip() != ""] sentences = [i for i in re.split(pattern, text) if i.strip() != ""]
@ -158,6 +178,23 @@ def text_normalize(text):
dest_text = "" dest_text = ""
for sentence in sentences: for sentence in sentences:
dest_text += replace_punctuation(sentence) dest_text += replace_punctuation(sentence)
# 避免重复标点引起的参考泄露
dest_text = replace_consecutive_punctuation(dest_text)
return dest_text
# 不排除英文的文本格式化
def mix_text_normalize(text):
# https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization
tx = TextNormalizer()
sentences = tx.normalize(text)
dest_text = ""
for sentence in sentences:
dest_text += replace_punctuation_with_en(sentence)
# 避免重复标点引起的参考泄露
dest_text = replace_consecutive_punctuation(dest_text)
return dest_text return dest_text

308
GPT_SoVITS/text/chinese2.py Normal file
View File

@ -0,0 +1,308 @@
import os
import pdb
import re
import cn2an
from pypinyin import lazy_pinyin, Style
from pypinyin.contrib.tone_convert import to_normal, to_finals_tone3, to_initials, to_finals
from text.symbols import punctuation
from text.tone_sandhi import ToneSandhi
from text.zh_normalization.text_normlization import TextNormalizer
normalizer = lambda x: cn2an.transform(x, "an2cn")
current_file_path = os.path.dirname(__file__)
pinyin_to_symbol_map = {
line.split("\t")[0]: line.strip().split("\t")[1]
for line in open(os.path.join(current_file_path, "opencpop-strict.txt")).readlines()
}
import jieba_fast.posseg as psg
# is_g2pw_str = os.environ.get("is_g2pw", "True")##默认开启
# is_g2pw = False#True if is_g2pw_str.lower() == 'true' else False
is_g2pw = True#True if is_g2pw_str.lower() == 'true' else False
if is_g2pw:
print("当前使用g2pw进行拼音推理")
from text.g2pw import G2PWPinyin, correct_pronunciation
parent_directory = os.path.dirname(current_file_path)
g2pw = G2PWPinyin(model_dir="GPT_SoVITS/text/G2PWModel",model_source="GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large",v_to_u=False, neutral_tone_with_five=True)
rep_map = {
"": ",",
"": ",",
"": ",",
"": ".",
"": "!",
"": "?",
"\n": ".",
"·": ",",
"": ",",
"...": "",
"$": ".",
"/": ",",
"": "-",
"~": "",
"":"",
}
tone_modifier = ToneSandhi()
def replace_punctuation(text):
text = text.replace("", "").replace("", "")
pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys()))
replaced_text = pattern.sub(lambda x: rep_map[x.group()], text)
replaced_text = re.sub(
r"[^\u4e00-\u9fa5" + "".join(punctuation) + r"]+", "", replaced_text
)
return replaced_text
def g2p(text):
pattern = r"(?<=[{0}])\s*".format("".join(punctuation))
sentences = [i for i in re.split(pattern, text) if i.strip() != ""]
phones, word2ph = _g2p(sentences)
return phones, word2ph
def _get_initials_finals(word):
initials = []
finals = []
orig_initials = lazy_pinyin(word, neutral_tone_with_five=True, style=Style.INITIALS)
orig_finals = lazy_pinyin(
word, neutral_tone_with_five=True, style=Style.FINALS_TONE3
)
for c, v in zip(orig_initials, orig_finals):
initials.append(c)
finals.append(v)
return initials, finals
must_erhua = {
"小院儿", "胡同儿", "范儿", "老汉儿", "撒欢儿", "寻老礼儿", "妥妥儿", "媳妇儿"
}
not_erhua = {
"虐儿", "为儿", "护儿", "瞒儿", "救儿", "替儿", "有儿", "一儿", "我儿", "俺儿", "妻儿",
"拐儿", "聋儿", "乞儿", "患儿", "幼儿", "孤儿", "婴儿", "婴幼儿", "连体儿", "脑瘫儿",
"流浪儿", "体弱儿", "混血儿", "蜜雪儿", "舫儿", "祖儿", "美儿", "应采儿", "可儿", "侄儿",
"孙儿", "侄孙儿", "女儿", "男儿", "红孩儿", "花儿", "虫儿", "马儿", "鸟儿", "猪儿", "猫儿",
"狗儿", "少儿"
}
def _merge_erhua(initials: list[str],
finals: list[str],
word: str,
pos: str) -> list[list[str]]:
"""
Do erhub.
"""
# fix er1
for i, phn in enumerate(finals):
if i == len(finals) - 1 and word[i] == "" and phn == 'er1':
finals[i] = 'er2'
# 发音
if word not in must_erhua and (word in not_erhua or
pos in {"a", "j", "nr"}):
return initials, finals
# "……" 等情况直接返回
if len(finals) != len(word):
return initials, finals
assert len(finals) == len(word)
# 与前一个字发同音
new_initials = []
new_finals = []
for i, phn in enumerate(finals):
if i == len(finals) - 1 and word[i] == "" and phn in {
"er2", "er5"
} and word[-2:] not in not_erhua and new_finals:
phn = "er" + new_finals[-1][-1]
new_initials.append(initials[i])
new_finals.append(phn)
return new_initials, new_finals
def _g2p(segments):
phones_list = []
word2ph = []
for seg in segments:
pinyins = []
# Replace all English words in the sentence
seg = re.sub("[a-zA-Z]+", "", seg)
seg_cut = psg.lcut(seg)
seg_cut = tone_modifier.pre_merge_for_modify(seg_cut)
initials = []
finals = []
if not is_g2pw:
for word, pos in seg_cut:
if pos == "eng":
continue
sub_initials, sub_finals = _get_initials_finals(word)
sub_finals = tone_modifier.modified_tone(word, pos, sub_finals)
# 儿化
sub_initials, sub_finals = _merge_erhua(sub_initials, sub_finals, word, pos)
initials.append(sub_initials)
finals.append(sub_finals)
# assert len(sub_initials) == len(sub_finals) == len(word)
initials = sum(initials, [])
finals = sum(finals, [])
print("pypinyin结果",initials,finals)
else:
# g2pw采用整句推理
pinyins = g2pw.lazy_pinyin(seg, neutral_tone_with_five=True, style=Style.TONE3)
pre_word_length = 0
for word, pos in seg_cut:
sub_initials = []
sub_finals = []
now_word_length = pre_word_length + len(word)
if pos == 'eng':
pre_word_length = now_word_length
continue
word_pinyins = pinyins[pre_word_length:now_word_length]
# 多音字消歧
word_pinyins = correct_pronunciation(word,word_pinyins)
for pinyin in word_pinyins:
if pinyin[0].isalpha():
sub_initials.append(to_initials(pinyin))
sub_finals.append(to_finals_tone3(pinyin,neutral_tone_with_five=True))
else:
sub_initials.append(pinyin)
sub_finals.append(pinyin)
pre_word_length = now_word_length
sub_finals = tone_modifier.modified_tone(word, pos, sub_finals)
# 儿化
sub_initials, sub_finals = _merge_erhua(sub_initials, sub_finals, word, pos)
initials.append(sub_initials)
finals.append(sub_finals)
initials = sum(initials, [])
finals = sum(finals, [])
# print("g2pw结果",initials,finals)
for c, v in zip(initials, finals):
raw_pinyin = c + v
# NOTE: post process for pypinyin outputs
# we discriminate i, ii and iii
if c == v:
assert c in punctuation
phone = [c]
word2ph.append(1)
else:
v_without_tone = v[:-1]
tone = v[-1]
pinyin = c + v_without_tone
assert tone in "12345"
if c:
# 多音节
v_rep_map = {
"uei": "ui",
"iou": "iu",
"uen": "un",
}
if v_without_tone in v_rep_map.keys():
pinyin = c + v_rep_map[v_without_tone]
else:
# 单音节
pinyin_rep_map = {
"ing": "ying",
"i": "yi",
"in": "yin",
"u": "wu",
}
if pinyin in pinyin_rep_map.keys():
pinyin = pinyin_rep_map[pinyin]
else:
single_rep_map = {
"v": "yu",
"e": "e",
"i": "y",
"u": "w",
}
if pinyin[0] in single_rep_map.keys():
pinyin = single_rep_map[pinyin[0]] + pinyin[1:]
assert pinyin in pinyin_to_symbol_map.keys(), (pinyin, seg, raw_pinyin)
new_c, new_v = pinyin_to_symbol_map[pinyin].split(" ")
new_v = new_v + tone
phone = [new_c, new_v]
word2ph.append(len(phone))
phones_list += phone
return phones_list, word2ph
def replace_punctuation_with_en(text):
text = text.replace("", "").replace("", "")
pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys()))
replaced_text = pattern.sub(lambda x: rep_map[x.group()], text)
replaced_text = re.sub(
r"[^\u4e00-\u9fa5A-Za-z" + "".join(punctuation) + r"]+", "", replaced_text
)
return replaced_text
def replace_consecutive_punctuation(text):
punctuations = ''.join(re.escape(p) for p in punctuation)
pattern = f'([{punctuations}])([{punctuations}])+'
result = re.sub(pattern, r'\1', text)
return result
def text_normalize(text):
# https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization
tx = TextNormalizer()
sentences = tx.normalize(text)
dest_text = ""
for sentence in sentences:
dest_text += replace_punctuation(sentence)
# 避免重复标点引起的参考泄露
dest_text = replace_consecutive_punctuation(dest_text)
return dest_text
# 不排除英文的文本格式化
def mix_text_normalize(text):
# https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization
tx = TextNormalizer()
sentences = tx.normalize(text)
dest_text = ""
for sentence in sentences:
dest_text += replace_punctuation_with_en(sentence)
# 避免重复标点引起的参考泄露
dest_text = replace_consecutive_punctuation(dest_text)
return dest_text
if __name__ == "__main__":
text = "啊——但是《原神》是由,米哈\游自主,研发的一款全.新开放世界.冒险游戏"
text = "呣呣呣~就是…大人的鼹鼠党吧?"
text = "你好"
text = text_normalize(text)
print(g2p(text))
# # 示例用法
# text = "这是一个示例文本:,你好!这是一个测试..."
# print(g2p_paddle(text)) # 输出: 这是一个示例文本你好这是一个测试

View File

@ -1,6 +1,15 @@
from text import chinese, japanese, cleaned_text_to_sequence, symbols, english from text import cleaned_text_to_sequence
import os
# if os.environ.get("version","v1")=="v1":
# from text import chinese
# from text.symbols import symbols
# else:
# from text import chinese2 as chinese
# from text.symbols2 import symbols
from text import symbols as symbols_v1
from text import symbols2 as symbols_v2
language_module_map = {"zh": chinese, "ja": japanese, "en": english}
special = [ special = [
# ("%", "zh", "SP"), # ("%", "zh", "SP"),
("", "zh", "SP2"), ("", "zh", "SP2"),
@ -9,39 +18,58 @@ special = [
] ]
def clean_text(text, language): def clean_text(text, language, version=None):
if version is None:version=os.environ.get('version', 'v2')
if version == "v1":
symbols = symbols_v1.symbols
language_module_map = {"zh": "chinese", "ja": "japanese", "en": "english"}
else:
symbols = symbols_v2.symbols
language_module_map = {"zh": "chinese2", "ja": "japanese", "en": "english", "ko": "korean","yue":"cantonese"}
if(language not in language_module_map): if(language not in language_module_map):
language="en" language="en"
text=" " text=" "
for special_s, special_l, target_symbol in special: for special_s, special_l, target_symbol in special:
if special_s in text and language == special_l: if special_s in text and language == special_l:
return clean_special(text, language, special_s, target_symbol) return clean_special(text, language, special_s, target_symbol, version)
language_module = language_module_map[language] language_module = __import__("text."+language_module_map[language],fromlist=[language_module_map[language]])
norm_text = language_module.text_normalize(text) if hasattr(language_module,"text_normalize"):
if language == "zh": norm_text = language_module.text_normalize(text)
else:
norm_text=text
if language == "zh" or language=="yue":##########
phones, word2ph = language_module.g2p(norm_text) phones, word2ph = language_module.g2p(norm_text)
assert len(phones) == sum(word2ph) assert len(phones) == sum(word2ph)
assert len(norm_text) == len(word2ph) assert len(norm_text) == len(word2ph)
elif language == "en": elif language == "en":
phones = language_module.g2p(norm_text) phones = language_module.g2p(norm_text)
if len(phones) < 4: if len(phones) < 4:
phones = [','] * (4 - len(phones)) + phones phones = [','] + phones
word2ph = None word2ph = None
else: else:
phones = language_module.g2p(norm_text) phones = language_module.g2p(norm_text)
word2ph = None word2ph = None
for ph in phones: for ph in phones:
assert ph in symbols phones = ['UNK' if ph not in symbols else ph for ph in phones]
return phones, word2ph, norm_text return phones, word2ph, norm_text
def clean_special(text, language, special_s, target_symbol): def clean_special(text, language, special_s, target_symbol, version=None):
if version is None:version=os.environ.get('version', 'v2')
if version == "v1":
symbols = symbols_v1.symbols
language_module_map = {"zh": "chinese", "ja": "japanese", "en": "english"}
else:
symbols = symbols_v2.symbols
language_module_map = {"zh": "chinese2", "ja": "japanese", "en": "english", "ko": "korean","yue":"cantonese"}
""" """
特殊静音段sp符号处理 特殊静音段sp符号处理
""" """
text = text.replace(special_s, ",") text = text.replace(special_s, ",")
language_module = language_module_map[language] language_module = __import__("text."+language_module_map[language],fromlist=[language_module_map[language]])
norm_text = language_module.text_normalize(text) norm_text = language_module.text_normalize(text)
phones = language_module.g2p(norm_text) phones = language_module.g2p(norm_text)
new_ph = [] new_ph = []
@ -54,9 +82,11 @@ def clean_special(text, language, special_s, target_symbol):
return new_ph, phones[1], norm_text return new_ph, phones[1], norm_text
def text_to_sequence(text, language): def text_to_sequence(text, language, version=None):
version = os.environ.get('version',version)
if version is None:version='v2'
phones = clean_text(text) phones = clean_text(text)
return cleaned_text_to_sequence(phones) return cleaned_text_to_sequence(phones, version)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -4,9 +4,9 @@ import re
import wordsegment import wordsegment
from g2p_en import G2p from g2p_en import G2p
from string import punctuation from text.symbols import punctuation
from text import symbols from text.symbols2 import symbols
import unicodedata import unicodedata
from builtins import str as unicode from builtins import str as unicode
@ -110,6 +110,13 @@ def replace_phs(phs):
return phs_new return phs_new
def replace_consecutive_punctuation(text):
punctuations = ''.join(re.escape(p) for p in punctuation)
pattern = f'([{punctuations}])([{punctuations}])+'
result = re.sub(pattern, r'\1', text)
return result
def read_dict(): def read_dict():
g2p_dict = {} g2p_dict = {}
start_line = 49 start_line = 49
@ -234,6 +241,9 @@ def text_normalize(text):
text = re.sub(r"(?i)i\.e\.", "that is", text) text = re.sub(r"(?i)i\.e\.", "that is", text)
text = re.sub(r"(?i)e\.g\.", "for example", text) text = re.sub(r"(?i)e\.g\.", "for example", text)
# 避免重复标点引起的参考泄露
text = replace_consecutive_punctuation(text)
return text return text

View File

@ -0,0 +1 @@
from text.g2pw.g2pw import *

View File

@ -0,0 +1,166 @@
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Credits
This code is modified from https://github.com/GitYCC/g2pW
"""
from typing import Dict
from typing import List
from typing import Tuple
import numpy as np
from .utils import tokenize_and_map
ANCHOR_CHAR = ''
def prepare_onnx_input(tokenizer,
labels: List[str],
char2phonemes: Dict[str, List[int]],
chars: List[str],
texts: List[str],
query_ids: List[int],
use_mask: bool=False,
window_size: int=None,
max_len: int=512) -> Dict[str, np.array]:
if window_size is not None:
truncated_texts, truncated_query_ids = _truncate_texts(
window_size=window_size, texts=texts, query_ids=query_ids)
input_ids = []
token_type_ids = []
attention_masks = []
phoneme_masks = []
char_ids = []
position_ids = []
for idx in range(len(texts)):
text = (truncated_texts if window_size else texts)[idx].lower()
query_id = (truncated_query_ids if window_size else query_ids)[idx]
try:
tokens, text2token, token2text = tokenize_and_map(
tokenizer=tokenizer, text=text)
except Exception:
print(f'warning: text "{text}" is invalid')
return {}
text, query_id, tokens, text2token, token2text = _truncate(
max_len=max_len,
text=text,
query_id=query_id,
tokens=tokens,
text2token=text2token,
token2text=token2text)
processed_tokens = ['[CLS]'] + tokens + ['[SEP]']
input_id = list(
np.array(tokenizer.convert_tokens_to_ids(processed_tokens)))
token_type_id = list(np.zeros((len(processed_tokens), ), dtype=int))
attention_mask = list(np.ones((len(processed_tokens), ), dtype=int))
query_char = text[query_id]
phoneme_mask = [1 if i in char2phonemes[query_char] else 0 for i in range(len(labels))] \
if use_mask else [1] * len(labels)
char_id = chars.index(query_char)
position_id = text2token[
query_id] + 1 # [CLS] token locate at first place
input_ids.append(input_id)
token_type_ids.append(token_type_id)
attention_masks.append(attention_mask)
phoneme_masks.append(phoneme_mask)
char_ids.append(char_id)
position_ids.append(position_id)
outputs = {
'input_ids': np.array(input_ids).astype(np.int64),
'token_type_ids': np.array(token_type_ids).astype(np.int64),
'attention_masks': np.array(attention_masks).astype(np.int64),
'phoneme_masks': np.array(phoneme_masks).astype(np.float32),
'char_ids': np.array(char_ids).astype(np.int64),
'position_ids': np.array(position_ids).astype(np.int64),
}
return outputs
def _truncate_texts(window_size: int, texts: List[str],
query_ids: List[int]) -> Tuple[List[str], List[int]]:
truncated_texts = []
truncated_query_ids = []
for text, query_id in zip(texts, query_ids):
start = max(0, query_id - window_size // 2)
end = min(len(text), query_id + window_size // 2)
truncated_text = text[start:end]
truncated_texts.append(truncated_text)
truncated_query_id = query_id - start
truncated_query_ids.append(truncated_query_id)
return truncated_texts, truncated_query_ids
def _truncate(max_len: int,
text: str,
query_id: int,
tokens: List[str],
text2token: List[int],
token2text: List[Tuple[int]]):
truncate_len = max_len - 2
if len(tokens) <= truncate_len:
return (text, query_id, tokens, text2token, token2text)
token_position = text2token[query_id]
token_start = token_position - truncate_len // 2
token_end = token_start + truncate_len
font_exceed_dist = -token_start
back_exceed_dist = token_end - len(tokens)
if font_exceed_dist > 0:
token_start += font_exceed_dist
token_end += font_exceed_dist
elif back_exceed_dist > 0:
token_start -= back_exceed_dist
token_end -= back_exceed_dist
start = token2text[token_start][0]
end = token2text[token_end - 1][1]
return (text[start:end], query_id - start, tokens[token_start:token_end], [
i - token_start if i is not None else None
for i in text2token[start:end]
], [(s - start, e - start) for s, e in token2text[token_start:token_end]])
def get_phoneme_labels(polyphonic_chars: List[List[str]]
) -> Tuple[List[str], Dict[str, List[int]]]:
labels = sorted(list(set([phoneme for char, phoneme in polyphonic_chars])))
char2phonemes = {}
for char, phoneme in polyphonic_chars:
if char not in char2phonemes:
char2phonemes[char] = []
char2phonemes[char].append(labels.index(phoneme))
return labels, char2phonemes
def get_char_phoneme_labels(polyphonic_chars: List[List[str]]
) -> Tuple[List[str], Dict[str, List[int]]]:
labels = sorted(
list(set([f'{char} {phoneme}' for char, phoneme in polyphonic_chars])))
char2phonemes = {}
for char, phoneme in polyphonic_chars:
if char not in char2phonemes:
char2phonemes[char] = []
char2phonemes[char].append(labels.index(f'{char} {phoneme}'))
return labels, char2phonemes

View File

@ -0,0 +1,154 @@
# This code is modified from https://github.com/mozillazg/pypinyin-g2pW
import pickle
import os
from pypinyin.constants import RE_HANS
from pypinyin.core import Pinyin, Style
from pypinyin.seg.simpleseg import simple_seg
from pypinyin.converter import UltimateConverter
from pypinyin.contrib.tone_convert import to_tone
from .onnx_api import G2PWOnnxConverter
current_file_path = os.path.dirname(__file__)
CACHE_PATH = os.path.join(current_file_path, "polyphonic.pickle")
PP_DICT_PATH = os.path.join(current_file_path, "polyphonic.rep")
PP_FIX_DICT_PATH = os.path.join(current_file_path, "polyphonic-fix.rep")
class G2PWPinyin(Pinyin):
def __init__(self, model_dir='G2PWModel/', model_source=None,
enable_non_tradional_chinese=True,
v_to_u=False, neutral_tone_with_five=False, tone_sandhi=False, **kwargs):
self._g2pw = G2PWOnnxConverter(
model_dir=model_dir,
style='pinyin',
model_source=model_source,
enable_non_tradional_chinese=enable_non_tradional_chinese,
)
self._converter = Converter(
self._g2pw, v_to_u=v_to_u,
neutral_tone_with_five=neutral_tone_with_five,
tone_sandhi=tone_sandhi,
)
def get_seg(self, **kwargs):
return simple_seg
class Converter(UltimateConverter):
def __init__(self, g2pw_instance, v_to_u=False,
neutral_tone_with_five=False,
tone_sandhi=False, **kwargs):
super(Converter, self).__init__(
v_to_u=v_to_u,
neutral_tone_with_five=neutral_tone_with_five,
tone_sandhi=tone_sandhi, **kwargs)
self._g2pw = g2pw_instance
def convert(self, words, style, heteronym, errors, strict, **kwargs):
pys = []
if RE_HANS.match(words):
pys = self._to_pinyin(words, style=style, heteronym=heteronym,
errors=errors, strict=strict)
post_data = self.post_pinyin(words, heteronym, pys)
if post_data is not None:
pys = post_data
pys = self.convert_styles(
pys, words, style, heteronym, errors, strict)
else:
py = self.handle_nopinyin(words, style=style, errors=errors,
heteronym=heteronym, strict=strict)
if py:
pys.extend(py)
return _remove_dup_and_empty(pys)
def _to_pinyin(self, han, style, heteronym, errors, strict, **kwargs):
pinyins = []
g2pw_pinyin = self._g2pw(han)
if not g2pw_pinyin: # g2pw 不支持的汉字改为使用 pypinyin 原有逻辑
return super(Converter, self).convert(
han, Style.TONE, heteronym, errors, strict, **kwargs)
for i, item in enumerate(g2pw_pinyin[0]):
if item is None: # g2pw 不支持的汉字改为使用 pypinyin 原有逻辑
py = super(Converter, self).convert(
han[i], Style.TONE, heteronym, errors, strict, **kwargs)
pinyins.extend(py)
else:
pinyins.append([to_tone(item)])
return pinyins
def _remove_dup_items(lst, remove_empty=False):
new_lst = []
for item in lst:
if remove_empty and not item:
continue
if item not in new_lst:
new_lst.append(item)
return new_lst
def _remove_dup_and_empty(lst_list):
new_lst_list = []
for lst in lst_list:
lst = _remove_dup_items(lst, remove_empty=True)
if lst:
new_lst_list.append(lst)
else:
new_lst_list.append([''])
return new_lst_list
def cache_dict(polyphonic_dict, file_path):
with open(file_path, "wb") as pickle_file:
pickle.dump(polyphonic_dict, pickle_file)
def get_dict():
if os.path.exists(CACHE_PATH):
with open(CACHE_PATH, "rb") as pickle_file:
polyphonic_dict = pickle.load(pickle_file)
else:
polyphonic_dict = read_dict()
cache_dict(polyphonic_dict, CACHE_PATH)
return polyphonic_dict
def read_dict():
polyphonic_dict = {}
with open(PP_DICT_PATH) as f:
line = f.readline()
while line:
key, value_str = line.split(':')
value = eval(value_str.strip())
polyphonic_dict[key.strip()] = value
line = f.readline()
with open(PP_FIX_DICT_PATH) as f:
line = f.readline()
while line:
key, value_str = line.split(':')
value = eval(value_str.strip())
polyphonic_dict[key.strip()] = value
line = f.readline()
return polyphonic_dict
def correct_pronunciation(word,word_pinyins):
if word in pp_dict:
word_pinyins = pp_dict[word]
return word_pinyins
pp_dict = get_dict()

View File

@ -0,0 +1,241 @@
# This code is modified from https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/g2pw
# This code is modified from https://github.com/GitYCC/g2pW
import warnings
warnings.filterwarnings("ignore")
import json
import os
import zipfile,requests
from typing import Any
from typing import Dict
from typing import List
from typing import Tuple
import numpy as np
import onnxruntime
onnxruntime.set_default_logger_severity(3)
from opencc import OpenCC
from transformers import AutoTokenizer
from pypinyin import pinyin
from pypinyin import Style
from .dataset import get_char_phoneme_labels
from .dataset import get_phoneme_labels
from .dataset import prepare_onnx_input
from .utils import load_config
from ..zh_normalization.char_convert import tranditional_to_simplified
model_version = '1.1'
def predict(session, onnx_input: Dict[str, Any],
labels: List[str]) -> Tuple[List[str], List[float]]:
all_preds = []
all_confidences = []
probs = session.run([], {
"input_ids": onnx_input['input_ids'],
"token_type_ids": onnx_input['token_type_ids'],
"attention_mask": onnx_input['attention_masks'],
"phoneme_mask": onnx_input['phoneme_masks'],
"char_ids": onnx_input['char_ids'],
"position_ids": onnx_input['position_ids']
})[0]
preds = np.argmax(probs, axis=1).tolist()
max_probs = []
for index, arr in zip(preds, probs.tolist()):
max_probs.append(arr[index])
all_preds += [labels[pred] for pred in preds]
all_confidences += max_probs
return all_preds, all_confidences
def download_and_decompress(model_dir: str='G2PWModel/'):
if not os.path.exists(model_dir):
parent_directory = os.path.dirname(model_dir)
zip_dir = os.path.join(parent_directory,"G2PWModel_1.1.zip")
extract_dir = os.path.join(parent_directory,"G2PWModel_1.1")
extract_dir_new = os.path.join(parent_directory,"G2PWModel")
print("Downloading g2pw model...")
modelscope_url = "https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip"
with requests.get(modelscope_url, stream=True) as r:
r.raise_for_status()
with open(zip_dir, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print("Extracting g2pw model...")
with zipfile.ZipFile(zip_dir, "r") as zip_ref:
zip_ref.extractall(parent_directory)
os.rename(extract_dir, extract_dir_new)
return model_dir
class G2PWOnnxConverter:
def __init__(self,
model_dir: str='G2PWModel/',
style: str='bopomofo',
model_source: str=None,
enable_non_tradional_chinese: bool=False):
uncompress_path = download_and_decompress(model_dir)
sess_options = onnxruntime.SessionOptions()
sess_options.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_ALL
sess_options.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL
sess_options.intra_op_num_threads = 2
try:
self.session_g2pW = onnxruntime.InferenceSession(os.path.join(uncompress_path, 'g2pW.onnx'),sess_options=sess_options, providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
except:
self.session_g2pW = onnxruntime.InferenceSession(os.path.join(uncompress_path, 'g2pW.onnx'),sess_options=sess_options, providers=['CPUExecutionProvider'])
self.config = load_config(
config_path=os.path.join(uncompress_path, 'config.py'),
use_default=True)
self.model_source = model_source if model_source else self.config.model_source
self.enable_opencc = enable_non_tradional_chinese
self.tokenizer = AutoTokenizer.from_pretrained(self.model_source)
polyphonic_chars_path = os.path.join(uncompress_path,
'POLYPHONIC_CHARS.txt')
monophonic_chars_path = os.path.join(uncompress_path,
'MONOPHONIC_CHARS.txt')
self.polyphonic_chars = [
line.split('\t')
for line in open(polyphonic_chars_path, encoding='utf-8').read()
.strip().split('\n')
]
self.non_polyphonic = {
'', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', ''
}
self.non_monophonic = {'', ''}
self.monophonic_chars = [
line.split('\t')
for line in open(monophonic_chars_path, encoding='utf-8').read()
.strip().split('\n')
]
self.labels, self.char2phonemes = get_char_phoneme_labels(
polyphonic_chars=self.polyphonic_chars
) if self.config.use_char_phoneme else get_phoneme_labels(
polyphonic_chars=self.polyphonic_chars)
self.chars = sorted(list(self.char2phonemes.keys()))
self.polyphonic_chars_new = set(self.chars)
for char in self.non_polyphonic:
if char in self.polyphonic_chars_new:
self.polyphonic_chars_new.remove(char)
self.monophonic_chars_dict = {
char: phoneme
for char, phoneme in self.monophonic_chars
}
for char in self.non_monophonic:
if char in self.monophonic_chars_dict:
self.monophonic_chars_dict.pop(char)
self.pos_tags = [
'UNK', 'A', 'C', 'D', 'I', 'N', 'P', 'T', 'V', 'DE', 'SHI'
]
with open(
os.path.join(uncompress_path,
'bopomofo_to_pinyin_wo_tune_dict.json'),
'r',
encoding='utf-8') as fr:
self.bopomofo_convert_dict = json.load(fr)
self.style_convert_func = {
'bopomofo': lambda x: x,
'pinyin': self._convert_bopomofo_to_pinyin,
}[style]
with open(
os.path.join(uncompress_path, 'char_bopomofo_dict.json'),
'r',
encoding='utf-8') as fr:
self.char_bopomofo_dict = json.load(fr)
if self.enable_opencc:
self.cc = OpenCC('s2tw')
def _convert_bopomofo_to_pinyin(self, bopomofo: str) -> str:
tone = bopomofo[-1]
assert tone in '12345'
component = self.bopomofo_convert_dict.get(bopomofo[:-1])
if component:
return component + tone
else:
print(f'Warning: "{bopomofo}" cannot convert to pinyin')
return None
def __call__(self, sentences: List[str]) -> List[List[str]]:
if isinstance(sentences, str):
sentences = [sentences]
if self.enable_opencc:
translated_sentences = []
for sent in sentences:
translated_sent = self.cc.convert(sent)
assert len(translated_sent) == len(sent)
translated_sentences.append(translated_sent)
sentences = translated_sentences
texts, query_ids, sent_ids, partial_results = self._prepare_data(
sentences=sentences)
if len(texts) == 0:
# sentences no polyphonic words
return partial_results
onnx_input = prepare_onnx_input(
tokenizer=self.tokenizer,
labels=self.labels,
char2phonemes=self.char2phonemes,
chars=self.chars,
texts=texts,
query_ids=query_ids,
use_mask=self.config.use_mask,
window_size=None)
preds, confidences = predict(
session=self.session_g2pW,
onnx_input=onnx_input,
labels=self.labels)
if self.config.use_char_phoneme:
preds = [pred.split(' ')[1] for pred in preds]
results = partial_results
for sent_id, query_id, pred in zip(sent_ids, query_ids, preds):
results[sent_id][query_id] = self.style_convert_func(pred)
return results
def _prepare_data(
self, sentences: List[str]
) -> Tuple[List[str], List[int], List[int], List[List[str]]]:
texts, query_ids, sent_ids, partial_results = [], [], [], []
for sent_id, sent in enumerate(sentences):
# pypinyin works well for Simplified Chinese than Traditional Chinese
sent_s = tranditional_to_simplified(sent)
pypinyin_result = pinyin(
sent_s, neutral_tone_with_five=True, style=Style.TONE3)
partial_result = [None] * len(sent)
for i, char in enumerate(sent):
if char in self.polyphonic_chars_new:
texts.append(sent)
query_ids.append(i)
sent_ids.append(sent_id)
elif char in self.monophonic_chars_dict:
partial_result[i] = self.style_convert_func(
self.monophonic_chars_dict[char])
elif char in self.char_bopomofo_dict:
partial_result[i] = pypinyin_result[i][0]
# partial_result[i] = self.style_convert_func(self.char_bopomofo_dict[char][0])
else:
partial_result[i] = pypinyin_result[i][0]
partial_results.append(partial_result)
return texts, query_ids, sent_ids, partial_results

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,53 @@
湖泊: ['hu2','po1']
地壳: ['di4','qiao4']
柏树: ['bai3','shu4']
曝光: ['bao4','guang1']
弹力: ['tan2','li4']
字帖: ['zi4','tie4']
口吃: ['kou3','chi1']
包扎: ['bao1','za1']
哪吒: ['ne2','zha1']
说服: ['shuo1','fu2']
识字: ['shi2','zi4']
骨头: ['gu3','tou5']
对称: ['dui4','chen4']
口供: ['kou3','gong4']
抹布: ['ma1','bu4']
露背: ['lu4','bei4']
圈养: ['juan4', 'yang3']
眼眶: ['yan3', 'kuang4']
品行: ['pin3','xing2']
颤抖: ['chan4','dou3']
差不多: ['cha4','bu5','duo1']
鸭绿江: ['ya1','lu4','jiang1']
撒切尔: ['sa4','qie4','er3']
比比皆是: ['bi3','bi3','jie1','shi4']
身无长物: ['shen1','wu2','chang2','wu4']
手里: ['shou2','li3']
关卡: ['guan1','qia3']
怀揣: ['huai2','chuai1']
挑剔: ['tiao1','ti4']
供称: ['gong4','cheng1']
作坊: ['zuo1', 'fang5']
中医: ['zhong1','yi1']
嚷嚷: ['rang1','rang5']
商厦: ['shang1','sha4']
大厦: ['da4','sha4']
刹车: ['sha1','che1']
嘚瑟: ['de4','se5']
朝鲜: ['chao2','xian3']
阿房宫: ['e1','pang2','gong1']
阿胶: ['e1','jiao1']
咖喱: ['ga1','li5']
时分: ['shi2','fen1']
蚌埠: ['beng4','bu4']
驯服: ['xun4','fu2']
幸免于难: ['xing4','mian3','yu2','nan4']
恶行: ['e4','xing2']
唉: ['ai4']
扎实: ['zha1','shi2']
干将: ['gan4','jiang4']
陈威行: ['chen2', 'wei1', 'hang2']
郭晟: ['guo1', 'sheng4']
中标: ['zhong4', 'biao1']
抗住: ['kang2', 'zhu4']

View File

@ -0,0 +1,145 @@
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Credits
This code is modified from https://github.com/GitYCC/g2pW
"""
import os
import re
def wordize_and_map(text: str):
words = []
index_map_from_text_to_word = []
index_map_from_word_to_text = []
while len(text) > 0:
match_space = re.match(r'^ +', text)
if match_space:
space_str = match_space.group(0)
index_map_from_text_to_word += [None] * len(space_str)
text = text[len(space_str):]
continue
match_en = re.match(r'^[a-zA-Z0-9]+', text)
if match_en:
en_word = match_en.group(0)
word_start_pos = len(index_map_from_text_to_word)
word_end_pos = word_start_pos + len(en_word)
index_map_from_word_to_text.append((word_start_pos, word_end_pos))
index_map_from_text_to_word += [len(words)] * len(en_word)
words.append(en_word)
text = text[len(en_word):]
else:
word_start_pos = len(index_map_from_text_to_word)
word_end_pos = word_start_pos + 1
index_map_from_word_to_text.append((word_start_pos, word_end_pos))
index_map_from_text_to_word += [len(words)]
words.append(text[0])
text = text[1:]
return words, index_map_from_text_to_word, index_map_from_word_to_text
def tokenize_and_map(tokenizer, text: str):
words, text2word, word2text = wordize_and_map(text=text)
tokens = []
index_map_from_token_to_text = []
for word, (word_start, word_end) in zip(words, word2text):
word_tokens = tokenizer.tokenize(word)
if len(word_tokens) == 0 or word_tokens == ['[UNK]']:
index_map_from_token_to_text.append((word_start, word_end))
tokens.append('[UNK]')
else:
current_word_start = word_start
for word_token in word_tokens:
word_token_len = len(re.sub(r'^##', '', word_token))
index_map_from_token_to_text.append(
(current_word_start, current_word_start + word_token_len))
current_word_start = current_word_start + word_token_len
tokens.append(word_token)
index_map_from_text_to_token = text2word
for i, (token_start, token_end) in enumerate(index_map_from_token_to_text):
for token_pos in range(token_start, token_end):
index_map_from_text_to_token[token_pos] = i
return tokens, index_map_from_text_to_token, index_map_from_token_to_text
def _load_config(config_path: os.PathLike):
import importlib.util
spec = importlib.util.spec_from_file_location('__init__', config_path)
config = importlib.util.module_from_spec(spec)
spec.loader.exec_module(config)
return config
default_config_dict = {
'manual_seed': 1313,
'model_source': 'bert-base-chinese',
'window_size': 32,
'num_workers': 2,
'use_mask': True,
'use_char_phoneme': False,
'use_conditional': True,
'param_conditional': {
'affect_location': 'softmax',
'bias': True,
'char-linear': True,
'pos-linear': False,
'char+pos-second': True,
'char+pos-second_lowrank': False,
'lowrank_size': 0,
'char+pos-second_fm': False,
'fm_size': 0,
'fix_mode': None,
'count_json': 'train.count.json'
},
'lr': 5e-5,
'val_interval': 200,
'num_iter': 10000,
'use_focal': False,
'param_focal': {
'alpha': 0.0,
'gamma': 0.7
},
'use_pos': True,
'param_pos ': {
'weight': 0.1,
'pos_joint_training': True,
'train_pos_path': 'train.pos',
'valid_pos_path': 'dev.pos',
'test_pos_path': 'test.pos'
}
}
def load_config(config_path: os.PathLike, use_default: bool=False):
config = _load_config(config_path)
if use_default:
for attr, val in default_config_dict.items():
if not hasattr(config, attr):
setattr(config, attr, val)
elif isinstance(val, dict):
d = getattr(config, attr)
for dict_k, dict_v in val.items():
if dict_k not in d:
d[dict_k] = dict_v
return config

View File

@ -4,8 +4,7 @@ import sys
import pyopenjtalk import pyopenjtalk
from text.symbols import punctuation
from text import symbols
# Regular expression matching Japanese without punctuation marks: # Regular expression matching Japanese without punctuation marks:
_japanese_characters = re.compile( _japanese_characters = re.compile(
r"[A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]" r"[A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]"
@ -56,15 +55,23 @@ def post_replace_ph(ph):
"": ",", "": ",",
"...": "", "...": "",
} }
if ph in rep_map.keys(): if ph in rep_map.keys():
ph = rep_map[ph] ph = rep_map[ph]
if ph in symbols: # if ph in symbols:
return ph # return ph
if ph not in symbols: # if ph not in symbols:
ph = "UNK" # ph = "UNK"
return ph return ph
def replace_consecutive_punctuation(text):
punctuations = ''.join(re.escape(p) for p in punctuation)
pattern = f'([{punctuations}])([{punctuations}])+'
result = re.sub(pattern, r'\1', text)
return result
def symbols_to_japanese(text): def symbols_to_japanese(text):
for regex, replacement in _symbols_to_japanese: for regex, replacement in _symbols_to_japanese:
text = re.sub(regex, replacement, text) text = re.sub(regex, replacement, text)
@ -94,6 +101,9 @@ def preprocess_jap(text, with_prosody=False):
def text_normalize(text): def text_normalize(text):
# todo: jap text normalize # todo: jap text normalize
# 避免重复标点引起的参考泄露
text = replace_consecutive_punctuation(text)
return text return text
# Copied from espnet https://github.com/espnet/espnet/blob/master/espnet2/text/phoneme_tokenizer.py # Copied from espnet https://github.com/espnet/espnet/blob/master/espnet2/text/phoneme_tokenizer.py
@ -179,7 +189,7 @@ def _numeric_feature_by_regex(regex, s):
return -50 return -50
return int(match.group(1)) return int(match.group(1))
def g2p(norm_text, with_prosody=False): def g2p(norm_text, with_prosody=True):
phones = preprocess_jap(norm_text, with_prosody) phones = preprocess_jap(norm_text, with_prosody)
phones = [post_replace_ph(i) for i in phones] phones = [post_replace_ph(i) for i in phones]
# todo: implement tones and word2ph # todo: implement tones and word2ph
@ -188,4 +198,4 @@ def g2p(norm_text, with_prosody=False):
if __name__ == "__main__": if __name__ == "__main__":
phones = g2p("こんにちは, hello, AKITOです,よろしくお願いしますね!") phones = g2p("こんにちは, hello, AKITOです,よろしくお願いしますね!")
print(phones) print(phones)

265
GPT_SoVITS/text/korean.py Normal file
View File

@ -0,0 +1,265 @@
# reference: https://github.com/ORI-Muchim/MB-iSTFT-VITS-Korean/blob/main/text/korean.py
import re
from jamo import h2j, j2hcj
import ko_pron
from g2pk2 import G2p
from text.symbols2 import symbols
# This is a list of Korean classifiers preceded by pure Korean numerals.
_korean_classifiers = '군데 권 개 그루 닢 대 두 마리 모 모금 뭇 발 발짝 방 번 벌 보루 살 수 술 시 쌈 움큼 정 짝 채 척 첩 축 켤레 톨 통'
# List of (hangul, hangul divided) pairs:
_hangul_divided = [(re.compile('%s' % x[0]), x[1]) for x in [
# ('ㄳ', 'ㄱㅅ'), # g2pk2, A Syllable-ending Rule
# ('ㄵ', 'ㄴㅈ'),
# ('ㄶ', 'ㄴㅎ'),
# ('ㄺ', 'ㄹㄱ'),
# ('ㄻ', 'ㄹㅁ'),
# ('ㄼ', 'ㄹㅂ'),
# ('ㄽ', 'ㄹㅅ'),
# ('ㄾ', 'ㄹㅌ'),
# ('ㄿ', 'ㄹㅍ'),
# ('ㅀ', 'ㄹㅎ'),
# ('ㅄ', 'ㅂㅅ'),
('', 'ㅗㅏ'),
('', 'ㅗㅐ'),
('', 'ㅗㅣ'),
('', 'ㅜㅓ'),
('', 'ㅜㅔ'),
('', 'ㅜㅣ'),
('', 'ㅡㅣ'),
('', 'ㅣㅏ'),
('', 'ㅣㅐ'),
('', 'ㅣㅓ'),
('', 'ㅣㅔ'),
('', 'ㅣㅗ'),
('', 'ㅣㅜ')
]]
# List of (Latin alphabet, hangul) pairs:
_latin_to_hangul = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [
('a', '에이'),
('b', ''),
('c', ''),
('d', ''),
('e', ''),
('f', '에프'),
('g', ''),
('h', '에이치'),
('i', '아이'),
('j', '제이'),
('k', '케이'),
('l', ''),
('m', ''),
('n', ''),
('o', ''),
('p', ''),
('q', ''),
('r', '아르'),
('s', '에스'),
('t', ''),
('u', ''),
('v', '브이'),
('w', '더블유'),
('x', '엑스'),
('y', '와이'),
('z', '제트')
]]
# List of (ipa, lazy ipa) pairs:
_ipa_to_lazy_ipa = [(re.compile('%s' % x[0], re.IGNORECASE), x[1]) for x in [
('t͡ɕ','ʧ'),
('d͡ʑ','ʥ'),
('ɲ','n^'),
('ɕ','ʃ'),
('ʷ','w'),
('ɭ','l`'),
('ʎ','ɾ'),
('ɣ','ŋ'),
('ɰ','ɯ'),
('ʝ','j'),
('ʌ','ə'),
('ɡ','g'),
('\u031a','#'),
('\u0348','='),
('\u031e',''),
('\u0320',''),
('\u0339','')
]]
def fix_g2pk2_error(text):
new_text = ""
i = 0
while i < len(text) - 4:
if (text[i:i+3] == 'ㅇㅡㄹ' or text[i:i+3] == 'ㄹㅡㄹ') and text[i+3] == ' ' and text[i+4] == '':
new_text += text[i:i+3] + ' ' + ''
i += 5
else:
new_text += text[i]
i += 1
new_text += text[i:]
return new_text
def latin_to_hangul(text):
for regex, replacement in _latin_to_hangul:
text = re.sub(regex, replacement, text)
return text
def divide_hangul(text):
text = j2hcj(h2j(text))
for regex, replacement in _hangul_divided:
text = re.sub(regex, replacement, text)
return text
def hangul_number(num, sino=True):
'''Reference https://github.com/Kyubyong/g2pK'''
num = re.sub(',', '', num)
if num == '0':
return ''
if not sino and num == '20':
return '스무'
digits = '123456789'
names = '일이삼사오육칠팔구'
digit2name = {d: n for d, n in zip(digits, names)}
modifiers = '한 두 세 네 다섯 여섯 일곱 여덟 아홉'
decimals = '열 스물 서른 마흔 쉰 예순 일흔 여든 아흔'
digit2mod = {d: mod for d, mod in zip(digits, modifiers.split())}
digit2dec = {d: dec for d, dec in zip(digits, decimals.split())}
spelledout = []
for i, digit in enumerate(num):
i = len(num) - i - 1
if sino:
if i == 0:
name = digit2name.get(digit, '')
elif i == 1:
name = digit2name.get(digit, '') + ''
name = name.replace('일십', '')
else:
if i == 0:
name = digit2mod.get(digit, '')
elif i == 1:
name = digit2dec.get(digit, '')
if digit == '0':
if i % 4 == 0:
last_three = spelledout[-min(3, len(spelledout)):]
if ''.join(last_three) == '':
spelledout.append('')
continue
else:
spelledout.append('')
continue
if i == 2:
name = digit2name.get(digit, '') + ''
name = name.replace('일백', '')
elif i == 3:
name = digit2name.get(digit, '') + ''
name = name.replace('일천', '')
elif i == 4:
name = digit2name.get(digit, '') + ''
name = name.replace('일만', '')
elif i == 5:
name = digit2name.get(digit, '') + ''
name = name.replace('일십', '')
elif i == 6:
name = digit2name.get(digit, '') + ''
name = name.replace('일백', '')
elif i == 7:
name = digit2name.get(digit, '') + ''
name = name.replace('일천', '')
elif i == 8:
name = digit2name.get(digit, '') + ''
elif i == 9:
name = digit2name.get(digit, '') + ''
elif i == 10:
name = digit2name.get(digit, '') + ''
elif i == 11:
name = digit2name.get(digit, '') + ''
elif i == 12:
name = digit2name.get(digit, '') + ''
elif i == 13:
name = digit2name.get(digit, '') + ''
elif i == 14:
name = digit2name.get(digit, '') + ''
elif i == 15:
name = digit2name.get(digit, '') + ''
spelledout.append(name)
return ''.join(elem for elem in spelledout)
def number_to_hangul(text):
'''Reference https://github.com/Kyubyong/g2pK'''
tokens = set(re.findall(r'(\d[\d,]*)([\uac00-\ud71f]+)', text))
for token in tokens:
num, classifier = token
if classifier[:2] in _korean_classifiers or classifier[0] in _korean_classifiers:
spelledout = hangul_number(num, sino=False)
else:
spelledout = hangul_number(num, sino=True)
text = text.replace(f'{num}{classifier}', f'{spelledout}{classifier}')
# digit by digit for remaining digits
digits = '0123456789'
names = '영일이삼사오육칠팔구'
for d, n in zip(digits, names):
text = text.replace(d, n)
return text
def korean_to_lazy_ipa(text):
text = latin_to_hangul(text)
text = number_to_hangul(text)
text=re.sub('[\uac00-\ud7af]+',lambda x:ko_pron.romanise(x.group(0),'ipa').split('] ~ [')[0],text)
for regex, replacement in _ipa_to_lazy_ipa:
text = re.sub(regex, replacement, text)
return text
_g2p=G2p()
def korean_to_ipa(text):
text = latin_to_hangul(text)
text = number_to_hangul(text)
text = _g2p(text)
text = fix_g2pk2_error(text)
text = korean_to_lazy_ipa(text)
return text.replace('ʧ','').replace('ʥ','')
def post_replace_ph(ph):
rep_map = {
"": ",",
"": ",",
"": ",",
"": ".",
"": "!",
"": "?",
"\n": ".",
"·": ",",
"": ",",
"...": "",
" ": "",
}
if ph in rep_map.keys():
ph = rep_map[ph]
if ph in symbols:
return ph
if ph not in symbols:
ph = ""
return ph
def g2p(text):
text = latin_to_hangul(text)
text = _g2p(text)
text = divide_hangul(text)
text = fix_g2pk2_error(text)
text = re.sub(r'([\u3131-\u3163])$', r'\1.', text)
# text = "".join([post_replace_ph(i) for i in text])
text = [post_replace_ph(i) for i in text]
return text

419
GPT_SoVITS/text/symbols2.py Normal file
View File

@ -0,0 +1,419 @@
import os
# punctuation = ['!', '?', '…', ",", ".","@"]#@是SP停顿
punctuation = ["!", "?", "", ",", "."] # @是SP停顿
punctuation.append("-")
pu_symbols = punctuation + ["SP", "SP2", "SP3", "UNK"]
# pu_symbols = punctuation + ["SP", 'SP2', 'SP3','SP4', "UNK"]
pad = "_"
c = [
"AA",
"EE",
"OO",
"b",
"c",
"ch",
"d",
"f",
"g",
"h",
"j",
"k",
"l",
"m",
"n",
"p",
"q",
"r",
"s",
"sh",
"t",
"w",
"x",
"y",
"z",
"zh",
]
v = [
"E1",
"En1",
"a1",
"ai1",
"an1",
"ang1",
"ao1",
"e1",
"ei1",
"en1",
"eng1",
"er1",
"i1",
"i01",
"ia1",
"ian1",
"iang1",
"iao1",
"ie1",
"in1",
"ing1",
"iong1",
"ir1",
"iu1",
"o1",
"ong1",
"ou1",
"u1",
"ua1",
"uai1",
"uan1",
"uang1",
"ui1",
"un1",
"uo1",
"v1",
"van1",
"ve1",
"vn1",
"E2",
"En2",
"a2",
"ai2",
"an2",
"ang2",
"ao2",
"e2",
"ei2",
"en2",
"eng2",
"er2",
"i2",
"i02",
"ia2",
"ian2",
"iang2",
"iao2",
"ie2",
"in2",
"ing2",
"iong2",
"ir2",
"iu2",
"o2",
"ong2",
"ou2",
"u2",
"ua2",
"uai2",
"uan2",
"uang2",
"ui2",
"un2",
"uo2",
"v2",
"van2",
"ve2",
"vn2",
"E3",
"En3",
"a3",
"ai3",
"an3",
"ang3",
"ao3",
"e3",
"ei3",
"en3",
"eng3",
"er3",
"i3",
"i03",
"ia3",
"ian3",
"iang3",
"iao3",
"ie3",
"in3",
"ing3",
"iong3",
"ir3",
"iu3",
"o3",
"ong3",
"ou3",
"u3",
"ua3",
"uai3",
"uan3",
"uang3",
"ui3",
"un3",
"uo3",
"v3",
"van3",
"ve3",
"vn3",
"E4",
"En4",
"a4",
"ai4",
"an4",
"ang4",
"ao4",
"e4",
"ei4",
"en4",
"eng4",
"er4",
"i4",
"i04",
"ia4",
"ian4",
"iang4",
"iao4",
"ie4",
"in4",
"ing4",
"iong4",
"ir4",
"iu4",
"o4",
"ong4",
"ou4",
"u4",
"ua4",
"uai4",
"uan4",
"uang4",
"ui4",
"un4",
"uo4",
"v4",
"van4",
"ve4",
"vn4",
"E5",
"En5",
"a5",
"ai5",
"an5",
"ang5",
"ao5",
"e5",
"ei5",
"en5",
"eng5",
"er5",
"i5",
"i05",
"ia5",
"ian5",
"iang5",
"iao5",
"ie5",
"in5",
"ing5",
"iong5",
"ir5",
"iu5",
"o5",
"ong5",
"ou5",
"u5",
"ua5",
"uai5",
"uan5",
"uang5",
"ui5",
"un5",
"uo5",
"v5",
"van5",
"ve5",
"vn5",
]
v_without_tone = [
"E",
"En",
"a",
"ai",
"an",
"ang",
"ao",
"e",
"ei",
"en",
"eng",
"er",
"i",
"i0",
"ia",
"ian",
"iang",
"iao",
"ie",
"in",
"ing",
"iong",
"ir",
"iu",
"o",
"ong",
"ou",
"u",
"ua",
"uai",
"uan",
"uang",
"ui",
"un",
"uo",
"v",
"van",
"ve",
"vn",
]
# japanese
ja_symbols = [
"I",
"N",
"U",
"a",
"b",
"by",
"ch",
"cl",
"d",
"dy",
"e",
"f",
"g",
"gy",
"h",
"hy",
"i",
"j",
"k",
"ky",
"m",
"my",
"n",
"ny",
"o",
"p",
"py",
"r",
"ry",
"s",
"sh",
"t",
"ts",
"u",
"v",
"w",
"y",
"z",
###楼下2个留到后面加
# "[", #上升调型
# "]", #下降调型
# "$", #结束符
# "^", #开始符
]
arpa = {
"AH0",
"S",
"AH1",
"EY2",
"AE2",
"EH0",
"OW2",
"UH0",
"NG",
"B",
"G",
"AY0",
"M",
"AA0",
"F",
"AO0",
"ER2",
"UH1",
"IY1",
"AH2",
"DH",
"IY0",
"EY1",
"IH0",
"K",
"N",
"W",
"IY2",
"T",
"AA1",
"ER1",
"EH2",
"OY0",
"UH2",
"UW1",
"Z",
"AW2",
"AW1",
"V",
"UW2",
"AA2",
"ER",
"AW0",
"UW0",
"R",
"OW1",
"EH1",
"ZH",
"AE0",
"IH2",
"IH",
"Y",
"JH",
"P",
"AY1",
"EY0",
"OY2",
"TH",
"HH",
"D",
"ER0",
"CH",
"AO1",
"AE1",
"AO2",
"OY1",
"AY2",
"IH1",
"OW0",
"L",
"SH",
}
ko_symbols='ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㄲㄸㅃㅆㅉㅏㅓㅗㅜㅡㅣㅐㅔ空停'
# ko_symbols='ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㄲㄸㅃㅆㅉㅏㅓㅗㅜㅡㅣㅐㅔ '
yue_symbols={'Yeot3', 'Yip1', 'Yyu3', 'Yeng4', 'Yut5', 'Yaan5', 'Ym5', 'Yaan6', 'Yang1', 'Yun4', 'Yon2', 'Yui5', 'Yun2', 'Yat3', 'Ye', 'Yeot1', 'Yoeng5', 'Yoek2', 'Yam2', 'Yeon6', 'Yu6', 'Yiu3', 'Yaang6', 'Yp5', 'Yai4', 'Yoek4', 'Yit6', 'Yam5', 'Yoeng6', 'Yg1', 'Yk3', 'Yoe4', 'Yam3', 'Yc', 'Yyu4', 'Yyut1', 'Yiu4', 'Ying3', 'Yip3', 'Yaap3', 'Yau3', 'Yan4', 'Yau1', 'Yap4', 'Yk6', 'Yok3', 'Yai1', 'Yeot6', 'Yan2', 'Yoek6', 'Yt1', 'Yoi1', 'Yit5', 'Yn4', 'Yaau3', 'Yau4', 'Yuk6', 'Ys', 'Yuk', 'Yin6', 'Yung6', 'Ya', 'You', 'Yaai5', 'Yau5', 'Yoi3', 'Yaak3', 'Yaat3', 'Ying2', 'Yok5', 'Yeng2', 'Yyut3', 'Yam1', 'Yip5', 'You1', 'Yam6', 'Yaa5', 'Yi6', 'Yek4', 'Yyu2', 'Yuk5', 'Yaam1', 'Yang2', 'Yai', 'Yiu6', 'Yin4', 'Yok4', 'Yot3', 'Yui2', 'Yeoi5', 'Yyun6', 'Yyu5', 'Yoi5', 'Yeot2', 'Yim4', 'Yeoi2', 'Yaan1', 'Yang6', 'Yong1', 'Yaang4', 'Yung5', 'Yeon1', 'Yin2', 'Ya3', 'Yaang3', 'Yg', 'Yk2', 'Yaau5', 'Yut1', 'Yt5', 'Yip4', 'Yung4', 'Yj', 'Yong3', 'Ya1', 'Yg6', 'Yaau6', 'Yit3', 'Yun3', 'Ying1', 'Yn2', 'Yg4', 'Yl', 'Yp3', 'Yn3', 'Yak1', 'Yang5', 'Yoe6', 'You2', 'Yap2', 'Yak2', 'Yt3', 'Yot5', 'Yim2', 'Yi1', 'Yn6', 'Yaat5', 'Yaam3', 'Yoek5', 'Ye3', 'Yeon4', 'Yaa2', 'Yu3', 'Yim6', 'Ym', 'Yoe3', 'Yaai2', 'Ym2', 'Ya6', 'Yeng6', 'Yik4', 'Yot4', 'Yaai4', 'Yyun3', 'Yu1', 'Yoeng1', 'Yaap2', 'Yuk3', 'Yoek3', 'Yeng5', 'Yeoi1', 'Yiu2', 'Yok1', 'Yo1', 'Yoek1', 'Yoeng2', 'Yeon5', 'Yiu1', 'Yoeng4', 'Yuk2', 'Yat4', 'Yg5', 'Yut4', 'Yan6', 'Yin3', 'Yaa6', 'Yap1', 'Yg2', 'Yoe5', 'Yt4', 'Ya5', 'Yo4', 'Yyu1', 'Yak3', 'Yeon2', 'Yong4', 'Ym1', 'Ye2', 'Yaang5', 'Yoi2', 'Yeng3', 'Yn', 'Yyut4', 'Yau', 'Yaak2', 'Yaan4', 'Yek2', 'Yin1', 'Yi5', 'Yoe2', 'Yei5', 'Yaat6', 'Yak5', 'Yp6', 'Yok6', 'Yei2', 'Yaap1', 'Yyut5', 'Yi4', 'Yim1', 'Yk5', 'Ye4', 'Yok2', 'Yaam6', 'Yat2', 'Yon6', 'Yei3', 'Yyu6', 'Yeot5', 'Yk4', 'Yai6', 'Yd', 'Yg3', 'Yei6', 'Yau2', 'Yok', 'Yau6', 'Yung3', 'Yim5', 'Yut6', 'Yit1', 'Yon3', 'Yat1', 'Yaam2', 'Yyut2', 'Yui6', 'Yt2', 'Yek6', 'Yt', 'Ye6', 'Yang3', 'Ying6', 'Yaau1', 'Yeon3', 'Yng', 'Yh', 'Yang4', 'Ying5', 'Yaap6', 'Yoeng3', 'Yyun4', 'You3', 'Yan5', 'Yat5', 'Yot1', 'Yun1', 'Yi3', 'Yaa1', 'Yaap4', 'You6', 'Yaang2', 'Yaap5', 'Yaa3', 'Yaak6', 'Yeng1', 'Yaak1', 'Yo5', 'Yoi4', 'Yam4', 'Yik1', 'Ye1', 'Yai5', 'Yung1', 'Yp2', 'Yui4', 'Yaak4', 'Yung2', 'Yak4', 'Yaat4', 'Yeoi4', 'Yut2', 'Yin5', 'Yaau4', 'Yap6', 'Yb', 'Yaam4', 'Yw', 'Yut3', 'Yong2', 'Yt6', 'Yaai6', 'Yap5', 'Yik5', 'Yun6', 'Yaam5', 'Yun5', 'Yik3', 'Ya2', 'Yyut6', 'Yon4', 'Yk1', 'Yit4', 'Yak6', 'Yaan2', 'Yuk1', 'Yai2', 'Yik2', 'Yaat2', 'Yo3', 'Ykw', 'Yn5', 'Yaa', 'Ye5', 'Yu4', 'Yei1', 'Yai3', 'Yyun5', 'Yip2', 'Yaau2', 'Yiu5', 'Ym4', 'Yeoi6', 'Yk', 'Ym6', 'Yoe1', 'Yeoi3', 'Yon', 'Yuk4', 'Yaai3', 'Yaa4', 'Yot6', 'Yaang1', 'Yei4', 'Yek1', 'Yo', 'Yp', 'Yo6', 'Yp4', 'Yan3', 'Yoi', 'Yap3', 'Yek3', 'Yim3', 'Yz', 'Yot2', 'Yoi6', 'Yit2', 'Yu5', 'Yaan3', 'Yan1', 'Yon5', 'Yp1', 'Yong5', 'Ygw', 'Yak', 'Yat6', 'Ying4', 'Yu2', 'Yf', 'Ya4', 'Yon1', 'You4', 'Yik6', 'Yui1', 'Yaat1', 'Yeot4', 'Yi2', 'Yaai1', 'Yek5', 'Ym3', 'Yong6', 'You5', 'Yyun1', 'Yn1', 'Yo2', 'Yip6', 'Yui3', 'Yaak5', 'Yyun2'}
# symbols = [pad] + c + v + ja_symbols + pu_symbols + list(arpa)+list(ko_symbols)#+list(yue_symbols)###直接这么加yue顺序乱了
symbols = [pad] + c + v + ja_symbols + pu_symbols + list(arpa)
symbols = sorted(set(symbols))
# print(len(symbols))
symbols+=["[","]"]##日文新增上升下降调型
symbols+=sorted(list(ko_symbols))
symbols+=sorted(list(yue_symbols))##新加的yue统一摆在后头#已查过开头加Y后没有重复韩文显然不会重复
# print(len(symbols))
if __name__ == "__main__":
print(len(symbols))
'''
粤语
732-353=379
韩文+粤语
732-322=410
'''

View File

@ -28,7 +28,7 @@ UNITS = OrderedDict({
8: '亿', 8: '亿',
}) })
COM_QUANTIFIERS = '(封|艘|把|目|套|段|人|所|朵|匹|张|座|回|场|尾|条|个|首|阙|阵|网|炮|顶|丘|棵|只|支|袭|辆|挑|担|颗|壳|窠|曲|墙|群|腔|砣|座|客|贯|扎|捆|刀|令|打|手|罗|坡|山|岭|江|溪|钟|队|单|双|对|出|口|头|脚|板|跳|枝|件|贴|针|线|管|名|位|身|堂|课|本|页|家|户|层|丝|毫|厘|分|钱|两|斤|担|铢|石|钧|锱|忽|(千|毫|微)克|毫|厘|(公)分|分|寸|尺|丈|里|寻|常|铺|程|(千|分|厘|毫|微)米|米|撮|勺|合|升|斗|石|盘|碗|碟|叠|桶|笼|盆|盒|杯|钟|斛|锅|簋|篮|盘|桶|罐|瓶|壶|卮|盏|箩|箱|煲|啖|袋|钵|年|月|日|季|刻|时|周|天|秒|分|小时|旬|纪|岁|世|更|夜|春|夏|秋|冬|代|伏|辈|丸|泡|粒|颗|幢|堆|条|根|支|道|面|片|张|颗|块|元|(亿|千万|百万|万|千|百)|(亿|千万|百万|万|千|百|美|)元|(亿|千万|百万|万|千|百|十|)吨|(亿|千万|百万|万|千|百|)块|角|毛|分)' COM_QUANTIFIERS = '(处|台|架|枚|趟|幅|平|方|堵|间|床|株|批|项|例|列|篇|栋|注|亩|封|艘|把|目|套|段|人|所|朵|匹|张|座|回|场|尾|条|个|首|阙|阵|网|炮|顶|丘|棵|只|支|袭|辆|挑|担|颗|壳|窠|曲|墙|群|腔|砣|座|客|贯|扎|捆|刀|令|打|手|罗|坡|山|岭|江|溪|钟|队|单|双|对|出|口|头|脚|板|跳|枝|件|贴|针|线|管|名|位|身|堂|课|本|页|家|户|层|丝|毫|厘|分|钱|两|斤|担|铢|石|钧|锱|忽|(千|毫|微)克|毫|厘|(公)分|分|寸|尺|丈|里|寻|常|铺|程|(千|分|厘|毫|微)米|米|撮|勺|合|升|斗|石|盘|碗|碟|叠|桶|笼|盆|盒|杯|钟|斛|锅|簋|篮|盘|桶|罐|瓶|壶|卮|盏|箩|箱|煲|啖|袋|钵|年|月|日|季|刻|时|周|天|秒|分|小时|旬|纪|岁|世|更|夜|春|夏|秋|冬|代|伏|辈|丸|泡|粒|颗|幢|堆|条|根|支|道|面|片|张|颗|块|元|(亿|千万|百万|万|千|百)|(亿|千万|百万|万|千|百|美|)元|(亿|千万|百万|万|千|百|十|)吨|(亿|千万|百万|万|千|百|)块|角|毛|分)'
# 分数表达式 # 分数表达式
RE_FRAC = re.compile(r'(-?)(\d+)/(\d+)') RE_FRAC = re.compile(r'(-?)(\d+)/(\d+)')
@ -107,8 +107,11 @@ def replace_default_num(match):
# 加减乘除 # 加减乘除
# RE_ASMD = re.compile(
# r'((-?)((\d+)(\.\d+)?)|(\.(\d+)))([\+\-\×÷=])((-?)((\d+)(\.\d+)?)|(\.(\d+)))')
RE_ASMD = re.compile( RE_ASMD = re.compile(
r'((-?)((\d+)(\.\d+)?)|(\.(\d+)))([\+\-\×÷=])((-?)((\d+)(\.\d+)?)|(\.(\d+)))') r'((-?)((\d+)(\.\d+)?[⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]*)|(\.\d+[⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]*)|([A-Za-z][⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]*))([\+\-\×÷=])((-?)((\d+)(\.\d+)?[⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]*)|(\.\d+[⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]*)|([A-Za-z][⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]*))')
asmd_map = { asmd_map = {
'+': '', '+': '',
'-': '', '-': '',
@ -117,7 +120,6 @@ asmd_map = {
'=': '等于' '=': '等于'
} }
def replace_asmd(match) -> str: def replace_asmd(match) -> str:
""" """
Args: Args:
@ -129,6 +131,39 @@ def replace_asmd(match) -> str:
return result return result
# 次方专项
RE_POWER = re.compile(r'[⁰¹²³⁴⁵⁶⁷⁸⁹ˣʸⁿ]+')
power_map = {
'': '0',
'¹': '1',
'²': '2',
'³': '3',
'': '4',
'': '5',
'': '6',
'': '7',
'': '8',
'': '9',
'ˣ': 'x',
'ʸ': 'y',
'': 'n'
}
def replace_power(match) -> str:
"""
Args:
match (re.Match)
Returns:
str
"""
power_num = ""
for m in match.group(0):
power_num += power_map[m]
result = "" + power_num + "次方"
return result
# 数字表达式 # 数字表达式
# 纯小数 # 纯小数
RE_DECIMAL_NUM = re.compile(r'(-?)((\d+)(\.\d+))' r'|(\.(\d+))') RE_DECIMAL_NUM = re.compile(r'(-?)((\d+)(\.\d+))' r'|(\.(\d+))')

View File

@ -35,6 +35,7 @@ from .num import RE_POSITIVE_QUANTIFIERS
from .num import RE_RANGE from .num import RE_RANGE
from .num import RE_TO_RANGE from .num import RE_TO_RANGE
from .num import RE_ASMD from .num import RE_ASMD
from .num import RE_POWER
from .num import replace_default_num from .num import replace_default_num
from .num import replace_frac from .num import replace_frac
from .num import replace_negative_num from .num import replace_negative_num
@ -44,6 +45,7 @@ from .num import replace_positive_quantifier
from .num import replace_range from .num import replace_range
from .num import replace_to_range from .num import replace_to_range
from .num import replace_asmd from .num import replace_asmd
from .num import replace_power
from .phonecode import RE_MOBILE_PHONE from .phonecode import RE_MOBILE_PHONE
from .phonecode import RE_NATIONAL_UNIFORM_NUMBER from .phonecode import RE_NATIONAL_UNIFORM_NUMBER
from .phonecode import RE_TELEPHONE from .phonecode import RE_TELEPHONE
@ -114,6 +116,12 @@ class TextNormalizer():
sentence = sentence.replace('χ', '') sentence = sentence.replace('χ', '')
sentence = sentence.replace('ψ', '普赛').replace('Ψ', '普赛') sentence = sentence.replace('ψ', '普赛').replace('Ψ', '普赛')
sentence = sentence.replace('ω', '欧米伽').replace('Ω', '欧米伽') sentence = sentence.replace('ω', '欧米伽').replace('Ω', '欧米伽')
# 兜底数学运算,顺便兼容懒人用语
sentence = sentence.replace('+', '')
sentence = sentence.replace('-', '')
sentence = sentence.replace('×', '')
sentence = sentence.replace('÷', '')
sentence = sentence.replace('=', '')
# re filter special characters, have one more character "-" than line 68 # re filter special characters, have one more character "-" than line 68
sentence = re.sub(r'[-——《》【】<=>{}()#&@“”^_|\\]', '', sentence) sentence = re.sub(r'[-——《》【】<=>{}()#&@“”^_|\\]', '', sentence)
return sentence return sentence
@ -136,6 +144,12 @@ class TextNormalizer():
sentence = RE_TO_RANGE.sub(replace_to_range, sentence) sentence = RE_TO_RANGE.sub(replace_to_range, sentence)
sentence = RE_TEMPERATURE.sub(replace_temperature, sentence) sentence = RE_TEMPERATURE.sub(replace_temperature, sentence)
sentence = replace_measure(sentence) sentence = replace_measure(sentence)
# 处理数学运算
while RE_ASMD.search(sentence):
sentence = RE_ASMD.sub(replace_asmd, sentence)
sentence = RE_POWER.sub(replace_power, sentence)
sentence = RE_FRAC.sub(replace_frac, sentence) sentence = RE_FRAC.sub(replace_frac, sentence)
sentence = RE_PERCENTAGE.sub(replace_percentage, sentence) sentence = RE_PERCENTAGE.sub(replace_percentage, sentence)
sentence = RE_MOBILE_PHONE.sub(replace_mobile, sentence) sentence = RE_MOBILE_PHONE.sub(replace_mobile, sentence)
@ -145,10 +159,6 @@ class TextNormalizer():
sentence = RE_RANGE.sub(replace_range, sentence) sentence = RE_RANGE.sub(replace_range, sentence)
# 处理加减乘除
while RE_ASMD.search(sentence):
sentence = RE_ASMD.sub(replace_asmd, sentence)
sentence = RE_INTEGER.sub(replace_negative_num, sentence) sentence = RE_INTEGER.sub(replace_negative_num, sentence)
sentence = RE_DECIMAL_NUM.sub(replace_number, sentence) sentence = RE_DECIMAL_NUM.sub(replace_number, sentence)
sentence = RE_POSITIVE_QUANTIFIERS.sub(replace_positive_quantifier, sentence = RE_POSITIVE_QUANTIFIERS.sub(replace_positive_quantifier,

140
README.md
View File

@ -74,18 +74,11 @@ bash install.sh
```bash ```bash
conda create -n GPTSoVits python=3.9 conda create -n GPTSoVits python=3.9
conda activate GPTSoVits conda activate GPTSoVits
pip install -r requirements.txt pip install -r requirements.txt
``` ```
### Install Manually ### Install Manually
#### Install Dependences
```bash
pip install -r requirements.txt
```
#### Install FFmpeg #### Install FFmpeg
##### Conda Users ##### Conda Users
@ -106,11 +99,19 @@ conda install -c conda-forge 'ffmpeg<7'
Download and place [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) and [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) in the GPT-SoVITS root. Download and place [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) and [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) in the GPT-SoVITS root.
##### Mac Users Install [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) (Korean TTS Only)
##### MacOS Users
```bash ```bash
brew install ffmpeg brew install ffmpeg
``` ```
#### Install Dependences
```bash
pip install -r requirements.txt
```
### Using Docker ### Using Docker
#### docker-compose.yaml configuration #### docker-compose.yaml configuration
@ -142,21 +143,27 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
Download pretrained models from [GPT-SoVITS Models](https://huggingface.co/lj1995/GPT-SoVITS) and place them in `GPT_SoVITS/pretrained_models`. Download pretrained models from [GPT-SoVITS Models](https://huggingface.co/lj1995/GPT-SoVITS) and place them in `GPT_SoVITS/pretrained_models`.
Download G2PW models from [G2PWModel-v2-onnx.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip), unzip and rename to `G2PWModel`, and then place them in `GPT_SoVITS\text`.(Chinese TTS Only)
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`. 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`.
Users in the China region can download these two models by entering the links below and clicking "Download a copy"(Log out if you encounter errors while downloading.) Users in the China region can download these two models by entering the links below and clicking "Download a copy" (Log out if you encounter errors while downloading.)
- [GPT-SoVITS Models](https://www.icloud.com.cn/iclouddrive/056y_Xog_HXpALuVUjscIwTtg#GPT-SoVITS_Models) - [GPT-SoVITS Models](https://www.icloud.com/iclouddrive/044boFMiOHHt22SNr-c-tirbA#pretrained_models)
- [UVR5 Weights](https://www.icloud.com.cn/iclouddrive/0bekRKDiJXboFhbfm3lM2fVbA#UVR5_Weights) - [UVR5 Weights](https://www.icloud.com.cn/iclouddrive/0bekRKDiJXboFhbfm3lM2fVbA#UVR5_Weights)
- [G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip)Download G2PW models, unzip and rename to `G2PWModel`, and then place them in `GPT_SoVITS\text`.
For Chinese ASR (additionally), download models from [Damo ASR Model](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files), [Damo VAD Model](https://modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch/files), and [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) and place them in `tools/asr/models`. For Chinese ASR (additionally), download models from [Damo ASR Model](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files), [Damo VAD Model](https://modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch/files), and [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) and place them in `tools/asr/models`.
Or Download FunASR Model from [FunASR Model](https://www.icloud.com/iclouddrive/0b52_7SQWYr75kHkPoPXgpeQA#models), unzip and replace `tools/asr/models`.(Log out if you encounter errors while downloading.)
For English or Japanese ASR (additionally), download models from [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) and place them in `tools/asr/models`. Also, [other models](https://huggingface.co/Systran) may have the similar effect with smaller disk footprint. For English or Japanese ASR (additionally), download models from [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) and place them in `tools/asr/models`. Also, [other models](https://huggingface.co/Systran) may have the similar effect with smaller disk footprint.
Users in the China region can download this model by entering the links below Users in the China region can download this model by entering the links below
- [Faster Whisper Large V3](https://www.icloud.com/iclouddrive/0c4pQxFs7oWyVU1iMTq2DbmLA#faster-whisper-large-v3) (Click "Download a copy", log out if you encounter errors while downloading.) - [Faster Whisper Large V3](https://www.icloud.com/iclouddrive/00bUEp9_mcjMq_dhHu_vrAFDQ#faster-whisper-large-v3) (Click "Download a copy", log out if you encounter errors while downloading.)
- [Faster Whisper Large V3](https://hf-mirror.com/Systran/faster-whisper-large-v3) (HuggingFace mirror site) - [Faster Whisper Large V3](https://hf-mirror.com/Systran/faster-whisper-large-v3) (HuggingFace mirror site)
@ -173,31 +180,113 @@ Language dictionary:
- 'zh': Chinese - 'zh': Chinese
- 'ja': Japanese - 'ja': Japanese
- 'en': English - 'en': English
- 'ko': Korean
- 'yue': Cantonese
Example: Example:
``` ```
D:\GPT-SoVITS\xxx/xxx.wav|xxx|en|I like playing Genshin. D:\GPT-SoVITS\xxx/xxx.wav|xxx|en|I like playing Genshin.
``` ```
## Finetune and inference
### Open WebUI
#### Integrated Package Users
Double-click `go-webui.bat`or use `go-webui.ps`
if you want to switch to V1,then double-click`go-webui-v1.bat` or use `go-webui-v1.ps`
#### Others
```bash
python webui.py <language(optional)>
```
if you want to switch to V1,then
```bash
python webui.py v1 <language(optional)>
```
Or maunally switch version in WebUI
### Finetune
#### Path Auto-filling is now supported
1.Fill in the audio path
2.Slice the audio into small chunks
3.Denoise(optinal)
4.ASR
5.Proofreading ASR transcriptions
6.Go to the next Tab, then finetune the model
### Open Inference WebUI
#### Integrated Package Users
Double-click `go-webui-v2.bat` or use `go-webui-v2.ps` ,then open the inference webui at `1-GPT-SoVITS-TTS/1C-inference`
#### Others
```bash
python GPT_SoVITS/inference_webui.py <language(optional)>
```
OR
```bash
python webui.py
```
then open the inference webui at `1-GPT-SoVITS-TTS/1C-inference`
## V2 Release Notes
New Features:
1.Support Korean and Cantonese
2.An optimized text frontend
3.Pre-trained model extended from 2k hours to 5k hours
4.Improved synthesis quality for low-quality reference audio
[more details](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v2%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7) )
Use v2 from v1 environment:
1.pip install -r requirements.txt to update some packages
2.clone the latest codes from github
3.download v2 pretrained models from [huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main/gsv-v2final-pretrained) and put them into GPT_SoVITS\pretrained_models\gsv-v2final-pretrained
Chinese v2 additional: [G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip)Download G2PW models, unzip and rename to `G2PWModel`, and then place them in `GPT_SoVITS\text`.
## Todo List ## Todo List
- [ ] **High Priority:** - [x] **High Priority:**
- [x] Localization in Japanese and English. - [x] Localization in Japanese and English.
- [x] User guide. - [x] User guide.
- [x] Japanese and English dataset fine tune training. - [x] Japanese and English dataset fine tune training.
- [ ] **Features:** - [ ] **Features:**
- [ ] Zero-shot voice conversion (5s) / few-shot voice conversion (1min). - [x] Zero-shot voice conversion (5s) / few-shot voice conversion (1min).
- [ ] TTS speaking speed control. - [x] TTS speaking speed control.
- [ ] Enhanced TTS emotion control. - [ ] ~~Enhanced TTS emotion control.~~
- [ ] Experiment with changing SoVITS token inputs to probability distribution of vocabs. - [ ] Experiment with changing SoVITS token inputs to probability distribution of GPT vocabs (transformer latent).
- [ ] Improve English and Japanese text frontend. - [x] Improve English and Japanese text frontend.
- [ ] Develop tiny and larger-sized TTS models. - [ ] Develop tiny and larger-sized TTS models.
- [x] Colab scripts. - [x] Colab scripts.
- [ ] Try expand training dataset (2k hours -> 10k hours). - [ ] Try expand training dataset (2k hours -> 10k hours).
- [ ] better sovits base model (enhanced audio quality) - [x] better sovits base model (enhanced audio quality)
- [ ] model mix - [ ] model mix
## (Additional) Method for running from the command line ## (Additional) Method for running from the command line
@ -205,10 +294,10 @@ Use the command line to open the WebUI for UVR5
``` ```
python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5> python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>
``` ```
If you can't open a browser, follow the format below for UVR processing,This is using mdxnet for audio processing <!-- If you can't open a browser, follow the format below for UVR processing,This is using mdxnet for audio processing
``` ```
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
``` ``` -->
This is how the audio segmentation of the dataset is done using the command line This is how the audio segmentation of the dataset is done using the command line
``` ```
python audio_slicer.py \ python audio_slicer.py \
@ -227,7 +316,7 @@ ASR processing is performed through Faster_Whisper(ASR marking except Chinese)
(No progress bars, GPU performance may cause time delays) (No progress bars, GPU performance may cause time delays)
``` ```
python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p <precision>
``` ```
A custom list save path is enabled A custom list save path is enabled
@ -249,6 +338,9 @@ Special thanks to the following projects and contributors:
### Text Frontend for Inference ### Text Frontend for Inference
- [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization) - [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization)
- [LangSegment](https://github.com/juntaosun/LangSegment) - [LangSegment](https://github.com/juntaosun/LangSegment)
- [g2pW](https://github.com/GitYCC/g2pW)
- [pypinyin-g2pW](https://github.com/mozillazg/pypinyin-g2pW)
- [paddlespeech g2pw](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/g2pw)
### WebUI Tools ### WebUI Tools
- [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui) - [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui)
- [audio-slicer](https://github.com/openvpi/audio-slicer) - [audio-slicer](https://github.com/openvpi/audio-slicer)
@ -257,7 +349,9 @@ Special thanks to the following projects and contributors:
- [gradio](https://github.com/gradio-app/gradio) - [gradio](https://github.com/gradio-app/gradio)
- [faster-whisper](https://github.com/SYSTRAN/faster-whisper) - [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
- [FunASR](https://github.com/alibaba-damo-academy/FunASR) - [FunASR](https://github.com/alibaba-damo-academy/FunASR)
Thankful to @Naozumi520 for providing the Cantonese training set and for the guidance on Cantonese-related knowledge.
## Thanks to all contributors for their efforts ## Thanks to all contributors for their efforts
<a href="https://github.com/RVC-Boss/GPT-SoVITS/graphs/contributors" target="_blank"> <a href="https://github.com/RVC-Boss/GPT-SoVITS/graphs/contributors" target="_blank">

148
api.py
View File

@ -11,7 +11,7 @@
调用请求缺少参考音频时使用 调用请求缺少参考音频时使用
`-dr` - `默认参考音频路径` `-dr` - `默认参考音频路径`
`-dt` - `默认参考音频文本` `-dt` - `默认参考音频文本`
`-dl` - `默认参考音频语种, "中文","英文","日文","zh","en","ja"` `-dl` - `默认参考音频语种, "中文","英文","日文","韩文","粤语,"zh","en","ja","ko","yue"`
`-d` - `推理设备, "cuda","cpu"` `-d` - `推理设备, "cuda","cpu"`
`-a` - `绑定地址, 默认"127.0.0.1"` `-a` - `绑定地址, 默认"127.0.0.1"`
@ -72,6 +72,28 @@ RESP:
成功: 直接返回 wav 音频流 http code 200 成功: 直接返回 wav 音频流 http code 200
失败: 返回包含错误信息的 json, http code 400 失败: 返回包含错误信息的 json, http code 400
手动指定当次推理所使用的参考音频并提供参数:
GET:
`http://127.0.0.1:9880?refer_wav_path=123.wav&prompt_text=一二三&prompt_language=zh&text=先帝创业未半而中道崩殂今天下三分益州疲弊此诚危急存亡之秋也&text_language=zh&top_k=20&top_p=0.6&temperature=0.6&speed=1`
POST:
```json
{
"refer_wav_path": "123.wav",
"prompt_text": "一二三。",
"prompt_language": "zh",
"text": "先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。",
"text_language": "zh",
"top_k": 20,
"top_p": 0.6,
"temperature": 0.6,
"speed": 1
}
```
RESP:
成功: 直接返回 wav 音频流 http code 200
失败: 返回包含错误信息的 json, http code 400
### 更换默认参考音频 ### 更换默认参考音频
@ -179,6 +201,11 @@ def change_sovits_weights(sovits_path):
hps = dict_s2["config"] hps = dict_s2["config"]
hps = DictToAttrRecursive(hps) hps = DictToAttrRecursive(hps)
hps.model.semantic_frame_rate = "25hz" hps.model.semantic_frame_rate = "25hz"
if dict_s2['weight']['enc_p.text_embedding.weight'].shape[0] == 322:
hps.model.version = "v1"
else:
hps.model.version = "v2"
print("sovits版本:",hps.model.version)
model_params_dict = vars(hps.model) model_params_dict = vars(hps.model)
vq_model = SynthesizerTrn( vq_model = SynthesizerTrn(
hps.data.filter_length // 2 + 1, hps.data.filter_length // 2 + 1,
@ -229,9 +256,9 @@ def get_bert_feature(text, word2ph):
return phone_level_feature.T return phone_level_feature.T
def clean_text_inf(text, language): def clean_text_inf(text, language, version):
phones, word2ph, norm_text = clean_text(text, language) phones, word2ph, norm_text = clean_text(text, language, version)
phones = cleaned_text_to_sequence(phones) phones = cleaned_text_to_sequence(phones, version)
return phones, word2ph, norm_text return phones, word2ph, norm_text
@ -247,54 +274,64 @@ def get_bert_inf(phones, word2ph, norm_text, language):
return bert return bert
from text import chinese
def get_phones_and_bert(text,language): def get_phones_and_bert(text,language,version,final=False):
if language in {"en","all_zh","all_ja"}: if language in {"en", "all_zh", "all_ja", "all_ko", "all_yue"}:
language = language.replace("all_","") language = language.replace("all_","")
if language == "en": if language == "en":
LangSegment.setfilters(["en"]) LangSegment.setfilters(["en"])
formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text)) formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text))
else: else:
# 因无法区别中日文汉字,以用户输入为准 # 因无法区别中日文汉字,以用户输入为准
formattext = text formattext = text
while " " in formattext: while " " in formattext:
formattext = formattext.replace(" ", " ") formattext = formattext.replace(" ", " ")
phones, word2ph, norm_text = clean_text_inf(formattext, language)
if language == "zh": if language == "zh":
bert = get_bert_feature(norm_text, word2ph).to(device) if re.search(r'[A-Za-z]', formattext):
formattext = re.sub(r'[a-z]', lambda x: x.group(0).upper(), formattext)
formattext = chinese.text_normalize(formattext)
return get_phones_and_bert(formattext,"zh",version)
else:
phones, word2ph, norm_text = clean_text_inf(formattext, language, version)
bert = get_bert_feature(norm_text, word2ph).to(device)
elif language == "yue" and re.search(r'[A-Za-z]', formattext):
formattext = re.sub(r'[a-z]', lambda x: x.group(0).upper(), formattext)
formattext = chinese.text_normalize(formattext)
return get_phones_and_bert(formattext,"yue",version)
else: else:
phones, word2ph, norm_text = clean_text_inf(formattext, language, version)
bert = torch.zeros( bert = torch.zeros(
(1024, len(phones)), (1024, len(phones)),
dtype=torch.float16 if is_half == True else torch.float32, dtype=torch.float16 if is_half == True else torch.float32,
).to(device) ).to(device)
elif language in {"zh", "ja","auto"}: elif language in {"zh", "ja", "ko", "yue", "auto", "auto_yue"}:
textlist=[] textlist=[]
langlist=[] langlist=[]
LangSegment.setfilters(["zh","ja","en","ko"]) LangSegment.setfilters(["zh","ja","en","ko"])
if language == "auto": if language == "auto":
for tmp in LangSegment.getTexts(text): for tmp in LangSegment.getTexts(text):
if tmp["lang"] == "ko": langlist.append(tmp["lang"])
langlist.append("zh") textlist.append(tmp["text"])
textlist.append(tmp["text"]) elif language == "auto_yue":
else: for tmp in LangSegment.getTexts(text):
langlist.append(tmp["lang"]) if tmp["lang"] == "zh":
textlist.append(tmp["text"]) tmp["lang"] = "yue"
langlist.append(tmp["lang"])
textlist.append(tmp["text"])
else: else:
for tmp in LangSegment.getTexts(text): for tmp in LangSegment.getTexts(text):
if tmp["lang"] == "en": if tmp["lang"] == "en":
langlist.append(tmp["lang"]) langlist.append(tmp["lang"])
else: else:
# 因无法区别中日文汉字,以用户输入为准 # 因无法区别中日文汉字,以用户输入为准
langlist.append(language) langlist.append(language)
textlist.append(tmp["text"]) textlist.append(tmp["text"])
# logger.info(textlist)
# logger.info(langlist)
phones_list = [] phones_list = []
bert_list = [] bert_list = []
norm_text_list = [] norm_text_list = []
for i in range(len(textlist)): for i in range(len(textlist)):
lang = langlist[i] lang = langlist[i]
phones, word2ph, norm_text = clean_text_inf(textlist[i], lang) phones, word2ph, norm_text = clean_text_inf(textlist[i], lang, version)
bert = get_bert_inf(phones, word2ph, norm_text, lang) bert = get_bert_inf(phones, word2ph, norm_text, lang)
phones_list.append(phones) phones_list.append(phones)
norm_text_list.append(norm_text) norm_text_list.append(norm_text)
@ -303,17 +340,38 @@ def get_phones_and_bert(text,language):
phones = sum(phones_list, []) phones = sum(phones_list, [])
norm_text = ''.join(norm_text_list) norm_text = ''.join(norm_text_list)
if not final and len(phones) < 6:
return get_phones_and_bert("." + text,language,version,final=True)
return phones,bert.to(torch.float16 if is_half == True else torch.float32),norm_text return phones,bert.to(torch.float16 if is_half == True else torch.float32),norm_text
class DictToAttrRecursive: class DictToAttrRecursive(dict):
def __init__(self, input_dict): def __init__(self, input_dict):
super().__init__(input_dict)
for key, value in input_dict.items(): for key, value in input_dict.items():
if isinstance(value, dict): if isinstance(value, dict):
# 如果值是字典,递归调用构造函数 value = DictToAttrRecursive(value)
setattr(self, key, DictToAttrRecursive(value)) self[key] = value
else: setattr(self, key, value)
setattr(self, key, value)
def __getattr__(self, item):
try:
return self[item]
except KeyError:
raise AttributeError(f"Attribute {item} not found")
def __setattr__(self, key, value):
if isinstance(value, dict):
value = DictToAttrRecursive(value)
super(DictToAttrRecursive, self).__setitem__(key, value)
super().__setattr__(key, value)
def __delattr__(self, item):
try:
del self[item]
except KeyError:
raise AttributeError(f"Attribute {item} not found")
def get_spepc(hps, filename): def get_spepc(hps, filename):
@ -446,7 +504,7 @@ def only_punc(text):
return not any(t.isalnum() or t.isalpha() for t in text) return not any(t.isalnum() or t.isalpha() for t in text)
def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language): def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language, top_k= 20, top_p = 0.6, temperature = 0.6, speed = 1):
t0 = ttime() t0 = ttime()
prompt_text = prompt_text.strip("\n") prompt_text = prompt_text.strip("\n")
prompt_language, text = prompt_language, text.strip("\n") prompt_language, text = prompt_language, text.strip("\n")
@ -466,9 +524,11 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language)
codes = vq_model.extract_latent(ssl_content) codes = vq_model.extract_latent(ssl_content)
prompt_semantic = codes[0, 0] prompt_semantic = codes[0, 0]
t1 = ttime() t1 = ttime()
version = vq_model.version
os.environ['version'] = version
prompt_language = dict_language[prompt_language.lower()] prompt_language = dict_language[prompt_language.lower()]
text_language = dict_language[text_language.lower()] text_language = dict_language[text_language.lower()]
phones1, bert1, norm_text1 = get_phones_and_bert(prompt_text, prompt_language) phones1, bert1, norm_text1 = get_phones_and_bert(prompt_text, prompt_language, version)
texts = text.split("\n") texts = text.split("\n")
audio_bytes = BytesIO() audio_bytes = BytesIO()
@ -478,7 +538,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language)
continue continue
audio_opt = [] audio_opt = []
phones2, bert2, norm_text2 = get_phones_and_bert(text, text_language) phones2, bert2, norm_text2 = get_phones_and_bert(text, text_language, version)
bert = torch.cat([bert1, bert2], 1) bert = torch.cat([bert1, bert2], 1)
all_phoneme_ids = torch.LongTensor(phones1 + phones2).to(device).unsqueeze(0) all_phoneme_ids = torch.LongTensor(phones1 + phones2).to(device).unsqueeze(0)
@ -494,7 +554,9 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language)
prompt, prompt,
bert, bert,
# prompt_phone_len=ph_offset, # prompt_phone_len=ph_offset,
top_k=config['inference']['top_k'], top_k = top_k,
top_p = top_p,
temperature = temperature,
early_stop_num=hz * max_sec) early_stop_num=hz * max_sec)
t3 = ttime() t3 = ttime()
# print(pred_semantic.shape,idx) # print(pred_semantic.shape,idx)
@ -507,7 +569,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language)
# audio = vq_model.decode(pred_semantic, all_phoneme_ids, refer).detach().cpu().numpy()[0, 0] # audio = vq_model.decode(pred_semantic, all_phoneme_ids, refer).detach().cpu().numpy()[0, 0]
audio = \ audio = \
vq_model.decode(pred_semantic, torch.LongTensor(phones2).to(device).unsqueeze(0), vq_model.decode(pred_semantic, torch.LongTensor(phones2).to(device).unsqueeze(0),
refer).detach().cpu().numpy()[ refer,speed=speed).detach().cpu().numpy()[
0, 0] ###试试重建不带上prompt部分 0, 0] ###试试重建不带上prompt部分
audio_opt.append(audio) audio_opt.append(audio)
audio_opt.append(zero_wav) audio_opt.append(zero_wav)
@ -553,7 +615,7 @@ def handle_change(path, text, language):
return JSONResponse({"code": 0, "message": "Success"}, status_code=200) return JSONResponse({"code": 0, "message": "Success"}, status_code=200)
def handle(refer_wav_path, prompt_text, prompt_language, text, text_language, cut_punc): def handle(refer_wav_path, prompt_text, prompt_language, text, text_language, cut_punc, top_k, top_p, temperature, speed):
if ( if (
refer_wav_path == "" or refer_wav_path is None refer_wav_path == "" or refer_wav_path is None
or prompt_text == "" or prompt_text is None or prompt_text == "" or prompt_text is None
@ -572,7 +634,7 @@ def handle(refer_wav_path, prompt_text, prompt_language, text, text_language, cu
else: else:
text = cut_text(text,cut_punc) text = cut_text(text,cut_punc)
return StreamingResponse(get_tts_wav(refer_wav_path, prompt_text, prompt_language, text, text_language), media_type="audio/"+media_type) return StreamingResponse(get_tts_wav(refer_wav_path, prompt_text, prompt_language, text, text_language, top_k, top_p, temperature, speed), media_type="audio/"+media_type)
@ -582,17 +644,27 @@ def handle(refer_wav_path, prompt_text, prompt_language, text, text_language, cu
# -------------------------------- # --------------------------------
dict_language = { dict_language = {
"中文": "all_zh", "中文": "all_zh",
"粤语": "all_yue",
"英文": "en", "英文": "en",
"日文": "all_ja", "日文": "all_ja",
"韩文": "all_ko",
"中英混合": "zh", "中英混合": "zh",
"粤英混合": "yue",
"日英混合": "ja", "日英混合": "ja",
"韩英混合": "ko",
"多语种混合": "auto", #多语种启动切分识别语种 "多语种混合": "auto", #多语种启动切分识别语种
"多语种混合(粤语)": "auto_yue",
"all_zh": "all_zh", "all_zh": "all_zh",
"all_yue": "all_yue",
"en": "en", "en": "en",
"all_ja": "all_ja", "all_ja": "all_ja",
"all_ko": "all_ko",
"zh": "zh", "zh": "zh",
"yue": "yue",
"ja": "ja", "ja": "ja",
"ko": "ko",
"auto": "auto", "auto": "auto",
"auto_yue": "auto_yue",
} }
# logger # logger
@ -755,6 +827,10 @@ async def tts_endpoint(request: Request):
json_post_raw.get("text"), json_post_raw.get("text"),
json_post_raw.get("text_language"), json_post_raw.get("text_language"),
json_post_raw.get("cut_punc"), json_post_raw.get("cut_punc"),
json_post_raw.get("top_k", 10),
json_post_raw.get("top_p", 1.0),
json_post_raw.get("temperature", 1.0),
json_post_raw.get("speed", 1.0)
) )
@ -766,8 +842,12 @@ async def tts_endpoint(
text: str = None, text: str = None,
text_language: str = None, text_language: str = None,
cut_punc: str = None, cut_punc: str = None,
top_k: int = 10,
top_p: float = 1.0,
temperature: float = 1.0,
speed: float = 1.0
): ):
return handle(refer_wav_path, prompt_text, prompt_language, text, text_language, cut_punc) return handle(refer_wav_path, prompt_text, prompt_language, text, text_language, cut_punc, top_k, top_p, temperature, speed)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -93,7 +93,7 @@
2-uvr5适配高版本librosa https://github.com/RVC-Boss/GPT-SoVITS/pull/403 2-uvr5适配高版本librosa https://github.com/RVC-Boss/GPT-SoVITS/pull/403
3-修复uvr5 inf everywhere报错的问题(is_half传参未转换bool导致恒定半精度推理16系显卡会inf) https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8 3-[修复uvr5 inf everywhere报错的问题(is_half传参未转换bool导致恒定半精度推理16系显卡会inf)](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8)
4-优化英文文本前端 4-优化英文文本前端
@ -187,33 +187,50 @@
小问题修复: 小问题修复:
1-修正CPU推理默认bs小数 https://github.com/RVC-Boss/GPT-SoVITS/commit/db50670598f0236613eefa6f2d5a23a271d82041 1-[修正CPU推理默认bs小数](https://github.com/RVC-Boss/GPT-SoVITS/commit/db50670598f0236613eefa6f2d5a23a271d82041)
2-修复降噪、asr中途遇到异常跳出所有需处理的音频文件的问题 https://github.com/RVC-Boss/GPT-SoVITS/pull/1258 https://github.com/RVC-Boss/GPT-SoVITS/pull/1265 https://github.com/RVC-Boss/GPT-SoVITS/pull/1267 2-修复降噪、asr中途遇到异常跳出所有需处理的音频文件的问题 https://github.com/RVC-Boss/GPT-SoVITS/pull/1258 https://github.com/RVC-Boss/GPT-SoVITS/pull/1265 https://github.com/RVC-Boss/GPT-SoVITS/pull/1267
3-修复按标点符号切分时小数会被切分 https://github.com/RVC-Boss/GPT-SoVITS/pull/1253 3-修复按标点符号切分时小数会被切分 https://github.com/RVC-Boss/GPT-SoVITS/pull/1253
4-多卡训练多进程保存逻辑修复 4-[多卡训练多进程保存逻辑修复](https://github.com/RVC-Boss/GPT-SoVITS/commit/a208698e775155efc95b187b746d153d0f2847ca)
https://github.com/RVC-Boss/GPT-SoVITS/commit/a208698e775155efc95b187b746d153d0f2847ca
5-移除冗余my_utils https://github.com/RVC-Boss/GPT-SoVITS/pull/1251 5-移除冗余my_utils https://github.com/RVC-Boss/GPT-SoVITS/pull/1251
重点: 重点:
6-倍速推理代码经过验证后推理效果和base完全一致合并进main。使用的代码https://github.com/RVC-Boss/GPT-SoVITS/pull/672。支持无参考文本模式也倍速。 6-倍速推理代码经过验证后推理效果和base完全一致合并进main。使用的代码https://github.com/RVC-Boss/GPT-SoVITS/pull/672 。支持无参考文本模式也倍速。
后面会逐渐验证快速推理分支的推理改动的一致性 后面会逐渐验证快速推理分支的推理改动的一致性
### 20240727
1-清理冗余i18n代码 https://github.com/RVC-Boss/GPT-SoVITS/pull/1298
2-修复用户打文件及路径在结尾添加/会导致命令行报错的问题 https://github.com/RVC-Boss/GPT-SoVITS/pull/1299
3-修复GPT训练的step计算逻辑 https://github.com/RVC-Boss/GPT-SoVITS/pull/756
重点:
4-[支持合成语速调节。支持冻结随机性只调节语速,](https://github.com/RVC-Boss/GPT-SoVITS/commit/9588a3c52d9ebdb20b3c5d74f647d12e7c1171c2)并将其更新到api.py上https://github.com/RVC-Boss/GPT-SoVITS/pull/1340
todolist ### 20240806
1-中文多音字推理优化(有没有人来测试的欢迎把测试结果写在pr评论区里) https://github.com/RVC-Boss/GPT-SoVITS/pull/488 1-增加bs-roformer人声伴奏分离模型支持。 https://github.com/RVC-Boss/GPT-SoVITS/pull/1306 https://github.com/RVC-Boss/GPT-SoVITS/pull/1356 [支持fp16推理。](https://github.com/RVC-Boss/GPT-SoVITS/commit/e62e965323a60a76a025bcaa45268c1ddcbcf05c)
v2底模训练已经合了下个版本发布就要合了
2-正在尝试解决低音质参考音频导致音质较差的问题v2再试试如果能解决就发了节点暂定7月吧
2-更好的中文文本前端。 https://github.com/RVC-Boss/GPT-SoVITS/pull/987 https://github.com/RVC-Boss/GPT-SoVITS/pull/1351 https://github.com/RVC-Boss/GPT-SoVITS/pull/1404 优化多音字逻辑v2版本特供。 https://github.com/RVC-Boss/GPT-SoVITS/pull/488
3-自动填充下一步的文件路径 https://github.com/RVC-Boss/GPT-SoVITS/pull/1355
4-增加喂饭逻辑,用户瞎写显卡序号也可以正常运作 [bce451a](https://github.com/RVC-Boss/GPT-SoVITS/commit/bce451a2d1641e581e200297d01f219aeaaf7299) [4c8b761](https://github.com/RVC-Boss/GPT-SoVITS/commit/4c8b7612206536b8b4435997acb69b25d93acb78)
5-增加粤语ASR支持 [8a10147](https://github.com/RVC-Boss/GPT-SoVITS/commit/8a101474b5a4f913b4c94fca2e3ca87d0771bae3)
6-GPT-SoVITS-v2支持
7-计时逻辑优化 https://github.com/RVC-Boss/GPT-SoVITS/pull/1387

View File

@ -74,18 +74,11 @@ bash install.sh
```bash ```bash
conda create -n GPTSoVits python=3.9 conda create -n GPTSoVits python=3.9
conda activate GPTSoVits conda activate GPTSoVits
pip install -r requirements.txt pip install -r requirements.txt
``` ```
### 手动安装 ### 手动安装
#### 安装依赖
```bash
pip install -r requirements.txt
```
#### 安装 FFmpeg #### 安装 FFmpeg
##### Conda 用户 ##### Conda 用户
@ -106,11 +99,19 @@ conda install -c conda-forge 'ffmpeg<7'
下载并将 [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) 和 [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) 放置在 GPT-SoVITS 根目录下。 下载并将 [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) 和 [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) 放置在 GPT-SoVITS 根目录下。
##### Mac 用户 安装 [Visual Studio 2022](https://visualstudio.microsoft.com/zh-hans/downloads/) 环境(仅限韩语TTS)
##### MacOS 用户
```bash ```bash
brew install ffmpeg brew install ffmpeg
``` ```
#### 安装依赖
```bash
pip install -r requirements.txt
```
### 在 Docker 中使用 ### 在 Docker 中使用
#### docker-compose.yaml 设置 #### docker-compose.yaml 设置
@ -142,22 +143,28 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
从 [GPT-SoVITS Models](https://huggingface.co/lj1995/GPT-SoVITS) 下载预训练模型,并将它们放置在 `GPT_SoVITS\pretrained_models` 中。 从 [GPT-SoVITS Models](https://huggingface.co/lj1995/GPT-SoVITS) 下载预训练模型,并将它们放置在 `GPT_SoVITS\pretrained_models` 中。
从 [G2PWModel-v2-onnx.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip) 下载G2PW模型,并将它们解压重命名为`G2PWModel` 后放置在 `GPT_SoVITS\text` 中。仅限中文TTS
对于 UVR5人声/伴奏分离和混响移除,附加),从 [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) 下载模型,并将它们放置在 `tools/uvr5/uvr5_weights` 中。 对于 UVR5人声/伴奏分离和混响移除,附加),从 [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) 下载模型,并将它们放置在 `tools/uvr5/uvr5_weights` 中。
中国地区用户可以进入以下链接并点击“下载副本”下载以上两个模型(如果下载时遇到错误,请退出登录): 中国地区用户可以进入以下链接并点击“下载副本”下载以上两个模型(如果下载时遇到错误,请退出登录):
- [GPT-SoVITS Models](https://www.icloud.com.cn/iclouddrive/056y_Xog_HXpALuVUjscIwTtg#GPT-SoVITS_Models) - [GPT-SoVITS Models](https://www.icloud.com/iclouddrive/044boFMiOHHt22SNr-c-tirbA#pretrained_models)
- [UVR5 Weights](https://www.icloud.com.cn/iclouddrive/0bekRKDiJXboFhbfm3lM2fVbA#UVR5_Weights) - [UVR5 Weights](https://www.icloud.com.cn/iclouddrive/0bekRKDiJXboFhbfm3lM2fVbA#UVR5_Weights)
- [G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip)下载G2PW模型,并将它们解压重命名为 `G2PWModel` 后放置在 `GPT_SoVITS\text` 中)
对于中文自动语音识别(附加),从 [Damo ASR Model](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files), [Damo VAD Model](https://modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch/files), 和 [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) 下载模型,并将它们放置在 `tools/asr/models` 中。 对于中文自动语音识别(附加),从 [Damo ASR Model](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files), [Damo VAD Model](https://modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch/files), 和 [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) 下载模型,并将它们放置在 `tools/asr/models` 中。
或者从[FunASR模型链接](https://www.icloud.com/iclouddrive/0b52_7SQWYr75kHkPoPXgpeQA#models)下载模型,并将它们解压后替换 `tools/asr/models` 。(点击“下载副本”,如果下载时遇到错误,请退出登录)
对于英语与日语自动语音识别(附加),从 [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) 下载模型,并将它们放置在 `tools/asr/models` 中。 此外,[其他模型](https://huggingface.co/Systran)可能具有类似效果,但占用更小的磁盘空间。 对于英语与日语自动语音识别(附加),从 [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) 下载模型,并将它们放置在 `tools/asr/models` 中。 此外,[其他模型](https://huggingface.co/Systran)可能具有类似效果,但占用更小的磁盘空间。
中国地区用户可以通过以下链接下载: 中国地区用户可以通过以下链接下载:
- [Faster Whisper Large V3](https://www.icloud.com/iclouddrive/0c4pQxFs7oWyVU1iMTq2DbmLA#faster-whisper-large-v3)(点击“下载副本”,如果下载时遇到错误,请退出登录) - [Faster Whisper Large V3](https://www.icloud.com/iclouddrive/00bUEp9_mcjMq_dhHu_vrAFDQ#faster-whisper-large-v3)(点击“下载副本”,如果下载时遇到错误,请退出登录)
- [Faster Whisper Large V3](https://hf-mirror.com/Systran/faster-whisper-large-v3)(Hugging Face镜像站) - [Faster Whisper Large V3](https://hf-mirror.com/Systran/faster-whisper-large-v3)Hugging Face镜像站
## 数据集格式 ## 数据集格式
@ -170,22 +177,104 @@ vocal_path|speaker_name|language|text
语言字典: 语言字典:
- 'zh': Chinese - 'zh': 中文
- 'ja': Japanese - 'ja': 日语
- 'en': English - 'en': 英语
- 'ko': 韩语
- 'yue': 粤语
示例: 示例:
``` ```
D:\GPT-SoVITS\xxx/xxx.wav|xxx|en|I like playing Genshin. D:\GPT-SoVITS\xxx/xxx.wav|xxx|zh|我爱玩原神。
``` ```
## 微调与推理
### 打开WebUI
#### 整合包用户
双击`go-webui.bat`或者使用`go-webui.ps`
若想使用V1,则双击`go-webui-v1.bat`或者使用`go-webui-v1.ps`
#### 其他
```bash
python webui.py <language(optional)>
```
若想使用V1,则
```bash
python webui.py v1 <language(optional)>
```
或者在webUI内动态切换
### 微调
#### 现已支持自动填充路径
1.填入训练音频路径
2.切割音频
3.进行降噪(可选)
4.进行ASR
5.校对标注
6.前往下一个窗口,点击训练
### 打开推理WebUI
#### 整合包用户
双击 `go-webui.bat` 或者使用 `go-webui.ps` ,然后在 `1-GPT-SoVITS-TTS/1C-推理` 中打开推理webUI
#### 其他
```bash
python GPT_SoVITS/inference_webui.py <language(optional)>
```
或者
```bash
python webui.py
```
然后在 `1-GPT-SoVITS-TTS/1C-推理` 中打开推理webUI
## V2发布说明
新特性:
1.支持韩语及粤语
2.更好的文本前端
3.底模由2k小时扩展至5k小时
4.对低音质参考音频(尤其是来源于网络的高频严重缺失、听着很闷的音频)合成出来音质更好
详见[wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v2%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7))
从v1环境迁移至v2
1.需要pip安装requirements.txt更新环境
2.需要克隆github上的最新代码
3.需要从[huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main/gsv-v2final-pretrained) 下载预训练模型文件放到GPT_SoVITS\pretrained_models\gsv-v2final-pretrained下
中文额外需要下载[G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip)下载G2PW模型,解压并重命名为`G2PWModel`,将其放到`GPT_SoVITS\text`目录下
## 待办事项清单 ## 待办事项清单
- [ ] **高优先级:** - [ ] **高优先级:**
- [x] 日语和英语的本地化。 - [x] 日语和英语的本地化。
- [ ] 用户指南。 - [x] 用户指南。
- [x] 日语和英语数据集微调训练。 - [x] 日语和英语数据集微调训练。
- [ ] **功能:** - [ ] **功能:**
@ -205,10 +294,10 @@ D:\GPT-SoVITS\xxx/xxx.wav|xxx|en|I like playing Genshin.
```` ````
python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5> python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>
```` ````
如果打不开浏览器请按照下面的格式进行UVR处理这是使用mdxnet进行音频处理的方式 <!-- 如果打不开浏览器请按照下面的格式进行UVR处理这是使用mdxnet进行音频处理的方式
```` ````
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
```` ```` -->
这是使用命令行完成数据集的音频切分的方式 这是使用命令行完成数据集的音频切分的方式
```` ````
python audio_slicer.py \ python audio_slicer.py \
@ -226,9 +315,9 @@ python tools/asr/funasr_asr.py -i <input> -o <output>
通过Faster_Whisper进行ASR处理除中文之外的ASR标记 通过Faster_Whisper进行ASR处理除中文之外的ASR标记
没有进度条GPU性能可能会导致时间延迟 没有进度条GPU性能可能会导致时间延迟
```` ```
python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p <precision>
```` ```
启用自定义列表保存路径 启用自定义列表保存路径
## 致谢 ## 致谢
@ -249,6 +338,9 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language>
### 推理用文本前端 ### 推理用文本前端
- [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization) - [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization)
- [LangSegment](https://github.com/juntaosun/LangSegment) - [LangSegment](https://github.com/juntaosun/LangSegment)
- [g2pW](https://github.com/GitYCC/g2pW)
- [pypinyin-g2pW](https://github.com/mozillazg/pypinyin-g2pW)
- [paddlespeech g2pw](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/g2pw)
### WebUI 工具 ### WebUI 工具
- [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui) - [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui)
- [audio-slicer](https://github.com/openvpi/audio-slicer) - [audio-slicer](https://github.com/openvpi/audio-slicer)

178
docs/en/Changelog_EN.md Normal file
View File

@ -0,0 +1,178 @@
### 20240121 Update
1. Added `is_share` to the `config`. In scenarios like Colab, this can be set to `True` to map the WebUI to the public network.
2. Added English system translation support to WebUI.
3. The `cmd-asr` automatically detects if the FunASR model is included; if not found in the default directory, it will be downloaded from ModelScope.
4. Attempted to fix the SoVITS training ZeroDivisionError reported in [Issue 79](https://github.com/RVC-Boss/GPT-SoVITS/issues/79) by filtering samples with zero length, etc.
5. Cleaned up cached audio files and other files in the `TEMP` folder.
6. Significantly reduced the issue of synthesized audio containing the end of the reference audio.
### 20240122 Update
1. Fixed the issue where excessively short output files resulted in repeating the reference audio.
2. Tested native support for English and Japanese training (Japanese training requires the root directory to be free of non-English special characters).
3. Improved audio path checking. If an attempt is made to read from an incorrect input path, it will report that the path does not exist instead of an ffmpeg error.
### 20240123 Update
1. Resolved the issue where Hubert extraction caused NaN errors, leading to SoVITS/GPT training ZeroDivisionError.
2. Added support for quick model switching in the inference WebUI.
3. Optimized the model file sorting logic.
4. Replaced `jieba` with `jieba_fast` for Chinese word segmentation.
### 20240126 Update
1. Added support for Chinese-English mixed and Japanese-English mixed output texts.
2. Added an optional segmentation mode for output.
3. Fixed the issue of UVR5 reading and automatically jumping out of directories.
4. Fixed multiple newline issues causing inference errors.
5. Removed redundant logs in the inference WebUI.
6. Supported training and inference on Mac.
7. Automatically forced single precision for GPU that do not support half precision; enforced single precision under CPU inference.
### 20240128 Update
1. Fixed the issue with the pronunciation of numbers converting to Chinese characters.
2. Fixed the issue of swallowing a few characters at the beginning of sentences.
3. Excluded unreasonable reference audio lengths by setting restrictions.
4. Fixed the issue where GPT training did not save checkpoints.
5. Completed model downloading process in the Dockerfile.
### 20240129 Update
1. Changed training configurations to single precision for GPUs like the 16 series, which have issues with half precision training.
2. Tested and updated the available Colab version.
3. Fixed the issue of git cloning the ModelScope FunASR repository with older versions of FunASR causing interface misalignment errors.
### 20240130 Update
1. Automatically removed double quotes from all path-related entries to prevent errors from novice users copying paths with double quotes.
2. Fixed issues with splitting Chinese and English punctuation and added punctuation at the beginning and end of sentences.
3. Added splitting by punctuation.
### 20240201 Update
1. Fixed the UVR5 format reading error causing separation failures.
2. Supported automatic segmentation and language recognition for mixed Chinese-Japanese-English texts.
### 20240202 Update
1. Fixed the issue where an ASR path ending with `/` caused an error in saving the filename.
2. [PR 377](https://github.com/RVC-Boss/GPT-SoVITS/pull/377) introduced PaddleSpeech's Normalizer to fix issues like reading "xx.xx%" (percent symbols) and "元/吨" being read as "元吨" instead of "元每吨", and fixed underscore errors.
### 20240207 Update
1. Corrected language parameter confusion causing decreased Chinese inference quality reported in [Issue 391](https://github.com/RVC-Boss/GPT-SoVITS/issues/391).
2. [PR 403](https://github.com/RVC-Boss/GPT-SoVITS/pull/403) adapted UVR5 to higher versions of librosa.
3. [Commit 14a2851](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8) fixed UVR5 inf everywhere error caused by `is_half` parameter not converting to boolean, resulting in constant half precision inference, which caused `inf` on 16 series GPUs.
4. Optimized English text frontend.
5. Fixed Gradio dependencies.
6. Supported automatic reading of `.list` full paths if the root directory is left blank during dataset preparation.
7. Integrated Faster Whisper ASR for Japanese and English.
### 20240208 Update
1. [Commit 59f35ad](https://github.com/RVC-Boss/GPT-SoVITS/commit/59f35adad85815df27e9c6b33d420f5ebfd8376b) attempted to fix GPT training hang on Windows 10 1909 and [Issue 232](https://github.com/RVC-Boss/GPT-SoVITS/issues/232) (Traditional Chinese System Language).
### 20240212 Update
1. Optimized logic for Faster Whisper and FunASR, switching Faster Whisper to mirror downloads to avoid issues with Hugging Face connections.
2. [PR 457](https://github.com/RVC-Boss/GPT-SoVITS/pull/457) enabled experimental DPO Loss training option to mitigate GPT repetition and missing characters by constructing negative samples during training and made several inference parameters available in the inference WebUI.
### 20240214 Update
1. Supported Chinese experiment names in training (previously caused errors).
2. Made DPO training an optional feature instead of mandatory. If selected, the batch size is automatically halved. Fixed issues with new parameters not being passed in the inference WebUI.
### 20240216 Update
1. Supported input without reference text.
2. Fixed bugs in Chinese frontend reported in [Issue 475](https://github.com/RVC-Boss/GPT-SoVITS/issues/475).
### 20240221 Update
1. Added a noise reduction option during data processing (noise reduction leaves only 16kHz sampling rate; use only if the background noise is significant).
2. [PR 559](https://github.com/RVC-Boss/GPT-SoVITS/pull/559), [PR 556](https://github.com/RVC-Boss/GPT-SoVITS/pull/556), [PR 532](https://github.com/RVC-Boss/GPT-SoVITS/pull/532), [PR 507](https://github.com/RVC-Boss/GPT-SoVITS/pull/507), [PR 509](https://github.com/RVC-Boss/GPT-SoVITS/pull/509) optimized Chinese and Japanese frontend processing.
3. Switched Mac CPU inference to use CPU instead of MPS for faster performance.
4. Fixed Colab public URL issue.
### 20240306 Update
1. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672) accelerated inference by 50% (tested on RTX3090 + PyTorch 2.2.1 + CU11.8 + Win10 + Py39) .
2. No longer requires downloading the Chinese FunASR model first when using Faster Whisper non-Chinese ASR.
3. [PR 610](https://github.com/RVC-Boss/GPT-SoVITS/pull/610) fixed UVR5 reverb removal model where the setting was reversed.
4. [PR 675](https://github.com/RVC-Boss/GPT-SoVITS/pull/675) enabled automatic CPU inference for Faster Whisper if no CUDA is available.
5. [PR 573](https://github.com/RVC-Boss/GPT-SoVITS/pull/573) modified `is_half` check to ensure proper CPU inference on Mac.
### 202403/202404/202405 Update
#### Minor Fixes:
1. Fixed issues with the no-reference text mode.
2. Optimized the Chinese and English text frontend.
3. Improved API format.
4. Fixed CMD format issues.
5. Added error prompts for unsupported languages during training data processing.
6. Fixed the bug in Hubert extraction.
#### Major Fixes:
1. Fixed the issue of SoVITS training without freezing VQ (which could cause quality degradation).
2. Added a quick inference branch.
### 20240610 Update
#### Minor Fixes:
1. [PR 1168](https://github.com/RVC-Boss/GPT-SoVITS/pull/1168) & [PR 1169](https://github.com/RVC-Boss/GPT-SoVITS/pull/1169) improved the logic for pure punctuation and multi-punctuation text input.
2. [Commit 501a74a](https://github.com/RVC-Boss/GPT-SoVITS/commit/501a74ae96789a26b48932babed5eb4e9483a232) fixed CMD format for MDXNet de-reverb in UVR5, supporting paths with spaces.
3. [PR 1159](https://github.com/RVC-Boss/GPT-SoVITS/pull/1159) fixed progress bar logic for SoVITS training in `s2_train.py`.
#### Major Fixes:
4. [Commit 99f09c8](https://github.com/RVC-Boss/GPT-SoVITS/commit/99f09c8bdc155c1f4272b511940717705509582a) fixed the issue of WebUI's GPT fine-tuning not reading BERT feature of Chinese input texts, causing inconsistency with inference and potential quality degradation.
**Caution: If you have previously fine-tuned with a large amount of data, it is recommended to retune the model to improve quality.**
### 20240706 Update
#### Minor Fixes:
1. [Commit 1250670](https://github.com/RVC-Boss/GPT-SoVITS/commit/db50670598f0236613eefa6f2d5a23a271d82041) fixed default batch size decimal issue in CPU inference.
2. [PR 1258](https://github.com/RVC-Boss/GPT-SoVITS/pull/1258), [PR 1265](https://github.com/RVC-Boss/GPT-SoVITS/pull/1265), [PR 1267](https://github.com/RVC-Boss/GPT-SoVITS/pull/1267) fixed issues where denoising or ASR encountering exceptions would exit all pending audio files.
3. [PR 1253](https://github.com/RVC-Boss/GPT-SoVITS/pull/1253) fixed the issue of splitting decimals when splitting by punctuation.
4. [Commit a208698](https://github.com/RVC-Boss/GPT-SoVITS/commit/a208698e775155efc95b187b746d153d0f2847ca) fixed multi-process save logic for multi-GPU training.
5. [PR 1251](https://github.com/RVC-Boss/GPT-SoVITS/pull/1251) removed redundant `my_utils`.
#### Major Fixes:
6. The accelerated inference code from [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672) has been validated and merged into the main branch, ensuring consistent inference effects with the base.
It also supports accelerated inference in no-reference text mode.
**Future updates will continue to verify the consistency of changes in the `fast_inference` branch**.
### 20240727 Update
#### Minor Fixes:
1. [PR 1298](https://github.com/RVC-Boss/GPT-SoVITS/pull/1298) cleaned up redundant i18n code.
2. [PR 1299](https://github.com/RVC-Boss/GPT-SoVITS/pull/1299) fixed issues where trailing slashes in user file paths caused command line errors.
3. [PR 756](https://github.com/RVC-Boss/GPT-SoVITS/pull/756) fixed the step calculation logic in GPT training.
#### Major Fixes:
4. [Commit 9588a3c](https://github.com/RVC-Boss/GPT-SoVITS/commit/9588a3c52d9ebdb20b3c5d74f647d12e7c1171c2) supported speech rate adjustment for synthesis.
Enabled freezing randomness while only adjusting the speech rate.
### 20240806 Update
1. [PR 1306](https://github.com/RVC-Boss/GPT-SoVITS/pull/1306), [PR 1356](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) Added support for the BS RoFormer vocal accompaniment separation model. [Commit e62e965](https://github.com/RVC-Boss/GPT-SoVITS/commit/e62e965323a60a76a025bcaa45268c1ddcbcf05c) Enabled FP16 inference.
2. Improved Chinese text frontend.
- [PR 488](https://github.com/RVC-Boss/GPT-SoVITS/pull/488) added support for polyphonic characters (v2 only);
- [PR 987](https://github.com/RVC-Boss/GPT-SoVITS/pull/987) added quantifier;
- [PR 1351](https://github.com/RVC-Boss/GPT-SoVITS/pull/1351) supports arithmetic and basic math formulas;
- [PR 1404](https://github.com/RVC-Boss/GPT-SoVITS/pull/1404) fixed mixed text errors.
3. [PR 1355](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) automatically filled in the paths when processing audio in the WebUI.
4. [Commit bce451a](https://github.com/RVC-Boss/GPT-SoVITS/commit/bce451a2d1641e581e200297d01f219aeaaf7299), [Commit 4c8b761](https://github.com/RVC-Boss/GPT-SoVITS/commit/4c8b7612206536b8b4435997acb69b25d93acb78) optimized GPU recognition logic.
5. [Commit 8a10147](https://github.com/RVC-Boss/GPT-SoVITS/commit/8a101474b5a4f913b4c94fca2e3ca87d0771bae3) added support for Cantonese ASR.
6. Added support for GPT-SoVITS v2.
7. [PR 1387](https://github.com/RVC-Boss/GPT-SoVITS/pull/1387) optimized timing logic.

View File

@ -1,85 +1,177 @@
### 20240121 更新 ### 20240121 更新
1. `config``is_share`を追加し、Colab などの環境でこれを`True`に設定すると、webui を公共ネットワークにマッピングできます。 1. `config``is_share`を追加し、Colab などの環境でこれを`True`に設定すると、webui を公共ネットワークにマッピングできます。
2. WebUI に英語システムの英語翻訳を追加しました。 2. WebUI に英語システムの英語翻訳を追加しました。
3. `cmd-asr`は FunASR モデルが既に含まれているかどうかを自動的に確認し、デフォルトのパスにない場合は modelscope から自動的にダウンロードします。
3. `cmd-asr`は damo モデルが既に含まれているかどうかを自動的に確認し、デフォルトのパスにない場合は modelscope から自動的にダウンロードします。
4. [SoVITS 训练报错 ZeroDivisionError](https://github.com/RVC-Boss/GPT-SoVITS/issues/79) 修復を試みます(長さ 0 のサンプルをフィルタリングなど) 4. [SoVITS 训练报错 ZeroDivisionError](https://github.com/RVC-Boss/GPT-SoVITS/issues/79) 修復を試みます(長さ 0 のサンプルをフィルタリングなど)
5. TEMP ファイルフォルダからオーディオやその他のファイルをクリーンアップして最適化します。 5. TEMP ファイルフォルダからオーディオやその他のファイルをクリーンアップして最適化します。
6. 合成オーディオがリファレンスオーディオの終わりを含む問題を大幅に改善しました。 6. 合成オーディオがリファレンスオーディオの終わりを含む問題を大幅に改善しました。
### 20240122 更新 ### 20240122 更新
1. 短すぎる出力ファイルが重複したリファレンスオーディオを返す問題を修正しました。 1. 短すぎる出力ファイルが重複したリファレンスオーディオを返す問題を修正しました。
2. 英語-日本語学習がスムーズに進む QA を完了しました。(ただし、日本語学習はルートディレクトリに英語以外の文字が含まれていない必要があります) 2. 英語-日本語学習がスムーズに進む QA を完了しました。(ただし、日本語学習はルートディレクトリに英語以外の文字が含まれていない必要があります)
3. オーディオパスをチェックします。間違ったパスを読み取ろうとすると、「パスが存在しません」というエラーメッセージが返されます。これは ffmpeg モジュールのエラーではありません。 3. オーディオパスをチェックします。間違ったパスを読み取ろうとすると、「パスが存在しません」というエラーメッセージが返されます。これは ffmpeg モジュールのエラーではありません。
### 20240123 更新 ### 20240123 更新
1. hubert から nan 抽出による SoVITS/GPT 学習中の ZeroDivisionError 関連エラーを修正しました。 1. hubert から nan 抽出による SoVITS/GPT 学習中の ZeroDivisionError 関連エラーを修正しました。
2. 推論インターフェースでモデルを素早く切り替えることができるようにサポートしました。 2. 推論インターフェースでモデルを素早く切り替えることができるようにサポートしました。
3. モデルファイルのソートロジックを最適化しました。 3. モデルファイルのソートロジックを最適化しました。
4. 中国語の分析に `jieba_fast``jieba` に置き換えました。
4. 中国語の分析に`jieba_fast``jieba`に置き換えました。
### 20240126 更新 ### 20240126 更新
1. 中国語と英語、日本語と英語が混在した出力テキストをサポートします。 1. 中国語と英語、日本語と英語が混在した出力テキストをサポートします。
2. 出力で選択的な分割モードをサポートします。 2. 出力で選択的な分割モードをサポートします。
3. uvr5 がディレクトリを読み取り、自動的に終了する問題を修正しました。 3. uvr5 がディレクトリを読み取り、自動的に終了する問題を修正しました。
4. 複数の改行による推論エラーを修正しました。 4. 複数の改行による推論エラーを修正しました。
5. 推論インターフェースから不要なログを削除しました。 5. 推論インターフェースから不要なログを削除しました。
6. MacOS での学習と推論をサポートします。 6. MacOS での学習と推論をサポートします。
7. 半精度をサポートしていないカードを自動的に識別して単精度を強制し、CPU 推論では単精度を強制します。 7. 半精度をサポートしていないカードを自動的に識別して単精度を強制し、CPU 推論では単精度を強制します。
### 20240128 更新 ### 20240128 更新
1. 数字を漢字で読む問題を修正しました。 1. 数字を漢字で読む問題を修正しました。
2. 文章の先頭の一部の単語が欠落する問題を修正しました。 2. 文章の先頭の一部の単語が欠落する問題を修正しました。
3. 不適切な長さのリファレンスオーディオを制限しました。 3. 不適切な長さのリファレンスオーディオを制限しました。
4. GPT 学習時の ckpt が保存されない問題を修正しました。 4. GPT 学習時の ckpt が保存されない問題を修正しました。
5. Dockerfile のモデルダウンロードプロセスを改善しました。 5. Dockerfile のモデルダウンロードプロセスを改善しました。
### 20240129 更新 ### 20240129 更新
1. 16 系などの半精度学習に問題があるカードは、学習構成を単精度学習に変更しました。 1. 16 系などの半精度学習に問題があるカードは、学習構成を単精度学習に変更しました。
2. Colab でも使用可能なバージョンをテストして更新しました。 2. Colab でも使用可能なバージョンをテストして更新しました。
3. ModelScope FunASR リポジトリの古いバージョンで git クローンを行う際のインターフェース不整合エラーの問題を修正しました。
3. `git clone modelscope funasr`リポジトリと古いバージョンの funasr を使用してインターフェースが一致しないエラーを修正しました。
### 20240130 更新 ### 20240130 更新
1. パスと関連する文字列を解析して、二重引用符を自動的に削除します。また、パスをコピーする場合、二重引用符が含まれていてもエラーが発生しません。 1. パスと関連する文字列を解析して、二重引用符を自動的に削除します。また、パスをコピーする場合、二重引用符が含まれていてもエラーが発生しません。
2. 中国語と英語、日本語と英語の混合出力をサポートします。 2. 中国語と英語、日本語と英語の混合出力をサポートします。
3. 出力で選択的な分割モードをサポートします。 3. 出力で選択的な分割モードをサポートします。
todolist ### 20240201 更新
1. 同音異義語(中国語)の推論の最適化 1. UVR5 形式の読み取りエラーによる分離失敗を修正しました。
2. 中国語・日本語・英語の混合テキストに対する自動分割と言語認識をサポートしました。
2. 英語大文字認識と英語ハイフン [問題](https://github.com/RVC-Boss/GPT-SoVITS/issues/271) ### 20240202 更新
3. テキストに%記号が含まれているとエラーが発生し、推論が不可能です。また、「元/吨」が「元吨」ではなく「元每吨」と読まれるなどの問題があります。このような問題を解決するには、どのライブラリを使用する必要があり、それに対する改善を検討しています。 1. ASRパスが `/` で終わることによるファイル名保存エラーの問題を修正しました。
2. [PR 377](https://github.com/RVC-Boss/GPT-SoVITS/pull/377) で PaddleSpeech の Normalizer を導入し、"xx.xx%"(パーセント記号)の読み取りや"元/吨"が"元吨"ではなく"元每吨"と読まれる問題、アンダースコアエラーを修正しました。
4. 中-日-英、中-英、日-英を含む 5 つの言語をサポートすることを目標にしています。 ### 20240207 更新
1. [Issue 391](https://github.com/RVC-Boss/GPT-SoVITS/issues/391) で報告された中国語推論品質の低下を引き起こした言語パラメータの混乱を修正しました。
2. [PR 403](https://github.com/RVC-Boss/GPT-SoVITS/pull/403) で UVR5 を librosa のより高いバージョンに適応させました。
3. [Commit 14a2851](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8) で、`is_half` パラメータがブール値に変換されず、常に半精度推論が行われ、16 シリーズの GPU で `inf` が発生する UVR5 inf everywhereエラーを修正しました。
4. 英語テキストフロントエンドを最適化しました。
5. Gradio の依存関係を修正しました。
6. データセット準備中にルートディレクトリが空白の場合、`.list` フルパスの自動読み取りをサポートしました。
7. 日本語と英語のために Faster Whisper ASR を統合しました。
### 20240208 更新
1. [Commit 59f35ad](https://github.com/RVC-Boss/GPT-SoVITS/commit/59f35adad85815df27e9c6b33d420f5ebfd8376b) で、Windows 10 1909 および [Issue 232](https://github.com/RVC-Boss/GPT-SoVITS/issues/232)(繁体字中国語システム言語)での GPT トレーニングのハングを修正する試みを行いました。
### 20240212 更新
1. Faster Whisper と FunASR のロジックを最適化し、Faster Whisper をミラーダウンロードに切り替えて Hugging Face の接続問題を回避しました。
2. [PR 457](https://github.com/RVC-Boss/GPT-SoVITS/pull/457) で、GPT の繰り返しと文字欠落を軽減するために、トレーニング中に負のサンプルを構築する実験的なDPO Lossトレーニングオプションを有効にし、いくつかの推論パラメータを推論WebUIで利用可能にしました。
### 20240214 更新
1. トレーニングで中国語の実験名をサポート(以前はエラーが発生していました)。
2. DPOトレーニングを必須ではなくオプション機能に変更。選択された場合、バッチサイズは自動的に半分になります。推論 WebUI で新しいパラメータが渡されない問題を修正しました。
### 20240216 更新
1. 参照テキストなしでの入力をサポート。
2. [Issue 475](https://github.com/RVC-Boss/GPT-SoVITS/issues/475) で報告された中国語フロントエンドのバグを修正しました。
### 20240221 更新
1. データ処理中のイズ低減オプションを追加イズ低減は16kHzサンプリングレートのみを残します背景イズが大きい場合にのみ使用してください
2. [PR 559](https://github.com/RVC-Boss/GPT-SoVITS/pull/559), [PR 556](https://github.com/RVC-Boss/GPT-SoVITS/pull/556), [PR 532](https://github.com/RVC-Boss/GPT-SoVITS/pull/532), [PR 507](https://github.com/RVC-Boss/GPT-SoVITS/pull/507), [PR 509](https://github.com/RVC-Boss/GPT-SoVITS/pull/509) で中国語と日本語のフロントエンド処理を最適化しました。
3. Mac CPU 推論を MPS ではなく CPU を使用するように切り替え、パフォーマンスを向上させました。
4. Colab のパブリック URL の問題を修正しました。
### 20240306 更新
1. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672) で推論速度を50%向上させましたRTX3090 + PyTorch 2.2.1 + CU11.8 + Win10 + Py39 でテスト)。
2. Faster Whisper非中国語ASRを使用する際、最初に中国語FunASRモデルをダウンロードする必要がなくなりました。
3. [PR 610](https://github.com/RVC-Boss/GPT-SoVITS/pull/610) で UVR5 残響除去モデルの設定が逆になっていた問題を修正しました。
4. [PR 675](https://github.com/RVC-Boss/GPT-SoVITS/pull/675) で、CUDA が利用できない場合に Faster Whisper の自動 CPU 推論を有効にしました。
5. [PR 573](https://github.com/RVC-Boss/GPT-SoVITS/pull/573) で、Mac での適切なCPU推論を確保するために `is_half` チェックを修正しました。
### 202403/202404/202405 更新
#### マイナー修正:
1. 参照テキストなしモードの問題を修正しました。
2. 中国語と英語のテキストフロントエンドを最適化しました。
3. API フォーマットを改善しました。
4. CMD フォーマットの問題を修正しました。
5. トレーニングデータ処理中のサポートされていない言語に対するエラープロンプトを追加しました。
6. Hubert 抽出のバグを修正しました。
#### メジャー修正:
1. SoVITS トレーニングで VQ を凍結せずに品質低下を引き起こす問題を修正しました。
2. クイック推論ブランチを追加しました。
### 20240610 更新
#### マイナー修正:
1. [PR 1168](https://github.com/RVC-Boss/GPT-SoVITS/pull/1168) & [PR 1169](https://github.com/RVC-Boss/GPT-SoVITS/pull/1169)で、純粋な句読点および複数の句読点を含むテキスト入力のロジックを改善しました。
2. [Commit 501a74a](https://github.com/RVC-Boss/GPT-SoVITS/commit/501a74ae96789a26b48932babed5eb4e9483a232)で、UVR5 の MDXNet デリバブをサポートする CMD フォーマットを修正し、スペースを含むパスをサポートしました。
3. [PR 1159](https://github.com/RVC-Boss/GPT-SoVITS/pull/1159)で、`s2_train.py` の SoVITS トレーニングのプログレスバーロジックを修正しました。
#### メジャー修正:
4. [Commit 99f09c8](https://github.com/RVC-Boss/GPT-SoVITS/commit/99f09c8bdc155c1f4272b511940717705509582a) で、WebUI の GPT ファインチューニングが中国語入力テキストの BERT 特徴を読み取らず、推論との不一致や品質低下の可能性を修正しました。
**注意: 以前に大量のデータでファインチューニングを行った場合、品質向上のためにモデルを再調整することをお勧めします。**
### 20240706 更新
#### マイナー修正:
1. [Commit 1250670](https://github.com/RVC-Boss/GPT-SoVITS/commit/db50670598f0236613eefa6f2d5a23a271d82041) で、CPU 推論のデフォルトバッチサイズの小数点問題を修正しました。
2. [PR 1258](https://github.com/RVC-Boss/GPT-SoVITS/pull/1258), [PR 1265](https://github.com/RVC-Boss/GPT-SoVITS/pull/1265), [PR 1267](https://github.com/RVC-Boss/GPT-SoVITS/pull/1267) で、イズ除去またはASRが例外に遭遇した場合に、すべての保留中のオーディオファイルが終了する問題を修正しました。
3. [PR 1253](https://github.com/RVC-Boss/GPT-SoVITS/pull/1253) で、句読点で分割する際の小数点分割の問題を修正しました。
4. [Commit a208698](https://github.com/RVC-Boss/GPT-SoVITS/commit/a208698e775155efc95b187b746d153d0f2847ca) で、マルチGPUトレーニングのマルチプロセス保存ロジックを修正しました。
5. [PR 1251](https://github.com/RVC-Boss/GPT-SoVITS/pull/1251) で、不要な `my_utils` を削除しました。
#### メジャー修正:
6. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672) の加速推論コードが検証され、メインブランチにマージされ、ベースとの推論効果の一貫性が確保されました。
また、参照テキストなしモードでの加速推論もサポートしています。
**今後の更新では、`fast_inference`ブランチの変更の一貫性を継続的に検証します**。
### 20240727 更新
#### マイナー修正:
1. [PR 1298](https://github.com/RVC-Boss/GPT-SoVITS/pull/1298) で、不要な i18n コードをクリーンアップしました。
2. [PR 1299](https://github.com/RVC-Boss/GPT-SoVITS/pull/1299) で、ユーザーファイルパスの末尾のスラッシュがコマンドラインエラーを引き起こす問題を修正しました。
3. [PR 756](https://github.com/RVC-Boss/GPT-SoVITS/pull/756) で、GPT トレーニングのステップ計算ロジックを修正しました。
#### メジャー修正:
4. [Commit 9588a3c](https://github.com/RVC-Boss/GPT-SoVITS/commit/9588a3c52d9ebdb20b3c5d74f647d12e7c1171c2) で、合成のスピーチレート調整をサポートしました。
スピーチレートのみを調整しながらランダム性を固定できるようになりました。
### 20240806 更新
1. [PR 1306](https://github.com/RVC-Boss/GPT-SoVITS/pull/1306)、[PR 1356](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) BS RoFormer ボーカルアコムパニ分離モデルのサポートを追加しました。[Commit e62e965](https://github.com/RVC-Boss/GPT-SoVITS/commit/e62e965323a60a76a025bcaa45268c1ddcbcf05c) FP16 推論を有効にしました。
2. 中国語テキストフロントエンドを改善しました。
- [PR 488](https://github.com/RVC-Boss/GPT-SoVITS/pull/488) 多音字のサポートを追加v2 のみ);
- [PR 987](https://github.com/RVC-Boss/GPT-SoVITS/pull/987) 量詞を追加;
- [PR 1351](https://github.com/RVC-Boss/GPT-SoVITS/pull/1351) 四則演算と基本数式のサポート;
- [PR 1404](https://github.com/RVC-Boss/GPT-SoVITS/pull/1404) 混合テキストエラーを修正。
3. [PR 1355](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) WebUIでオーディオ処理時にパスを自動入力しました。
4. [Commit bce451a](https://github.com/RVC-Boss/GPT-SoVITS/commit/bce451a2d1641e581e200297d01f219aeaaf7299), [Commit 4c8b761](https://github.com/RVC-Boss/GPT-SoVITS/commit/4c8b7612206536b8b4435997acb69b25d93acb78) GPU 認識ロジックを最適化しました。
5. [Commit 8a10147](https://github.com/RVC-Boss/GPT-SoVITS/commit/8a101474b5a4f913b4c94fca2e3ca87d0771bae3) 広東語ASRのサポートを追加しました。
6. GPT-SoVITS v2 のサポートを追加しました。
7. [PR 1387](https://github.com/RVC-Boss/GPT-SoVITS/pull/1387) タイミングロジックを最適化しました。

View File

@ -102,7 +102,7 @@ conda install -c conda-forge 'ffmpeg<7'
[ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) と [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) をダウンロードし、GPT-SoVITS のルートディレクトリに置きます。 [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) と [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) をダウンロードし、GPT-SoVITS のルートディレクトリに置きます。
##### Mac ユーザー ##### MacOS ユーザー
```bash ```bash
brew install ffmpeg brew install ffmpeg
``` ```
@ -209,7 +209,7 @@ ASR処理はFaster_Whisperを通じて実行されます(中国語を除くASR
(進行状況バーは表示されません。GPU のパフォーマンスにより時間遅延が発生する可能性があります) (進行状況バーは表示されません。GPU のパフォーマンスにより時間遅延が発生する可能性があります)
``` ```
python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p <precision>
``` ```
カスタムリストの保存パスが有効になっています カスタムリストの保存パスが有効になっています

View File

@ -1,109 +1,178 @@
### 20240121 업데이트 ### 20240121 업데이트
1. `config``is_share` 추가, Colab 등의 환경에서 이를 `True`로 설정하여 webui를 공용 네트워크에 매핑되도록 할 수 있습니다. 1. `config``is_share`를 추가했습니다. Colab과 같은 시나리오에서는 이 값을 `True`로 설정하여 WebUI를 공개 네트워크에 매핑할 수 있습니다.
2. WebUI에 영어 번역이 추가되었습니다. 2. WebUI에 영어 시스템 번역 지원을 추가했습니다.
3. `cmd-asr`은 damo 모델이 이미 포함되어 있는지 자동으로 확인하고, 기본 경로에 없는 경우 modelscope에서 자동 다운로드 되도록 수정하였습니다. 3. `cmd-asr`이 FunASR 모델이 포함되어 있는지 자동으로 감지합니다; 기본 디렉토리에서 찾을 수 없으면 ModelScope에서 다운로드됩니다.
4. [SoVITS 학습 중 ZeroDivisionError가 발생](https://github.com/RVC-Boss/GPT-SoVITS/issues/79)하는 경우 복구를 시도합니다. (길이가 0인 샘플 필터링 등) 4. [Issue 79](https://github.com/RVC-Boss/GPT-SoVITS/issues/79)에서 보고된 SoVITS 훈련의 ZeroDivisionError를 필터링 샘플 등으로 해결하려고 시도했습니다.
5. TEMP 파일 폴더에서 오디오 및 기타 파일을 정리하여 최적화합니다. 5. `TEMP` 폴더의 캐시된 오디오 파일 및 기타 파일을 정리했습니다.
6. 합성 오디오가 레퍼런스 오디오의 끝부분을 포함하는 문제를 개선하였습니다. 6. 참조 오디오의 끝이 포함된 합성 오디오 문제를 크게 줄였습니다.
### 20240122 업데이트 ### 20240122 업데이트
1. 너무 짧은 출력 파일이 중복된 레퍼런스 오디오를 반환하는 문제 수정하였습니다. 1. 지나치게 짧은 출력 파일로 인해 참조 오디오가 반복되는 문제를 수정했습니다.
2. 영어-일본어 학습이 원활하게 진행되는 QA를 완료하였습니다. (다만, 일본어 학습은 루트 디렉토리에 영어 이외의 문자가 없어야 합니다) 2. 영어 및 일본어 훈련의 네이티브 지원을 테스트했습니다 (일본어 훈련 시 루트 디렉토리에 비영어 특수 문자가 없어야 합니다).
3. 오디오 경로를 검사합니다. 잘못된 경로를 읽으려고 할 때 '경로가 존재하지 않습니다'라는 에러 메시지를 반환하도록 수정하였습니다. 이는 ffmpeg 모듈의 에러가 아닙니다. 3. 오디오 경로 확인을 개선했습니다. 잘못된 입력 경로에서 읽으려는 시도가 있을 경우, ffmpeg 오류 대신 경로가 존재하지 않는다고 보고합니다.
### 20240123 업데이트 ### 20240123 업데이트
1. hubert에서 nan 추출로 인한 SoVITS/GPT 학습 중 ZeroDivisionError 관련 에러를 해결하였습니다. 1. Hubert 추출로 인해 NaN 오류가 발생하여 SoVITS/GPT 훈련에서 ZeroDivisionError가 발생하는 문제를 해결했습니다.
2. 추론 인터페이스에서 모델을 빠르게 전환할 수 있도록 지원하도록 수정되었습니다. 2. 추론 WebUI에서 빠른 모델 전환 지원을 추가했습니다.
3. 모델 파일 정렬 로직 최적화하였습니다. 3. 모델 파일 정렬 로직을 최적화했습니다.
4. 중문 분석에 `jieba_fast``jieba`로 대체하였습니다. 4. 중국어 단어 분할을 위해 `jieba``jieba_fast`로 교체했습니다.
### 20240126 업데이트 ### 20240126 업데이트
1. 중국어와 영어, 일본어와 영어가 혼합된 출력 텍스트를 지원합니다. 1. 중국어-영어 혼합 및 일본어-영어 혼합 출력 텍스트를 지원합니다.
2. 출력에서 선택적 분할 모드를 지원합니다. 2. 출력에 대한 선택적 분할 모드를 추가했습니다.
3. uvr5가 디렉토리를 읽고 자동으로 종료되는 문제를 수정하였습니다. 3. UVR5 읽기 문제 및 디렉토리 자동 탈출 문제를 수정했습니다.
4. 여러 줄바꿈으로 인한 추론 오류를 수정하였습니다. 4. 추론 오류를 일으키는 여러 줄 바꿈 문제를 수정했습니다.
5. 추론 인터페이스에서 불필요한 로그 제거하였습니다. 5. 추론 WebUI 에서 중복 로그를 제거했습니다.
6. MacOS에서의 학습 및 추론을 지원합니다. 6. Mac에서 훈련 및 추론을 지원합니다.
7. 반정밀을 지원하지 않는 카드를 자동으로 식별하여 단일 정밀도를 강제 적용하고, CPU 추론에서 단일 정밀도를 강제 적용합니다. 7. 절반 정밀도를 지원하지 않는 GPU에 대해 자동으로 단정밀도를 강제하며, CPU 추론 시 단정밀도를 적용합니다.
### 20240128 업데이트 ### 20240128 업데이트
1. 숫자를 한자로 읽는 문제를 수정했습니다. 1. 숫자의 발음이 중국어 문자로 변환되는 문제를 수정했습니다.
2. 문장 시작 부분의 일부 단어가 누락되는 문제 수정하였습니다. 2. 문장 시작 부분에서 몇 개의 문자가 누락되는 문제를 수정했습니다.
3. 부적절한 길이의 레퍼런스 오디오를 제한하였습니다. 3. 비합리적인 참조 오디오 길이를 설정하여 제외했습니다.
4. GPT 학습 시 ckpt가 저장되지 않는 문제 수정하였습니다. 4. GPT 훈련 시 체크포인트가 저장되지 않는 문제를 수정했습니다.
5. Dockerfile에서 모델 다운로드 프로세스 개선하였습니다. 5. Dockerfile 에서 모델 다운로드 프로세스를 완료했습니다.
### 20240129 업데이트 ### 20240129 업데이트
1. 반정밀도 훈련에 문제가 있는 16 시리즈 및 기타 그래픽 카드의 훈련 구성을 단정밀도 훈련으로 변경했습니다. 1. 절반 정밀도 훈련에 문제가 있는 16 시리즈와 같은 GPU의 훈련 구성을 단정밀도로 변경했습니다.
2. Colab에서도 사용이 가능한 버전을 테스트 및 업데이트 하였습니다. 2. 사용 가능한 Colab 버전을 테스트하고 업데이트했습니다.
3. `git clone modelscope funasr` 저장소와 오래된 버전의 funasr 사용으로 인해 인터페이스가 일치하지 않는 오류를 수정하였습니다. 3. 이전 버전의 FunASR 로 인해 인터페이스 정렬 오류가 발생하는 ModelScope FunASR 저장소의 git 클로닝 문제를 수정했습니다.
### 20240130 업데이트 ### 20240130 업데이트
1. 경로와 관련된 문자열을 파싱하여 큰따옴표를 자동으로 제거합니다. 또한, 경로를 복사하는 경우 큰따옴표가 포함되어도 오류가 발생하지 않습니다. 1. 모든 경로 관련 항목에서 이중 따옴표를 자동으로 제거하여 초보자가 이중 따옴표가 포함된 경로를 복사하는 오류를 방지했습니다.
2. 중국어 및 영어 문자열의 문장 부호가 잘리는 문제 및 문장의 시작과 끝에 문장 부호가 추가되는 문제를 수정했습니다. 2. 중국어 및 영어 문장 부호 분할 문제를 수정하고 문장 시작과 끝에 부호를 추가했습니다.
3. 문장 부호의 수를 확장하였습니다. 3. 부호에 의한 분할을 추가했습니다.
### 20240201 업데이트 ### 20240201 업데이트
1. uvr5가 잘못된 형식으로 읽어들이는 문제를 수정하였습니다. 1. 분리 실패를 일으킨 UVR5 형식 읽기 오류를 수정했습니다.
2. 중국어, 일본어, 영어가 혼합된 여러 텍스트를 자동으로 분리하여 언어를 인식합니다. 2. 혼합된 중국어-일본어-영어 텍스트에 대한 자동 분할 및 언어 인식을 지원합니다.
### 20240202 업데이트 ### 20240202 업데이트
1. asr 경로의 끝에 `/`가 포함되어 있는 경우 오류가 발생하는 문제를 수정하였습니다. 1. `/` 로 끝나는 ASR 경로가 파일 이름 저장 시 오류를 발생시키는 문제를 수정했습니다.
2. paddlespeech의 Normalizer를 도입하여 [문제를 해결](https://github.com/RVC-Boss/GPT-SoVITS/pull/377)하여, 예를 들어 xx.xx%(백분율), 元/吨이 元吨으로 읽히는 문제를 해결하였습니다. 또한, 밑줄이 더 이상 오류를 발생시키지 않습니다. 2. [PR 377](https://github.com/RVC-Boss/GPT-SoVITS/pull/377) 에서는 PaddleSpeech 의 Normalizer 를 도입하여 "xx.xx%" (백분율 기호)와 "元/吨"이 "元吨"으로 읽히는 문제를 "元每吨"으로 수정하고, 밑줄 오류를 수정했습니다.
### 20240207 업데이트 ### 20240207 업데이트
1. 언어 전달 매개변수가 혼란스러워져 [중국어 추론 효과가 저하되는 문제](https://github.com/RVC-Boss/GPT-SoVITS/issues/391)를 수정하였습니다. 1. [Issue 391](https://github.com/RVC-Boss/GPT-SoVITS/issues/391) 에서 보고된 중국어 추론 품질 저하를 일으킨 언어 매개변수 혼동을 수정했습니다.
2. uvr5가 `inf everywhere` [오류를 반환하는 문제](https://github.com/RVC-Boss/GPT-SoVITS/pull/403)를 수정하였습니다. 2. [PR 403](https://github.com/RVC-Boss/GPT-SoVITS/pull/403) 에서는 UVR5 를 높은 버전의 librosa에 맞게 조정했습니다.
3. uvr5의 `is_half` 매개변수가 bool로 변환되지 않아 항상 반정밀도 추론으로 설정되어 16 시리즈 그래픽 카드에서 `inf`가 반환되는 [문제](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8)를 수정하였습니다. 3. [Commit 14a2851](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8)에서는 `is_half` 매개변수가 불리언으로 변환되지 않아 발생한 UVR5 `inf` 오류를 수정했습니다. 이로 인해 16 시리즈 GPU에서 `inf` 가 발생했습니다.
4. 영어 텍스트 입력을 최적화하였습니다. 4. 영어 텍스트 프론트엔드를 최적화했습니다.
5. gradio 종속성을 지원합니다. 5. Gradio 종속성 문제를 수정했습니다.
6. 루트 디렉토리가 비어 있으면 `.list` 전체 경로를 자동으로 읽습니다. 6. 데이터셋 준비 시 루트 디렉토리를 비워두면 `.list` 전체 경로를 자동으로 읽도록 지원합니다.
7. faster whisper ASR 일본어 및 영어를 지원합니다. 7. 일본어와 영어에 대한 Faster Whisper ASR을 통합했습니다.
### 20240208 업데이트 ### 20240208 업데이트
1. GPT 학습이 카드에 따라 멈추는 문제와 [GPT 학습 중 ZeroDivisionError](https://github.com/RVC-Boss/GPT-SoVITS/commit/59f35adad85815df27e9c6b33d420f5ebfd8376b) 문제를 수정하였습니다. 1. [Commit 59f35ad](https://github.com/RVC-Boss/GPT-SoVITS/commit/59f35adad85815df27e9c6b33d420f5ebfd8376b)에서는 Windows 10 1909와 [Issue 232](https://github.com/RVC-Boss/GPT-SoVITS/issues/232) (전통 중국어 시스템 언어)에서 GPT 훈련 멈춤 문제를 수정하려고 했습니다.
### 20240212 업데이트 ### 20240212 업데이트
1. faster whisper 및 funasr 로직을 최적화하였습니다. faster whisper는 이미지 스토어에서 다운로드하여 huggingface에 연결하지 못하는 문제를 회피합니다. 1. Faster Whisper와 FunASR의 로직을 최적화하고, Faster Whisper를 미러 다운로드로 전환하여 Hugging Face 연결 문제를 피했습니다.
2. DPO Loss 실험적 학습 옵션을 활성화하여 부정적 샘플을 생성하여 [GPT 반복 및 누락 문자 문제](https://github.com/RVC-Boss/GPT-SoVITS/pull/457)를 완화합니다. 추론 인터페이스에 몇 가지 추론 매개변수를 공개합니다. 2. [PR 457](https://github.com/RVC-Boss/GPT-SoVITS/pull/457)은 DPO Loss 실험적 훈련 옵션을 활성화하여 GPT의 반복 및 문자 누락 문제를 완화하고, 훈련 중 부정 샘플을 구성하며 여러 추론 매개변수를 추론 WebUI에서 사용할 수 있게 했습니다.
### 20240214 업데이트 ### 20240214 업데이트
1. 학습에서 중국어 실험 이름을 지원합니다. (이전에 오류가 발생했습니다) 1. 훈련 시 중국어 실험 이름을 지원합니다 (이전에는 오류가 발생했습니다).
2. DPO 학습을 선택적으로 설정할 수 있도록 변경하였습니다. 배치 크기를 선택하면 자동으로 절반으로 줄어듭니다. 추론 인터페이스에서 새로운 매개변수를 전달하지 않는 문제를 수정하였습니다. 2. DPO 훈련을 필수 기능 대신 선택적 기능으로 변경했습니다. 선택 시, 배치 크기가 자동으로 절반으로 줄어듭니다. 추론 WebUI에서 새로운 매개변수가 전달되지 않는 문제를 수정했습니다.
### 20240216 업데이트 ### 20240216 업데이트
1. 참조 텍스트 입력을 지원합니다. 1. 참조 텍스트 없이 입력을 지원합니다.
2. 프론트엔드에 있던 중국어 텍스트 입력 버그를 수정하였습니다. 2. [Issue 475](https://github.com/RVC-Boss/GPT-SoVITS/issues/475)에서 보고된 중국어 프론트엔드의 버그를 수정했습니다.
### 20240221 업데이트 ### 20240221 업데이트
1. 데이터 처리에 음성 노이즈 감소 옵션을 추가하였습니다. (노이즈 감소는 16k 샘플링률만 남기며, 노이즈가 크지 않다면 사용하지 마십시오.) 1. 데이터 처리 중 노이즈 감소 옵션을 추가했습니다 (노이즈 감소는 16kHz 샘플링 비율만 남깁니다; 배경 노이즈가 심한 경우에만 사용하십시오).
2. 중국어 및 일본어 프론트엔드 처리를 최적화하였습니다. https://github.com/RVC-Boss/GPT-SoVITS/pull/559 https://github.com/RVC-Boss/GPT-SoVITS/pull/556 https://github.com/RVC-Boss/GPT-SoVITS/pull/532 https://github.com/RVC-Boss/GPT-SoVITS/pull/507 https://github.com/RVC-Boss/GPT-SoVITS/pull/509 2. [PR 559](https://github.com/RVC-Boss/GPT-SoVITS/pull/559), [PR 556](https://github.com/RVC-Boss/GPT-SoVITS/pull/556), [PR 532](https://github.com/RVC-Boss/GPT-SoVITS/pull/532), [PR 507](https://github.com/RVC-Boss/GPT-SoVITS/pull/507), [PR 509](https://github.com/RVC-Boss/GPT-SoVITS/pull/509) 중국어 및 일본어 프론트엔드 처리를 최적화했습니다.
3. Mac에서 CPU 추론이 더 빨라졌으므로 추론 장치를 mps에서 CPU로 변경하였습니다. 3. Mac CPU 추론을 MPS 대신 CPU를 사용하도록 전환하여 성능을 향상시켰습니다.
4. colab에서 공용 URL을 열지 않는 문제를 수정하였습니다. 4. Colab 공개 URL 문제를 수정했습니다.
### 20240306 업데이트 ### 20240306 업데이트
1. 추론 속도를 50% 빠르게 하였습니다. (RTX3090+pytorch2.2.1+cu11.8+win10+py39 테스트 완료) https://github.com/RVC-Boss/GPT-SoVITS/pull/672 1. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672)는 추론 속도를 50% 가속화했습니다 (RTX3090 + PyTorch 2.2.1 + CU11.8 + Win10 + Py39에서 테스트됨).
2. faster whisper를 사용할 때 중국어 ASR을 먼저 다운로드할 필요가 없습니다. 2. Faster Whisper의 비중국어 ASR을 사용할 때 중국어 FunASR 모델을 먼저 다운로드할 필요가 없습니다.
3. uvr5의 잔향 제거 모델이 잔향이 있는지 여부를 반대로 반환하는 문제를 수정하였습니다. 3. [PR 610](https://github.com/RVC-Boss/GPT-SoVITS/pull/610)은 UVR5 리버브 제거 모델에서 설정이 반대로 되어 있는 문제를 수정했습니다.
4. faster whisper가 CUDA를 사용할 수 없는 경우 자동으로 CPU 추론을 사용하도록 수정하였습니다. 4. [PR 675](https://github.com/RVC-Boss/GPT-SoVITS/pull/675)는 CUDA가 없는 경우 Faster Whisper의 자동 CPU 추론을 가능하게 했습니다.
5. is_half의 판단을 수정하여 Mac에서 CPU 추론이 정상적으로 작동하도록 수정하였습니다. 5. [PR 573](https://github.com/RVC-Boss/GPT-SoVITS/pull/573)은 Mac에서 올바른 CPU 추론을 보장하기 위해 `is_half` 체크를 수정했습니다.
todolist ### 202403/202404/202405 업데이트
1. 중국어 다양한 발음 단어 추론 최적화(테스트 결과를 작성하시는 분은 pr 코멘트 영역에 작성해주시면 감사하겠습니다) #### 사소한 수정:
1. 참조 텍스트 없는 모드의 문제를 수정했습니다.
2. 중국어 및 영어 텍스트 프론트엔드를 최적화했습니다.
3. API 형식을 개선했습니다.
4. CMD 형식 문제를 수정했습니다.
5. 훈련 데이터 처리 중 지원되지 않는 언어에 대한 오류 프롬프트를 추가했습니다.
6. Hubert 추출의 버그를 수정했습니다.
#### 주요 수정:
1. VQ를 고정하지 않고 SoVITS 훈련의 문제를 수정했습니다(품질 저하를 일으킬 수 있음).
2. 빠른 추론 분기를 추가했습니다.
### 20240610 업데이트
#### 사소한 수정:
1. [PR 1168](https://github.com/RVC-Boss/GPT-SoVITS/pull/1168) & [PR 1169](https://github.com/RVC-Boss/GPT-SoVITS/pull/1169) 순수 구두점 및 다중 구두점 텍스트 입력 로직을 개선했습니다.
2. [Commit 501a74a](https://github.com/RVC-Boss/GPT-SoVITS/commit/501a74ae96789a26b48932babed5eb4e9483a232) UVR5에서 MDXNet 디러버브를 위한 CMD 형식을 수정하고 공백이 있는 경로를 지원했습니다.
3. [PR 1159](https://github.com/RVC-Boss/GPT-SoVITS/pull/1159) `s2_train.py`에서 SoVITS 훈련을 위한 진행률 표시줄 로직을 수정했습니다.
#### 주요 수정:
4. [Commit 99f09c8](https://github.com/RVC-Boss/GPT-SoVITS/commit/99f09c8bdc155c1f4272b511940717705509582a) WebUI의 GPT 미세 조정이 중국어 입력 텍스트의 BERT 기능을 읽지 않아 추론과 불일치 및 잠재적 품질 저하를 일으키는 문제를 수정했습니다.
**주의: 이전에 많은 양의 데이터로 미세 조정한 경우 품질을 향상시키기 위해 모델을 다시 조정하는 것이 좋습니다.**
### 20240706 업데이트
#### 사소한 수정:
1. [Commit 1250670](https://github.com/RVC-Boss/GPT-SoVITS/commit/db50670598f0236613eefa6f2d5a23a271d82041) CPU 추론에서 기본 배치 크기 소수점 문제를 수정했습니다.
2. [PR 1258](https://github.com/RVC-Boss/GPT-SoVITS/pull/1258), [PR 1265](https://github.com/RVC-Boss/GPT-SoVITS/pull/1265), [PR 1267](https://github.com/RVC-Boss/GPT-SoVITS/pull/1267) 노이즈 제거 또는 ASR이 예외를 만나면 모든 보류 중인 오디오 파일이 종료되는 문제를 수정했습니다.
3. [PR 1253](https://github.com/RVC-Boss/GPT-SoVITS/pull/1253) 구두점으로 분할할 때 소수점 분할 문제를 수정했습니다.
4. [Commit a208698](https://github.com/RVC-Boss/GPT-SoVITS/commit/a208698e775155efc95b187b746d153d0f2847ca) 다중 GPU 훈련을 위한 다중 프로세스 저장 로직을 수정했습니다.
5. [PR 1251](https://github.com/RVC-Boss/GPT-SoVITS/pull/1251) 불필요한 `my_utils`를 제거했습니다.
#### 주요 수정:
6. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672)의 가속 추론 코드가 검증되어 메인 브랜치에 병합되었으며, 기본과 일관된 추론 효과를 보장합니다.
또한 참조 텍스트 없는 모드에서 가속 추론을 지원합니다.
**향후 업데이트에서는 `fast_inference` 브랜치의 변경 사항의 일관성을 계속 검증할 것입니다**.
### 20240727 업데이트
#### 사소한 수정:
1. [PR 1298](https://github.com/RVC-Boss/GPT-SoVITS/pull/1298) 불필요한 i18n 코드를 정리했습니다.
2. [PR 1299](https://github.com/RVC-Boss/GPT-SoVITS/pull/1299) 사용자 파일 경로의 후행 슬래시가 명령줄 오류를 일으키는 문제를 수정했습니다.
3. [PR 756](https://github.com/RVC-Boss/GPT-SoVITS/pull/756) GPT 훈련의 단계 계산 로직을 수정했습니다.
#### 주요 수정:
4. [Commit 9588a3c](https://github.com/RVC-Boss/GPT-SoVITS/commit/9588a3c52d9ebdb20b3c5d74f647d12e7c1171c2) 합성을 위한 음성 속도 조절을 지원했습니다.
음성 속도만 조절하면서 무작위성을 고정할 수 있습니다.
### 20240806 업데이트
1. [PR 1306](https://github.com/RVC-Boss/GPT-SoVITS/pull/1306), [PR 1356](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) BS RoFormer 보컬 반주 분리 모델에 대한 지원을 추가했습니다. [Commit e62e965](https://github.com/RVC-Boss/GPT-SoVITS/commit/e62e965323a60a76a025bcaa45268c1ddcbcf05c) FP16 추론을 활성화했습니다.
2. 중국어 텍스트 프론트엔드를 개선했습니다.
- [PR 488](https://github.com/RVC-Boss/GPT-SoVITS/pull/488) 중국어 다의자 지원 (v2 전용);
- [PR 987](https://github.com/RVC-Boss/GPT-SoVITS/pull/987) 추가된 양자;
- [PR 1351](https://github.com/RVC-Boss/GPT-SoVITS/pull/1351) 사칙연산 및 기본 수학 공식을 지원합니다;
- [PR 1404](https://github.com/RVC-Boss/GPT-SoVITS/pull/1404) 혼합 텍스트 오류를 수정했습니다.
3. [PR 1355](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) WebUI 에서 오디오를 처리할 때 경로를 자동으로 채웠습니다.
4. [Commit bce451a](https://github.com/RVC-Boss/GPT-SoVITS/commit/bce451a2d1641e581e200297d01f219aeaaf7299), [Commit 4c8b761](https://github.com/RVC-Boss/GPT-SoVITS/commit/4c8b7612206536b8b4435997acb69b25d93acb78) GPU 인식 로직을 최적화했습니다.
5. [Commit 8a10147](https://github.com/RVC-Boss/GPT-SoVITS/commit/8a101474b5a4f913b4c94fca2e3ca87d0771bae3) 광동어 ASR 지원을 추가했습니다.
6. GPT-SoVITS v2 지원을 추가했습니다.
7. [PR 1387](https://github.com/RVC-Boss/GPT-SoVITS/pull/1387) 타이밍 로직을 최적화했습니다.

View File

@ -102,7 +102,7 @@ conda install -c conda-forge 'ffmpeg<7'
[ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe)와 [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe)를 GPT-SoVITS root 디렉토리에 넣습니다. [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe)와 [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe)를 GPT-SoVITS root 디렉토리에 넣습니다.
##### Mac 사용자 ##### MacOS 사용자
```bash ```bash
brew install ffmpeg brew install ffmpeg
``` ```
@ -213,7 +213,7 @@ ASR 처리는 Faster_Whisper(중국어를 제외한 ASR 마킹)를 통해 수행
(진행률 표시줄 없음, GPU 성능으로 인해 시간 지연이 발생할 수 있음) (진행률 표시줄 없음, GPU 성능으로 인해 시간 지연이 발생할 수 있음)
``` ```
python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p <precision>
``` ```
사용자 정의 목록 저장 경로가 활성화되었습니다. 사용자 정의 목록 저장 경로가 활성화되었습니다.

178
docs/tr/Changelog_TR.md Normal file
View File

@ -0,0 +1,178 @@
### 20240121 Güncellemesi
1. `config`e `is_share` eklendi. Colab gibi senaryolarda, WebUI'yi halka açık ağa yönlendirmek için bu değeri `True` olarak ayarlayabilirsiniz.
2. WebUI'ye İngilizce sistem çeviri desteği eklendi.
3. `cmd-asr`, FunASR modelinin dahil olup olmadığını otomatik olarak tespit eder; eğer varsayılan dizinde bulunamazsa, ModelScope'dan indirilecektir.
4. [Issue 79](https://github.com/RVC-Boss/GPT-SoVITS/issues/79)de bildirilen SoVITS eğitimindeki ZeroDivisionError'u sıfır uzunlukta örnekleri filtreleyerek düzeltmeye çalıştık.
5. `TEMP` klasöründeki önbelleğe alınmış ses dosyaları ve diğer dosyaları temizledik.
6. Referans sesinin sonunu içeren sentezlenmiş ses sorununu önemli ölçüde azalttık.
### 20240122 Güncellemesi
1. Aşırı kısa çıktı dosyalarının referans sesini tekrarlamasına neden olan sorun giderildi.
2. İngilizce ve Japonca eğitim için yerel destek test edildi (Japonca eğitim için kök dizinin İngilizce olmayan özel karakterlerden arındırılmış olması gerekir).
3. Ses yolu denetimi iyileştirildi. Yanlış bir giriş yolundan okumaya çalışıldığında, ffmpeg hatası yerine yolun mevcut olmadığını bildirir.
### 20240123 Güncellemesi
1. Hubert çıkarımının NaN hatalarına neden olup SoVITS/GPT eğitiminde ZeroDivisionError'a yol açtığı sorun çözüldü.
2. İnferans WebUI'de hızlı model değiştirme desteği eklendi.
3. Model dosyası sıralama mantığı optimize edildi.
4. Çince kelime ayrımı için `jieba` `jieba_fast` ile değiştirildi.
### 20240126 Güncellemesi
1. Çince-İngilizce ve Japonca-İngilizce karışık çıktı metinleri için destek eklendi.
2. Çıktı için isteğe bağlı bir bölme modu eklendi.
3. UVR5'in dizinlerden otomatik olarak çıkmasına neden olan okuma sorununu düzelttik.
4. Çeşitli yeni satır sorunlarını düzelterek çıkarım hatalarını giderdik.
5. Çıkarım WebUI'deki gereksiz günlükleri kaldırdık.
6. Mac'te eğitim ve çıkarım desteği eklendi.
7. Yarım hassasiyeti desteklemeyen GPU'lar için otomatik olarak tek hassasiyet zorlandı; CPU çıkarımında tek hassasiyet uygulandı.
### 20240128 Güncellemesi
1. Sayıların Çince karakterlere dönüştürülmesiyle ilgili sorunu düzelttik.
2. Cümlelerin başındaki birkaç karakterin yutulması sorununu düzelttik.
3. Mantıksız referans ses uzunluklarını sınırlamalar koyarak hariç tuttuk.
4. GPT eğitiminin kontrol noktalarını kaydetmemesi sorununu düzelttik.
5. Dockerfile'da model indirme sürecini tamamladık.
### 20240129 Güncellemesi
1. Yarım hassasiyet eğitimi ile ilgili sorun yaşayan 16 serisi gibi GPU'lar için eğitim yapılandırmalarını tek hassasiyete değiştirdik.
2. Mevcut Colab sürümünü test ettik ve güncelledik.
3. Eski sürüm FunASR ile ModelScope FunASR deposunun git klonlanmasıyla oluşan arayüz hizalama hatalarını düzelttik.
### 20240130 Güncellemesi
1. Çift tırnaklarla yol kopyalama hatalarını önlemek için tüm yol ile ilgili girdilerden otomatik olarak çift tırnakları kaldırdık.
2. Çince ve İngilizce noktalama işaretlerini ayırma sorunlarını düzelttik ve cümlelerin başına ve sonuna noktalama işaretleri ekledik.
3. Noktalama işaretlerine göre ayırma özelliğini ekledik.
### 20240201 Güncellemesi
1. Ayrılma hatalarına neden olan UVR5 format okuma hatasını düzelttik.
2. Karışık Çince-Japonca-İngilizce metinler için otomatik segmentasyon ve dil tanıma desteği sağladık.
### 20240202 Güncellemesi
1. `/` ile biten bir ASR yolunun dosya adını kaydetme hatasına neden olma sorununu düzelttik.
2. [PR 377](https://github.com/RVC-Boss/GPT-SoVITS/pull/377) PaddleSpeech'in Normalizer'ını tanıtarak "xx.xx%" (yüzde sembolleri) ve "元/吨" ifadesinin "元吨" yerine "元每吨" olarak okunması gibi sorunları düzelttik ve alt çizgi hatalarını giderdik.
### 20240207 Güncellemesi
1. [Issue 391](https://github.com/RVC-Boss/GPT-SoVITS/issues/391)de bildirilen dil parametresi karışıklığının Çinçe çıkarım kalitesini düşürme sorununu düzelttik.
2. [PR 403](https://github.com/RVC-Boss/GPT-SoVITS/pull/403) ile UVR5'i daha yüksek versiyonlarda librosa'ya uyarladık.
3. [Commit 14a2851](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8) `is_half` parametresinin booleana dönüştürülmemesi nedeniyle sürekli yarım hassasiyet çıkarımı yaparak 16 serisi GPU'larda `inf` hatasına neden olan UVR5 inf hatasını düzelttik.
4. İngilizce metin önyüzünü optimize ettik.
5. Gradio bağımlılıklarını düzelttik.
6. Veri seti hazırlığı sırasında kök dizini boş bırakıldığında `.list` tam yollarının otomatik olarak okunmasını destekledik.
7. Japonca ve İngilizce için Faster Whisper ASR'yi entegre ettik.
### 20240208 Güncellemesi
1. [Commit 59f35ad](https://github.com/RVC-Boss/GPT-SoVITS/commit/59f35adad85815df27e9c6b33d420f5ebfd8376b) ile Windows 10 1909'da ve [Issue 232](https://github.com/RVC-Boss/GPT-SoVITS/issues/232)de (Geleneksel Çince Sistem Dili) bildirilen GPT eğitim durma sorununu düzeltmeye çalıştık.
### 20240212 Güncellemesi
1. Faster Whisper ve FunASR için mantığı optimize ettik, Hugging Face bağlantı sorunlarını önlemek için Faster Whisper'ı ayna indirmelere yönlendirdik.
2. [PR 457](https://github.com/RVC-Boss/GPT-SoVITS/pull/457) GPT tekrarı ve eksik karakterleri azaltmak için eğitim sırasında negatif örnekler oluşturarak deneysel DPO Loss eğitim seçeneğini etkinleştirdi ve çıkarım WebUI'de çeşitli çıkarım parametrelerini kullanılabilir hale getirdi.
### 20240214 Güncellemesi
1. Eğitimde Çince deney adlarını destekledik (önceden hatalara neden oluyordu).
2. DPO eğitimini zorunlu yerine isteğe bağlı bir özellik yaptık. Seçilirse, parti boyutu otomatik olarak yarıya indirilir. Çıkarım WebUI'de yeni parametrelerin iletilmemesi sorunlarını düzelttik.
### 20240216 Güncellemesi
1. Referans metin olmadan girişi destekledik.
2. [Issue 475](https://github.com/RVC-Boss/GPT-SoVITS/issues/475) de bildirilen Çince önyüz hatalarını düzelttik.
### 20240221 Güncellemesi
1. Veri işleme sırasında bir gürültü azaltma seçeneği ekledik (gürültü azaltma sadece 16kHz örnekleme hızını bırakır; yalnızca arka plan gürültüsü önemliyse kullanın).
2. [PR 559](https://github.com/RVC-Boss/GPT-SoVITS/pull/559), [PR 556](https://github.com/RVC-Boss/GPT-SoVITS/pull/556), [PR 532](https://github.com/RVC-Boss/GPT-SoVITS/pull/532), [PR 507](https://github.com/RVC-Boss/GPT-SoVITS/pull/507), [PR 509](https://github.com/RVC-Boss/GPT-SoVITS/pull/509) ile Çince ve Japonca önyüz işlemesini optimize ettik.
3. Mac CPU çıkarımını daha hızlı performans için MPS yerine CPU kullanacak şekilde değiştirdik.
4. Colab genel URL sorununu düzelttik.
### 20240306 Güncellemesi
1. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672) çıkarımı %50 hızlandırdı (RTX3090 + PyTorch 2.2.1 + CU11.8 + Win10 + Py39 üzerinde test edildi).
2. Faster Whisper'ın Çince olmayan ASR'sini kullanırken artık önce Çin FunASR modelini indirmeyi gerektirmiyor.
3. [PR 610](https://github.com/RVC-Boss/GPT-SoVITS/pull/610) UVR5 yankı giderme modelindeki ayarın tersine çevrildiği sorunu düzeltti.
4. [PR 675](https://github.com/RVC-Boss/GPT-SoVITS/pull/675) CUDA mevcut olmadığında Faster Whisper için otomatik CPU çıkarımını etkinleştirdi.
5. [PR 573](https://github.com/RVC-Boss/GPT-SoVITS/pull/573) Mac'te doğru CPU çıkarımı sağlamak için `is_half` kontrolünü değiştirdi.
### 202403/202404/202405 Güncellemeleri
#### Küçük Düzeltmeler:
1. Referans metin olmayan mod ile ilgili sorunlar düzeltildi.
2. Çince ve İngilizce metin önyüzü optimize edildi.
3. API formatı iyileştirildi.
4. CMD format sorunları düzeltildi.
5. Eğitim verisi işleme sırasında desteklenmeyen diller için hata uyarıları eklendi.
6. Hubert çıkarımındaki hata düzeltildi.
#### Büyük Düzeltmeler:
1. VQ'yu dondurmadan yapılan SoVITS eğitimi sorunu (bu kalite düşüşüne neden olabilir) düzeltildi.
2. Hızlı çıkarım dalı eklendi.
### 20240610 Güncellemesi
#### Küçük Düzeltmeler:
1. [PR 1168](https://github.com/RVC-Boss/GPT-SoVITS/pull/1168) & [PR 1169](https://github.com/RVC-Boss/GPT-SoVITS/pull/1169) saf noktalama işareti ve çoklu noktalama işareti metin girdisi için mantığı geliştirdi.
2. [Commit 501a74a](https://github.com/RVC-Boss/GPT-SoVITS/commit/501a74ae96789a26b48932babed5eb4e9483a232) UVR5'teki MDXNet yankı giderme için CMD formatını düzeltti, boşluk içeren yolları destekledi.
3. [PR 1159](https://github.com/RVC-Boss/GPT-SoVITS/pull/1159) `s2_train.py` içindeki SoVITS eğitimi için ilerleme çubuğu mantığını düzeltti.
#### Büyük Düzeltmeler:
4. [Commit 99f09c8](https://github.com/RVC-Boss/GPT-SoVITS/commit/99f09c8bdc155c1f4272b511940717705509582a) WebUI'nin GPT ince ayarının, Çince giriş metinlerinin BERT özelliğini okumaması sorununu düzeltti, bu da çıkarım ile tutarsızlığa ve potansiyel kalite düşüşüne neden oluyordu.
**Dikkat: Daha önce büyük miktarda veri ile ince ayar yaptıysanız, modelin kalitesini artırmak için yeniden ayar yapmanız önerilir.**
### 20240706 Güncellemesi
#### Küçük Düzeltmeler:
1. [Commit 1250670](https://github.com/RVC-Boss/GPT-SoVITS/commit/db50670598f0236613eefa6f2d5a23a271d82041) CPU çıkarımında varsayılan yığın boyutu ondalık sorununu düzeltti.
2. [PR 1258](https://github.com/RVC-Boss/GPT-SoVITS/pull/1258), [PR 1265](https://github.com/RVC-Boss/GPT-SoVITS/pull/1265), [PR 1267](https://github.com/RVC-Boss/GPT-SoVITS/pull/1267) gürültü giderme veya ASR ile ilgili istisnalarla karşılaşıldığında bekleyen tüm ses dosyalarının çıkış yapmasına neden olan sorunları düzeltti.
3. [PR 1253](https://github.com/RVC-Boss/GPT-SoVITS/pull/1253) noktalama işaretlerine göre ayrılırken ondalıkların bölünmesi sorununu düzeltti.
4. [Commit a208698](https://github.com/RVC-Boss/GPT-SoVITS/commit/a208698e775155efc95b187b746d153d0f2847ca) çoklu GPU eğitimi için çoklu işlem kaydetme mantığını düzeltti.
5. [PR 1251](https://github.com/RVC-Boss/GPT-SoVITS/pull/1251) gereksiz `my_utils`'ı kaldırdı.
#### Büyük Düzeltmeler:
6. [PR 672](https://github.com/RVC-Boss/GPT-SoVITS/pull/672) hızlandırılmış çıkarım kodu doğrulandı ve ana dala birleştirildi, taban ile tutarlı çıkarım etkileri sağlandı.
Ayrıca referans metni olmayan modda hızlandırılmış çıkarımı destekler.
**Gelecek güncellemeler, `fast_inference` dalındaki değişikliklerin tutarlılığını doğrulamaya devam edecek.**
### 20240727 Güncellemesi
#### Küçük Düzeltmeler:
1. [PR 1298](https://github.com/RVC-Boss/GPT-SoVITS/pull/1298) gereksiz i18n kodlarını temizledi.
2. [PR 1299](https://github.com/RVC-Boss/GPT-SoVITS/pull/1299) kullanıcı dosya yollarındaki sonlandırma eğik çizgilerinin komut satırı hatalarına neden olduğu sorunları düzeltti.
3. [PR 756](https://github.com/RVC-Boss/GPT-SoVITS/pull/756) GPT eğitimindeki adım hesaplama mantığını düzeltti.
#### Büyük Düzeltmeler:
4. [Commit 9588a3c](https://github.com/RVC-Boss/GPT-SoVITS/commit/9588a3c52d9ebdb20b3c5d74f647d12e7c1171c2) sentez için konuşma hızı ayarlamasını destekledi.
Konuşma hızını ayarlarken rastgeleliği dondurmayı etkinleştirdi.
### 20240806 Güncellemesi
1. [PR 1306](https://github.com/RVC-Boss/GPT-SoVITS/pull/1306), [PR 1356](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) BS RoFormer vokal eşlik ayırma modelini desteklemeye başladı. [Commit e62e965](https://github.com/RVC-Boss/GPT-SoVITS/commit/e62e965323a60a76a025bcaa45268c1ddcbcf05c) FP16 çıkarımı etkinleştirdi.
2. Çince metin ön yüzünü geliştirdi.
- [PR 488](https://github.com/RVC-Boss/GPT-SoVITS/pull/488) çoklu heceli karakterler için destek ekledi (v2 sadece);
- [PR 987](https://github.com/RVC-Boss/GPT-SoVITS/pull/987) sayı belirleyici ekledi;
- [PR 1351](https://github.com/RVC-Boss/GPT-SoVITS/pull/1351) aritmetik ve temel matematik formüllerini destekler;
- [PR 1404](https://github.com/RVC-Boss/GPT-SoVITS/pull/1404) karışık metin hatalarını düzeltti.
3. [PR 1355](https://github.com/RVC-Boss/GPT-SoVITS/pull/1356) WebUI'de ses işlenirken yolları otomatik olarak doldurdu.
4. [Commit bce451a](https://github.com/RVC-Boss/GPT-SoVITS/commit/bce451a2d1641e581e200297d01f219aeaaf7299), [Commit 4c8b761](https://github.com/RVC-Boss/GPT-SoVITS/commit/4c8b7612206536b8b4435997acb69b25d93acb78) GPU tanıma mantığını optimize etti.
5. [Commit 8a10147](https://github.com/RVC-Boss/GPT-SoVITS/commit/8a101474b5a4f913b4c94fca2e3ca87d0771bae3) Kantonca ASR desteği ekledi.
6. GPT-SoVITS v2 desteği eklendi.
7. [PR 1387](https://github.com/RVC-Boss/GPT-SoVITS/pull/1387) zamanlama mantığını optimize etti.

View File

@ -102,7 +102,7 @@ conda install -c conda-forge 'ffmpeg<7'
[ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) ve [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) dosyalarını indirin ve GPT-SoVITS kök dizinine yerleştirin. [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) ve [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) dosyalarını indirin ve GPT-SoVITS kök dizinine yerleştirin.
##### Mac Kullanıcıları ##### MacOS Kullanıcıları
```bash ```bash
brew install ffmpeg brew install ffmpeg
``` ```

2
go-webui-v1.bat Normal file
View File

@ -0,0 +1,2 @@
runtime\python.exe webui.py v1 zh_CN
pause

4
go-webui-v1.ps1 Normal file
View File

@ -0,0 +1,4 @@
$ErrorActionPreference = "SilentlyContinue"
chcp 65001
& "$PSScriptRoot\runtime\python.exe" "$PSScriptRoot\webui.py v1 zh_CN"
pause

View File

@ -1,2 +1,2 @@
runtime\python.exe webui.py runtime\python.exe webui.py zh_CN
pause pause

View File

@ -1,4 +1,4 @@
$ErrorActionPreference = "SilentlyContinue" $ErrorActionPreference = "SilentlyContinue"
chcp 65001 chcp 65001
& "$PSScriptRoot\runtime\python.exe" "$PSScriptRoot\webui.py" & "$PSScriptRoot\runtime\python.exe" "$PSScriptRoot\webui.py zh_CN"
pause pause

View File

@ -1,18 +1,16 @@
numpy==1.23.4 numpy==1.23.4
nltk==3.8.1 scipy
PyYAML==6.0.1 tensorboard
scipy==1.11.4
tensorboard==2.16.2
librosa==0.9.2 librosa==0.9.2
numba==0.56.4 numba==0.56.4
pytorch-lightning pytorch-lightning
gradio==4.4.1 gradio==3.38.0
gradio_client==0.8.1
ffmpeg-python ffmpeg-python
onnxruntime onnxruntime; sys_platform == 'darwin'
onnxruntime-gpu; sys_platform != 'darwin'
tqdm tqdm
funasr==1.0.11 funasr==1.0.27
hdbscan==0.8.37
setuptools==69.1.1
cn2an cn2an
pypinyin pypinyin
pyopenjtalk pyopenjtalk
@ -22,9 +20,17 @@ modelscope==1.10.0
sentencepiece sentencepiece
transformers transformers
chardet chardet
PyYAML
psutil psutil
jieba_fast jieba_fast
jieba jieba
LangSegment>=0.2.0 LangSegment>=0.2.0
Faster_Whisper Faster_Whisper
wordsegment wordsegment
rotary_embedding_torch
pyjyutping
g2pk2
ko_pron
opencc; sys_platform != 'linux'
opencc==1.1.1; sys_platform == 'linux'
python_mecab_ko; sys_platform != 'win32'

View File

@ -18,14 +18,16 @@ def check_fw_local_models():
asr_dict = { asr_dict = {
"达摩 ASR (中文)": { "达摩 ASR (中文)": {
'lang': ['zh'], 'lang': ['zh','yue'],
'size': ['large'], 'size': ['large'],
'path': 'funasr_asr.py', 'path': 'funasr_asr.py',
'precision': ['float32']
}, },
"Faster Whisper (多语种)": { "Faster Whisper (多语种)": {
'lang': ['auto', 'zh', 'en', 'ja'], 'lang': ['auto', 'zh', 'en', 'ja', 'ko', 'yue'],
'size': check_fw_local_models(), 'size': check_fw_local_models(),
'path': 'fasterwhisper_asr.py' 'path': 'fasterwhisper_asr.py',
} 'precision': ['float32', 'float16', 'int8']
},
} }

View File

@ -101,8 +101,8 @@ if __name__ == '__main__':
parser.add_argument("-l", "--language", type=str, default='ja', parser.add_argument("-l", "--language", type=str, default='ja',
choices=language_code_list, choices=language_code_list,
help="Language of the audio files.") help="Language of the audio files.")
parser.add_argument("-p", "--precision", type=str, default='float16', choices=['float16','float32'], parser.add_argument("-p", "--precision", type=str, default='float16', choices=['float16','float32','int8'],
help="fp16 or fp32") help="fp16, int8 or fp32")
cmd = parser.parse_args() cmd = parser.parse_args()
output_file_path = execute_asr( output_file_path = execute_asr(

View File

@ -4,24 +4,10 @@ import argparse
import os import os
import traceback import traceback
from tqdm import tqdm from tqdm import tqdm
# from funasr.utils import version_checker
# version_checker.check_for_update = lambda: None
from funasr import AutoModel from funasr import AutoModel
path_asr = 'tools/asr/models/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch'
path_vad = 'tools/asr/models/speech_fsmn_vad_zh-cn-16k-common-pytorch'
path_punc = 'tools/asr/models/punc_ct-transformer_zh-cn-common-vocab272727-pytorch'
path_asr = path_asr if os.path.exists(path_asr) else "iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch"
path_vad = path_vad if os.path.exists(path_vad) else "iic/speech_fsmn_vad_zh-cn-16k-common-pytorch"
path_punc = path_punc if os.path.exists(path_punc) else "iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch"
model = AutoModel(
model = path_asr,
model_revision = "v2.0.4",
vad_model = path_vad,
vad_model_revision = "v2.0.4",
punc_model = path_punc,
punc_model_revision = "v2.0.4",
)
def only_asr(input_file): def only_asr(input_file):
try: try:
@ -40,6 +26,7 @@ def execute_asr(input_folder, output_folder, model_size, language):
for file_name in tqdm(input_file_names): for file_name in tqdm(input_file_names):
try: try:
print(file_name)
file_path = os.path.join(input_folder, file_name) file_path = os.path.join(input_folder, file_name)
text = model.generate(input=file_path)[0]["text"] text = model.generate(input=file_path)[0]["text"]
output.append(f"{file_path}|{output_file_name}|{language.upper()}|{text}") output.append(f"{file_path}|{output_file_name}|{language.upper()}|{text}")
@ -55,20 +42,47 @@ def execute_asr(input_folder, output_folder, model_size, language):
print(f"ASR 任务完成->标注文件路径: {output_file_path}\n") print(f"ASR 任务完成->标注文件路径: {output_file_path}\n")
return output_file_path return output_file_path
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input_folder", type=str, required=True,
help="Path to the folder containing WAV files.")
parser.add_argument("-o", "--output_folder", type=str, required=True,
help="Output folder to store transcriptions.")
parser.add_argument("-s", "--model_size", type=str, default='large',
help="Model Size of FunASR is Large")
parser.add_argument("-l", "--language", type=str, default='zh', choices=['zh'],
help="Language of the audio files.")
parser.add_argument("-p", "--precision", type=str, default='float16', choices=['float16','float32'],
help="fp16 or fp32")#还没接入
cmd = parser.parse_args() parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input_folder", type=str, required=True,
help="Path to the folder containing WAV files.")
parser.add_argument("-o", "--output_folder", type=str, required=True,
help="Output folder to store transcriptions.")
parser.add_argument("-s", "--model_size", type=str, default='large',
help="Model Size of FunASR is Large")
parser.add_argument("-l", "--language", type=str, default='zh', choices=['zh','yue','auto'],
help="Language of the audio files.")
parser.add_argument("-p", "--precision", type=str, default='float16', choices=['float16','float32'],
help="fp16 or fp32")#还没接入
cmd = parser.parse_args()
path_vad = 'tools/asr/models/speech_fsmn_vad_zh-cn-16k-common-pytorch'
path_punc = 'tools/asr/models/punc_ct-transformer_zh-cn-common-vocab272727-pytorch'
path_vad = path_vad if os.path.exists(path_vad) else "iic/speech_fsmn_vad_zh-cn-16k-common-pytorch"
path_punc = path_punc if os.path.exists(path_punc) else "iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch"
vad_model_revision=punc_model_revision="v2.0.4"
if(cmd.language=="zh"):
path_asr = 'tools/asr/models/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch'
path_asr = path_asr if os.path.exists(path_asr) else "iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch"
model_revision="v2.0.4"
else:
path_asr = 'tools/asr/models/speech_UniASR_asr_2pass-cantonese-CHS-16k-common-vocab1468-tensorflow1-online'
path_asr = path_asr if os.path.exists(path_asr) else "iic/speech_UniASR_asr_2pass-cantonese-CHS-16k-common-vocab1468-tensorflow1-online"
model_revision="master"
path_vad=path_punc=vad_model_revision=punc_model_revision=None###友情提示粤语带VAD识别可能会有少量shape不对报错的但是不带VAD可以.不带vad只能分阶段单独加标点。不过标点模型对粤语效果真的不行…
model = AutoModel(
model=path_asr,
model_revision=model_revision,
vad_model=path_vad,
vad_model_revision=vad_model_revision,
punc_model=path_punc,
punc_model_revision=punc_model_revision,
)
if __name__ == '__main__':
execute_asr( execute_asr(
input_folder = cmd.input_folder, input_folder = cmd.input_folder,
output_folder = cmd.output_folder, output_folder = cmd.output_folder,

View File

@ -9,6 +9,12 @@ def load_language_list(language):
language_list = json.load(f) language_list = json.load(f)
return language_list return language_list
def scan_language_list():
language_list = []
for name in os.listdir(I18N_JSON_DIR):
if name.endswith(".json"):language_list.append(name.split('.')[0])
return language_list
class I18nAuto: class I18nAuto:
def __init__(self, language=None): def __init__(self, language=None):
if language in ["Auto", None]: if language in ["Auto", None]:

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb): Best choice for dual-channel reverberation, cannot remove single-channel reverberation;",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho: Removes delay effects. Aggressive mode removes more thoroughly than Normal mode. DeReverb additionally removes reverberation, can remove mono reverberation, but does not clean heavily high-frequency plate reverberation.",
"*GPT模型列表": "*GPT models list", "*GPT模型列表": "*GPT models list",
"*SoVITS模型列表": "*SoVITS models list", "*SoVITS模型列表": "*SoVITS models list",
"*实验/模型名": "*Experiment/model name", "*实验/模型名": "*Experiment/model name",
"*文本标注文件": "*Text labelling file", "*文本标注文件": "*Text labelling file",
"*训练集音频文件目录": "*Audio dataset folder", "*训练集音频文件目录": "*Audio dataset folder",
"*请上传并填写参考信息": "*Please upload and fill reference information", "*请上传并填写参考信息": "*Please upload and fill reference information",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*Please fill in the target text and language mode for synthesis",
".list标注文件的路径": ".list annotation file path", ".list标注文件的路径": ".list annotation file path",
"0-前置数据集获取工具": "0-Fetch dataset", "0-前置数据集获取工具": "0-Fetch dataset",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 webui (for vocal separation, deecho, dereverb and denoise)", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 webui (for vocal separation, deecho, dereverb and denoise)",
"0b-语音切分工具": "0b-Audio slicer", "0b-语音切分工具": "0b-Audio slicer",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb-Voice denoiser",
"0c-中文批量离线ASR工具": "0c-Chinese ASR tool", "0c-中文批量离线ASR工具": "0c-Chinese ASR tool",
"0d-语音文本校对标注工具": "0d-Speech to text proofreading tool", "0d-语音文本校对标注工具": "0d-Speech to text proofreading tool",
"1-GPT-SoVITS-TTS": "1-GPT-SOVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SOVITS-TTS",
@ -23,13 +25,20 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS training. The model is located in SoVITS_weights.", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS training. The model is located in SoVITS_weights.",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT training. The model is located in GPT_weights.", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT training. The model is located in GPT_weights.",
"1C-推理": "1C-inference", "1C-推理": "1C-inference",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. The DeEcho-DeReverb model's processing time is nearly twice that of the other two DeEcho models.",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Preserve Vocals: Choose this option for audio without harmonies, as it better retains the main vocal compared to the HP5 model. This option includes two built-in models, HP2 and HP3. HP3 may slightly let through some accompaniment but retains the main vocal slightly better than HP2.",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-Voice Changer", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-Voice Changer",
"2、MDX-Net-Dereverb模型挺慢的": "2、MDX-Net-Dereverb Model is slow;",
"2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Keep Only Main Vocal: Choose this option for audio with harmonies, as it may slightly reduce the main vocal. Includes one built-in HP5 model;",
"3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. Personal Recommendation for the cleanest configuration: First use MDX-Net followed by DeEcho-Aggressive",
"3、去混响、去延迟模型by FoxJoy": "3. Reverberation and delay removal model(by FoxJoy):",
"ASR 模型": "ASR model", "ASR 模型": "ASR model",
"ASR 模型尺寸": "ASR model size", "ASR 模型尺寸": "ASR model size",
"ASR 语言设置": "ASR language", "ASR 语言设置": "ASR language",
"ASR进程输出信息": "ASR output log", "ASR进程输出信息": "ASR output log",
"GPT模型列表": "GPT weight list", "GPT模型列表": "GPT weight list",
"GPT训练进程输出信息": "GPT training output log", "GPT训练进程输出信息": "GPT training output log",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT sampling parameters (not too low when there's no reference text. Use default if unsure):",
"GPU卡号,只能填1个整数": "GPU number, can only input ONE integer", "GPU卡号,只能填1个整数": "GPU number, can only input ONE integer",
"GPU卡号以-分割,每个卡号一个进程": "GPU number is separated by -, each GPU will run one process ", "GPU卡号以-分割,每个卡号一个进程": "GPU number is separated by -, each GPU will run one process ",
"SSL进程输出信息": "SSL output log", "SSL进程输出信息": "SSL output log",
@ -42,45 +51,47 @@
"UVR5已开启": "UVR5 opened ", "UVR5已开启": "UVR5 opened ",
"UVR5进程输出信息": "UVR5 process output log", "UVR5进程输出信息": "UVR5 process output log",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proportion of normalized audio merged into dataset", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proportion of normalized audio merged into dataset",
"gpt采样参数(无参考文本时不要太低)": "GPT parameters:",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: FO hop size, the smaller the value, the higher the accuracy", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: FO hop size, the smaller the value, the higher the accuracy",
"max:归一化后最大值多少": "Loudness multiplier after normalized", "max:归一化后最大值多少": "Loudness multiplier after normalized",
"max_sil_kept:切完后静音最多留多长": "Maximum length for silence to be kept", "max_sil_kept:切完后静音最多留多长": "Maximum length for silence to be kept",
"min_interval:最短切割间隔": "Minumum interval for audio cutting", "min_interval:最短切割间隔": "Minumum interval for audio cutting",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "Minimum length", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: the minimum length of each segment. If the first segment is too short, it will be concatenated with the next segment until it exceeds this value",
"temperature": "#!temperature", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "Noise gate threshold (loudness below this value will be treated as noise", "threshold:音量小于这个值视作静音的备选切割点": "Noise gate threshold (loudness below this value will be treated as noise",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "One-click formatting output", "一键三连进程输出信息": "One-click formatting output",
"不切": "No slice", "不切": "No slice",
"中文": "Chinese", "中文": "Chinese",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Chinese Tutorialhttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "Chinese-English Mixed",
"也可批量输入音频文件, 二选一, 优先读文件夹": "Multiple audio files can also be imported. If a folder path exists, this input is ignored.", "也可批量输入音频文件, 二选一, 优先读文件夹": "Multiple audio files can also be imported. If a folder path exists, this input is ignored.",
"人声伴奏分离批量处理, 使用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>&emsp;(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍<br>2、MDX-Net-Dereverb模型挺慢的<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "Batch processing for vocal accompaniment separation using the UVR5 model.<br>Example of a valid folder path format: D:\\path\\to\\input\\folder (copy it from the file manager address bar).<br>The model is divided into three categories:<br>1. Preserve vocals: Choose this option for audio without harmonies. It preserves vocals better than HP5. It includes two built-in models: HP2 and HP3. HP3 may slightly leak accompaniment but preserves vocals slightly better than HP2.<br>2. Preserve main vocals only: Choose this option for audio with harmonies. It may weaken the main vocals. It includes one built-in model: HP5.<br>3. De-reverb and de-delay models (by FoxJoy):<br>(1) MDX-Net: The best choice for stereo reverb removal but cannot remove mono reverb;<br>&emsp;(234) DeEcho: Removes delay effects. Aggressive mode removes more thoroughly than Normal mode. DeReverb additionally removes reverb and can remove mono reverb, but not very effectively for heavily reverberated high-frequency content.<br>De-reverb/de-delay notes:<br>1. The processing time for the DeEcho-DeReverb model is approximately twice as long as the other two DeEcho models.<br>2. The MDX-Net-Dereverb model is quite slow.<br>3. The recommended cleanest configuration is to apply MDX-Net first and then DeEcho-Aggressive.", "人声伴奏分离批量处理, 使用UVR5模型。": "Batch processing for vocal and instrumental separation, using the UVR5 model.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Vocal extraction aggressiveness",
"以下文件或文件夹不存在:": "No Such File or Folder:",
"以下模型不存在:": "No Such Model:",
"伴奏人声分离&去混响&去回声": "Vocals/Accompaniment Separation & Reverberation Removal", "伴奏人声分离&去混响&去回声": "Vocals/Accompaniment Separation & Reverberation Removal",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "When using the no-reference text mode, it is recommended to use a fine-tuned GPT. If the reference audio is unclear and you don't know what to write, you can enable this feature, which will ignore the reference text you've entered.",
"保存频率save_every_epoch": "Save frequency (save_every_epoch):", "保存频率save_every_epoch": "Save frequency (save_every_epoch):",
"凑50字一切": "Cut per 50 characters", "凑50字一切": "Slice per 50 characters",
"凑四句一切": "Slice once every 4 sentences", "凑四句一切": "Slice once every 4 sentences",
"切分后文本": "Text after sliced",
"切分后的子音频的输出根目录": "Audio slicer output folder", "切分后的子音频的输出根目录": "Audio slicer output folder",
"切割使用的进程数": "CPU threads used for audio slicing", "切割使用的进程数": "CPU threads used for audio slicing",
"刷新模型路径": "refreshing model paths", "刷新模型路径": "refreshing model paths",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "Processed text from the frontend (per sentence):",
"去混响/去延迟,附:": "Dereverberation/Delay Removal, including:",
"参考音频在3~10秒范围外请更换": "Reference audio is outside the 3-10 second range, please choose another one!", "参考音频在3~10秒范围外请更换": "Reference audio is outside the 3-10 second range, please choose another one!",
"参考音频的文本": "Text for reference audio", "参考音频的文本": "Text for reference audio",
"参考音频的语种": "Language for reference audio", "参考音频的语种": "Language for reference audio",
"合成语音": "Start inference", "合成语音": "Start inference",
"后续将支持转音素、手工修改音素、语音合成分步执行。": " Step-to-step phoneme transformation and modification coming soon!", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "An example of a valid folder path format: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (simply copy the address from the file manager's address bar).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Please fill in the segmented audio files' directory! The full path of the audio file = the directory concatenated with the filename corresponding to the waveform in the list file (not the full path). If left blank, the absolute full path in the .list file will be used.",
"多语种混合": "#!多语种混合", "多语种混合": "Multilingual Mixed",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "Multilingual Mixed(Yue)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "Actual Input Reference Text:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "Actual Input Target Text (after sentence segmentation):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "Actual Input Target Text (per sentence):",
"实际输入的目标文本:": "Actual Input Target Text:",
"导出文件格式": "Export file format", "导出文件格式": "Export file format",
"开启GPT训练": "Start GPT training", "开启GPT训练": "Start GPT training",
"开启SSL提取": "Start SSL extracting", "开启SSL提取": "Start SSL extracting",
@ -91,7 +102,7 @@
"开启离线批量ASR": "Start batch ASR", "开启离线批量ASR": "Start batch ASR",
"开启语义token提取": "Start semantics token extraction", "开启语义token提取": "Start semantics token extraction",
"开启语音切割": "Start audio slicer", "开启语音切割": "Start audio slicer",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Start voice denoiser",
"怎么切": "How to slice the sentence", "怎么切": "How to slice the sentence",
"总训练轮数total_epoch": "Total training epochs (total_epoch):", "总训练轮数total_epoch": "Total training epochs (total_epoch):",
"总训练轮数total_epoch不建议太高": "Total epochs, do not increase to a value that is too high", "总训练轮数total_epoch不建议太高": "Total epochs, do not increase to a value that is too high",
@ -103,23 +114,28 @@
"按中文句号。切": "Slice by Chinese punct", "按中文句号。切": "Slice by Chinese punct",
"按标点符号切": "Slice by every punct", "按标点符号切": "Slice by every punct",
"按英文句号.切": "Slice by English punct", "按英文句号.切": "Slice by English 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.", "数据类型精度": "Computing precision",
"文本模块学习率权重": "Text model learning rate weighting", "文本模块学习率权重": "Text model learning rate weighting",
"文本进程输出信息": "Text processing output", "文本进程输出信息": "Text processing output",
"施工中,请静候佳音": "In construction, please wait", "施工中,请静候佳音": "In construction, please wait",
"日文": "Japanese", "日文": "Japanese",
"日英混合": "#!日英混合", "日英混合": "Japanese-English Mixed",
"是否仅保存最新的ckpt文件以节省硬盘空间": "Save only the latest '.ckpt' file to save disk space:", "是否仅保存最新的ckpt文件以节省硬盘空间": "Save only the latest '.ckpt' file to save disk space:",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Save a small final model to the 'weights' folder at each save point:", "是否在每次保存时间点将最终小模型保存至weights文件夹": "Save a small final model to the 'weights' folder at each save point:",
"是否开启TTS推理WebUI": "Open TTS inference WEBUI", "是否开启TTS推理WebUI": "Open TTS inference WebUI",
"是否开启UVR5-WebUI": "Open UVR5-WebUI", "是否开启UVR5-WebUI": "Open UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "Enable DPO training (experimental feature)", "是否开启dpo训练选项(实验性)": "Enable DPO training (experimental feature)",
"是否开启打标WebUI": "Open labelling WebUI", "是否开启打标WebUI": "Open labelling WebUI",
"是否直接对上次合成结果调整语速。防止随机性。": "Whether to directly adjust the speech rate of the last synthesis result to prevent randomness.",
"显卡信息": "GPU Information", "显卡信息": "GPU Information",
"本软件以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</b> for details.", "本软件以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</b> for details.",
"模型": "Model", "模型": "Model",
"模型分为三类:": "Models are categorized into three types:",
"模型切换": "Model switch", "模型切换": "Model switch",
"每张显卡的batch_size": "Batch size per GPU:", "每张显卡的batch_size": "Batch size per GPU:",
"版本": "Version",
"粤英混合": "Yue-English Mixed",
"粤语": "Yue",
"终止ASR进程": "Stop ASR task", "终止ASR进程": "Stop ASR task",
"终止GPT训练": "Stop GPT training", "终止GPT训练": "Stop GPT training",
"终止SSL提取进程": "Stop SSL extraction", "终止SSL提取进程": "Stop SSL extraction",
@ -128,13 +144,17 @@
"终止文本获取进程": "Stop speech-to-text", "终止文本获取进程": "Stop speech-to-text",
"终止语义token提取进程": "Stop semantics token extraction", "终止语义token提取进程": "Stop semantics token extraction",
"终止语音切割": "Stop audio cutting", "终止语音切割": "Stop audio cutting",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "Stop voice denoising",
"英文": "English", "英文": "English",
"语义token提取进程输出信息": "Sematics token extraction output log", "语义token提取进程输出信息": "Sematics token extraction output log",
"语速": "Speech rate",
"语速调整,高为更快": "Adjust speech rate, higher for faster",
"语音切割进程输出信息": "Audio slicer output log", "语音切割进程输出信息": "Audio slicer output log",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "Voice Denoiser Process Output Information",
"请上传3~10秒内参考音频超过会报错": "Please upload a reference audio within the 3-10 second range; if it exceeds this duration, it will raise errors.", "请上传3~10秒内参考音频超过会报错": "Please upload a reference audio within the 3-10 second range; if it exceeds this duration, it will raise errors.",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "Please Upload the Reference Audio",
"请填入推理文本": "Please Fill in the Terget Text",
"请输入有效文本": "Please enter valid text.",
"转换": "Convert", "转换": "Convert",
"输入待处理音频文件夹路径": "Enter the path of the audio folder to be processed:", "输入待处理音频文件夹路径": "Enter the path of the audio folder to be processed:",
"输入文件夹路径": "Input folder path", "输入文件夹路径": "Input folder path",
@ -143,11 +163,12 @@
"输出文件夹路径": "Output folder path", "输出文件夹路径": "Output folder path",
"输出的语音": "Inference Result", "输出的语音": "Inference Result",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Choose the models from SoVITS_weights and GPT_weights. The default one is a pretrain, so you can experience zero shot TTS.", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Choose the models from SoVITS_weights and GPT_weights. The default one is a pretrain, so you can experience zero shot TTS.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Denoised Results Output Folder",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Denoising Audio File Input Folder",
"需要合成的切分前文本": "Inference text that needs to be sliced",
"需要合成的文本": "Inference text", "需要合成的文本": "Inference text",
"需要合成的语种": "Inference text language", "需要合成的语种": "Inference text language",
"韩文": "Korean",
"韩英混合": "Korean-English Mixed",
"音频自动切分输入路径,可文件可文件夹": "Audio slicer input (file or folder)", "音频自动切分输入路径,可文件可文件夹": "Audio slicer input (file or folder)",
"预训练的GPT模型路径": "Pretrained GPT model path", "预训练的GPT模型路径": "Pretrained GPT model path",
"预训练的SSL模型路径": "Pretrained SSL model path", "预训练的SSL模型路径": "Pretrained SSL model path",

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net (onnx_dereverb): reverberación estéreo, la mejor opción; no puede eliminar reverberación mono",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho: Eliminar el efecto de retardo. Aggressive elimina más que Normal, DeReverb elimina reverberación adicional, puede eliminar reverberación mono, pero no limpia bien la reverberación de placa de alta frecuencia",
"*GPT模型列表": "*Lista de modelos GPT", "*GPT模型列表": "*Lista de modelos GPT",
"*SoVITS模型列表": "*Lista de modelos SoVITS", "*SoVITS模型列表": "*Lista de modelos SoVITS",
"*实验/模型名": "*Nombre del experimento/modelo", "*实验/模型名": "*Nombre del experimento/modelo",
"*文本标注文件": "*Archivo de etiquetado de texto", "*文本标注文件": "*Archivo de etiquetado de texto",
"*训练集音频文件目录": "*Directorio de archivos de audio de entrenamiento", "*训练集音频文件目录": "*Directorio de archivos de audio de entrenamiento",
"*请上传并填写参考信息": "*Por favor, suba y complete la información de referencia", "*请上传并填写参考信息": "*Por favor, suba y complete la información de referencia",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*Por favor, complete el texto objetivo a sintetizar y el modo de idioma",
".list标注文件的路径": "Ruta del archivo de anotación .list", ".list标注文件的路径": "Ruta del archivo de anotación .list",
"0-前置数据集获取工具": "0-Herramienta de obtención de conjunto de datos previo", "0-前置数据集获取工具": "0-Herramienta de obtención de conjunto de datos previo",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Herramienta de separación de voz y acompañamiento UVR5 y eliminación de reverberación y retardo", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Herramienta de separación de voz y acompañamiento UVR5 y eliminación de reverberación y retardo",
"0b-语音切分工具": "0b-Herramienta de división de voz", "0b-语音切分工具": "0b-Herramienta de división de voz",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb-Herramienta de reducción de ruido de voz",
"0c-中文批量离线ASR工具": "0c-Herramienta de ASR en lote fuera de línea en chino", "0c-中文批量离线ASR工具": "0c-Herramienta de ASR en lote fuera de línea en chino",
"0d-语音文本校对标注工具": "0d-Herramienta de corrección y etiquetado de texto de voz", "0d-语音文本校对标注工具": "0d-Herramienta de corrección y etiquetado de texto de voz",
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
@ -23,13 +25,20 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Entrenamiento de SoVITS. Los archivos de modelo para compartir se encuentran en SoVITS_weights.", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Entrenamiento de SoVITS. Los archivos de modelo para compartir se encuentran en SoVITS_weights.",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Entrenamiento de GPT. Los archivos de modelo para compartir se encuentran en GPT_weights.", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Entrenamiento de GPT. Los archivos de modelo para compartir se encuentran en GPT_weights.",
"1C-推理": "1C-Inferencia", "1C-推理": "1C-Inferencia",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. El modelo DeEcho-DeReverb tarda casi el doble que los otros dos modelos DeEcho",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Retener voz principal: seleccione este para audio sin coros, retiene mejor la voz principal que HP5. Incluye dos modelos, HP2 y HP3; HP3 puede filtrar ligeramente el acompañamiento pero retiene mejor la voz principal que HP2",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-Cambio de voz", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-Cambio de voz",
"ASR 模型": "#!ASR 模型", "2、MDX-Net-Dereverb模型挺慢的": "2. El modelo MDX-Net-Dereverb es bastante lento",
"ASR 模型尺寸": "#!ASR 模型尺寸", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Solo retener voz principal: seleccione este para audio con coros, puede debilitar la voz principal. Incluye un modelo HP5",
"ASR 语言设置": "#!ASR 语言设置", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. La configuración más limpia recomendada es primero MDX-Net, luego DeEcho-Aggressive",
"3、去混响、去延迟模型by FoxJoy": "3. Modelos de eliminación de reverberación y retardo (por FoxJoy)",
"ASR 模型": "Modelo ASR",
"ASR 模型尺寸": "Tamaño del modelo ASR",
"ASR 语言设置": "Configuración del idioma ASR",
"ASR进程输出信息": "Información de salida del proceso ASR", "ASR进程输出信息": "Información de salida del proceso ASR",
"GPT模型列表": "Lista de modelos GPT", "GPT模型列表": "Lista de modelos GPT",
"GPT训练进程输出信息": "Información de salida del proceso de entrenamiento de GPT", "GPT训练进程输出信息": "Información de salida del proceso de entrenamiento de GPT",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "Parámetros de muestreo de GPT (no demasiado bajos cuando no hay texto de referencia. Use los valores por defecto si no está seguro):",
"GPU卡号,只能填1个整数": "Número de tarjeta GPU, solo se puede ingresar un número entero", "GPU卡号,只能填1个整数": "Número de tarjeta GPU, solo se puede ingresar un número entero",
"GPU卡号以-分割,每个卡号一个进程": "Número de tarjeta GPU separado por '-', cada número de tarjeta es un proceso", "GPU卡号以-分割,每个卡号一个进程": "Número de tarjeta GPU separado por '-', cada número de tarjeta es un proceso",
"SSL进程输出信息": "Información de salida del proceso SSL", "SSL进程输出信息": "Información de salida del proceso SSL",
@ -42,56 +51,58 @@
"UVR5已开启": "UVR5 está habilitado", "UVR5已开启": "UVR5 está habilitado",
"UVR5进程输出信息": "Información de salida del proceso UVR5", "UVR5进程输出信息": "Información de salida del proceso UVR5",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proporción de mezcla de audio normalizado que entra", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proporción de mezcla de audio normalizado que entra",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: cómo calcular la curva de volumen, cuanto más pequeño, mayor precisión pero mayor carga computacional (mayor precisión no significa mejor rendimiento)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: cómo calcular la curva de volumen, cuanto más pequeño, mayor precisión pero mayor carga computacional (mayor precisión no significa mejor rendimiento)",
"max:归一化后最大值多少": "max: valor máximo después de la normalización", "max:归一化后最大值多少": "max: valor máximo después de la normalización",
"max_sil_kept:切完后静音最多留多长": "max_sil_kept: duración máxima del silencio después del corte", "max_sil_kept:切完后静音最多留多长": "max_sil_kept: duración máxima del silencio después del corte",
"min_interval:最短切割间隔": "min_interval: intervalo mínimo de corte", "min_interval:最短切割间隔": "min_interval: intervalo mínimo de corte",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: duración mínima de cada segmento, si el primer segmento es demasiado corto, se conecta continuamente con los siguientes hasta que supera este valor", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: longitud mínima de cada segmento; si el primer segmento es demasiado corto, se une al siguiente hasta superar este valor",
"temperature": "#!temperature", "temperature": "temperatura",
"threshold:音量小于这个值视作静音的备选切割点": "umbral: puntos de corte alternativos considerados como silencio si el volumen es menor que este valor", "threshold:音量小于这个值视作静音的备选切割点": "umbral: puntos de corte alternativos considerados como silencio si el volumen es menor que este valor",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "Información de salida del proceso de triple acción", "一键三连进程输出信息": "Información de salida del proceso de triple acción",
"不切": "No cortar", "不切": "No cortar",
"中文": "Chino", "中文": "Chino",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentación del tutorial en chino: https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "Chino e inglés mezclados",
"也可批量输入音频文件, 二选一, 优先读文件夹": "También se pueden ingresar archivos de audio por lotes, seleccionar uno, prioridad para leer carpetas", "也可批量输入音频文件, 二选一, 优先读文件夹": "También se pueden ingresar archivos de audio por lotes, seleccionar uno, prioridad para leer carpetas",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "Procesamiento por lotes de separación de voz y acompañamiento utilizando el modelo UVR5",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Nivel de agresividad en la extracción de voz",
"以下文件或文件夹不存在:": "No Existe Tal Archivo o Carpeta:",
"以下模型不存在:": "No Existe tal Modelo:",
"伴奏人声分离&去混响&去回声": "Separación de acompañamiento y voz principal y eliminación de reverberación y eco", "伴奏人声分离&去混响&去回声": "Separación de acompañamiento y voz principal y eliminación de reverberación y eco",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "Se recomienda usar un GPT ajustado en modo sin texto de referencia; habilítelo si no puede entender el audio de referencia (si no sabe qué escribir). Una vez habilitado, ignorará el texto de referencia ingresado.",
"保存频率save_every_epoch": "Frecuencia de guardado (cada epoch)", "保存频率save_every_epoch": "Frecuencia de guardado (cada epoch)",
"凑50字一切": "Todo para alcanzar las 50 palabras", "凑50字一切": "Todo para alcanzar las 50 palabras",
"凑四句一切": "Completa cuatro oraciones para rellenar todo", "凑四句一切": "Completa cuatro oraciones para rellenar todo",
"切分后文本": "Texto después de la división",
"切分后的子音频的输出根目录": "Directorio raíz de salida de los sub-audios después de la división", "切分后的子音频的输出根目录": "Directorio raíz de salida de los sub-audios después de la división",
"切割使用的进程数": "Número de procesos utilizados para la división", "切割使用的进程数": "Número de procesos utilizados para la división",
"刷新模型路径": "Actualizar la ruta del modelo", "刷新模型路径": "Actualizar la ruta del modelo",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "Texto después del procesamiento previo (por frase):",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "去混响/去延迟,附:": "Eliminación de reverberación/retardo, incluye:",
"参考音频在3~10秒范围外请更换": "El audio de referencia está fuera del rango de 3 a 10 segundos, ¡por favor cámbielo!",
"参考音频的文本": "Texto de referencia del audio", "参考音频的文本": "Texto de referencia del audio",
"参考音频的语种": "Idioma del audio de referencia", "参考音频的语种": "Idioma del audio de referencia",
"合成语音": "Síntesis de voz", "合成语音": "Síntesis de voz",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Ejemplo de formato de ruta de carpeta válida: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (simplemente copie desde la barra de direcciones del administrador de archivos).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Ingrese el directorio donde se encuentran los audios después de la división. La ruta completa de los archivos de audio leídos = este directorio + nombre de archivo correspondiente en el archivo .list (no la ruta completa). Si se deja en blanco, se utilizará la ruta completa del archivo .list.",
"多语种混合": "#!多语种混合", "多语种混合": "Mezcla de varios idiomas",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "Mezcla Multilingüe (Cantonés)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "Texto de referencia realmente ingresado:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "Texto objetivo realmente ingresado (después de dividir en frases):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "Texto objetivo realmente ingresado (por frase):",
"实际输入的目标文本:": "Texto objetivo realmente ingresado:",
"导出文件格式": "Formato de archivo de exportación", "导出文件格式": "Formato de archivo de exportación",
"开启GPT训练": "Iniciar entrenamiento de GPT", "开启GPT训练": "Iniciar entrenamiento de GPT",
"开启SSL提取": "¿Habilitar la extracción SSL?", "开启SSL提取": "Habilitar la extracción SSL",
"开启SoVITS训练": "Iniciar entrenamiento de SoVITS", "开启SoVITS训练": "Iniciar entrenamiento de SoVITS",
"开启一键三连": "¿Habilitar un solo paso de formateo?", "开启一键三连": "Habilitar un solo paso de formateo",
"开启文本获取": "¿Habilitar la obtención de texto?", "开启文本获取": "Habilitar la obtención de texto",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "Habilitar el modo sin texto de referencia. No llenar el texto de referencia también lo habilita.",
"开启离线批量ASR": "¿Habilitar ASR en lote fuera de línea?", "开启离线批量ASR": "Habilitar ASR en lote fuera de línea",
"开启语义token提取": "¿Habilitar la extracción de tokens semánticos?", "开启语义token提取": "Habilitar la extracción de tokens semánticos",
"开启语音切割": "Habilitar la división de voz", "开启语音切割": "Habilitar la división de voz",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Habilitar la reducción de ruido de voz",
"怎么切": "Cómo cortar", "怎么切": "Cómo cortar",
"总训练轮数total_epoch": "Número total de épocas de entrenamiento", "总训练轮数total_epoch": "Número total de épocas de entrenamiento",
"总训练轮数total_epoch不建议太高": "Número total de épocas de entrenamiento, no se recomienda demasiado alto", "总训练轮数total_epoch不建议太高": "Número total de épocas de entrenamiento, no se recomienda demasiado alto",
@ -101,25 +112,30 @@
"指定输出主人声文件夹": "Especificar carpeta de salida de voz principal", "指定输出主人声文件夹": "Especificar carpeta de salida de voz principal",
"指定输出非主人声文件夹": "Especificar carpeta de salida de no voz principal", "指定输出非主人声文件夹": "Especificar carpeta de salida de no voz principal",
"按中文句号。切": "Cortar según puntos en chino", "按中文句号。切": "Cortar según puntos en chino",
"按标点符号切": "#!按标点符号切", "按标点符号切": "Cortar según los signos de puntuación",
"按英文句号.切": "Cortar por puntos en inglés.", "按英文句号.切": "Cortar por puntos en inglés.",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Herramienta de división de texto. El resultado de la síntesis puede no ser bueno para textos demasiado largos, por lo que se recomienda dividirlos primero. La síntesis se realiza separando el texto según los saltos de línea y luego uniendo los fragmentos.", "数据类型精度": "precisión del tipo de datos",
"文本模块学习率权重": "Peso de la tasa de aprendizaje del módulo de texto", "文本模块学习率权重": "Peso de la tasa de aprendizaje del módulo de texto",
"文本进程输出信息": "Información de salida del proceso de obtención de texto", "文本进程输出信息": "Información de salida del proceso de obtención de texto",
"施工中,请静候佳音": "En construcción, por favor espere pacientemente", "施工中,请静候佳音": "En construcción, por favor espere pacientemente",
"日文": "Japonés", "日文": "Japonés",
"日英混合": "#!日英混合", "日英混合": "Mezcla de japonés e inglés",
"是否仅保存最新的ckpt文件以节省硬盘空间": "¿Guardar solo el último archivo ckpt para ahorrar espacio en disco?", "是否仅保存最新的ckpt文件以节省硬盘空间": "¿Guardar solo el último archivo ckpt para ahorrar espacio en disco?",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "¿Guardar el modelo final pequeño en la carpeta de pesos en cada punto de guardado?", "是否在每次保存时间点将最终小模型保存至weights文件夹": "¿Guardar el modelo final pequeño en la carpeta de pesos en cada punto de guardado?",
"是否开启TTS推理WebUI": "¿Habilitar la interfaz web de inferencia TTS?", "是否开启TTS推理WebUI": "¿Habilitar la interfaz web de inferencia TTS?",
"是否开启UVR5-WebUI": "¿Habilitar UVR5-WebUI?", "是否开启UVR5-WebUI": "¿Habilitar UVR5-WebUI?",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "¿Habilitar la opción de entrenamiento dpo (experimental)?",
"是否开启打标WebUI": "¿Habilitar la interfaz web de etiquetado?", "是否开启打标WebUI": "¿Habilitar la interfaz web de etiquetado?",
"是否直接对上次合成结果调整语速。防止随机性。": "¿Si se ajusta directamente la velocidad de habla del último resultado de síntesis para evitar aleatoriedad?",
"显卡信息": "Información de la tarjeta gráfica", "显卡信息": "Información de la tarjeta gráfica",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Este software es de código abierto bajo la licencia MIT. El autor no tiene control sobre el software. El usuario que lo utilice o distribuya, y el que genere sonidos a partir del software, asume toda la responsabilidad. <br>Si no acepta estos términos, no puede utilizar ni hacer referencia a ningún código o archivo dentro del paquete de software. Consulte el archivo <b>LICENSE</b> en el directorio raíz para obtener más detalles.", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Este software es de código abierto bajo la licencia MIT. El autor no tiene control sobre el software. El usuario que lo utilice o distribuya, y el que genere sonidos a partir del software, asume toda la responsabilidad. <br>Si no acepta estos términos, no puede utilizar ni hacer referencia a ningún código o archivo dentro del paquete de software. Consulte el archivo <b>LICENSE</b> en el directorio raíz para obtener más detalles.",
"模型": "Modelo", "模型": "Modelo",
"模型切换": "#!模型切换", "模型分为三类:": "Los modelos se dividen en tres categorías:",
"模型切换": "Cambio de modelo",
"每张显卡的batch_size": "Tamaño de lote por tarjeta gráfica", "每张显卡的batch_size": "Tamaño de lote por tarjeta gráfica",
"版本": "Versión",
"粤英混合": "Mezcla Cantonés-Inglés",
"粤语": "Cantonés",
"终止ASR进程": "Terminar el proceso ASR", "终止ASR进程": "Terminar el proceso ASR",
"终止GPT训练": "Detener entrenamiento de GPT", "终止GPT训练": "Detener entrenamiento de GPT",
"终止SSL提取进程": "Terminar el proceso de extracción SSL", "终止SSL提取进程": "Terminar el proceso de extracción SSL",
@ -128,26 +144,31 @@
"终止文本获取进程": "Terminar el proceso de obtención de texto", "终止文本获取进程": "Terminar el proceso de obtención de texto",
"终止语义token提取进程": "Terminar el proceso de extracción de tokens semánticos", "终止语义token提取进程": "Terminar el proceso de extracción de tokens semánticos",
"终止语音切割": "Terminar la división de voz", "终止语音切割": "Terminar la división de voz",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "Terminar el proceso de reducción de ruido de voz",
"英文": "Inglés", "英文": "Inglés",
"语义token提取进程输出信息": "Información de salida del proceso de extracción de tokens semánticos", "语义token提取进程输出信息": "Información de salida del proceso de extracción de tokens semánticos",
"语速": "Velocidad de habla",
"语速调整,高为更快": "Ajustar la velocidad de habla, más alta para más rápido",
"语音切割进程输出信息": "Información de salida del proceso de división de voz", "语音切割进程输出信息": "Información de salida del proceso de división de voz",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "Información de salida del proceso de reducción de ruido de voz",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "请上传3~10秒内参考音频超过会报错": "Por favor, suba un audio de referencia de entre 3 y 10 segundos, ¡más de eso causará un error!",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "Por Favor, Suba el Audio de Referencia",
"请填入推理文本": "Por Favor, Ingrese el Texto Objetivo",
"请输入有效文本": "Por favor, introduzca un texto válido",
"转换": "Convertir", "转换": "Convertir",
"输入待处理音频文件夹路径": "Ingrese la ruta de la carpeta de audio a procesar", "输入待处理音频文件夹路径": "Ingrese la ruta de la carpeta de audio a procesar",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "Ingrese la ruta de la carpeta",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Debe haber archivos y carpetas que comiencen con 23456 en el directorio logs/nombre del experimento", "输出logs/实验名目录下应有23456开头的文件和文件夹": "Debe haber archivos y carpetas que comiencen con 23456 en el directorio logs/nombre del experimento",
"输出信息": "Información de salida", "输出信息": "Información de salida",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "Ruta de la carpeta de salida",
"输出的语音": "Audio de salida", "输出的语音": "Audio de salida",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Seleccione el modelo almacenado en SoVITS_weights y GPT_weights después del entrenamiento. Uno de ellos es el modelo base, útil para experimentar con TTS de 5 segundos sin entrenamiento.", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Seleccione el modelo almacenado en SoVITS_weights y GPT_weights después del entrenamiento. Uno de ellos es el modelo base, útil para experimentar con TTS de 5 segundos sin entrenamiento.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Carpeta de salida de los resultados de reducción de ruido",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Carpeta de entrada de archivos de audio para reducción de ruido",
"需要合成的切分前文本": "Texto a sintetizar antes de la división",
"需要合成的文本": "Texto a sintetizar", "需要合成的文本": "Texto a sintetizar",
"需要合成的语种": "Idioma para la síntesis", "需要合成的语种": "Idioma para la síntesis",
"韩文": "Coreano",
"韩英混合": "Mezcla Coreano-Inglés",
"音频自动切分输入路径,可文件可文件夹": "Ruta de entrada para la división automática de audio, puede ser un archivo o una carpeta", "音频自动切分输入路径,可文件可文件夹": "Ruta de entrada para la división automática de audio, puede ser un archivo o una carpeta",
"预训练的GPT模型路径": "Ruta del modelo GPT preentrenado", "预训练的GPT模型路径": "Ruta del modelo GPT preentrenado",
"预训练的SSL模型路径": "Ruta del modelo SSL preentrenado", "预训练的SSL模型路径": "Ruta del modelo SSL preentrenado",

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1) MDX-Net (onnx_dereverb) : C'est le meilleur choix pour la réverbération à deux canaux, mais il ne peut pas éliminer la réverbération à un seul canal;",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho : Supprime les effets de délai. Aggressive est plus exhaustif que Normal dans la suppression, DeReverb élimine également la réverbération, peut supprimer la réverbération monocanal, mais n'élimine pas complètement la réverbération de plaque à haute fréquence.",
"*GPT模型列表": "*Liste des modèles GPT", "*GPT模型列表": "*Liste des modèles GPT",
"*SoVITS模型列表": "*Liste des modèles SoVITS", "*SoVITS模型列表": "*Liste des modèles SoVITS",
"*实验/模型名": "*Nom de l'expérience/modèle", "*实验/模型名": "*Nom de l'expérience/modèle",
"*文本标注文件": "*Fichier d'annotation de texte", "*文本标注文件": "*Fichier d'annotation de texte",
"*训练集音频文件目录": "*Répertoire des fichiers audio d'entraînement", "*训练集音频文件目录": "*Répertoire des fichiers audio d'entraînement",
"*请上传并填写参考信息": "*Veuillez télécharger et remplir les informations de référence", "*请上传并填写参考信息": "*Veuillez télécharger et remplir les informations de référence",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*Veuillez saisir le texte cible à synthétiser et le mode de langue.",
".list标注文件的路径": "Chemin du fichier d'annotation .list", ".list标注文件的路径": "Chemin du fichier d'annotation .list",
"0-前置数据集获取工具": "0-Outil de récupération de jeu de données préalable", "0-前置数据集获取工具": "0-Outil de récupération de jeu de données préalable",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Outil de séparation de la voix humaine et de l'accompagnement UVR5 & suppression de la réverbération et du retard", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Outil de séparation de la voix humaine et de l'accompagnement UVR5 & suppression de la réverbération et du retard",
"0b-语音切分工具": "0b-Outil de découpage vocal", "0b-语音切分工具": "0b-Outil de découpage vocal",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb-Outil de réduction du bruit vocal",
"0c-中文批量离线ASR工具": "0c-Outil chinois de transcription automatique hors ligne en masse", "0c-中文批量离线ASR工具": "0c-Outil chinois de transcription automatique hors ligne en masse",
"0d-语音文本校对标注工具": "0d-Outil de correction et d'annotation de texte vocal", "0d-语音文本校对标注工具": "0d-Outil de correction et d'annotation de texte vocal",
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
@ -23,13 +25,20 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Entraînement SoVITS. Les fichiers de modèle destinés au partage sont enregistrés sous SoVITS_weights.", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Entraînement SoVITS. Les fichiers de modèle destinés au partage sont enregistrés sous SoVITS_weights.",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Entraînement GPT. Les fichiers de modèle destinés au partage sont enregistrés sous GPT_weights.", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Entraînement GPT. Les fichiers de modèle destinés au partage sont enregistrés sous GPT_weights.",
"1C-推理": "1C-Inférence", "1C-推理": "1C-Inférence",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. Le temps de traitement du modèle DeEcho-DeReverb est presque le double de celui des deux autres modèles DeEcho;",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Préserver les voix : Choisissez cette option pour les audio sans harmonie, car elle conserve mieux la voix principale par rapport au modèle HP5. Deux modèles intégrés, HP2 et HP3, sont disponibles. HP3 peut légèrement laisser passer l'accompagnement mais conserve la voix principale un peu mieux que HP2;",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-Modification de la voix", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-Modification de la voix",
"ASR 模型": "#!ASR 模型", "2、MDX-Net-Dereverb模型挺慢的": "2. Le modèle MDX-Net-Dereverb est assez lent;",
"ASR 模型尺寸": "#!ASR 模型尺寸", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Conserver uniquement la voix principale : Choisissez cette option pour les audio avec harmonie, car elle peut affaiblir la voix principale. Un modèle HP5 intégré est disponible;",
"ASR 语言设置": "#!ASR 语言设置", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. La configuration la plus propre que je recommande est d'utiliser d'abord MDX-Net, puis DeEcho-Aggressive.",
"3、去混响、去延迟模型by FoxJoy": "3. Modèle de suppression de réverbération et de retard (par FoxJoy) :",
"ASR 模型": "Modèle ASR",
"ASR 模型尺寸": "Taille du modèle ASR",
"ASR 语言设置": "Paramètres de langue ASR",
"ASR进程输出信息": "Informations de processus ASR", "ASR进程输出信息": "Informations de processus ASR",
"GPT模型列表": "Liste des modèles GPT", "GPT模型列表": "Liste des modèles GPT",
"GPT训练进程输出信息": "Informations de processus d'entraînement GPT", "GPT训练进程输出信息": "Informations de processus d'entraînement GPT",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "Paramètres d'échantillonnage de GPT (ne pas mettre trop bas lorsqu'il n'y a pas de texte de référence. Utilisez les valeurs par défaut si vous n'êtes pas sûr):",
"GPU卡号,只能填1个整数": "Numéro de carte GPU, ne peut contenir qu'un seul entier", "GPU卡号,只能填1个整数": "Numéro de carte GPU, ne peut contenir qu'un seul entier",
"GPU卡号以-分割,每个卡号一个进程": "Numéro de carte GPU séparé par des tirets, un processus par numéro de carte", "GPU卡号以-分割,每个卡号一个进程": "Numéro de carte GPU séparé par des tirets, un processus par numéro de carte",
"SSL进程输出信息": "Informations de processus SSL", "SSL进程输出信息": "Informations de processus SSL",
@ -42,56 +51,58 @@
"UVR5已开启": "UVR5 est activé", "UVR5已开启": "UVR5 est activé",
"UVR5进程输出信息": "Informations de processus UVR5", "UVR5进程输出信息": "Informations de processus UVR5",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proportion d'audio normalisé mélangé", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proportion d'audio normalisé mélangé",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: comment calculer la courbe de volume, plus petit pour une précision plus élevée mais une charge de calcul plus élevée (ce n'est pas une meilleure précision)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: comment calculer la courbe de volume, plus petit pour une précision plus élevée mais une charge de calcul plus élevée (ce n'est pas une meilleure précision)",
"max:归一化后最大值多少": "max: valeur maximale après normalisation", "max:归一化后最大值多少": "max: valeur maximale après normalisation",
"max_sil_kept:切完后静音最多留多长": "max_sil_kept: durée maximale de silence après la coupe", "max_sil_kept:切完后静音最多留多长": "max_sil_kept: durée maximale de silence après la coupe",
"min_interval:最短切割间隔": "min_interval: intervalle de coupe minimum", "min_interval:最短切割间隔": "min_interval: intervalle de coupe minimum",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: longueur minimale de chaque segment, si le premier segment est trop court, il est continué avec le segment suivant jusqu'à dépasser cette valeur", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:longueur minimale de chaque segment ; si le premier segment est trop court, il est concaténé avec les segments suivants jusqu'à ce que la longueur dépasse cette valeur",
"temperature": "#!temperature", "temperature": "température",
"threshold:音量小于这个值视作静音的备选切割点": "seuil: le volume inférieur à cette valeur est considéré comme un point de coupe silencieux alternatif", "threshold:音量小于这个值视作静音的备选切割点": "seuil: le volume inférieur à cette valeur est considéré comme un point de coupe silencieux alternatif",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "Informations de processus de l'un clic trois connexions", "一键三连进程输出信息": "Informations de processus de l'un clic trois connexions",
"不切": "Pas de découpe", "不切": "Pas de découpe",
"中文": "Chinois", "中文": "Chinois",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentation du tutoriel en chinoishttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "Mélange de chinois et d'anglais",
"也可批量输入音频文件, 二选一, 优先读文件夹": "Également possible d'entrer en lot des fichiers audio, au choix, privilégiez la lecture du dossier", "也可批量输入音频文件, 二选一, 优先读文件夹": "Également possible d'entrer en lot des fichiers audio, au choix, privilégiez la lecture du dossier",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "Traitement par lot de séparation voix-accompagnement en utilisant le modèle UVR5.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Degré d'extraction des voix",
"以下文件或文件夹不存在:": "Aucun fichier ou dossier de ce type:",
"以下模型不存在:": "Aucun Modèle de ce Type:",
"伴奏人声分离&去混响&去回声": "Séparation de la voix et de l'accompagnement, suppression de la réverbération et de l'écho", "伴奏人声分离&去混响&去回声": "Séparation de la voix et de l'accompagnement, suppression de la réverbération et de l'écho",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "Il est recommandé d'utiliser GPT finement ajusté en mode sans texte de référence. Si vous ne comprenez pas ce que dit l'audio de référence (vous ne savez pas quoi écrire), vous pouvez l'activer ; une fois activé, ignorez le texte de référence saisi.",
"保存频率save_every_epoch": "Fréquence de sauvegarde (sauvegarder à chaque époque)", "保存频率save_every_epoch": "Fréquence de sauvegarde (sauvegarder à chaque époque)",
"凑50字一切": "Assembler 50 mots tout", "凑50字一切": "Assembler 50 mots tout",
"凑四句一切": "Composez quatre phrases pour tout remplir", "凑四句一切": "Composez quatre phrases pour tout remplir",
"切分后文本": "Texte après découpage",
"切分后的子音频的输出根目录": "Répertoire racine de sortie des sous-audios après découpage", "切分后的子音频的输出根目录": "Répertoire racine de sortie des sous-audios après découpage",
"切割使用的进程数": "Nombre de processus utilisés pour le découpage", "切割使用的进程数": "Nombre de processus utilisés pour le découpage",
"刷新模型路径": "Actualiser le chemin du modèle", "刷新模型路径": "Actualiser le chemin du modèle",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "Texte après traitement frontal (par phrase):",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "去混响/去延迟,附:": "Suppression de la réverbération / suppression du retard, ci-joint:",
"参考音频在3~10秒范围外请更换": "Veuillez remplacer l'audio de référence si sa durée est en dehors de la plage de 3 à 10 secondes!",
"参考音频的文本": "Texte de l'audio de référence", "参考音频的文本": "Texte de l'audio de référence",
"参考音频的语种": "Langue de l'audio de référence", "参考音频的语种": "Langue de l'audio de référence",
"合成语音": "Synthèse vocale", "合成语音": "Synthèse vocale",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Exemple de format de chemin de dossier valide : E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (copiez-le depuis la barre d'adresse de l'explorateur de fichiers).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Veuillez indiquer le répertoire contenant les audio découpés ! Le chemin complet du fichier audio à lire = ce répertoire - nom du fichier correspondant à l'onde dans le fichier .list (pas le chemin complet). Si laissé vide, le chemin absolu dans le fichier .list sera utilisé.",
"多语种混合": "#!多语种混合", "多语种混合": "Mélange multilingue",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "Mélange Multilingue (Cantonais)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "Texte de référence réellement saisi:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "Texte cible réellement saisi (après découpage):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "Texte cible réellement saisi (par phrase):",
"实际输入的目标文本:": "Texte cible réellement saisi:",
"导出文件格式": "Format d'exportation du fichier", "导出文件格式": "Format d'exportation du fichier",
"开启GPT训练": "Activer l'entraînement GPT", "开启GPT训练": "Activer l'entraînement GPT",
"开启SSL提取": "Activer l'extraction SSL", "开启SSL提取": "Activer l'extraction SSL",
"开启SoVITS训练": "Activer l'entraînement SoVITS", "开启SoVITS训练": "Activer l'entraînement SoVITS",
"开启一键三连": "Activer l'un clic trois connexions", "开启一键三连": "Activer l'un clic trois connexions",
"开启文本获取": "Activer l'extraction de texte", "开启文本获取": "Activer l'extraction de texte",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "Activer le mode sans texte de référence. Laisser le texte de référence vide équivaut également à activer le mode.",
"开启离线批量ASR": "Activer la transcription automatique hors ligne en masse", "开启离线批量ASR": "Activer la transcription automatique hors ligne en masse",
"开启语义token提取": "Activer l'extraction de jetons sémantiques", "开启语义token提取": "Activer l'extraction de jetons sémantiques",
"开启语音切割": "Activer le découpage vocal", "开启语音切割": "Activer le découpage vocal",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Activer la réduction de bruit vocal",
"怎么切": "Comment découper", "怎么切": "Comment découper",
"总训练轮数total_epoch": "Nombre total d'époques d'entraînement", "总训练轮数total_epoch": "Nombre total d'époques d'entraînement",
"总训练轮数total_epoch不建议太高": "Nombre total d'époques d'entraînement, pas recommandé d'être trop élevé", "总训练轮数total_epoch不建议太高": "Nombre total d'époques d'entraînement, pas recommandé d'être trop élevé",
@ -101,25 +112,30 @@
"指定输出主人声文件夹": "Spécifier le dossier de sortie pour la voix principale", "指定输出主人声文件夹": "Spécifier le dossier de sortie pour la voix principale",
"指定输出非主人声文件夹": "Spécifier le dossier de sortie pour la non-voix principale", "指定输出非主人声文件夹": "Spécifier le dossier de sortie pour la non-voix principale",
"按中文句号。切": "Couper selon les points en chinois.", "按中文句号。切": "Couper selon les points en chinois.",
"按标点符号切": "#!按标点符号切", "按标点符号切": "Couper selon les signes de ponctuation",
"按英文句号.切": "Découpez par des points en anglais", "按英文句号.切": "Découpez par des points en anglais",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Outil de découpage de texte. Un texte trop long peut ne pas donner un bon résultat, donc il est recommandé de le couper d'abord s'il est trop long. La synthèse se fera en séparant le texte par les sauts de ligne puis en les assemblant.", "数据类型精度": "précision du type de données",
"文本模块学习率权重": "Poids du taux d'apprentissage du module de texte", "文本模块学习率权重": "Poids du taux d'apprentissage du module de texte",
"文本进程输出信息": "Informations de processus de texte", "文本进程输出信息": "Informations de processus de texte",
"施工中,请静候佳音": "En construction, veuillez attendre patiemment", "施工中,请静候佳音": "En construction, veuillez attendre patiemment",
"日文": "Japonais", "日文": "Japonais",
"日英混合": "#!日英混合", "日英混合": "Mélange Japonais-Anglais",
"是否仅保存最新的ckpt文件以节省硬盘空间": "Sauvegarder uniquement le dernier fichier ckpt pour économiser de l'espace disque", "是否仅保存最新的ckpt文件以节省硬盘空间": "Sauvegarder uniquement le dernier fichier ckpt pour économiser de l'espace disque",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Sauvegarder le petit modèle final dans le dossier weights à chaque point de sauvegarde", "是否在每次保存时间点将最终小模型保存至weights文件夹": "Sauvegarder le petit modèle final dans le dossier weights à chaque point de sauvegarde",
"是否开启TTS推理WebUI": "Activer l'interface Web d'inférence TTS", "是否开启TTS推理WebUI": "Activer l'interface Web d'inférence TTS",
"是否开启UVR5-WebUI": "Activer UVR5-WebUI", "是否开启UVR5-WebUI": "Activer UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "Activer l'option d'entraînement DPO (expérimental)",
"是否开启打标WebUI": "Activer l'interface Web d'annotation", "是否开启打标WebUI": "Activer l'interface Web d'annotation",
"是否直接对上次合成结果调整语速。防止随机性。": "Est-ce qu'on ajuste directement la vitesse de parole du dernier résultat de synthèse pour éviter l'aléatoire ?",
"显卡信息": "Informations sur la carte graphique", "显卡信息": "Informations sur la carte graphique",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Ce logiciel est open source sous la licence MIT. L'auteur n'a aucun contrôle sur le logiciel. Les utilisateurs et les diffuseurs du son exporté par le logiciel en assument l'entière responsabilité. <br>Si vous n'acceptez pas ces termes, vous ne pouvez ni utiliser ni citer aucun code ou fichier à l'intérieur du package. Voir <b>LICENSE</b> dans le répertoire racine pour plus de détails.", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Ce logiciel est open source sous la licence MIT. L'auteur n'a aucun contrôle sur le logiciel. Les utilisateurs et les diffuseurs du son exporté par le logiciel en assument l'entière responsabilité. <br>Si vous n'acceptez pas ces termes, vous ne pouvez ni utiliser ni citer aucun code ou fichier à l'intérieur du package. Voir <b>LICENSE</b> dans le répertoire racine pour plus de détails.",
"模型": "Modèle", "模型": "Modèle",
"模型切换": "#!模型切换", "模型分为三类:": "Les modèles sont classés en trois catégories:",
"模型切换": "Changement de modèle",
"每张显卡的batch_size": "Taille de lot par carte graphique", "每张显卡的batch_size": "Taille de lot par carte graphique",
"版本": "Version",
"粤英混合": "Mélange Cantonais-Anglais",
"粤语": "Cantonais",
"终止ASR进程": "Arrêter le processus ASR", "终止ASR进程": "Arrêter le processus ASR",
"终止GPT训练": "Arrêter l'entraînement GPT", "终止GPT训练": "Arrêter l'entraînement GPT",
"终止SSL提取进程": "Arrêter le processus d'extraction SSL", "终止SSL提取进程": "Arrêter le processus d'extraction SSL",
@ -128,26 +144,31 @@
"终止文本获取进程": "Arrêter le processus d'extraction de texte", "终止文本获取进程": "Arrêter le processus d'extraction de texte",
"终止语义token提取进程": "Arrêter le processus d'extraction de jetons sémantiques", "终止语义token提取进程": "Arrêter le processus d'extraction de jetons sémantiques",
"终止语音切割": "Arrêter le découpage vocal", "终止语音切割": "Arrêter le découpage vocal",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "Arrêter le processus de réduction du bruit vocal",
"英文": "Anglais", "英文": "Anglais",
"语义token提取进程输出信息": "Informations de processus d'extraction de jetons sémantiques", "语义token提取进程输出信息": "Informations de processus d'extraction de jetons sémantiques",
"语速": "Débit de parole",
"语速调整,高为更快": "Ajuster la vitesse de parole, plus élevée pour plus rapide",
"语音切割进程输出信息": "Informations de processus de découpage vocal", "语音切割进程输出信息": "Informations de processus de découpage vocal",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "Informations de sortie du processus de réduction du bruit vocal",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "请上传3~10秒内参考音频超过会报错": "Veuillez télécharger une référence audio de 3 à 10 secondes ; les fichiers plus longs généreront une erreur!",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "Veuillez télécharger l'audio de référence",
"请填入推理文本": "Veuillez remplir le texte cible",
"请输入有效文本": "Veuillez entrer un texte valide",
"转换": "Conversion", "转换": "Conversion",
"输入待处理音频文件夹路径": "Entrez le chemin du dossier audio à traiter", "输入待处理音频文件夹路径": "Entrez le chemin du dossier audio à traiter",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "Chemin du dossier à entrer",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Les fichiers et dossiers commençant par 23456 devraient être présents dans le répertoire logs/nom de l'expérience", "输出logs/实验名目录下应有23456开头的文件和文件夹": "Les fichiers et dossiers commençant par 23456 devraient être présents dans le répertoire logs/nom de l'expérience",
"输出信息": "Sortie d'information", "输出信息": "Sortie d'information",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "Chemin du dossier de sortie",
"输出的语音": "Audio de sortie", "输出的语音": "Audio de sortie",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Choisissez le modèle entraîné stocké sous SoVITS_weights et GPT_weights. Par défaut, l'un d'eux est un modèle de base pour l'expérience de TTS Zero Shot de 5 secondes.", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Choisissez le modèle entraîné stocké sous SoVITS_weights et GPT_weights. Par défaut, l'un d'eux est un modèle de base pour l'expérience de TTS Zero Shot de 5 secondes.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Dossier de sortie des résultats de réduction du bruit",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Dossier d'entrée des fichiers audio de réduction du bruit",
"需要合成的切分前文本": "Texte préalable à la synthèse",
"需要合成的文本": "Texte à synthétiser", "需要合成的文本": "Texte à synthétiser",
"需要合成的语种": "Langue de synthèse requise", "需要合成的语种": "Langue de synthèse requise",
"韩文": "Coreano",
"韩英混合": "Mezcla Coreano-Inglés",
"音频自动切分输入路径,可文件可文件夹": "Chemin d'entrée automatique de découpage audio, peut être un fichier ou un dossier", "音频自动切分输入路径,可文件可文件夹": "Chemin d'entrée automatique de découpage audio, peut être un fichier ou un dossier",
"预训练的GPT模型路径": "Chemin du modèle GPT pré-entraîné", "预训练的GPT模型路径": "Chemin du modèle GPT pré-entraîné",
"预训练的SSL模型路径": "Chemin du modèle SSL pré-entraîné", "预训练的SSL模型路径": "Chemin du modèle SSL pré-entraîné",

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net (onnx_dereverb): È la scelta migliore per la riverberazione a due canali, ma non può rimuovere la riverberazione a canale singolo;",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho: Rimuove gli effetti di ritardo. Aggressive è più completo di Normal nella rimozione, DeReverb rimuove ulteriormente la riverberazione, può rimuovere la riverberazione a canale singolo, ma non rimuove completamente la riverberazione a piastra ad alta frequenza.",
"*GPT模型列表": "*Lista dei modelli GPT", "*GPT模型列表": "*Lista dei modelli GPT",
"*SoVITS模型列表": "*Lista dei modelli SoVITS", "*SoVITS模型列表": "*Lista dei modelli SoVITS",
"*实验/模型名": "*Nome dell'esperimento/modello", "*实验/模型名": "*Nome dell'esperimento/modello",
"*文本标注文件": "*File di annotazione del testo", "*文本标注文件": "*File di annotazione del testo",
"*训练集音频文件目录": "*Directory dei file audio del set di addestramento", "*训练集音频文件目录": "*Directory dei file audio del set di addestramento",
"*请上传并填写参考信息": "*Carica e compila le informazioni di riferimento", "*请上传并填写参考信息": "*Carica e compila le informazioni di riferimento",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*Si prega di inserire il testo di destinazione da sintetizzare e la modalità lingua",
".list标注文件的路径": "#!.list标注文件的路径", ".list标注文件的路径": "Percorso del file di annotazione .list",
"0-前置数据集获取工具": "0-Strumento di acquisizione del dataset preliminare", "0-前置数据集获取工具": "0-Strumento di acquisizione del dataset preliminare",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Strumento di separazione voce e accompagnamento UVR5 & Rimozione riverbero e ritardo", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Strumento di separazione voce e accompagnamento UVR5 & Rimozione riverbero e ritardo",
"0b-语音切分工具": "0b-Strumento di segmentazione vocale", "0b-语音切分工具": "0b-Strumento di segmentazione vocale",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb-Strumento di riduzione del rumore vocale",
"0c-中文批量离线ASR工具": "0c-Strumento di ASR offline batch in cinese", "0c-中文批量离线ASR工具": "0c-Strumento di ASR offline batch in cinese",
"0d-语音文本校对标注工具": "0d-Strumento di correzione e annotazione testo vocale", "0d-语音文本校对标注工具": "0d-Strumento di correzione e annotazione testo vocale",
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
@ -23,17 +25,24 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Allenamento di SoVITS. I file del modello destinati alla condivisione sono salvati in SoVITS_weights.", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Allenamento di SoVITS. I file del modello destinati alla condivisione sono salvati in SoVITS_weights.",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Allenamento di GPT. I file del modello destinati alla condivisione sono salvati in GPT_weights.", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Allenamento di GPT. I file del modello destinati alla condivisione sono salvati in GPT_weights.",
"1C-推理": "1C-Inferenza", "1C-推理": "1C-Inferenza",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. Il tempo di elaborazione del modello DeEcho-DeReverb è quasi il doppio di quello degli altri due modelli DeEcho;",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Conserva la voce principale: scegli questa opzione per audio senza armonie, poiché conserva meglio la voce principale rispetto al modello HP5. Include due modelli integrati, HP2 e HP3. HP3 potrebbe far passare leggermente l'accompagnamento ma conserva meglio la voce principale rispetto a HP2;",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-Voce modificata", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-Voce modificata",
"ASR 模型": "#!ASR 模型", "2、MDX-Net-Dereverb模型挺慢的": "2. Il modello MDX-Net-Dereverb è piuttosto lento;",
"ASR 模型尺寸": "#!ASR 模型尺寸", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Solo conserva la voce principale: scegli questa opzione per audio con armonie, poiché potrebbe indebolire la voce principale. Include un modello HP5;",
"ASR 语言设置": "#!ASR 语言设置", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. La configurazione più pulita consigliata è MDX-Net seguito da DeEcho-Aggressive.",
"3、去混响、去延迟模型by FoxJoy": "3. Modello per rimuovere la riverberazione e il ritardo (by FoxJoy):",
"ASR 模型": "Modello ASR",
"ASR 模型尺寸": "Dimensioni del modello ASR",
"ASR 语言设置": "Impostazioni linguistiche ASR",
"ASR进程输出信息": "Informazioni sull'output del processo ASR", "ASR进程输出信息": "Informazioni sull'output del processo ASR",
"GPT模型列表": "#!GPT模型列表", "GPT模型列表": "Elenco dei modelli GPT",
"GPT训练进程输出信息": "Informazioni sull'output del processo di allenamento di GPT", "GPT训练进程输出信息": "Informazioni sull'output del processo di allenamento di GPT",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "Parametri di campionamento di GPT (non troppo bassi quando non c'è testo di riferimento. Utilizzare i valori predefiniti in caso di incertezza):",
"GPU卡号,只能填1个整数": "Numero della scheda grafica, può essere inserito solo un numero intero", "GPU卡号,只能填1个整数": "Numero della scheda grafica, può essere inserito solo un numero intero",
"GPU卡号以-分割,每个卡号一个进程": "Numero di GPU separati da '-'; ogni numero corrisponde a un processo", "GPU卡号以-分割,每个卡号一个进程": "Numero di GPU separati da '-'; ogni numero corrisponde a un processo",
"SSL进程输出信息": "Informazioni sull'output del processo SSL", "SSL进程输出信息": "Informazioni sull'output del processo SSL",
"SoVITS模型列表": "#!SoVITS模型列表", "SoVITS模型列表": "Elenco dei modelli SoVITS",
"SoVITS训练进程输出信息": "Informazioni sull'output del processo di allenamento di SoVITS", "SoVITS训练进程输出信息": "Informazioni sull'output del processo di allenamento di SoVITS",
"TTS推理WebUI进程输出信息": "Informazioni sull'output del processo dell'interfaccia utente Web per l'inferenza TTS", "TTS推理WebUI进程输出信息": "Informazioni sull'output del processo dell'interfaccia utente Web per l'inferenza TTS",
"TTS推理进程已关闭": "Il processo di inferenza TTS è stato chiuso", "TTS推理进程已关闭": "Il processo di inferenza TTS è stato chiuso",
@ -42,57 +51,59 @@
"UVR5已开启": "UVR5 è attivato", "UVR5已开启": "UVR5 è attivato",
"UVR5进程输出信息": "Informazioni sull'output del processo UVR5", "UVR5进程输出信息": "Informazioni sull'output del processo UVR5",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: Quanta proporzione dell'audio normalizzato deve essere miscelata", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix: Quanta proporzione dell'audio normalizzato deve essere miscelata",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: Come calcolare la curva del volume. Più piccolo è, maggiore è la precisione ma aumenta la complessità computazionale (non significa che una maggiore precisione dà risultati migliori)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: Come calcolare la curva del volume. Più piccolo è, maggiore è la precisione ma aumenta la complessità computazionale (non significa che una maggiore precisione dà risultati migliori)",
"max:归一化后最大值多少": "max: Massimo valore dopo la normalizzazione", "max:归一化后最大值多少": "max: Massimo valore dopo la normalizzazione",
"max_sil_kept:切完后静音最多留多长": "max_sil_kept: Massima durata del silenzio dopo il taglio", "max_sil_kept:切完后静音最多留多长": "max_sil_kept: Massima durata del silenzio dopo il taglio",
"min_interval:最短切割间隔": "min_interval: Intervallo minimo di taglio", "min_interval:最短切割间隔": "min_interval: Intervallo minimo di taglio",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: Lunghezza minima di ogni segmento. Se il primo segmento è troppo corto, verrà unito agli segmenti successivi fino a superare questo valore", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: Lunghezza minima per segmento; se il primo segmento è troppo corto, sarà unito ai segmenti successivi fino a superare questo valore",
"temperature": "#!temperature", "temperature": "temperatura",
"threshold:音量小于这个值视作静音的备选切割点": "threshold: Punto di taglio alternativo considerato silenzioso se il volume è inferiore a questo valore", "threshold:音量小于这个值视作静音的备选切割点": "threshold: Punto di taglio alternativo considerato silenzioso se il volume è inferiore a questo valore",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "Informazioni sull'output del processo di 'One Click Three Connect'", "一键三连进程输出信息": "Informazioni sull'output del processo di 'One Click Three Connect'",
"不切": "#!不切", "不切": "Nessuna suddivisione",
"中文": "Cinese", "中文": "Cinese",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentazione del tutorial in cinesehttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "Cinese e inglese misti",
"也可批量输入音频文件, 二选一, 优先读文件夹": "È possibile anche inserire file audio in batch, una delle due opzioni, con priorità alla lettura della cartella", "也可批量输入音频文件, 二选一, 优先读文件夹": "È possibile anche inserire file audio in batch, una delle due opzioni, con priorità alla lettura della cartella",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "Separazione voce-accompagnamento in batch, utilizza il modello UVR5.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Grado di aggressività dell'estrazione vocale",
"以下文件或文件夹不存在:": "Nessun file o cartella trovati:",
"以下模型不存在:": "Nessun Modello del Genere:",
"伴奏人声分离&去混响&去回声": "Separazione tra accompagnamento e voce & Rimozione dell'eco & Rimozione dell'eco", "伴奏人声分离&去混响&去回声": "Separazione tra accompagnamento e voce & Rimozione dell'eco & Rimozione dell'eco",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "Si consiglia di utilizzare GPT fine-tuned quando si utilizza la modalità senza testo di riferimento. Se non si riesce a capire cosa dice l'audio di riferimento (e non si sa cosa scrivere), è possibile abilitare questa opzione, ignorando il testo di riferimento inserito.",
"保存频率save_every_epoch": "Frequenza di salvataggio ogni epoca", "保存频率save_every_epoch": "Frequenza di salvataggio ogni epoca",
"凑50字一切": "Riempire con 50 caratteri per tutto", "凑50字一切": "Riempire con 50 caratteri per tutto",
"凑四句一切": "#!凑四句一切", "凑四句一切": "Riempire con quattro frasi per tutto",
"切分后文本": "Testo dopo il taglio",
"切分后的子音频的输出根目录": "Directory radice di output per gli audio segmentati", "切分后的子音频的输出根目录": "Directory radice di output per gli audio segmentati",
"切割使用的进程数": "Numero di processi utilizzati per il taglio", "切割使用的进程数": "Numero di processi utilizzati per il taglio",
"刷新模型路径": "Aggiorna il percorso del modello", "刷新模型路径": "Aggiorna il percorso del modello",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "Testo elaborato dal front-end (per frase):",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "去混响/去延迟,附:": "Rimozione della riverberazione/ritardo, allegato:",
"参考音频在3~10秒范围外请更换": "L'audio di riferimento è al di fuori dell'intervallo di 3-10 secondi. Si prega di cambiarlo!",
"参考音频的文本": "Testo dell'audio di riferimento", "参考音频的文本": "Testo dell'audio di riferimento",
"参考音频的语种": "Lingua dell'audio di riferimento", "参考音频的语种": "Lingua dell'audio di riferimento",
"合成语音": "Sintesi vocale", "合成语音": "Sintesi vocale",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Formato di percorso della cartella valido: E:\\codes\\py39\\vits_vc_gpu\\Esempio di test di BaiLuShuangHua (copiare direttamente dalla barra degli indirizzi del gestore file).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Inserisci la directory dell'audio segmentato! Il percorso completo del file audio letto = questa directory - unione del nome del file corrispondente alle forme d'onda nel file .list (non il percorso completo). Se lasciato vuoto, verrà utilizzato il percorso assoluto nel file .list.",
"多语种混合": "#!多语种混合", "多语种混合": "Mix multilingue",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "Misto Multilingue (Cantonese)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "Testo di riferimento effettivamente inserito:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "Testo di destinazione effettivamente inserito (dopo il taglio delle frasi):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "Testo di destinazione effettivamente inserito (per frase):",
"实际输入的目标文本:": "Testo di destinazione effettivamente inserito:",
"导出文件格式": "Formato di esportazione del file", "导出文件格式": "Formato di esportazione del file",
"开启GPT训练": "Attivare l'allenamento di GPT", "开启GPT训练": "Attivare l'allenamento di GPT",
"开启SSL提取": "Attivare l'estrazione SSL", "开启SSL提取": "Attivare l'estrazione SSL",
"开启SoVITS训练": "Attivare l'allenamento di SoVITS", "开启SoVITS训练": "Attivare l'allenamento di SoVITS",
"开启一键三连": "Attivare la formattazione con tre passaggi", "开启一键三连": "Attivare la formattazione con tre passaggi",
"开启文本获取": "Attivare l'estrazione del testo", "开启文本获取": "Attivare l'estrazione del testo",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "Attivare la modalità senza testo di riferimento. Anche se non inserisci un testo di riferimento, la modalità verrà attivata.",
"开启离线批量ASR": "Attivare ASR offline batch", "开启离线批量ASR": "Attivare ASR offline batch",
"开启语义token提取": "Attivare l'estrazione del token semantico", "开启语义token提取": "Attivare l'estrazione del token semantico",
"开启语音切割": "Attivare la segmentazione vocale", "开启语音切割": "Attivare la segmentazione vocale",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Attivare la riduzione del rumore vocale",
"怎么切": "#!怎么切", "怎么切": "Come tagliare",
"总训练轮数total_epoch": "Numero totale di epoche di addestramento", "总训练轮数total_epoch": "Numero totale di epoche di addestramento",
"总训练轮数total_epoch不建议太高": "Numero totale di epoche di addestramento, non raccomandato troppo alto", "总训练轮数total_epoch不建议太高": "Numero totale di epoche di addestramento, non raccomandato troppo alto",
"打标工具WebUI已关闭": "L'interfaccia utente Web dello strumento di annotazione è stata chiusa", "打标工具WebUI已关闭": "L'interfaccia utente Web dello strumento di annotazione è stata chiusa",
@ -101,25 +112,30 @@
"指定输出主人声文件夹": "Specifica la cartella di output per la voce principale", "指定输出主人声文件夹": "Specifica la cartella di output per la voce principale",
"指定输出非主人声文件夹": "Specifica la cartella di output per la non voce principale", "指定输出非主人声文件夹": "Specifica la cartella di output per la non voce principale",
"按中文句号。切": "Taglia secondo il punto cinese.", "按中文句号。切": "Taglia secondo il punto cinese.",
"按标点符号切": "#!按标点符号切", "按标点符号切": "Taglia secondo i segni di punteggiatura",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "Taglia secondo il punto inglese",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Strumento di divisione del testo. I testi troppo lunghi potrebbero non avere un buon effetto di sintesi, quindi è consigliabile dividerli prima della sintesi. La sintesi verrà separata in base ai ritorni a capo nel testo e successivamente ricomposta.", "数据类型精度": "precisione del tipo di dati",
"文本模块学习率权重": "Peso del tasso di apprendimento del modulo di testo", "文本模块学习率权重": "Peso del tasso di apprendimento del modulo di testo",
"文本进程输出信息": "Informazioni sull'output del processo di estrazione del testo", "文本进程输出信息": "Informazioni sull'output del processo di estrazione del testo",
"施工中,请静候佳音": "In costruzione, attendi pazientemente le buone notizie", "施工中,请静候佳音": "In costruzione, attendi pazientemente le buone notizie",
"日文": "Giapponese", "日文": "Giapponese",
"日英混合": "#!日英混合", "日英混合": "Mix giapponese e inglese",
"是否仅保存最新的ckpt文件以节省硬盘空间": "Salvare solo il file ckpt più recente per risparmiare spazio su disco", "是否仅保存最新的ckpt文件以节省硬盘空间": "Salvare solo il file ckpt più recente per risparmiare spazio su disco",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Salvare il modello finale più piccolo nella cartella weights ad ogni punto di salvataggio", "是否在每次保存时间点将最终小模型保存至weights文件夹": "Salvare il modello finale più piccolo nella cartella weights ad ogni punto di salvataggio",
"是否开启TTS推理WebUI": "Attivare l'interfaccia utente Web per l'inferenza TTS", "是否开启TTS推理WebUI": "Attivare l'interfaccia utente Web per l'inferenza TTS",
"是否开启UVR5-WebUI": "Attivare UVR5-WebUI", "是否开启UVR5-WebUI": "Attivare UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "Attivare l'opzione di addestramento DPO (sperimentale)",
"是否开启打标WebUI": "Attivare l'interfaccia utente Web di annotazione", "是否开启打标WebUI": "Attivare l'interfaccia utente Web di annotazione",
"是否直接对上次合成结果调整语速。防止随机性。": "Se regolare direttamente la velocità della voce dell'ultimo risultato di sintesi per evitare casualità.",
"显卡信息": "Informazioni sulla scheda grafica", "显卡信息": "Informazioni sulla scheda grafica",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Questo software è open source con licenza MIT. L'autore non ha alcun controllo sul software. L'utente che utilizza il software o diffonde i suoni derivati dal software ne è responsabile. <br>Se non accetti questi termini, non puoi utilizzare o citare alcun codice o file all'interno del pacchetto software. Vedi la cartella principale<b>LICENSE</b> per i dettagli.", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Questo software è open source con licenza MIT. L'autore non ha alcun controllo sul software. L'utente che utilizza il software o diffonde i suoni derivati dal software ne è responsabile. <br>Se non accetti questi termini, non puoi utilizzare o citare alcun codice o file all'interno del pacchetto software. Vedi la cartella principale<b>LICENSE</b> per i dettagli.",
"模型": "Modello", "模型": "Modello",
"模型切换": "#!模型切换", "模型分为三类:": "I modelli sono divisi in tre categorie:",
"模型切换": "Cambio del modello",
"每张显卡的batch_size": "Batch size per ogni scheda grafica", "每张显卡的batch_size": "Batch size per ogni scheda grafica",
"版本": "Versione",
"粤英混合": "Misto Cantonese-Inglese",
"粤语": "Cantonese",
"终止ASR进程": "Terminare il processo ASR", "终止ASR进程": "Terminare il processo ASR",
"终止GPT训练": "Terminare l'allenamento di GPT", "终止GPT训练": "Terminare l'allenamento di GPT",
"终止SSL提取进程": "Terminare il processo di estrazione SSL", "终止SSL提取进程": "Terminare il processo di estrazione SSL",
@ -128,26 +144,31 @@
"终止文本获取进程": "Terminare il processo di estrazione del testo", "终止文本获取进程": "Terminare il processo di estrazione del testo",
"终止语义token提取进程": "Terminare il processo di estrazione del token semantico", "终止语义token提取进程": "Terminare il processo di estrazione del token semantico",
"终止语音切割": "Terminare la segmentazione vocale", "终止语音切割": "Terminare la segmentazione vocale",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "Termina il processo di riduzione del rumore vocale",
"英文": "Inglese", "英文": "Inglese",
"语义token提取进程输出信息": "Informazioni sull'output del processo di estrazione del token semantico", "语义token提取进程输出信息": "Informazioni sull'output del processo di estrazione del token semantico",
"语速": "Velocità della voce",
"语速调整,高为更快": "Regolare la velocità della voce, più alta per più veloce",
"语音切割进程输出信息": "Informazioni sull'output del processo di segmentazione vocale", "语音切割进程输出信息": "Informazioni sull'output del processo di segmentazione vocale",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "Informazioni sull'output del processo di riduzione del rumore vocale",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "请上传3~10秒内参考音频超过会报错": "Carica un audio di riferimento della durata compresa tra 3 e 10 secondi. Superiore a questo, verrà generato un errore!",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "Si prega di caricare l'audio di riferimento",
"请填入推理文本": "Si prega di inserire il testo di destinazione",
"请输入有效文本": "Inserisci un testo valido",
"转换": "Converti", "转换": "Converti",
"输入待处理音频文件夹路径": "Inserisci il percorso della cartella dei file audio da elaborare", "输入待处理音频文件夹路径": "Inserisci il percorso della cartella dei file audio da elaborare",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "Inserisci il percorso della cartella",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Nella cartella logs/nome dell'esperimento dovrebbero esserci file e cartelle che iniziano con 23456", "输出logs/实验名目录下应有23456开头的文件和文件夹": "Nella cartella logs/nome dell'esperimento dovrebbero esserci file e cartelle che iniziano con 23456",
"输出信息": "Informazioni di output", "输出信息": "Informazioni di output",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "Percorso della cartella di output",
"输出的语音": "Audio di output", "输出的语音": "Audio di output",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Scegli il modello salvato in SoVITS_weights e GPT_weights dopo l'addestramento. Uno di default è il modello di base, utilizzato per l'esperienza di Zero Shot TTS in 5 secondi.", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Scegli il modello salvato in SoVITS_weights e GPT_weights dopo l'addestramento. Uno di default è il modello di base, utilizzato per l'esperienza di Zero Shot TTS in 5 secondi.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Cartella di output dei risultati di riduzione del rumore",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Cartella di input dei file audio per la riduzione del rumore",
"需要合成的切分前文本": "Testo da sintetizzare prima del taglio",
"需要合成的文本": "Testo da sintetizzare", "需要合成的文本": "Testo da sintetizzare",
"需要合成的语种": "Lingua da sintetizzare", "需要合成的语种": "Lingua da sintetizzare",
"韩文": "Coreano",
"韩英混合": "Misto Coreano-Inglese",
"音频自动切分输入路径,可文件可文件夹": "Percorso di input per la segmentazione automatica dell'audio, può essere un file o una cartella", "音频自动切分输入路径,可文件可文件夹": "Percorso di input per la segmentazione automatica dell'audio, può essere un file o una cartella",
"预训练的GPT模型路径": "Percorso del modello preaddestrato GPT", "预训练的GPT模型路径": "Percorso del modello preaddestrato GPT",
"预训练的SSL模型路径": "Percorso del modello SSL preaddestrato", "预训练的SSL模型路径": "Percorso del modello SSL preaddestrato",

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):二重チャンネルのリバーブに最適な選択ですが、単一チャンネルのリバーブは除去できません;",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho:遅延効果を除去します。AggressiveはNormalよりも徹底的に除去し、DeReverbは追加でリバーブを除去し、モラルリバーブを除去できますが、高周波数のプレートリバーブは完全には除去できません。",
"*GPT模型列表": "*GPTモデルリスト", "*GPT模型列表": "*GPTモデルリスト",
"*SoVITS模型列表": "*SoVITSモデルリスト", "*SoVITS模型列表": "*SoVITSモデルリスト",
"*实验/模型名": "*実験/モデル名", "*实验/模型名": "*実験/モデル名",
"*文本标注文件": "*テキスト注釈ファイル", "*文本标注文件": "*テキスト注釈ファイル",
"*训练集音频文件目录": "*トレーニングデータのオーディオファイルディレクトリ", "*训练集音频文件目录": "*トレーニングデータのオーディオファイルディレクトリ",
"*请上传并填写参考信息": "*参照情報をアップロードして記入してください", "*请上传并填写参考信息": "*参照情報をアップロードして記入してください",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*合成対象テキストと言語モードを入力してください",
".list标注文件的路径": ".listアテーションファイルのパス", ".list标注文件的路径": ".listアテーションファイルのパス",
"0-前置数据集获取工具": "0-データセット取得ツールの事前処理", "0-前置数据集获取工具": "0-データセット取得ツールの事前処理",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5ボーカルアカンパニメント分離リバーブおよびディレイ除去ツール", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5ボーカルアカンパニメント分離リバーブおよびディレイ除去ツール",
"0b-语音切分工具": "0b-音声分割ツール", "0b-语音切分工具": "0b-音声分割ツール",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb-音声ノイズ除去ツール",
"0c-中文批量离线ASR工具": "0c-中国語バッチオフラインASRツール", "0c-中文批量离线ASR工具": "0c-中国語バッチオフラインASRツール",
"0d-语音文本校对标注工具": "0d-音声テキストの校正アノテーションツール", "0d-语音文本校对标注工具": "0d-音声テキストの校正アノテーションツール",
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
@ -23,13 +25,20 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITSトレーニング。共有用のモデルファイルはSoVITS_weightsディレクトリに出力されます。", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITSトレーニング。共有用のモデルファイルはSoVITS_weightsディレクトリに出力されます。",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPTトレーニング。共有用のモデルファイルはGPT_weightsディレクトリに出力されます。", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPTトレーニング。共有用のモデルファイルはGPT_weightsディレクトリに出力されます。",
"1C-推理": "1C-推論", "1C-推理": "1C-推論",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1、DeEcho-DeReverbモデルの処理時間は、他の2つのDeEchoモデルのほぼ2倍です",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1、主音を保持: ハーモニーなしの音声にはこのオプションを選択し、HP5よりも主音の保持が優れています。HP2とHP3の2つのモデルが内蔵されており、HP3はわずかに伴奏を漏らす可能性がありますが、HP2よりも主音の保持がわずかに良いです",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-ボイスチェンジャー", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-ボイスチェンジャー",
"ASR 模型": "#!ASR 模型", "2、MDX-Net-Dereverb模型挺慢的": "2、MDX-Net-Dereverbモデルはかなり遅いです",
"ASR 模型尺寸": "#!ASR 模型尺寸", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2、主音のみを保持: ハーモニー付きの音声にはこのオプションを選択し、主音が弱くなる可能性があります。HP5モデルが1つ内蔵されています",
"ASR 语言设置": "#!ASR 语言设置", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3、最もクリーンな設定は、MDX-Netの後にDeEcho-Aggressiveを使用することをお勧めします。",
"3、去混响、去延迟模型by FoxJoy": "3、リバーブ除去と遅延除去モデルby FoxJoy",
"ASR 模型": "ASR モデル",
"ASR 模型尺寸": "ASRモデルサイズ",
"ASR 语言设置": "ASR 言語設定",
"ASR进程输出信息": "ASRプロセスの出力情報", "ASR进程输出信息": "ASRプロセスの出力情報",
"GPT模型列表": "GPTモデルリスト", "GPT模型列表": "GPTモデルリスト",
"GPT训练进程输出信息": "GPTトレーニングプロセスの出力情報", "GPT训练进程输出信息": "GPTトレーニングプロセスの出力情報",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT サンプリングパラメーター(参照テキストがない場合はあまり低くしないでください。わからない場合はデフォルトを使用してください):",
"GPU卡号,只能填1个整数": "GPU番号、1つの整数しか入力できません", "GPU卡号,只能填1个整数": "GPU番号、1つの整数しか入力できません",
"GPU卡号以-分割,每个卡号一个进程": "GPUカード番号はハイフンで区切り、各カード番号ごとに1つのプロセスが実行されます", "GPU卡号以-分割,每个卡号一个进程": "GPUカード番号はハイフンで区切り、各カード番号ごとに1つのプロセスが実行されます",
"SSL进程输出信息": "SSLプロセスの出力情報", "SSL进程输出信息": "SSLプロセスの出力情報",
@ -42,56 +51,58 @@
"UVR5已开启": "UVR5がオンになっています", "UVR5已开启": "UVR5がオンになっています",
"UVR5进程输出信息": "UVR5プロセスの出力情報", "UVR5进程输出信息": "UVR5プロセスの出力情報",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix正規化後のオーディオが入る割合", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix正規化後のオーディオが入る割合",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: 音量曲線の計算方法、小さいほど精度が高くなりますが、計算量が増加します(精度が高いほど必ずしも効果が良いわけではありません)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "#!hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)",
"max:归一化后最大值多少": "max正規化後の最大値", "max:归一化后最大值多少": "max正規化後の最大値",
"max_sil_kept:切完后静音最多留多长": "max_sil_kept切り終えた後、最大でどれだけ静かにするか", "max_sil_kept:切完后静音最多留多长": "max_sil_kept切り終えた後、最大でどれだけ静かにするか",
"min_interval:最短切割间隔": "min_interval最短カット間隔", "min_interval:最短切割间隔": "min_interval最短カット間隔",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length各セグメントの最小長さ。最初のセグメントが短すぎる場合、連続して後続のセグメントに接続され、この値を超えるまで続きます。", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length各セグメントの最小長さ。最初のセグメントが短すぎる場合、連続して後続のセグメントに接続され、この値を超えるまで続きます。",
"temperature": "#!temperature", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "閾値:この値未満の音量は静音と見なされ、代替のカットポイントとして扱われます", "threshold:音量小于这个值视作静音的备选切割点": "閾値:この値未満の音量は静音と見なされ、代替のカットポイントとして扱われます",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "ワンクリック三連プロセスの出力情報", "一键三连进程输出信息": "ワンクリック三連プロセスの出力情報",
"不切": "切らない", "不切": "切らない",
"中文": "中国語", "中文": "中国語",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中国語チュートリアルドキュメントhttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "中英混合",
"也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルもインポートできます。フォルダパスが存在する場合、この入力は無視されます。", "也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルもインポートできます。フォルダパスが存在する場合、この入力は無視されます。",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "人声と伴奏の分離をバッチ処理で行い、UVR5モデルを使用します。",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "人声抽出の積極性",
"以下文件或文件夹不存在:": "そのようなファイルやフォルダは存在しません:",
"以下模型不存在:": "モデルが存在しません:",
"伴奏人声分离&去混响&去回声": "ボーカル/伴奏の分離と残響の除去", "伴奏人声分离&去混响&去回声": "ボーカル/伴奏の分離と残響の除去",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "参考テキストなしモードを使用する場合は、微調整されたGPTの使用をお勧めします。参考音声が聞き取れない場合何を書けば良いかわからない場合は、有効にすると、入力した参考テキストを無視します。",
"保存频率save_every_epoch": "保存頻度save_every_epoch", "保存频率save_every_epoch": "保存頻度save_every_epoch",
"凑50字一切": "50文字ずつカット", "凑50字一切": "50文字ずつカット",
"凑四句一切": "4つの文で埋める", "凑四句一切": "4つの文で埋める",
"切分后文本": "分割後のテキスト",
"切分后的子音频的输出根目录": "分割後のサブオーディオの出力ルートディレクトリ", "切分后的子音频的输出根目录": "分割後のサブオーディオの出力ルートディレクトリ",
"切割使用的进程数": "分割に使用されるプロセス数", "切割使用的进程数": "分割に使用されるプロセス数",
"刷新模型路径": "モデルのパスを更新", "刷新模型路径": "モデルのパスを更新",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "フロントエンド処理後のテキスト(文ごと):",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "去混响/去延迟,附:": "残響除去/遅延除去、附:",
"参考音频在3~10秒范围外请更换": "参照音声が310秒の範囲外です。別の音声に変更してください",
"参考音频的文本": "参照オーディオのテキスト", "参考音频的文本": "参照オーディオのテキスト",
"参考音频的语种": "参照オーディオの言語", "参考音频的语种": "参照オーディオの言語",
"合成语音": "推論を開始", "合成语音": "推論を開始",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "適切なフォルダパスの例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华テストサンプル(ファイルマネージャのアドレスバーからコピーしてください)。",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "切断後の音声ファイルが格納されているディレクトリを入力してください!読み取り対象の音声ファイルの完全パス = このディレクトリ - 結合 - listファイル内の波形に対応するファイル名完全パスではありません。空白の場合、.listファイル内の絶対完全パスを使用します。",
"多语种混合": "#!多语种混合", "多语种混合": "多言語混合",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "多言語混合(粤語)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "実際に入力された参照テキスト:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "実際に入力された目標テキスト(文分割後):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "実際に入力された目標テキスト(文ごと):",
"实际输入的目标文本:": "実際に入力された目標テキスト:",
"导出文件格式": "エクスポートファイル形式", "导出文件格式": "エクスポートファイル形式",
"开启GPT训练": "GPTトレーニングを開始", "开启GPT训练": "GPTトレーニングを開始",
"开启SSL提取": "SSL抽出を開始", "开启SSL提取": "SSL抽出を開始",
"开启SoVITS训练": "SoVITSトレーニングを開始", "开启SoVITS训练": "SoVITSトレーニングを開始",
"开启一键三连": "ワンクリック三連を開始", "开启一键三连": "ワンクリック三連を開始",
"开启文本获取": "テキストの取得を開始", "开启文本获取": "テキストの取得を開始",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "参照テキストなしモードを有効にします。参照テキストを入力しない場合も同様に有効になります。",
"开启离线批量ASR": "オフラインバッチASRを開始", "开启离线批量ASR": "オフラインバッチASRを開始",
"开启语义token提取": "セマンティックトークン抽出を開始", "开启语义token提取": "セマンティックトークン抽出を開始",
"开启语音切割": "音声の分割を開始", "开启语音切割": "音声の分割を開始",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "音声ノイズ除去を有効にする",
"怎么切": "どうやって切るか", "怎么切": "どうやって切るか",
"总训练轮数total_epoch": "総トレーニングエポック数total_epoch", "总训练轮数total_epoch": "総トレーニングエポック数total_epoch",
"总训练轮数total_epoch不建议太高": "総トレーニングエポック数total_epoch、高すぎないようにお勧めします", "总训练轮数total_epoch不建议太高": "総トレーニングエポック数total_epoch、高すぎないようにお勧めします",
@ -101,25 +112,30 @@
"指定输出主人声文件夹": "ボーカルの出力フォルダを指定:", "指定输出主人声文件夹": "ボーカルの出力フォルダを指定:",
"指定输出非主人声文件夹": "伴奏の出力フォルダを指定:", "指定输出非主人声文件夹": "伴奏の出力フォルダを指定:",
"按中文句号。切": "中国語の句点でカット", "按中文句号。切": "中国語の句点でカット",
"按标点符号切": "#!按标点符号切", "按标点符号切": "句読点で分割",
"按英文句号.切": "英文のピリオドで切ってください", "按英文句号.切": "英文のピリオドで切ってください",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "テキストスライサーツール。長文を変換すると効果が不安定になる可能性があるため、長文の場合は事前に切り分けることをお勧めします。推論時には、テキストを個別に推論し、それを組み合わせて再構築します。", "数据类型精度": "データ型の精度",
"文本模块学习率权重": "テキストモジュールの学習率の重み", "文本模块学习率权重": "テキストモジュールの学習率の重み",
"文本进程输出信息": "テキストプロセスの出力情報", "文本进程输出信息": "テキストプロセスの出力情報",
"施工中,请静候佳音": "施工中、お待ちください", "施工中,请静候佳音": "施工中、お待ちください",
"日文": "日本語", "日文": "日本語",
"日英混合": "#!日英混合", "日英混合": "日英混合",
"是否仅保存最新的ckpt文件以节省硬盘空间": "最新のckptファイルのみを保存してディスクスペースを節約するかどうか", "是否仅保存最新的ckpt文件以节省硬盘空间": "最新のckptファイルのみを保存してディスクスペースを節約するかどうか",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "各保存時間点で最終的な小さなモデルをweightsフォルダに保存するかどうか", "是否在每次保存时间点将最终小模型保存至weights文件夹": "各保存時間点で最終的な小さなモデルをweightsフォルダに保存するかどうか",
"是否开启TTS推理WebUI": "TTS推論WebUIを開く", "是否开启TTS推理WebUI": "TTS推論WebUIを開く",
"是否开启UVR5-WebUI": "UVR5-WebUIをオンにしますか", "是否开启UVR5-WebUI": "UVR5-WebUIをオンにしますか",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "DPOトレーニングオプションを有効にするかどうか実験的",
"是否开启打标WebUI": "WebUIを使用したアテーションを開始しますか", "是否开启打标WebUI": "WebUIを使用したアテーションを開始しますか",
"是否直接对上次合成结果调整语速。防止随机性。": "直前の合成結果の話速を直接調整して、ランダム性を防ぐか。",
"显卡信息": "グラフィックカード情報", "显卡信息": "グラフィックカード情報",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアから導出される音声を広める者は、自己責任で行ってください。<br>この条件を認めない場合、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はルートディレクトリの<b>LICENSE</b>を参照してください。", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアから導出される音声を広める者は、自己責任で行ってください。<br>この条件を認めない場合、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はルートディレクトリの<b>LICENSE</b>を参照してください。",
"模型": "モデル", "模型": "モデル",
"模型切换": "#!模型切换", "模型分为三类:": "モデルは3種類に分かれています",
"模型切换": "モデル切り替え",
"每张显卡的batch_size": "各グラフィックカードのバッチサイズ", "每张显卡的batch_size": "各グラフィックカードのバッチサイズ",
"版本": "バージョン",
"粤英混合": "粤英混合",
"粤语": "粤語",
"终止ASR进程": "ASRプロセスを停止", "终止ASR进程": "ASRプロセスを停止",
"终止GPT训练": "GPTトレーニングを停止", "终止GPT训练": "GPTトレーニングを停止",
"终止SSL提取进程": "SSL抽出プロセスを停止", "终止SSL提取进程": "SSL抽出プロセスを停止",
@ -128,26 +144,31 @@
"终止文本获取进程": "テキスト取得プロセスを停止", "终止文本获取进程": "テキスト取得プロセスを停止",
"终止语义token提取进程": "セマンティックトークン抽出プロセスを停止", "终止语义token提取进程": "セマンティックトークン抽出プロセスを停止",
"终止语音切割": "音声の分割を停止", "终止语音切割": "音声の分割を停止",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "音声ノイズ除去プロセスを終了する",
"英文": "英語", "英文": "英語",
"语义token提取进程输出信息": "セマンティックトークン抽出プロセスの出力情報", "语义token提取进程输出信息": "セマンティックトークン抽出プロセスの出力情報",
"语速": "話速",
"语速调整,高为更快": "話速調整、高いほど速く",
"语音切割进程输出信息": "音声分割プロセスの出力情報", "语音切割进程输出信息": "音声分割プロセスの出力情報",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "音声ノイズ除去プロセスの出力情報",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "请上传3~10秒内参考音频超过会报错": "310秒以内の参照音声をアップロードしてください。それを超えるとエラーが発生します",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "リファレンスオーディオをアップロードしてください",
"请填入推理文本": "ターゲットテキストを入力してください",
"请输入有效文本": "有効なテキストを入力してください",
"转换": "変換", "转换": "変換",
"输入待处理音频文件夹路径": "処理するオーディオフォルダのパスを入力してください:", "输入待处理音频文件夹路径": "処理するオーディオフォルダのパスを入力してください:",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "入力フォルダのパス",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/実験名ディレクトリには23456で始まるファイルとフォルダが含まれている必要があります", "输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/実験名ディレクトリには23456で始まるファイルとフォルダが含まれている必要があります",
"输出信息": "出力情報", "输出信息": "出力情報",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "出力フォルダのパス",
"输出的语音": "推論結果", "输出的语音": "推論結果",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "SoVITS_weightsおよびGPT_weightsに保存されたモデルを選択します。デフォルトのものはプレトレインであり、ゼロショットTTSを体験できます。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "SoVITS_weightsおよびGPT_weightsに保存されたモデルを選択します。デフォルトのものはプレトレインであり、ゼロショットTTSを体験できます。",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "ノイズ除去結果出力フォルダ",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "ノイズ除去音声ファイル入力フォルダ",
"需要合成的切分前文本": "推論が必要な分割前のテキスト",
"需要合成的文本": "推論テキスト", "需要合成的文本": "推論テキスト",
"需要合成的语种": "推論テキストの言語", "需要合成的语种": "推論テキストの言語",
"韩文": "韓国語",
"韩英混合": "韓英混合",
"音频自动切分输入路径,可文件可文件夹": "オーディオの自動分割入力パス、ファイルまたはフォルダを指定できます", "音频自动切分输入路径,可文件可文件夹": "オーディオの自動分割入力パス、ファイルまたはフォルダを指定できます",
"预训练的GPT模型路径": "事前にトレーニングされたGPTモデルのパス", "预训练的GPT模型路径": "事前にトレーニングされたGPTモデルのパス",
"预训练的SSL模型路径": "事前にトレーニングされたSSLモデルのパス", "预训练的SSL模型路径": "事前にトレーニングされたSSLモデルのパス",

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net (onnx_dereverb): 듀얼 채널 리버브에는 가장 적합하지만, 싱글 채널 리버브는 제거할 수 없습니다",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho:지연 효과를 제거합니다. Aggressive는 Normal보다 더 철저하게 제거하며, DeReverb는 추가로 리버브를 제거하여 단일 채널 리버브를 제거할 수 있지만 고주파 리버브는 완전히 제거하지 못합니다.",
"*GPT模型列表": "*GPT 모델 목록", "*GPT模型列表": "*GPT 모델 목록",
"*SoVITS模型列表": "*SoVITS 모델 목록", "*SoVITS模型列表": "*SoVITS 모델 목록",
"*实验/模型名": "*실험/모델 이름", "*实验/模型名": "*실험/모델 이름",
"*文本标注文件": "*텍스트 주석 파일", "*文本标注文件": "*텍스트 주석 파일",
"*训练集音频文件目录": "*훈련 세트 오디오 파일 디렉터리", "*训练集音频文件目录": "*훈련 세트 오디오 파일 디렉터리",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*请上传并填写参考信息": "*참고 정보를 업로드하고 입력하십시오",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*합성할 목표 텍스트와 언어 모드를 입력하세요",
".list标注文件的路径": ".list 주석 파일 경로", ".list标注文件的路径": ".list 주석 파일 경로",
"0-前置数据集获取工具": "0-전방 데이터 세트 수집 도구", "0-前置数据集获取工具": "0-전방 데이터 세트 수집 도구",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 보컬 및 반주 분리 및 에코 및 지연 제거 도구", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 보컬 및 반주 분리 및 에코 및 지연 제거 도구",
"0b-语音切分工具": "0b-음성 분리 도구", "0b-语音切分工具": "0b-음성 분리 도구",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb-음성 노이즈 제거 도구",
"0c-中文批量离线ASR工具": "0c-중국어 대량 오프라인 ASR 도구", "0c-中文批量离线ASR工具": "0c-중국어 대량 오프라인 ASR 도구",
"0d-语音文本校对标注工具": "0d-음성 텍스트 교정 주석 도구", "0d-语音文本校对标注工具": "0d-음성 텍스트 교정 주석 도구",
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
@ -23,13 +25,20 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS 훈련. 공유 용 모델 파일은 SoVITS_weights 하위에 출력됩니다.", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS 훈련. 공유 용 모델 파일은 SoVITS_weights 하위에 출력됩니다.",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT 훈련. 공유 용 모델 파일은 GPT_weights 하위에 출력됩니다.", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT 훈련. 공유 용 모델 파일은 GPT_weights 하위에 출력됩니다.",
"1C-推理": "1C-추론", "1C-推理": "1C-추론",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. DeEcho-DeReverb 모델의 처리 시간은 다른 두 DeEcho 모델의 거의 두 배입니다;",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. 사람 목소리를 유지: 화음이 없는 오디오를 선택하면 HP5보다 사람 목소리를 더 잘 유지할 수 있습니다. 내장된 HP2와 HP3 모델이 있으며, HP3는 화음을 약간 놓칠 수 있지만 HP2보다 사람 목소리를 조금 더 잘 유지합니다;",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-음성 변환", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-음성 변환",
"ASR 模型": "#!ASR 模型", "2、MDX-Net-Dereverb模型挺慢的": "2. MDX-Net-Dereverb 모델은 꽤 느립니다;",
"ASR 模型尺寸": "#!ASR 模型尺寸", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. 주 목소리만 유지: 화음이 있는 오디오에 이 모델을 선택하면 주 목소리가 약해질 수 있습니다. 내장된 HP5 모델이 있습니다;",
"ASR 语言设置": "#!ASR 语言设置", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. 개인적으로 가장 깨끗한 설정은 먼저 MDX-Net을 사용하고 그 다음에 DeEcho-Aggressive를 사용하는 것입니다;",
"3、去混响、去延迟模型by FoxJoy": "3. 잔향 제거 및 지연 제거 모델 (by FoxJoy):",
"ASR 模型": "ASR 모델",
"ASR 模型尺寸": "ASR 모델 크기",
"ASR 语言设置": "ASR 언어 설정",
"ASR进程输出信息": "ASR 프로세스 출력 정보", "ASR进程输出信息": "ASR 프로세스 출력 정보",
"GPT模型列表": "#!GPT模型列表", "GPT模型列表": "GPT 모델 목록",
"GPT训练进程输出信息": "GPT 훈련 프로세스 출력 정보", "GPT训练进程输出信息": "GPT 훈련 프로세스 출력 정보",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT 샘플링 매개변수 (참조 텍스트가 없을 때 너무 낮게 설정하지 마십시오. 확실하지 않으면 기본값을 사용하십시오):",
"GPU卡号,只能填1个整数": "GPU 카드 번호, 1개의 정수만 입력 가능", "GPU卡号,只能填1个整数": "GPU 카드 번호, 1개의 정수만 입력 가능",
"GPU卡号以-分割,每个卡号一个进程": "GPU 카드 번호는 -로 구분되며 각 카드 번호에 하나의 프로세스가 있어야 함", "GPU卡号以-分割,每个卡号一个进程": "GPU 카드 번호는 -로 구분되며 각 카드 번호에 하나의 프로세스가 있어야 함",
"SSL进程输出信息": "SSL 프로세스 출력 정보", "SSL进程输出信息": "SSL 프로세스 출력 정보",
@ -42,56 +51,58 @@
"UVR5已开启": "UVR5가 활성화되었습니다", "UVR5已开启": "UVR5가 활성화되었습니다",
"UVR5进程输出信息": "UVR5 프로세스 출력 정보", "UVR5进程输出信息": "UVR5 프로세스 출력 정보",
"alpha_mix:混多少比例归一化后音频进来": "알파 믹스: 정규화된 오디오가 들어오는 비율", "alpha_mix:混多少比例归一化后音频进来": "알파 믹스: 정규화된 오디오가 들어오는 비율",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop 크기: 볼륨 곡선을 계산하는 방법. 작을수록 정확도가 높아지지만 계산량이 높아집니다 (정확도가 높다고 효과가 좋아지지 않음)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop 크기: 볼륨 곡선을 계산하는 방법. 작을수록 정확도가 높아지지만 계산량이 높아집니다 (정확도가 높다고 효과가 좋아지지 않음)",
"max:归一化后最大值多少": "최대 값 (정규화 후)", "max:归一化后最大值多少": "최대 값 (정규화 후)",
"max_sil_kept:切完后静音最多留多长": "최대 유지되는 정적 길이 (분리 후)", "max_sil_kept:切完后静音最多留多长": "최대 유지되는 정적 길이 (분리 후)",
"min_interval:最短切割间隔": "최소 분리 간격", "min_interval:最短切割间隔": "최소 분리 간격",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "최소 길이: 각 세그먼트의 최소 길이. 첫 번째 세그먼트가 너무 짧으면 계속해서 뒷부분과 연결하여 이 값 이상이 될 때까지", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:각 부분의 최소 길이, 첫 번째 부분이 너무 짧으면 다음 부분과 계속 연결하여 이 값을 초과할 때까지",
"temperature": "#!temperature", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "임계 값: 이 값보다 작은 볼륨은 대체 분리 지점으로 간주됩니다.", "threshold:音量小于这个值视作静音的备选切割点": "임계 값: 이 값보다 작은 볼륨은 대체 분리 지점으로 간주됩니다.",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "일괄 처리 프로세스 출력 정보", "一键三连进程输出信息": "일괄 처리 프로세스 출력 정보",
"不切": "자르지 않음", "不切": "자르지 않음",
"中文": "중국어", "中文": "중국어",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "중국어 튜토리얼 문서https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "중영 혼합",
"也可批量输入音频文件, 二选一, 优先读文件夹": "오디오 파일을 일괄로 입력할 수도 있습니다. 둘 중 하나를 선택하고 폴더를 읽기를 우선합니다.", "也可批量输入音频文件, 二选一, 优先读文件夹": "오디오 파일을 일괄로 입력할 수도 있습니다. 둘 중 하나를 선택하고 폴더를 읽기를 우선합니다.",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "보컬과 반주 분리 배치 처리, UVR5 모델 사용.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "보컬 추출의 공격성",
"以下文件或文件夹不存在:": "해당 파일 또는 폴더가 존재하지 않습니다:",
"以下模型不存在:": "해당 모델이 존재하지 않습니다:",
"伴奏人声分离&去混响&去回声": "반주 및 보컬 분리 & 리버브 제거 & 에코 제거", "伴奏人声分离&去混响&去回声": "반주 및 보컬 분리 & 리버브 제거 & 에코 제거",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "참고 텍스트가 없을 때는 미세 조정된 GPT를 사용하는 것이 좋습니다. 참고 오디오에서 무엇을 말하는지 잘 들리지 않으면 이 모드를 켜서 입력한 참고 텍스트를 무시할 수 있습니다.",
"保存频率save_every_epoch": "저장 빈도 (각 라운드마다)", "保存频率save_every_epoch": "저장 빈도 (각 라운드마다)",
"凑50字一切": "50자를 채우십시오", "凑50字一切": "50자를 채우십시오",
"凑四句一切": "네 문장의 세트를 완성하세요.", "凑四句一切": "네 문장의 세트를 완성하세요.",
"切分后文本": "분리된 텍스트",
"切分后的子音频的输出根目录": "분리된 하위 오디오의 출력 기본 디렉터리", "切分后的子音频的输出根目录": "분리된 하위 오디오의 출력 기본 디렉터리",
"切割使用的进程数": "사용되는 프로세스 수로 자르기", "切割使用的进程数": "사용되는 프로세스 수로 자르기",
"刷新模型路径": "모델 경로 새로 고침", "刷新模型路径": "모델 경로 새로 고침",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "프론트엔드 처리 후 텍스트(문장별):",
"去混响/去延迟,附:": "리버브 제거/지연 제거, 부록:",
"参考音频在3~10秒范围外请更换": "참고 오디오가 3~10초 범위를 벗어났습니다. 다른 것으로 바꾸십시오!", "参考音频在3~10秒范围外请更换": "참고 오디오가 3~10초 범위를 벗어났습니다. 다른 것으로 바꾸십시오!",
"参考音频的文本": "참고 오디오의 텍스트", "参考音频的文本": "참고 오디오의 텍스트",
"参考音频的语种": "참고 오디오의 언어", "参考音频的语种": "참고 오디오의 언어",
"合成语音": "합성 음성", "合成语音": "합성 음성",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "적절한 폴더 경로 형식 예: E:\\codes\\py39\\vits_vc_gpu\\백로서리 테스트 샘플 (파일 관리자 주소 표시줄에서 복사하면 됩니다).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "분리된 오디오가 위치한 디렉터리를 입력하세요! 읽어들인 오디오 파일의 전체 경로 = 이 디렉터리 - list 파일에서 파형에 해당하는 파일명(전체 경로가 아님). 비워 두면 .list 파일의 절대 전체 경로를 사용합니다.",
"多语种混合": "#!多语种混合", "多语种混合": "다국어 혼합",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "다국어 혼합(粤語)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "실제 입력된 참고 텍스트:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "실제 입력된 목표 텍스트(문장 분리 후):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "실제 입력된 목표 텍스트(문장별):",
"实际输入的目标文本:": "실제 입력된 목표 텍스트:",
"导出文件格式": "내보내기 파일 형식", "导出文件格式": "내보내기 파일 형식",
"开启GPT训练": "GPT 훈련 활성화", "开启GPT训练": "GPT 훈련 활성화",
"开启SSL提取": "SSL 추출 활성화", "开启SSL提取": "SSL 추출 활성화",
"开启SoVITS训练": "SoVITS 훈련 활성화", "开启SoVITS训练": "SoVITS 훈련 활성화",
"开启一键三连": "일괄 처리 활성화", "开启一键三连": "일괄 처리 활성화",
"开启文本获取": "텍스트 추출 활성화", "开启文本获取": "텍스트 추출 활성화",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "참고 텍스트 없이 모드를 활성화합니다. 참고 텍스트를 입력하지 않으면 자동으로 활성화됩니다.",
"开启离线批量ASR": "오프라인 대량 ASR 활성화", "开启离线批量ASR": "오프라인 대량 ASR 활성화",
"开启语义token提取": "의미 토큰 추출 활성화", "开启语义token提取": "의미 토큰 추출 활성화",
"开启语音切割": "음성 분리 활성화", "开启语音切割": "음성 분리 활성화",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "음성 노이즈 제거 활성화",
"怎么切": "자르기 옵션", "怎么切": "자르기 옵션",
"总训练轮数total_epoch": "총 훈련 라운드 수 (total_epoch)", "总训练轮数total_epoch": "총 훈련 라운드 수 (total_epoch)",
"总训练轮数total_epoch不建议太高": "총 훈련 라운드 수 (total_epoch), 너무 높지 않게 권장됨", "总训练轮数total_epoch不建议太高": "총 훈련 라운드 수 (total_epoch), 너무 높지 않게 권장됨",
@ -101,25 +112,30 @@
"指定输出主人声文件夹": "지정된 주인 목소리 출력 폴더", "指定输出主人声文件夹": "지정된 주인 목소리 출력 폴더",
"指定输出非主人声文件夹": "지정된 비주인 목소리 출력 폴더", "指定输出非主人声文件夹": "지정된 비주인 목소리 출력 폴더",
"按中文句号。切": "중국어 문장으로 분리하십시오.", "按中文句号。切": "중국어 문장으로 분리하십시오.",
"按标点符号切": "#!按标点符号切", "按标点符号切": "구두점을 기준으로 자르기",
"按英文句号.切": "영어 문장으로 분리하기", "按英文句号.切": "영어 문장으로 분리하기",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "텍스트 분리 도구. 너무 긴 텍스트는 합성 결과가 항상 좋지 않을 수 있으므로 너무 길면 먼저 분리하는 것이 좋습니다. 합성은 텍스트 줄 바꿈을 기준으로 분리되어 다시 조합됩니다.", "数据类型精度": "데이터 유형 정밀도",
"文本模块学习率权重": "텍스트 모듈 학습률 가중치", "文本模块学习率权重": "텍스트 모듈 학습률 가중치",
"文本进程输出信息": "텍스트 프로세스 출력 정보", "文本进程输出信息": "텍스트 프로세스 출력 정보",
"施工中,请静候佳音": "공사 중입니다. 기다려주십시오.", "施工中,请静候佳音": "공사 중입니다. 기다려주십시오.",
"日文": "일본어", "日文": "일본어",
"日英混合": "#!日英混合", "日英混合": "일본어와 영어 혼합",
"是否仅保存最新的ckpt文件以节省硬盘空间": "디스크 공간을 절약하기 위해 최신 ckpt 파일만 저장할지 여부", "是否仅保存最新的ckpt文件以节省硬盘空间": "디스크 공간을 절약하기 위해 최신 ckpt 파일만 저장할지 여부",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "각 저장 시간에 최종 작은 모델을 weights 폴더에 저장할지 여부", "是否在每次保存时间点将最终小模型保存至weights文件夹": "각 저장 시간에 최종 작은 모델을 weights 폴더에 저장할지 여부",
"是否开启TTS推理WebUI": "TTS 추론 WebUI 활성화 여부", "是否开启TTS推理WebUI": "TTS 추론 WebUI 활성화 여부",
"是否开启UVR5-WebUI": "UVR5-WebUI를 여시겠습니까?", "是否开启UVR5-WebUI": "UVR5-WebUI를 여시겠습니까?",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "dpo 훈련 옵션(실험적) 활성화 여부",
"是否开启打标WebUI": "웹 기반 주석 활성화 여부", "是否开启打标WebUI": "웹 기반 주석 활성화 여부",
"是否直接对上次合成结果调整语速。防止随机性。": "직전 합성 결과의 언어 속도를 직접 조정하여 무작위성을 방지할까요?",
"显卡信息": "그래픽 카드 정보", "显卡信息": "그래픽 카드 정보",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "본 소프트웨어는 MIT 라이선스로 오픈 소스로 제공되며, 제작자는 소프트웨어에 대해 어떠한 제어력도 가지지 않습니다. 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 자는 전적으로 책임져야 합니다. <br>이 조항을 인정하지 않으면 소프트웨어의 코드 및 파일을 사용하거나 인용할 수 없습니다. 루트 디렉터리의 <b>LICENSE</b>를 참조하십시오.", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "본 소프트웨어는 MIT 라이선스로 오픈 소스로 제공되며, 제작자는 소프트웨어에 대해 어떠한 제어력도 가지지 않습니다. 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 자는 전적으로 책임져야 합니다. <br>이 조항을 인정하지 않으면 소프트웨어의 코드 및 파일을 사용하거나 인용할 수 없습니다. 루트 디렉터리의 <b>LICENSE</b>를 참조하십시오.",
"模型": "모델", "模型": "모델",
"模型切换": "#!模型切换", "模型分为三类:": "모델은 3가지로 나뉩니다:",
"模型切换": "모델 전환",
"每张显卡的batch_size": "각 그래픽 카드의 배치 크기", "每张显卡的batch_size": "각 그래픽 카드의 배치 크기",
"版本": "버전",
"粤英混合": "粤영 혼합",
"粤语": "粤語",
"终止ASR进程": "ASR 프로세스 종료", "终止ASR进程": "ASR 프로세스 종료",
"终止GPT训练": "GPT 훈련 종료", "终止GPT训练": "GPT 훈련 종료",
"终止SSL提取进程": "SSL 추출 프로세스 종료", "终止SSL提取进程": "SSL 추출 프로세스 종료",
@ -128,26 +144,31 @@
"终止文本获取进程": "텍스트 추출 프로세스 종료", "终止文本获取进程": "텍스트 추출 프로세스 종료",
"终止语义token提取进程": "의미 토큰 추출 프로세스 종료", "终止语义token提取进程": "의미 토큰 추출 프로세스 종료",
"终止语音切割": "음성 분리 종료", "终止语音切割": "음성 분리 종료",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "음성 노이즈 제거 프로세스 종료",
"英文": "영어", "英文": "영어",
"语义token提取进程输出信息": "의미 토큰 추출 프로세스 출력 정보", "语义token提取进程输出信息": "의미 토큰 추출 프로세스 출력 정보",
"语速": "언어 속도",
"语速调整,高为更快": "언어 속도 조정, 높을수록 빠름",
"语音切割进程输出信息": "음성 분리 프로세스 출력 정보", "语音切割进程输出信息": "음성 분리 프로세스 출력 정보",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "음성 노이즈 제거 프로세스 출력 정보",
"请上传3~10秒内参考音频超过会报错": "3~10초 이내의 참고 오디오를 업로드하십시오. 초과하면 오류가 발생합니다!", "请上传3~10秒内参考音频超过会报错": "3~10초 이내의 참고 오디오를 업로드하십시오. 초과하면 오류가 발생합니다!",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "참고 오디오를 업로드하세요",
"请填入推理文本": "목표 텍스트를 입력하세요",
"请输入有效文本": "유효한 텍스트를 입력하세요",
"转换": "변환", "转换": "변환",
"输入待处理音频文件夹路径": "처리 대기 중인 오디오 폴더 경로 입력", "输入待处理音频文件夹路径": "처리 대기 중인 오디오 폴더 경로 입력",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "폴더 경로 입력",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/실험 이름 디렉터리에는 23456으로 시작하는 파일과 폴더가 있어야 함", "输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/실험 이름 디렉터리에는 23456으로 시작하는 파일과 폴더가 있어야 함",
"输出信息": "출력 정보", "输出信息": "출력 정보",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "출력 폴더 경로",
"输出的语音": "출력 음성", "输出的语音": "출력 음성",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "SoVITS_weights 및 GPT_weights에 저장된 훈련 완료된 모델 중 선택. 기본적으로 하나는 기본 모델이며 5초 Zero Shot TTS를 체험할 수 있습니다.", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "SoVITS_weights 및 GPT_weights에 저장된 훈련 완료된 모델 중 선택. 기본적으로 하나는 기본 모델이며 5초 Zero Shot TTS를 체험할 수 있습니다.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "노이즈 제거 결과 출력 폴더",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "노이즈 제거 오디오 파일 입력 폴더",
"需要合成的切分前文本": "합성해야 할 분할 전 텍스트",
"需要合成的文本": "합성해야 할 텍스트", "需要合成的文本": "합성해야 할 텍스트",
"需要合成的语种": "합성해야 할 언어", "需要合成的语种": "합성해야 할 언어",
"韩文": "한국어",
"韩英混合": "한영 혼합",
"音频自动切分输入路径,可文件可文件夹": "오디오 자동 분리 입력 경로, 파일 또는 폴더 가능", "音频自动切分输入路径,可文件可文件夹": "오디오 자동 분리 입력 경로, 파일 또는 폴더 가능",
"预训练的GPT模型路径": "사전 훈련된 GPT 모델 경로", "预训练的GPT模型路径": "사전 훈련된 GPT 모델 경로",
"预训练的SSL模型路径": "사전 훈련된 SSL 모델 경로", "预训练的SSL模型路径": "사전 훈련된 SSL 모델 경로",

View File

@ -1,16 +1,18 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net (onnx_dereverb): É a melhor opção para reverberação de dois canais, mas não pode remover a reverberação de um único canal;",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho:Remove os efeitos de atraso. Aggressive é mais completo que Normal na remoção, DeReverb remove adicionalmente a reverberação, pode remover a reverberação de um canal único, mas não remove completamente a reverberação de placa de alta frequência.",
"*GPT模型列表": "*Lista de modelos GPT", "*GPT模型列表": "*Lista de modelos GPT",
"*SoVITS模型列表": "*Lista de modelos Sovits", "*SoVITS模型列表": "*Lista de modelos Sovits",
"*实验/模型名": "*Nome do experimento/modelo", "*实验/模型名": "*Nome do experimento/modelo",
"*文本标注文件": "*Arquivo de marcação de texto", "*文本标注文件": "*Arquivo de marcação de texto",
"*训练集音频文件目录": "*Diretório de arquivos de áudio do conjunto de treinamento", "*训练集音频文件目录": "*Diretório de arquivos de áudio do conjunto de treinamento",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*请上传并填写参考信息": "Por favor, faça o upload e preencha as informações de referência",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*请填写需要合成的目标文本和语种模式": "*Por favor, insira o texto alvo a ser sintetizado e o modo de idioma.",
".list标注文件的路径": "#!.list标注文件的路径", ".list标注文件的路径": "Caminho do arquivo de anotação .list",
"0-前置数据集获取工具": "0- Ferramenta de aquisição de conjunto de dados pré-frontal", "0-前置数据集获取工具": "0- Ferramenta de aquisição de conjunto de dados pré-frontal",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0A-UVR5 separação de voz e acompanhamento instrumental & ferramenta para remover reverberação e atraso", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0A-UVR5 separação de voz e acompanhamento instrumental & ferramenta para remover reverberação e atraso",
"0b-语音切分工具": "0b- Ferramenta de corte de voz", "0b-语音切分工具": "0b- Ferramenta de corte de voz",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0bb-语音降噪工具": "0bb- Ferramenta de redução de ruído de voz",
"0c-中文批量离线ASR工具": "0c- Ferramenta chinesa de ASR offline em lote", "0c-中文批量离线ASR工具": "0c- Ferramenta chinesa de ASR offline em lote",
"0d-语音文本校对标注工具": "0d- Ferramenta de correção e marcação de texto de voz", "0d-语音文本校对标注工具": "0d- Ferramenta de correção e marcação de texto de voz",
"1-GPT-SoVITS-TTS": "1-GPT-SOVITS-TTS", "1-GPT-SoVITS-TTS": "1-GPT-SOVITS-TTS",
@ -23,17 +25,24 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1ba-Treinamento SoVITS. O arquivo de modelo para compartilhamento é gerado em SOVITS_WEIGHTS", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1ba-Treinamento SoVITS. O arquivo de modelo para compartilhamento é gerado em SOVITS_WEIGHTS",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1BB-Treinamento GPT. O arquivo de modelo para compartilhamento é gerado em GPT_WEIGHTS", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1BB-Treinamento GPT. O arquivo de modelo para compartilhamento é gerado em GPT_WEIGHTS",
"1C-推理": "1C-raciocínio", "1C-推理": "1C-raciocínio",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. O tempo de processamento do modelo DeEcho-DeReverb é quase o dobro dos outros dois modelos DeEcho;",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Manter a voz: selecione isso para áudio sem harmonia, que preserva melhor a voz principal do que o HP5. Inclui dois modelos, HP2 e HP3; o HP3 pode permitir um pequeno vazamento de acompanhamento, mas preserva a voz principal um pouco melhor do que o HP2;",
"2-GPT-SoVITS-变声": "2-gpt-sovits-mudança de voz", "2-GPT-SoVITS-变声": "2-gpt-sovits-mudança de voz",
"ASR 模型": "#!ASR 模型", "2、MDX-Net-Dereverb模型挺慢的": "2. O modelo MDX-Net-Dereverb é bastante lento;",
"ASR 模型尺寸": "#!ASR 模型尺寸", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Manter apenas a voz principal: selecione isso para áudio com harmonia, pode haver uma redução na voz principal. Inclui um modelo HP5;",
"ASR 语言设置": "#!ASR 语言设置", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. A configuração mais limpa recomendada é usar primeiro o MDX-Net e depois o DeEcho-Aggressive.",
"3、去混响、去延迟模型by FoxJoy": "3. Modelo de remoção de reverberação e atraso (por FoxJoy):",
"ASR 模型": "Modelo ASR",
"ASR 模型尺寸": "Tamanho do modelo ASR",
"ASR 语言设置": "Configurações de idioma do ASR",
"ASR进程输出信息": "Informações de saída do processo ASR", "ASR进程输出信息": "Informações de saída do processo ASR",
"GPT模型列表": "#!GPT模型列表", "GPT模型列表": "Lista de modelos GPT",
"GPT训练进程输出信息": "Informações de saída do processo de treinamento GPT", "GPT训练进程输出信息": "Informações de saída do processo de treinamento GPT",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "Parâmetros de amostragem do GPT (não muito baixos quando não houver texto de referência. Use o padrão se não tiver certeza):",
"GPU卡号,只能填1个整数": "Número da placa de vídeo, só é possível preencher com um número inteiro", "GPU卡号,只能填1个整数": "Número da placa de vídeo, só é possível preencher com um número inteiro",
"GPU卡号以-分割,每个卡号一个进程": "Número da placa de vídeo dividido por-, cada número de placa é um processo", "GPU卡号以-分割,每个卡号一个进程": "Número da placa de vídeo dividido por-, cada número de placa é um processo",
"SSL进程输出信息": "Informações de saída do processo SSL", "SSL进程输出信息": "Informações de saída do processo SSL",
"SoVITS模型列表": "#!SoVITS模型列表", "SoVITS模型列表": "Lista de modelos SoVITS",
"SoVITS训练进程输出信息": "Informações de saída do processo de treinamento SoVITS", "SoVITS训练进程输出信息": "Informações de saída do processo de treinamento SoVITS",
"TTS推理WebUI进程输出信息": "Informações de saída do processo webui de raciocínio TTS", "TTS推理WebUI进程输出信息": "Informações de saída do processo webui de raciocínio TTS",
"TTS推理进程已关闭": "O processo de inferência TTS foi desativado", "TTS推理进程已关闭": "O processo de inferência TTS foi desativado",
@ -42,84 +51,91 @@
"UVR5已开启": "UVR5 está ativado", "UVR5已开启": "UVR5 está ativado",
"UVR5进程输出信息": "Informações de saída do processo UVR5", "UVR5进程输出信息": "Informações de saída do processo UVR5",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: Em que proporção o áudio normalizado é misturado de volta", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix: Em que proporção o áudio normalizado é misturado de volta",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "HOP_SIZE: Como calcular a curva de volume, quanto menor a precisão, maior a quantidade de cálculos (não significa que quanto maior a precisão, melhor o efeito)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "HOP_SIZE: Como calcular a curva de volume, quanto menor a precisão, maior a quantidade de cálculos (não significa que quanto maior a precisão, melhor o efeito)",
"max:归一化后最大值多少": "MAX: Qual é o valor máximo após a normalização?", "max:归一化后最大值多少": "MAX: Qual é o valor máximo após a normalização?",
"max_sil_kept:切完后静音最多留多长": "max_sil_kept: Depois de cortar, por quanto tempo no máximo o silêncio é mantido", "max_sil_kept:切完后静音最多留多长": "max_sil_kept: Depois de cortar, por quanto tempo no máximo o silêncio é mantido",
"min_interval:最短切割间隔": "min_interval: O intervalo de corte mínimo", "min_interval:最短切割间隔": "min_interval: O intervalo de corte mínimo",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: O comprimento mínimo de cada parágrafo, se o primeiro for muito curto, conecte-o continuamente aos próximos até ultrapassar este valor", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: Comprimento mínimo de cada segmento. Se o primeiro segmento for muito curto, ele será unido aos segmentos seguintes até exceder este valor",
"temperature": "#!temperature", "temperature": "temperatura",
"threshold:音量小于这个值视作静音的备选切割点": "Limiar: O volume menor que este valor é considerado como um ponto de corte mudo alternativo", "threshold:音量小于这个值视作静音的备选切割点": "Limiar: O volume menor que este valor é considerado como um ponto de corte mudo alternativo",
"top_k": "#!top_k", "top_k": "top_k",
"top_p": "#!top_p", "top_p": "top_p",
"一键三连进程输出信息": "Informações de saída do processo de um clique", "一键三连进程输出信息": "Informações de saída do processo de um clique",
"不切": "#!不切", "不切": "Não dividir",
"中文": "#!中文", "中文": "Chinês",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentação do tutorial em chinêshttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "#!中英混合", "中英混合": "Mistura de Chinês e Inglês",
"也可批量输入音频文件, 二选一, 优先读文件夹": "#!也可批量输入音频文件, 二选一, 优先读文件夹", "也可批量输入音频文件, 二选一, 优先读文件夹": "Também é possível inserir arquivos de áudio em lote; escolha uma opção, preferencialmente leia a pasta.",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "Processamento em lote de separação de voz e acompanhamento, usando o modelo UVR5.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Grau de agressividade da extração de voz",
"伴奏人声分离&去混响&去回声": "#!伴奏人声分离&去混响&去回声", "以下文件或文件夹不存在:": "Nenhum Arquivo ou Pasta Encontrado:",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "以下模型不存在:": "Nenhum Modelo Tal:",
"伴奏人声分离&去混响&去回声": "Separação de acompanhamento e voz & remoção de reverberação & remoção de eco",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "Ao usar o modo sem texto de referência, recomenda-se usar um GPT ajustado. Se não conseguir ouvir claramente o áudio de referência (não sabe o que escrever), você pode ativar o modo e ignorar o texto de referência fornecido.",
"保存频率save_every_epoch": "Frequência de salvamento save_every_epoch", "保存频率save_every_epoch": "Frequência de salvamento save_every_epoch",
"凑50字一切": "#!凑50字一切", "凑50字一切": "Complete com 50 caracteres",
"凑四句一切": "#!凑四句一切", "凑四句一切": "Complete com quatro frases",
"切分后文本": "#!切分后文本",
"切分后的子音频的输出根目录": "Diretório raiz de saída do sub-áudio após o corte", "切分后的子音频的输出根目录": "Diretório raiz de saída do sub-áudio após o corte",
"切割使用的进程数": "Número de processos para corte", "切割使用的进程数": "Número de processos para corte",
"刷新模型路径": "Atualizar caminho do modelo", "刷新模型路径": "Atualizar caminho do modelo",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "前端处理后的文本(每句):": "Texto após processamento front-end (por frase):",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "去混响/去延迟,附:": "Remoção de reverberação/remoção de atraso, anexo:",
"参考音频的文本": "#!参考音频的文本", "参考音频在3~10秒范围外请更换": "O áudio de referência está fora do intervalo de 3 a 10 segundos. Por favor, substitua!",
"参考音频的语种": "#!参考音频的语种", "参考音频的文本": "Texto do áudio de referência",
"合成语音": "#!合成语音", "参考音频的语种": "Idioma do áudio de referência",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合成语音": "Voz sintetizada",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Exemplo de formato de caminho de pasta válido: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (copie do endereço da barra do gerenciador de arquivos).",
"多语种混合": "#!多语种混合", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Preencha o diretório onde os áudios cortados estão localizados! O caminho completo dos arquivos de áudio lidos = este diretório - concatenação com o nome do arquivo de forma correspondente no arquivo .list (não o caminho completo). Se deixar em branco, use o caminho absoluto no arquivo .list.",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合": "Mistura de múltiplos idiomas",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "多语种混合(粤语)": "Mistura Multilíngue (Yue)",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的参考文本:": "Texto de referência realmente inserido:",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(切句后):": "Texto alvo realmente inserido (após divisão de frases):",
"导出文件格式": "#!导出文件格式", "实际输入的目标文本(每句):": "Texto alvo realmente inserido (por frase):",
"实际输入的目标文本:": "Texto alvo realmente inserido:",
"导出文件格式": "Formato de arquivo de exportação",
"开启GPT训练": "Ativar treinamento GPT", "开启GPT训练": "Ativar treinamento GPT",
"开启SSL提取": "Ativar extração SSL", "开启SSL提取": "Ativar extração SSL",
"开启SoVITS训练": "Ativar treinamento SoVITS", "开启SoVITS训练": "Ativar treinamento SoVITS",
"开启一键三连": "Ativar um clique", "开启一键三连": "Ativar um clique",
"开启文本获取": "Ativar obtenção de texto", "开启文本获取": "Ativar obtenção de texto",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "Ativar o modo sem texto de referência. Não preencher o texto de referência também equivale a ativar.",
"开启离线批量ASR": "Ativar ASR offline em lote", "开启离线批量ASR": "Ativar ASR offline em lote",
"开启语义token提取": "Ativar extração de token semântico", "开启语义token提取": "Ativar extração de token semântico",
"开启语音切割": "Ativar corte de voz", "开启语音切割": "Ativar corte de voz",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Ativar redução de ruído de voz",
"怎么切": "#!怎么切", "怎么切": "Como cortar",
"总训练轮数total_epoch": "Total de epoch de treinamento", "总训练轮数total_epoch": "Total de epoch de treinamento",
"总训练轮数total_epoch不建议太高": "Total de epoch de treinamento, não é recomendável um valor muito alto", "总训练轮数total_epoch不建议太高": "Total de epoch de treinamento, não é recomendável um valor muito alto",
"打标工具WebUI已关闭": "A ferramenta de marcação WebUI foi desativado", "打标工具WebUI已关闭": "A ferramenta de marcação WebUI foi desativado",
"打标工具WebUI已开启": "A ferramenta de marcação WebUI está ativada", "打标工具WebUI已开启": "A ferramenta de marcação WebUI está ativada",
"打标工具进程输出信息": "Informações de saída do processo da ferramenta de marcação", "打标工具进程输出信息": "Informações de saída do processo da ferramenta de marcação",
"指定输出主人声文件夹": "#!指定输出主人声文件夹", "指定输出主人声文件夹": "Especificar a pasta de saída da voz principal",
"指定输出非主人声文件夹": "#!指定输出非主人声文件夹", "指定输出非主人声文件夹": "Especificar a pasta de saída da voz secundária",
"按中文句号。切": "#!按中文句号。切", "按中文句号。切": "Dividir por ponto final chinês",
"按标点符号切": "#!按标点符号切", "按标点符号切": "Dividir por sinais de pontuação",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "Dividir por ponto final em inglês",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "#!文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "precisão do tipo de dado",
"文本模块学习率权重": "Weight da taxa de aprendizado do módulo de texto", "文本模块学习率权重": "Weight da taxa de aprendizado do módulo de texto",
"文本进程输出信息": "Informações de saída do processo de texto", "文本进程输出信息": "Informações de saída do processo de texto",
"施工中,请静候佳音": "Em construção, por favor, aguarde por um bom som", "施工中,请静候佳音": "Em construção, por favor, aguarde por um bom som",
"日文": "#!日文", "日文": "Japonês",
"日英混合": "#!日英混合", "日英混合": "Mistura de Japonês e Inglês",
"是否仅保存最新的ckpt文件以节省硬盘空间": "Se deve salvar apenas o último arquivo CKPT para economizar espaço em disco", "是否仅保存最新的ckpt文件以节省硬盘空间": "Se deve salvar apenas o último arquivo CKPT para economizar espaço em disco",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Se deve salvar o modelo pequeno final na pasta Weights em cada ponto de salvamento de tempo", "是否在每次保存时间点将最终小模型保存至weights文件夹": "Se deve salvar o modelo pequeno final na pasta Weights em cada ponto de salvamento de tempo",
"是否开启TTS推理WebUI": "Se deseja ativar o webui de raciocínio TTS", "是否开启TTS推理WebUI": "Se deseja ativar o webui de raciocínio TTS",
"是否开启UVR5-WebUI": "Se deseja ativar a UVR5-WEBUI", "是否开启UVR5-WebUI": "Se deseja ativar a UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "Se deseja ativar a opção de treinamento DPO (experimental)",
"是否开启打标WebUI": "Se deseja abrir o webui de marcação", "是否开启打标WebUI": "Se deseja abrir o webui de marcação",
"是否直接对上次合成结果调整语速。防止随机性。": "Se deve ajustar diretamente a velocidade da fala do último resultado de síntese para evitar aleatoriedade.",
"显卡信息": "Informações da placa de vídeo", "显卡信息": "Informações da placa de vídeo",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Este software é de código aberto sob a licença MIT. O autor não tem controle sobre o software. Aqueles que usam o software e difundem os sons exportados pelo software são totalmente responsáveis. <br>Se você não concorda com esta cláusula, não pode usar ou citar nenhum código e arquivo dentro do pacote de software. Consulte o diretório raiz <b>LICENSE</b> para mais detalhes.<br><br> Traduzido por Rafael Godoy Ebert", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Este software é de código aberto sob a licença MIT. O autor não tem controle sobre o software. Aqueles que usam o software e difundem os sons exportados pelo software são totalmente responsáveis. <br>Se você não concorda com esta cláusula, não pode usar ou citar nenhum código e arquivo dentro do pacote de software. Consulte o diretório raiz <b>LICENSE</b> para mais detalhes.<br><br> Traduzido por Rafael Godoy Ebert",
"模型": "#!模型", "模型": "Modelo",
"模型切换": "#!模型切换", "模型分为三类:": "Modelos dividem-se em três categorias:",
"模型切换": "Troca de modelo",
"每张显卡的batch_size": "Tamanho do lote de cada placa de vídeo", "每张显卡的batch_size": "Tamanho do lote de cada placa de vídeo",
"版本": "Versão",
"粤英混合": "Mistura Yue-Inglês",
"粤语": "Yue",
"终止ASR进程": "Encerrar processo ASR", "终止ASR进程": "Encerrar processo ASR",
"终止GPT训练": "Encerrar treinamento GPT", "终止GPT训练": "Encerrar treinamento GPT",
"终止SSL提取进程": "Encerrar processo de extração SSL", "终止SSL提取进程": "Encerrar processo de extração SSL",
@ -128,26 +144,31 @@
"终止文本获取进程": "Encerrar processo de obtenção de texto", "终止文本获取进程": "Encerrar processo de obtenção de texto",
"终止语义token提取进程": "Encerrar processo de extração de token semântico", "终止语义token提取进程": "Encerrar processo de extração de token semântico",
"终止语音切割": "Encerrar corte de voz", "终止语音切割": "Encerrar corte de voz",
"终止语音降噪进程": "#!终止语音降噪进程", "终止语音降噪进程": "Encerrar o processo de redução de ruído de voz",
"英文": "#!英文", "英文": "Inglês",
"语义token提取进程输出信息": "Informações de saída do processo de extração de token semântico", "语义token提取进程输出信息": "Informações de saída do processo de extração de token semântico",
"语速": "Velocidade da fala",
"语速调整,高为更快": "Ajustar a velocidade da fala, mais alta para mais rápido",
"语音切割进程输出信息": "Informações de saída do processo de corte de voz", "语音切割进程输出信息": "Informações de saída do processo de corte de voz",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "语音降噪进程输出信息": "Informações de saída do processo de redução de ruído de voz",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "请上传3~10秒内参考音频超过会报错": "Por favor, faça upload de um áudio de referência com duração entre 3 e 10 segundos. Áudios fora dessa faixa causarão erro!",
"请输入有效文本": "#!请输入有效文本", "请上传参考音频": "Por Favor, Carregue o Áudio de Referência",
"转换": "#!转换", "请填入推理文本": "Por Favor, Preencha o Texto de Inferência",
"输入待处理音频文件夹路径": "#!输入待处理音频文件夹路径", "请输入有效文本": "Por favor, insira um texto válido",
"输入文件夹路径": "#!输入文件夹路径", "转换": "Converter",
"输入待处理音频文件夹路径": "Caminho da pasta de arquivos de áudio a ser processados",
"输入文件夹路径": "Caminho da pasta de entrada",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Logs de saída/deve haver arquivos e pastas começando com 23456 no diretório do nome do experimento", "输出logs/实验名目录下应有23456开头的文件和文件夹": "Logs de saída/deve haver arquivos e pastas começando com 23456 no diretório do nome do experimento",
"输出信息": "#!输出信息", "输出信息": "Informações de saída",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "Caminho da pasta de saída",
"输出的语音": "#!输出的语音", "输出的语音": "Áudio de saída",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Selecione os modelos armazenados em Sovits_weights e GPT_WEIGHTS. O padrão é o modelo inferior, experiência para 5 segundos de Zero Shot TTS", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Selecione os modelos armazenados em Sovits_weights e GPT_WEIGHTS. O padrão é o modelo inferior, experiência para 5 segundos de Zero Shot TTS",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Pasta de saída dos resultados de redução de ruído",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Pasta de entrada dos arquivos de áudio para redução de ruído",
"需要合成的切分前文本": "#!需要合成的切分前文本", "需要合成的文本": "Texto a ser sintetizado",
"需要合成的文本": "#!需要合成的文本", "需要合成的语种": "Idioma a ser sintetizado",
"需要合成的语种": "#!需要合成的语种", "韩文": "Coreano",
"韩英混合": "Mistura Coreano-Inglês",
"音频自动切分输入路径,可文件可文件夹": "Caminho de entrada automático de corte de áudio, pode ser um arquivo ou uma pasta", "音频自动切分输入路径,可文件可文件夹": "Caminho de entrada automático de corte de áudio, pode ser um arquivo ou uma pasta",
"预训练的GPT模型路径": "Caminho do modelo GPT pre-train", "预训练的GPT模型路径": "Caminho do modelo GPT pre-train",
"预训练的SSL模型路径": "Caminho do modelo SSL pre-train", "预训练的SSL模型路径": "Caminho do modelo SSL pre-train",

View File

@ -1,157 +1,178 @@
{ {
"*GPT模型列表": "#!*GPT模型列表", "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):Это лучший выбор для реверберации с двумя каналами, но он не может устранить реверберацию с одним каналом;",
"*SoVITS模型列表": "#!*SoVITS模型列表", "(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho:Устраняет эффект задержки. Aggressive устраняет более тщательно, чем Normal, DeReverb дополнительно устраняет реверберацию, может устранить реверберацию с одного канала, но не полностью устраняет высокочастотную реверберацию.",
"*实验/模型名": "#!*实验/模型名", "*GPT模型列表": "*Список моделей GPT",
"*文本标注文件": "#!*文本标注文件", "*SoVITS模型列表": "*Список моделей SoVITS",
"*训练集音频文件目录": "#!*训练集音频文件目录", "*实验/模型名": "*Название эксперимента/модели",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*文本标注文件": "*Файл текстовой аннотации",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*训练集音频文件目录": "*Директория аудиофайлов обучающего набора",
".list标注文件的路径": "#!.list标注文件的路径", "*请上传并填写参考信息": "*Пожалуйста, загрузите и заполните референтные данные",
"0-前置数据集获取工具": "#!0-前置数据集获取工具", "*请填写需要合成的目标文本和语种模式": "*Пожалуйста, введите целевой текст для синтеза и режим языка",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "#!0a-UVR5人声伴奏分离&去混响去延迟工具", ".list标注文件的路径": "Путь к файлу аннотации .list",
"0b-语音切分工具": "#!0b-语音切分工具", "0-前置数据集获取工具": "0-Инструмент для получения предварительного набора данных",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Инструмент для разделения вокала и аккомпанемента UVR5 & устранения реверберации и задержек",
"0c-中文批量离线ASR工具": "#!0c-中文批量离线ASR工具", "0b-语音切分工具": "0b-Инструмент для разделения речи",
"0d-语音文本校对标注工具": "#!0d-语音文本校对标注工具", "0bb-语音降噪工具": "0bb-Инструмент для подавления шумов в голосе",
"1-GPT-SoVITS-TTS": "#!1-GPT-SoVITS-TTS", "0c-中文批量离线ASR工具": "0c-Инструмент для пакетной офлайн ASR на китайском",
"1A-训练集格式化工具": "#!1A-训练集格式化工具", "0d-语音文本校对标注工具": "0d-Инструмент для коррекции и аннотации текста речи",
"1Aa-文本内容": "#!1Aa-文本内容", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
"1Aabc-训练集格式化一键三连": "#!1Aabc-训练集格式化一键三连", "1A-训练集格式化工具": "1A-Инструмент для форматирования обучающего набора",
"1Ab-SSL自监督特征提取": "#!1Ab-SSL自监督特征提取", "1Aa-文本内容": "1Aa-Содержание текста",
"1Ac-语义token提取": "#!1Ac-语义token提取", "1Aabc-训练集格式化一键三连": "1Aabc-Форматирование обучающего набора одним нажатием",
"1B-微调训练": "#!1B-微调训练", "1Ab-SSL自监督特征提取": "1Ab-Самоконтролируемое извлечение признаков SSL",
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "#!1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", "1Ac-语义token提取": "1Ac-Извлечение семантических токенов",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "#!1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", "1B-微调训练": "1B-Дообучение",
"1C-推理": "#!1C-推理", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Обучение SoVITS. Файлы моделей для распространения находятся в SoVITS_weights.",
"2-GPT-SoVITS-变声": "#!2-GPT-SoVITS-变声", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Обучение GPT. Файлы моделей для распространения находятся в GPT_weights.",
"ASR 模型": "#!ASR 模型", "1C-推理": "1C-Инференс",
"ASR 模型尺寸": "#!ASR 模型尺寸", "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. Время обработки модели DeEcho-DeReverb почти вдвое больше, чем у двух других моделей DeEcho;",
"ASR 语言设置": "#!ASR 语言设置", "1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Сохранение голоса: выберите этот для аудио без гармоний, сохранение голоса будет лучше, чем HP5. Встроенные модели HP2 и HP3, HP3 может немного пропускать сопровождение, но сохраняет голос немного лучше, чем HP2;",
"ASR进程输出信息": "#!ASR进程输出信息", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-переозвучивание",
"GPT模型列表": "#!GPT模型列表", "2、MDX-Net-Dereverb模型挺慢的": "2. Модель MDX-Net-Dereverb довольно медленная;",
"GPT训练进程输出信息": "#!GPT训练进程输出信息", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Сохранение только основного голоса: выберите это для аудио с гармониями, может ослабить основной голос. Встроенная модель HP5;",
"GPU卡号,只能填1个整数": "#!GPU卡号,只能填1个整数", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. Лично рекомендованная самая чистая конфигурация — сначала MDX-Net, затем DeEcho-Aggressive.",
"GPU卡号以-分割,每个卡号一个进程": "#!GPU卡号以-分割,每个卡号一个进程", "3、去混响、去延迟模型by FoxJoy": "3. Модель удаления реверберации и задержек (от FoxJoy):",
"SSL进程输出信息": "#!SSL进程输出信息", "ASR 模型": "Модель ASR",
"SoVITS模型列表": "#!SoVITS模型列表", "ASR 模型尺寸": "Размер модели ASR",
"SoVITS训练进程输出信息": "#!SoVITS训练进程输出信息", "ASR 语言设置": "Настройки языка ASR",
"TTS推理WebUI进程输出信息": "#!TTS推理WebUI进程输出信息", "ASR进程输出信息": "Информация о процессе ASR",
"TTS推理进程已关闭": "#!TTS推理进程已关闭", "GPT模型列表": "Список моделей GPT",
"TTS推理进程已开启": "#!TTS推理进程已开启", "GPT训练进程输出信息": "Информация о процессе обучения GPT",
"UVR5已关闭": "#!UVR5已关闭", "GPT采样参数(无参考文本时不要太低。不懂就用默认)": "Параметры выборки GPT (не устанавливайте слишком низкие значения, если нет ссылочного текста. Используйте значения по умолчанию, если не уверены):",
"UVR5已开启": "#!UVR5已开启", "GPU卡号,只能填1个整数": "Номер GPU, можно указать только одно целое число",
"UVR5进程输出信息": "#!UVR5进程输出信息", "GPU卡号以-分割,每个卡号一个进程": "Номера GPU разделяются дефисом, на каждый номер отдельный процесс",
"alpha_mix:混多少比例归一化后音频进来": "#!alpha_mix:混多少比例归一化后音频进来", "SSL进程输出信息": "Информация о процессе SSL",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)", "SoVITS模型列表": "Список моделей SoVITS",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "#!hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", "SoVITS训练进程输出信息": "Информация о процессе обучения SoVITS",
"max:归一化后最大值多少": "#!max:归一化后最大值多少", "TTS推理WebUI进程输出信息": "Информация о процессе TTS инференса WebUI",
"max_sil_kept:切完后静音最多留多长": "#!max_sil_kept:切完后静音最多留多长", "TTS推理进程已关闭": "Процесс TTS-инференции остановлен",
"min_interval:最短切割间隔": "#!min_interval:最短切割间隔", "TTS推理进程已开启": "Процесс TTS-инференции запущен",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "#!min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值", "UVR5已关闭": "UVR5 выключен",
"temperature": "#!temperature", "UVR5已开启": "UVR5 включен",
"threshold:音量小于这个值视作静音的备选切割点": "#!threshold:音量小于这个值视作静音的备选切割点", "UVR5进程输出信息": "Вывод информации процесса UVR5",
"top_k": "#!top_k", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:Какая доля нормализованного аудио смешивается",
"top_p": "#!top_p", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:Как рассчитывается кривая громкости, чем меньше, тем выше точность и больше вычислительная нагрузка (большая точность не всегда означает лучший результат)",
"一键三连进程输出信息": "#!一键三连进程输出信息", "max:归一化后最大值多少": "max:Максимальное значение после нормализации",
"不切": "#!不切", "max_sil_kept:切完后静音最多留多长": "max_sil_kept:Максимальная длительность тишины после разреза",
"中文": "#!中文", "min_interval:最短切割间隔": "min_interval:Минимальный интервал разреза",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:Минимальная длина каждого отрезка; если первый отрезок слишком короткий, он будет соединен с последующими до достижения этого значения",
"中英混合": "#!中英混合", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "threshold:Значение громкости ниже этого считается тишиной для альтернативной точки разреза",
"top_k": "top_k",
"top_p": "top_p",
"一键三连进程输出信息": "Информация о процессе одного нажатия",
"不切": "Не разрезать",
"中文": "Китайский",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Документация на китайском языкеhttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "Китайский и английский",
"也可批量输入音频文件, 二选一, 优先读文件夹": "Можно также импортировать несколько аудиофайлов. Если путь к папке существует, то этот ввод игнорируется.", "也可批量输入音频文件, 二选一, 优先读文件夹": "Можно также импортировать несколько аудиофайлов. Если путь к папке существует, то этот ввод игнорируется.",
"人声伴奏分离批量处理, 使用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>&emsp;(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. Модели удаления реверберации и задержки (от FoxJoy):<br>(1) MDX-Net: лучший выбор для удаления стереореверберации, но он не может удалить монореверберацию;<br>&emsp;(234) DeEcho: удаляет эффекты задержки. Агрессивный режим удаляет более тщательно, чем Нормальный режим. DeReverb дополнительно удаляет реверберацию и может удалять монореверберацию, но не очень эффективно для сильно реверберированного высокочастотного контента.<br>Примечания по удалению реверберации/задержки:<br>1. Время обработки для модели DeEcho-DeReverb примерно в два раза больше, чем для двух других моделей DeEcho.<br>2. Модель MDX-Net-Dereverb довольно медленная.<br>3. Рекомендуемая самая чистая конфигурация — сначала применить MDX-Net, а затем DeEcho-Aggressive.", "人声伴奏分离批量处理, 使用UVR5模型。": "Обработка разделения вокала и аккомпанемента пакетно с использованием модели UVR5.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Степень агрессивности извлечения вокала",
"以下文件或文件夹不存在:": "Нет такого файла или папки:",
"以下模型不存在:": "Этот модель не существует",
"伴奏人声分离&去混响&去回声": "Разделение вокала/аккомпанемента и удаление эхо", "伴奏人声分离&去混响&去回声": "Разделение вокала/аккомпанемента и удаление эхо",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "При использовании режима без референсного текста рекомендуется использовать настроенную модель GPT. Если не удается разобрать, что говорит референсное аудио (не знаете, что писать), можете включить этот режим, и он проигнорирует введенный референсный текст.",
"保存频率save_every_epoch": "Частота сохранения (save_every_epoch):", "保存频率save_every_epoch": "Частота сохранения save_every_epoch",
"凑50字一切": "#!凑50字一切", "凑50字一切": "Соберите все в 50 символов",
"凑四句一切": "#!凑四句一切", "凑四句一切": "Собрать четыре предложения и разрезать",
"切分后文本": "#!切分后文本", "切分后的子音频的输出根目录": "Корневой каталог вывода для подаудио после разделения",
"切分后的子音频的输出根目录": "#!切分后的子音频的输出根目录", "切割使用的进程数": "Количество процессов, используемых для разрезания",
"切割使用的进程数": "#!切割使用的进程数", "刷新模型路径": "Обновить путь к модели",
"刷新模型路径": "#!刷新模型路径", "前端处理后的文本(每句):": "Текст после предварительной обработки (каждое предложение):",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "去混响/去延迟,附:": "Удаление реверберации/удаление задержки, примечание:",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "参考音频在3~10秒范围外请更换": "Референтное аудио вне диапазона 3~10 секунд, пожалуйста, замените!",
"参考音频的文本": "#!参考音频的文本", "参考音频的文本": "Текст референтного аудио",
"参考音频的语种": "#!参考音频的语种", "参考音频的语种": "Язык референтного аудио",
"合成语音": "#!合成语音", "合成语音": "Синтезированный голос",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Пример допустимого формата пути к папке: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (просто скопируйте из адресной строки файлового менеджера).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Заполните каталог, где находятся аудиофайлы после разрезания! Полный путь к читаемым аудиофайлам = каталог - файл .list, имя файла соответствует волне (не полный путь). Если оставить пустым, будет использоваться абсолютный путь из файла .list.",
"多语种混合": "#!多语种混合", "多语种混合": "Смешанные языки",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "Многоязычная смесь (кантонский)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "Фактически введенный референсный текст:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "Фактически введенный целевой текст (после разбиения на предложения):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "Фактически введенный целевой текст (каждое предложение):",
"实际输入的目标文本:": "Фактически введенный целевой текст:",
"导出文件格式": "Формат выходных файлов", "导出文件格式": "Формат выходных файлов",
"开启GPT训练": "#!开启GPT训练", "开启GPT训练": "Включить обучение GPT",
"开启SSL提取": "#!开启SSL提取", "开启SSL提取": "Включить извлечение SSL",
"开启SoVITS训练": "#!开启SoVITS训练", "开启SoVITS训练": "Включить обучение SoVITS",
"开启一键三连": "#!开启一键三连", "开启一键三连": "Включить одно нажатие",
"开启文本获取": "#!开启文本获取", "开启文本获取": "Включить получение текста",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "Включить режим без референтного текста. Не заполняя референтный текст, вы также включаете этот режим.",
"开启离线批量ASR": "#!开启离线批量ASR", "开启离线批量ASR": "Включить пакетную офлайн ASR",
"开启语义token提取": "#!开启语义token提取", "开启语义token提取": "Включить извлечение семантических токенов",
"开启语音切割": "#!开启语音切割", "开启语音切割": "Включить разрезание речи",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Включить шумоподавление",
"怎么切": "#!怎么切", "怎么切": "Как разрезать",
"总训练轮数total_epoch": "Полное количество эпох (total_epoch):", "总训练轮数total_epoch": "Общее количество эпох обучения total_epoch",
"总训练轮数total_epoch不建议太高": "#!总训练轮数total_epoch不建议太高", "总训练轮数total_epoch不建议太高": "Общее количество эпох обучения total_epoch, не рекомендуется слишком высокое",
"打标工具WebUI已关闭": "#!打标工具WebUI已关闭", "打标工具WebUI已关闭": "WebUI инструмента маркировки остановлен",
"打标工具WebUI已开启": "#!打标工具WebUI已开启", "打标工具WebUI已开启": "WebUI инструмента маркировки запущен",
"打标工具进程输出信息": "#!打标工具进程输出信息", "打标工具进程输出信息": "Информация о процессе аннотации",
"指定输出主人声文件夹": "Путь к папке для сохранения вокала:", "指定输出主人声文件夹": "Путь к папке для сохранения вокала:",
"指定输出非主人声文件夹": "Путь к папке для сохранения аккомпанемента:", "指定输出非主人声文件夹": "Путь к папке для сохранения аккомпанемента:",
"按中文句号。切": "#!按中文句号。切", "按中文句号。切": "Разделение по китайским точкам.",
"按标点符号切": "#!按标点符号切", "按标点符号切": "Разрезать по пунктуационным знакам",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "Разрезать по английской точке.",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "#!文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "точность типа данных",
"文本模块学习率权重": "#!文本模块学习率权重", "文本模块学习率权重": "Веса скорости обучения текстового модуля",
"文本进程输出信息": "#!文本进程输出信息", "文本进程输出信息": "Информация о процессе обработки текста",
"施工中,请静候佳音": "#!施工中,请静候佳音", "施工中,请静候佳音": "В разработке, ожидайте хороших новостей",
"日文": "#!日文", "日文": "Японский",
"日英混合": "#!日英混合", "日英混合": "Японский и английский",
"是否仅保存最新的ckpt文件以节省硬盘空间": "Сохранять только последний файл '.ckpt', чтобы сохранить место на диске:", "是否仅保存最新的ckpt文件以节省硬盘空间": "Сохранять только последние файлы ckpt для экономии места на диске?",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Сохранять маленькую финальную модель в папку 'weights' на каждой точке сохранения:", "是否在每次保存时间点将最终小模型保存至weights文件夹": "Сохранять финальную версию модели в папке weights на каждом этапе сохранения?",
"是否开启TTS推理WebUI": "#!是否开启TTS推理WebUI", "是否开启TTS推理WebUI": "Включить TTS инференс WebUI",
"是否开启UVR5-WebUI": "#!是否开启UVR5-WebUI", "是否开启UVR5-WebUI": "Включить UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "Включить опцию тренировки dpo (экспериментально)",
"是否开启打标WebUI": "#!是否开启打标WebUI", "是否开启打标WebUI": "Включить интерфейс веб-аннотации",
"显卡信息": "Информация о графических процессорах (GPUs):", "是否直接对上次合成结果调整语速。防止随机性。": "Следует ли непосредственно регулировать скорость речи последнего синтезированного результата, чтобы избежать случайности?",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Это программное обеспечение с открытым исходным кодом распространяется по лицензии MIT. Автор никак не контролирует это программное обеспечение. Пользователи, которые используют эту программу и распространяют аудиозаписи, полученные с помощью этой программы, несут полную ответственность за это. Если вы не согласны с этим, вы не можете использовать какие-либо коды и файлы в рамках этой программы или ссылаться на них. Подробнее в файле <b>Agreement-LICENSE.txt</b> в корневом каталоге программы.", "显卡信息": "Информация о видеокарте",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Это программное обеспечение открыто по лицензии MIT, автор не имеет никакого контроля над программным обеспечением, пользователи программного обеспечения и те, кто распространяет звуки, экспортированные программным обеспечением, несут полную ответственность. <br>Если вы не согласны с этими условиями, вы не можете использовать или ссылаться на любой код и файлы в пакете программного обеспечения. Смотрите <b>LICENSE</b> в корневом каталоге.",
"模型": "Модели", "模型": "Модели",
"模型切换": "#!模型切换", "模型分为三类:": "Модели делятся на три типа:",
"每张显卡的batch_size": "Размер пачки для GPU:", "模型切换": "Переключение модели",
"终止ASR进程": "#!终止ASR进程", "每张显卡的batch_size": "Размер пакета для каждой видеокарты",
"终止GPT训练": "#!终止GPT训练", "版本": "Версия",
"终止SSL提取进程": "#!终止SSL提取进程", "粤英混合": "Кантоно-английская смесь",
"终止SoVITS训练": "#!终止SoVITS训练", "粤语": "Кантонийский",
"终止一键三连": "#!终止一键三连", "终止ASR进程": "Прекратить процесс ASR",
"终止文本获取进程": "#!终止文本获取进程", "终止GPT训练": "Прекратить обучение GPT",
"终止语义token提取进程": "#!终止语义token提取进程", "终止SSL提取进程": "Прекратить процесс извлечения SSL",
"终止语音切割": "#!终止语音切割", "终止SoVITS训练": "Прекратить обучение SoVITS",
"终止语音降噪进程": "#!终止语音降噪进程", "终止一键三连": "Прекратить одно нажатие",
"英文": "#!英文", "终止文本获取进程": "Прекратить процесс получения текста",
"语义token提取进程输出信息": "#!语义token提取进程输出信息", "终止语义token提取进程": "Прекратить процесс извлечения семантических токенов",
"语音切割进程输出信息": "#!语音切割进程输出信息", "终止语音切割": "Прекратить разрезание речи",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "终止语音降噪进程": "Прекратить процесс шумоподавления",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "英文": "Английский",
"请输入有效文本": "#!请输入有效文本", "语义token提取进程输出信息": "Информация о процессе извлечения семантических токенов",
"语速": "Скорость речи",
"语速调整,高为更快": "Регулировка скорости речи, чем выше, тем быстрее",
"语音切割进程输出信息": "Информация о процессе разрезания речи",
"语音降噪进程输出信息": "Информация о процессе шумоподавления",
"请上传3~10秒内参考音频超过会报错": "Пожалуйста, загрузите референтное аудио длительностью от 3 до 10 секунд, иначе будет ошибка!",
"请上传参考音频": "Пожалуйста, загрузите эталонное аудио",
"请填入推理文本": "Пожалуйста, введите целевой текст",
"请输入有效文本": "Введите действительный текст",
"转换": "Преобразовать", "转换": "Преобразовать",
"输入待处理音频文件夹路径": "Путь к папке с аудиофайлами для обработки:", "输入待处理音频文件夹路径": "Путь к папке с аудиофайлами для обработки:",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "Введите путь к папке",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "#!输出logs/实验名目录下应有23456开头的文件和文件夹", "输出logs/实验名目录下应有23456开头的文件和文件夹": "В директории logs/имя_эксперимента должны быть файлы и папки, начинающиеся с 23456",
"输出信息": "Статистика", "输出信息": "Статистика",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "Путь к папке для вывода",
"输出的语音": "#!输出的语音", "输出的语音": "Выводимый звук",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "#!选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Выберите модель, сохраненную в SoVITS_weights и GPT_weights после обучения. По умолчанию используется базовая модель для 5-секундного Zero Shot TTS.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Папка для вывода результатов шумоподавления",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Папка для ввода аудиофайлов для шумоподавления",
"需要合成的切分前文本": "#!需要合成的切分前文本", "需要合成的文本": "Текст для синтеза",
"需要合成的文本": "#!需要合成的文本", "需要合成的语种": "Язык для синтеза",
"需要合成的语种": "#!需要合成的语种", "韩文": "Корейский",
"音频自动切分输入路径,可文件可文件夹": "#!音频自动切分输入路径,可文件可文件夹", "韩英混合": "Корейско-английская смесь",
"预训练的GPT模型路径": "#!预训练的GPT模型路径", "音频自动切分输入路径,可文件可文件夹": "Путь ввода для автоматического разделения аудио, может быть файлом или папкой",
"预训练的SSL模型路径": "#!预训练的SSL模型路径", "预训练的GPT模型路径": "Путь к предварительно обученной модели GPT",
"预训练的SoVITS-D模型路径": "#!预训练的SoVITS-D模型路径", "预训练的SSL模型路径": "Путь к предварительно обученной модели SSL",
"预训练的SoVITS-G模型路径": "#!预训练的SoVITS-G模型路径", "预训练的SoVITS-D模型路径": "Путь к предварительно обученной модели SoVITS-D",
"预训练的中文BERT模型路径": "#!预训练的中文BERT模型路径" "预训练的SoVITS-G模型路径": "Путь к предварительно обученной модели SoVITS-G",
"预训练的中文BERT模型路径": "Путь к предварительно обученной китайской модели BERT"
} }

View File

@ -1,157 +1,178 @@
{ {
"*GPT模型列表": "#!*GPT模型列表", "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):İki kanallı yankılar için en iyi seçimdir, ancak tek kanallı yankıları ortadan kaldıramaz;",
"*SoVITS模型列表": "#!*SoVITS模型列表", "(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho:Gecikme etkilerini giderir. Aggressive, Normal'dan daha kapsamlı bir şekilde giderir, DeReverb ek olarak yankıyı giderir, tek kanallı yankıyı giderebilir, ancak yüksek frekanslı plaka yankısını tamamen gideremez.",
"*实验/模型名": "#!*实验/模型名", "*GPT模型列表": "*GPT model listesi",
"*文本标注文件": "#!*文本标注文件", "*SoVITS模型列表": "*SoVITS model listesi",
"*训练集音频文件目录": "#!*训练集音频文件目录", "*实验/模型名": "*Deney/model adı",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*文本标注文件": "*Metin etiketleme dosyası",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*训练集音频文件目录": "*Eğitim seti ses dosyası dizini",
".list标注文件的路径": "#!.list标注文件的路径", "*请上传并填写参考信息": "*Lütfen referans bilgilerini yükleyin ve doldurun",
"0-前置数据集获取工具": "#!0-前置数据集获取工具", "*请填写需要合成的目标文本和语种模式": "*Lütfen sentezlenecek hedef metni ve dil modunu giriniz.",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "#!0a-UVR5人声伴奏分离&去混响去延迟工具", ".list标注文件的路径": ".list etiketleme dosyasının yolu",
"0b-语音切分工具": "#!0b-语音切分工具", "0-前置数据集获取工具": "0-Ön veri seti alma aracı",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 vokal eşlik ayırma & yankıyı giderme gecikme aracı",
"0c-中文批量离线ASR工具": "#!0c-中文批量离线ASR工具", "0b-语音切分工具": "0b-Ses bölme aracı",
"0d-语音文本校对标注工具": "#!0d-语音文本校对标注工具", "0bb-语音降噪工具": "0bb-Ses gürültü azaltma aracı",
"1-GPT-SoVITS-TTS": "#!1-GPT-SoVITS-TTS", "0c-中文批量离线ASR工具": "0c-Çince toplu offline ASR aracı",
"1A-训练集格式化工具": "#!1A-训练集格式化工具", "0d-语音文本校对标注工具": "0d-Ses ve metin düzeltme etiketleme aracı",
"1Aa-文本内容": "#!1Aa-文本内容", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
"1Aabc-训练集格式化一键三连": "#!1Aabc-训练集格式化一键三连", "1A-训练集格式化工具": "1A-Eğitim seti formatlama aracı",
"1Ab-SSL自监督特征提取": "#!1Ab-SSL自监督特征提取", "1Aa-文本内容": "1Aa-Metin içeriği",
"1Ac-语义token提取": "#!1Ac-语义token提取", "1Aabc-训练集格式化一键三连": "1Aabc-Eğitim seti formatlama tek tuşla üçleme",
"1B-微调训练": "#!1B-微调训练", "1Ab-SSL自监督特征提取": "1Ab-SSL kendi kendine denetimli özellik çıkarma",
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "#!1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", "1Ac-语义token提取": "1Ac-Anlamsal token çıkarma",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "#!1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", "1B-微调训练": "1B-Fine-tuning eğitimi",
"1C-推理": "#!1C-推理", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS eğitimi. Paylaşım için model dosyaları SoVITS_weights altında çıkarılır.",
"2-GPT-SoVITS-变声": "#!2-GPT-SoVITS-变声", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT eğitimi. Paylaşım için model dosyaları GPT_weights altında çıkarılır.",
"ASR 模型": "#!ASR 模型", "1C-推理": "1C-Çıkarım",
"ASR 模型尺寸": "#!ASR 模型尺寸", "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1. DeEcho-DeReverb modelinin işleme süresi, diğer iki DeEcho modelinin neredeyse iki katıdır;",
"ASR 语言设置": "#!ASR 语言设置", "1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1. Ses koruma: Arka vokal içermeyen sesler için bu seçeneği kullanın, ana sesi HP5'ten daha iyi korur. HP2 ve HP3 adlı iki model içerir; HP3, arka vokali biraz kaçırabilir ancak ana sesi HP2'ye göre biraz daha iyi korur;",
"ASR进程输出信息": "#!ASR进程输出信息", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-Ses Değiştirme",
"GPT模型列表": "#!GPT模型列表", "2、MDX-Net-Dereverb模型挺慢的": "2. MDX-Net-Dereverb modeli oldukça yavaştır;",
"GPT训练进程输出信息": "#!GPT训练进程输出信息", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2. Sadece ana sesi koruma: Arka vokalleri içeren sesler için bu seçeneği kullanın, ana sesi zayıflatabilir. İçinde HP5 modeli var;",
"GPU卡号,只能填1个整数": "#!GPU卡号,只能填1个整数", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3. Kişisel olarak en temiz konfigürasyon MDX-Net'in ardından DeEcho-Aggressive'dir.",
"GPU卡号以-分割,每个卡号一个进程": "#!GPU卡号以-分割,每个卡号一个进程", "3、去混响、去延迟模型by FoxJoy": "3. Yankı ve gecikme giderme modeli (FoxJoy tarafından):",
"SSL进程输出信息": "#!SSL进程输出信息", "ASR 模型": "ASR modeli",
"SoVITS模型列表": "#!SoVITS模型列表", "ASR 模型尺寸": "ASR model boyutu",
"SoVITS训练进程输出信息": "#!SoVITS训练进程输出信息", "ASR 语言设置": "ASR dil ayarları",
"TTS推理WebUI进程输出信息": "#!TTS推理WebUI进程输出信息", "ASR进程输出信息": "ASR işlemi çıktı bilgisi",
"TTS推理进程已关闭": "#!TTS推理进程已关闭", "GPT模型列表": "GPT model listesi",
"TTS推理进程已开启": "#!TTS推理进程已开启", "GPT训练进程输出信息": "GPT eğitimi işlemi çıktı bilgisi",
"UVR5已关闭": "#!UVR5已关闭", "GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT örnekleme parametreleri (referans metin olmadığında çok düşük olmamalıdır. Emin değilseniz varsayılanı kullanın):",
"UVR5已开启": "#!UVR5已开启", "GPU卡号,只能填1个整数": "GPU kart numarası, sadece bir tamsayı girilebilir",
"UVR5进程输出信息": "#!UVR5进程输出信息", "GPU卡号以-分割,每个卡号一个进程": "GPU kart numaraları - ile ayrılır, her kart numarası için bir işlem",
"alpha_mix:混多少比例归一化后音频进来": "#!alpha_mix:混多少比例归一化后音频进来", "SSL进程输出信息": "SSL işlemi çıktı bilgisi",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)", "SoVITS模型列表": "SoVITS model listesi",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "#!hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", "SoVITS训练进程输出信息": "SoVITS eğitimi işlemi çıktı bilgisi",
"max:归一化后最大值多少": "#!max:归一化后最大值多少", "TTS推理WebUI进程输出信息": "TTS çıkarımı WebUI işlemi çıktı bilgisi",
"max_sil_kept:切完后静音最多留多长": "#!max_sil_kept:切完后静音最多留多长", "TTS推理进程已关闭": "TTS çıkarım işlemi kapatıldı",
"min_interval:最短切割间隔": "#!min_interval:最短切割间隔", "TTS推理进程已开启": "TTS çıkarım işlemi başlatıldı",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "#!min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值", "UVR5已关闭": "UVR5 kapandı",
"temperature": "#!temperature", "UVR5已开启": "UVR5 açıldı",
"threshold:音量小于这个值视作静音的备选切割点": "#!threshold:音量小于这个值视作静音的备选切割点", "UVR5进程输出信息": "UVR5 işlem çıktı bilgisi",
"top_k": "#!top_k", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:Normalizasyondan sonraki sesin ne kadarlık bir oranı karıştırılsın",
"top_p": "#!top_p", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:Ses seviyesi eğrisi nasıl hesaplanır, ne kadar küçükse hassasiyet o kadar yüksek ve hesaplama yükü o kadar artar (hassasiyet arttıkça etki mutlaka daha iyi olmaz)",
"一键三连进程输出信息": "#!一键三连进程输出信息", "max:归一化后最大值多少": "max:Normalizasyondan sonra maksimum değer ne kadar",
"不切": "#!不切", "max_sil_kept:切完后静音最多留多长": "max_sil_kept:Kesimden sonra en fazla ne kadar sessizlik bırakılır",
"中文": "#!中文", "min_interval:最短切割间隔": "min_interval:Minimum kesim aralığı",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: bölümün minimum uzunluğu, ilk bölüm çok kısa ise, bu değeri aşana kadar sonraki bölümlerle birleştirilir",
"中英混合": "#!中英混合", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "threshold:Ses bu değerden düşükse sessiz olarak kabul edilen alternatif kesim noktası",
"top_k": "top_k",
"top_p": "top_p",
"一键三连进程输出信息": "Tek tuşla üçleme işlemi çıktı bilgisi",
"不切": "Kesme",
"中文": "Çince",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Çince öğretici belgehttps://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "Çince ve İngilizce karışık",
"也可批量输入音频文件, 二选一, 优先读文件夹": "Ses dosyaları ayrıca toplu olarak, iki seçimle, öncelikli okuma klasörüyle içe aktarılabilir", "也可批量输入音频文件, 二选一, 优先读文件夹": "Ses dosyaları ayrıca toplu olarak, iki seçimle, öncelikli okuma klasörüyle içe aktarılabilir",
"人声伴奏分离批量处理, 使用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>&emsp;(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍<br>2、MDX-Net-Dereverb模型挺慢的<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "Batch işleme kullanarak vokal eşlik ayrımı için UVR5 modeli kullanılır.<br>Geçerli bir klasör yol formatı örneği: D:\\path\\to\\input\\folder (dosya yöneticisi adres çubuğundan kopyalanır).<br>Model üç kategoriye ayrılır:<br>1. Vokalleri koru: Bu seçeneği, harmoni içermeyen sesler için kullanın. HP5'ten daha iyi bir şekilde vokalleri korur. İki dahili model içerir: HP2 ve HP3. HP3, eşlik sesini hafifçe sızdırabilir, ancak vokalleri HP2'den biraz daha iyi korur.<br>2. Sadece ana vokalleri koru: Bu seçeneği, harmoni içeren sesler için kullanın. Ana vokalleri zayıflatabilir. Bir dahili model içerir: HP5.<br>3. Reverb ve gecikme modelleri (FoxJoy tarafından):<br>(1) MDX-Net: Stereo reverb'i kaldırmak için en iyi seçenek, ancak mono reverb'i kaldıramaz;<br>(234) DeEcho: Gecikme efektlerini kaldırır. Agresif mod, Normal moda göre daha kapsamlı bir şekilde kaldırma yapar. DeReverb ayrıca reverb'i kaldırır ve mono reverb'i kaldırabilir, ancak yoğun yankılı yüksek frekanslı içerikler için çok etkili değildir.<br>Reverb/gecikme notları:<br>1. DeEcho-DeReverb modelinin işleme süresi diğer iki DeEcho modeline göre yaklaşık olarak iki kat daha uzundur.<br>2. MDX-Net-Dereverb modeli oldukça yavaştır.<br>3. Tavsiye edilen en temiz yapılandırma önce MDX-Net'i uygulamak ve ardından DeEcho-Aggressive uygulamaktır.", "人声伴奏分离批量处理, 使用UVR5模型。": "Vokal ve akor ayırma toplu işleme, UVR5 modelini kullanarak.",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "Vokal çıkarma agresiflik derecesi",
"以下文件或文件夹不存在:": "Böyle Bir Dosya veya Klasör Yok:",
"以下模型不存在:": "Böyle bir model yok:",
"伴奏人声分离&去混响&去回声": "Vokal/Müzik Ayrıştırma ve Yankı Giderme", "伴奏人声分离&去混响&去回声": "Vokal/Müzik Ayrıştırma ve Yankı Giderme",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "Referans metin modu olmadan kullanıldığında, referans sesi net duyulmadığında (ne yazılacağı bilinmiyorsa) açık bırakılması önerilir, bu durumda girilen referans metni göz ardı edilir.",
"保存频率save_every_epoch": "Kaydetme sıklığı (save_every_epoch):", "保存频率save_every_epoch": "Kayıt sıklığı save_every_epoch",
"凑50字一切": "#!凑50字一切", "凑50字一切": "50 kelime birleştir ve kes",
"凑四句一切": "#!凑四句一切", "凑四句一切": "Dört cümleyi bir araya getirip kes",
"切分后文本": "#!切分后文本", "切分后的子音频的输出根目录": "Bölündükten sonra alt ses dosyalarının çıktı kök dizini",
"切分后的子音频的输出根目录": "#!切分后的子音频的输出根目录", "切割使用的进程数": "Kesim için kullanılan işlem sayısı",
"切割使用的进程数": "#!切割使用的进程数", "刷新模型路径": "Model yolu yenile",
"刷新模型路径": "#!刷新模型路径", "前端处理后的文本(每句):": "Ön işleme tabi tutulan metin (her cümle):",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "去混响/去延迟,附:": "Yankı giderme/Geçikme giderme, ek:",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "参考音频在3~10秒范围外请更换": "Referans ses dosyası 3~10 saniye aralığının dışında, lütfen değiştirin!",
"参考音频的文本": "#!参考音频的文本", "参考音频的文本": "Referans ses dosyasının metni",
"参考音频的语种": "#!参考音频的语种", "参考音频的语种": "Referans ses dosyasının dili",
"合成语音": "#!合成语音", "合成语音": "Ses sentezi",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Geçerli klasör yolu formatı örneği: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (dosya yöneticisi adres çubuğundan kopyalayabilirsiniz).",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "Kesmeye uygun ses dosyalarının bulunduğu dizini doldurun! Okunan ses dosyasının tam yolu = bu dizin + list dosyasındaki dalga biçimiyle eşleşen dosya adı (tam yol değil). Boş bırakılırsa, .list dosyasındaki tam yol kullanılır.",
"多语种混合": "#!多语种混合", "多语种混合": "Çok dilli karışım",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "Çok dilli karışık (Yue)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "Gerçekten girilen referans metin:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "Gerçekten girilen hedef metin (cümleler kesildikten sonra):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "Gerçekten girilen hedef metin (her cümle):",
"实际输入的目标文本:": "Gerçekten girilen hedef metin:",
"导出文件格式": "Dışa aktarma dosya formatı", "导出文件格式": "Dışa aktarma dosya formatı",
"开启GPT训练": "#!开启GPT训练", "开启GPT训练": "GPT eğitimini başlat",
"开启SSL提取": "#!开启SSL提取", "开启SSL提取": "SSL çıkarmayı başlat",
"开启SoVITS训练": "#!开启SoVITS训练", "开启SoVITS训练": "SoVITS eğitimini başlat",
"开启一键三连": "#!开启一键三连", "开启一键三连": "Tek tuşla üçlemeyi başlat",
"开启文本获取": "#!开启文本获取", "开启文本获取": "Metin alma başlat",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "Referans metni olmayan mod açık. Referans metni doldurulmazsa bu mod otomatik olarak açılır.",
"开启离线批量ASR": "#!开启离线批量ASR", "开启离线批量ASR": "Offline toplu ASR başlat",
"开启语义token提取": "#!开启语义token提取", "开启语义token提取": "Anlamsal token çıkarmayı başlat",
"开启语音切割": "#!开启语音切割", "开启语音切割": "Ses kesimi başlat",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "Ses gürültü azaltmayı başlat",
"怎么切": "#!怎么切", "怎么切": "Nasıl kesilir",
"总训练轮数total_epoch": "Toplam eğitim turu (total_epoch):", "总训练轮数total_epoch": "Toplam eğitim turu sayısı total_epoch",
"总训练轮数total_epoch不建议太高": "#!总训练轮数total_epoch不建议太高", "总训练轮数total_epoch不建议太高": "Toplam eğitim turu sayısı total_epoch, çok yüksek önerilmez",
"打标工具WebUI已关闭": "#!打标工具WebUI已关闭", "打标工具WebUI已关闭": "Etiketleme aracı WebUI'si kapatıldı",
"打标工具WebUI已开启": "#!打标工具WebUI已开启", "打标工具WebUI已开启": "Etiketleme aracı WebUI'si açıldı",
"打标工具进程输出信息": "#!打标工具进程输出信息", "打标工具进程输出信息": "Etiketleme aracı işlemi çıktı bilgisi",
"指定输出主人声文件夹": "Vokal için çıkış klasörünü belirtin:", "指定输出主人声文件夹": "Vokal için çıkış klasörünü belirtin:",
"指定输出非主人声文件夹": "Müzik ve diğer sesler için çıkış klasörünü belirtin:", "指定输出非主人声文件夹": "Müzik ve diğer sesler için çıkış klasörünü belirtin:",
"按中文句号。切": "#!按中文句号。切", "按中文句号。切": "Çince dönem işaretine göre kes",
"按标点符号切": "#!按标点符号切", "按标点符号切": "Noktalama işaretlerine göre kes",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "İngilizce nokta işaretine göre kes",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "#!文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "veri türü doğruluğu",
"文本模块学习率权重": "#!文本模块学习率权重", "文本模块学习率权重": "Metin modülü öğrenme oranıırlığı",
"文本进程输出信息": "#!文本进程输出信息", "文本进程输出信息": "Metin işlemi çıktı bilgisi",
"施工中,请静候佳音": "#!施工中,请静候佳音", "施工中,请静候佳音": "Yapım aşamasında, lütfen iyi haberler için bekleyin",
"日文": "#!日文", "日文": "Japonca",
"日英混合": "#!日英混合", "日英混合": "Japonca ve İngilizce karışımı",
"是否仅保存最新的ckpt文件以节省硬盘空间": "Sadece en son '.ckpt' dosyasını kaydet:", "是否仅保存最新的ckpt文件以节省硬盘空间": "Sadece en yeni ckpt dosyasını kaydederek disk alanından tasarruf edilsin mi",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Her kaydetme noktasında son küçük bir modeli 'weights' klasörüne kaydetmek için:", "是否在每次保存时间点将最终小模型保存至weights文件夹": "Her kayıt zamanında son küçük modelin weights klasörüne kaydedilmesi gerekiyor mu",
"是否开启TTS推理WebUI": "#!是否开启TTS推理WebUI", "是否开启TTS推理WebUI": "TTS çıkarımı WebUI'si başlatılsın mı",
"是否开启UVR5-WebUI": "#!是否开启UVR5-WebUI", "是否开启UVR5-WebUI": "UVR5-WebUI açılsın mı",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "dpo eğitim seçeneği açılsın mı? (deneysel)",
"是否开启打标WebUI": "#!是否开启打标WebUI", "是否开启打标WebUI": "Etiketleme WebUI'si başlatılsın mı",
"显卡信息": "GPU Bilgisi", "是否直接对上次合成结果调整语速。防止随机性。": "Son sentez sonucunun konuşma hızını doğrudan ayarlamak, rastlantısallığı önlemek için mi?",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Bu yazılım, MIT lisansı altında açık kaynaklıdır. Yazarın yazılım üzerinde herhangi bir kontrolü yoktur. Yazılımı kullanan ve yazılım tarafından dışa aktarılan sesleri dağıtan kullanıcılar sorumludur. <br>Eğer bu maddeyle aynı fikirde değilseniz, yazılım paketi içindeki herhangi bir kod veya dosyayı kullanamaz veya referans göremezsiniz. Detaylar için kök dizindeki <b>Agreement-LICENSE.txt</b> dosyasına bakınız.", "显卡信息": "Ekran kartı bilgisi",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Bu yazılım MIT lisansı ile açık kaynaktır, yazar yazılım üzerinde herhangi bir kontrol gücüne sahip değildir, yazılımı kullanıcılar ve yazılım tarafından üretilen sesleri yayınlayanlar tüm sorumluluğu üstlenir. <br>Eğer bu şartları kabul etmiyorsanız, yazılım paketindeki hiçbir kodu veya dosyayı kullanamaz veya atıfta bulunamazsınız. Ayrıntılar için ana dizindeki <b>LICENSE</b>'ı görün.",
"模型": "Model", "模型": "Model",
"模型切换": "#!模型切换", "模型分为三类:": "Modeller üç türdedir:",
"每张显卡的batch_size": "Her GPU için yığın boyutu (batch_size):", "模型切换": "Model değiştirme",
"终止ASR进程": "#!终止ASR进程", "每张显卡的batch_size": "Her bir ekran kartı için batch_size",
"终止GPT训练": "#!终止GPT训练", "版本": "Versiyon",
"终止SSL提取进程": "#!终止SSL提取进程", "粤英混合": "Yue-İngilizce Karışık",
"终止SoVITS训练": "#!终止SoVITS训练", "粤语": "Yue",
"终止一键三连": "#!终止一键三连", "终止ASR进程": "ASR işlemini durdur",
"终止文本获取进程": "#!终止文本获取进程", "终止GPT训练": "GPT eğitimini durdur",
"终止语义token提取进程": "#!终止语义token提取进程", "终止SSL提取进程": "SSL çıkarma işlemini durdur",
"终止语音切割": "#!终止语音切割", "终止SoVITS训练": "SoVITS eğitimini durdur",
"终止语音降噪进程": "#!终止语音降噪进程", "终止一键三连": "Tek tuşla üçlemeyi durdur",
"英文": "#!英文", "终止文本获取进程": "Metin alma işlemini durdur",
"语义token提取进程输出信息": "#!语义token提取进程输出信息", "终止语义token提取进程": "Anlamsal token çıkarma işlemini durdur",
"语音切割进程输出信息": "#!语音切割进程输出信息", "终止语音切割": "Ses kesimini durdur",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "终止语音降噪进程": "Gürültü azaltma işlemini durdur",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "英文": "İngilizce",
"请输入有效文本": "#!请输入有效文本", "语义token提取进程输出信息": "Anlamsal token çıkarma işlemi çıktı bilgisi",
"语速": "Konuşma hızı",
"语速调整,高为更快": "Konuşma hızını ayarla, yüksek daha hızlı",
"语音切割进程输出信息": "Ses kesim işlemi çıktı bilgisi",
"语音降噪进程输出信息": "Gürültü azaltma işlemi çıktı bilgisi",
"请上传3~10秒内参考音频超过会报错": "Lütfen 3~10 saniye arasında bir referans ses dosyası yükleyin, aşım durumunda hata verilecektir!",
"请上传参考音频": "Lütfen Referans Sesi Yükleyin",
"请填入推理文本": "Lütfen Hedef Metni Girin",
"请输入有效文本": "Geçerli metin girin",
"转换": "Dönüştür", "转换": "Dönüştür",
"输入待处理音频文件夹路径": "İşlenecek ses klasörünün yolunu girin:", "输入待处理音频文件夹路径": "İşlenecek ses klasörünün yolunu girin:",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "Dosya klasörü yolu girin",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "#!输出logs/实验名目录下应有23456开头的文件和文件夹", "输出logs/实验名目录下应有23456开头的文件和文件夹": "Çıktı logs/deney adı dizininde 23456 ile başlayan dosya ve klasörler olmalı",
"输出信息": ıkış bilgisi", "输出信息": ıkış bilgisi",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": ıktı klasörü yolu",
"输出的语音": "#!输出的语音", "输出的语音": ıktı sesi",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "#!选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "Eğitimi tamamlanmış ve SoVITS_weights ile GPT_weights altına kaydedilmiş modeli seçin. Varsayılan bir temel modeldir, 5 saniyelik Zero Shot TTS deneyimi için kullanılır.",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "Gürültü azaltma sonuçları çıktı klasörü",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "Gürültü azaltma ses dosyaları giriş klasörü",
"需要合成的切分前文本": "#!需要合成的切分前文本", "需要合成的文本": "Sentezlenmesi gereken metin",
"需要合成的文本": "#!需要合成的文本", "需要合成的语种": "Sentezlenmesi gereken dil",
"需要合成的语种": "#!需要合成的语种", "韩文": "Korece",
"音频自动切分输入路径,可文件可文件夹": "#!音频自动切分输入路径,可文件可文件夹", "韩英混合": "Korece-İngilizce Karışık",
"预训练的GPT模型路径": "#!预训练的GPT模型路径", "音频自动切分输入路径,可文件可文件夹": "Ses otomatik bölme giriş yolu, dosya veya klasör olabilir",
"预训练的SSL模型路径": "#!预训练的SSL模型路径", "预训练的GPT模型路径": "Ön eğitilmiş GPT model yolu",
"预训练的SoVITS-D模型路径": "#!预训练的SoVITS-D模型路径", "预训练的SSL模型路径": "Ön eğitilmiş SSL model yolu",
"预训练的SoVITS-G模型路径": "#!预训练的SoVITS-G模型路径", "预训练的SoVITS-D模型路径": "Ön eğitilmiş SoVITS-D model yolu",
"预训练的中文BERT模型路径": "#!预训练的中文BERT模型路径" "预训练的SoVITS-G模型路径": "Ön eğitilmiş SoVITS-G model yolu",
"预训练的中文BERT模型路径": "Ön eğitilmiş Çince BERT model yolu"
} }

View File

@ -1,4 +1,6 @@
{ {
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;",
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho:去除延迟效果。Aggressive 比 Normal 去除得更彻底DeReverb 额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。",
"*GPT模型列表": "*GPT模型列表", "*GPT模型列表": "*GPT模型列表",
"*SoVITS模型列表": "*SoVITS模型列表", "*SoVITS模型列表": "*SoVITS模型列表",
"*实验/模型名": "*实验/模型名", "*实验/模型名": "*实验/模型名",
@ -23,13 +25,20 @@
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。",
"1C-推理": "1C-推理", "1C-推理": "1C-推理",
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍",
"1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点",
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-变声", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-变声",
"2、MDX-Net-Dereverb模型挺慢的": "2、MDX-Net-Dereverb模型挺慢的",
"2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型",
"3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。",
"3、去混响、去延迟模型by FoxJoy": "3、去混响、去延迟模型by FoxJoy",
"ASR 模型": "ASR 模型", "ASR 模型": "ASR 模型",
"ASR 模型尺寸": "ASR 模型尺寸", "ASR 模型尺寸": "ASR 模型尺寸",
"ASR 语言设置": "ASR 语言设置", "ASR 语言设置": "ASR 语言设置",
"ASR进程输出信息": "ASR进程输出信息", "ASR进程输出信息": "ASR进程输出信息",
"GPT模型列表": "GPT模型列表", "GPT模型列表": "GPT模型列表",
"GPT训练进程输出信息": "GPT训练进程输出信息", "GPT训练进程输出信息": "GPT训练进程输出信息",
"GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT采样参数(无参考文本时不要太低。不懂就用默认)",
"GPU卡号,只能填1个整数": "GPU卡号,只能填1个整数", "GPU卡号,只能填1个整数": "GPU卡号,只能填1个整数",
"GPU卡号以-分割,每个卡号一个进程": "GPU卡号以-分割,每个卡号一个进程", "GPU卡号以-分割,每个卡号一个进程": "GPU卡号以-分割,每个卡号一个进程",
"SSL进程输出信息": "SSL进程输出信息", "SSL进程输出信息": "SSL进程输出信息",
@ -42,7 +51,6 @@
"UVR5已开启": "UVR5已开启", "UVR5已开启": "UVR5已开启",
"UVR5进程输出信息": "UVR5进程输出信息", "UVR5进程输出信息": "UVR5进程输出信息",
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例归一化后音频进来", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例归一化后音频进来",
"gpt采样参数(无参考文本时不要太低)": "gpt采样参数(无参考文本时不要太低)",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)",
"max:归一化后最大值多少": "max:归一化后最大值多少", "max:归一化后最大值多少": "max:归一化后最大值多少",
"max_sil_kept:切完后静音最多留多长": "max_sil_kept:切完后静音最多留多长", "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切完后静音最多留多长",
@ -58,25 +66,28 @@
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "中英混合", "中英混合": "中英混合",
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
"人声伴奏分离批量处理, 使用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>&emsp;(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>&emsp;(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模型。": "人声伴奏分离批量处理, 使用UVR5模型。",
"人声提取激进程度": "人声提取激进程度", "人声提取激进程度": "人声提取激进程度",
"以下文件或文件夹不存在:": "以下文件或文件夹不存在:",
"以下模型不存在:": "以下模型不存在:",
"伴奏人声分离&去混响&去回声": "伴奏人声分离&去混响&去回声", "伴奏人声分离&去混响&去回声": "伴奏人声分离&去混响&去回声",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。",
"保存频率save_every_epoch": "保存频率save_every_epoch", "保存频率save_every_epoch": "保存频率save_every_epoch",
"凑50字一切": "凑50字一切", "凑50字一切": "凑50字一切",
"凑四句一切": "凑四句一切", "凑四句一切": "凑四句一切",
"切分后文本": "切分后文本",
"切分后的子音频的输出根目录": "切分后的子音频的输出根目录", "切分后的子音频的输出根目录": "切分后的子音频的输出根目录",
"切割使用的进程数": "切割使用的进程数", "切割使用的进程数": "切割使用的进程数",
"刷新模型路径": "刷新模型路径", "刷新模型路径": "刷新模型路径",
"前端处理后的文本(每句):": "前端处理后的文本(每句):", "前端处理后的文本(每句):": "前端处理后的文本(每句):",
"去混响/去延迟,附:": "去混响/去延迟,附:",
"参考音频在3~10秒范围外请更换": "参考音频在3~10秒范围外请更换", "参考音频在3~10秒范围外请更换": "参考音频在3~10秒范围外请更换",
"参考音频的文本": "参考音频的文本", "参考音频的文本": "参考音频的文本",
"参考音频的语种": "参考音频的语种", "参考音频的语种": "参考音频的语种",
"合成语音": "合成语音", "合成语音": "合成语音",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。",
"多语种混合": "多语种混合", "多语种混合": "多语种混合",
"多语种混合(粤语)": "多语种混合(粤语)",
"实际输入的参考文本:": "实际输入的参考文本:", "实际输入的参考文本:": "实际输入的参考文本:",
"实际输入的目标文本(切句后):": "实际输入的目标文本(切句后):", "实际输入的目标文本(切句后):": "实际输入的目标文本(切句后):",
"实际输入的目标文本(每句):": "实际输入的目标文本(每句):", "实际输入的目标文本(每句):": "实际输入的目标文本(每句):",
@ -103,7 +114,7 @@
"按中文句号。切": "按中文句号。切", "按中文句号。切": "按中文句号。切",
"按标点符号切": "按标点符号切", "按标点符号切": "按标点符号切",
"按英文句号.切": "按英文句号.切", "按英文句号.切": "按英文句号.切",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "数据类型精度",
"文本模块学习率权重": "文本模块学习率权重", "文本模块学习率权重": "文本模块学习率权重",
"文本进程输出信息": "文本进程输出信息", "文本进程输出信息": "文本进程输出信息",
"施工中,请静候佳音": "施工中,请静候佳音", "施工中,请静候佳音": "施工中,请静候佳音",
@ -115,11 +126,16 @@
"是否开启UVR5-WebUI": "是否开启UVR5-WebUI", "是否开启UVR5-WebUI": "是否开启UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "是否开启dpo训练选项(实验性)",
"是否开启打标WebUI": "是否开启打标WebUI", "是否开启打标WebUI": "是否开启打标WebUI",
"是否直接对上次合成结果调整语速。防止随机性。": "是否直接对上次合成结果调整语速。防止随机性。",
"显卡信息": "显卡信息", "显卡信息": "显卡信息",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.", "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.",
"模型": "模型", "模型": "模型",
"模型分为三类:": "模型分为三类:",
"模型切换": "模型切换", "模型切换": "模型切换",
"每张显卡的batch_size": "每张显卡的batch_size", "每张显卡的batch_size": "每张显卡的batch_size",
"版本": "版本",
"粤英混合": "粤英混合",
"粤语": "粤语",
"终止ASR进程": "终止ASR进程", "终止ASR进程": "终止ASR进程",
"终止GPT训练": "终止GPT训练", "终止GPT训练": "终止GPT训练",
"终止SSL提取进程": "终止SSL提取进程", "终止SSL提取进程": "终止SSL提取进程",
@ -131,9 +147,13 @@
"终止语音降噪进程": "终止语音降噪进程", "终止语音降噪进程": "终止语音降噪进程",
"英文": "英文", "英文": "英文",
"语义token提取进程输出信息": "语义token提取进程输出信息", "语义token提取进程输出信息": "语义token提取进程输出信息",
"语速": "语速",
"语速调整,高为更快": "语速调整,高为更快",
"语音切割进程输出信息": "语音切割进程输出信息", "语音切割进程输出信息": "语音切割进程输出信息",
"语音降噪进程输出信息": "语音降噪进程输出信息", "语音降噪进程输出信息": "语音降噪进程输出信息",
"请上传3~10秒内参考音频超过会报错": "请上传3~10秒内参考音频超过会报错", "请上传3~10秒内参考音频超过会报错": "请上传3~10秒内参考音频超过会报错",
"请上传参考音频": "请上传参考音频",
"请填入推理文本": "请填入推理文本",
"请输入有效文本": "请输入有效文本", "请输入有效文本": "请输入有效文本",
"转换": "转换", "转换": "转换",
"输入待处理音频文件夹路径": "输入待处理音频文件夹路径", "输入待处理音频文件夹路径": "输入待处理音频文件夹路径",
@ -145,9 +165,10 @@
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。",
"降噪结果输出文件夹": "降噪结果输出文件夹", "降噪结果输出文件夹": "降噪结果输出文件夹",
"降噪音频文件输入文件夹": "降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "降噪音频文件输入文件夹",
"需要合成的切分前文本": "需要合成的切分前文本",
"需要合成的文本": "需要合成的文本", "需要合成的文本": "需要合成的文本",
"需要合成的语种": "需要合成的语种", "需要合成的语种": "需要合成的语种",
"韩文": "韩文",
"韩英混合": "韩英混合",
"音频自动切分输入路径,可文件可文件夹": "音频自动切分输入路径,可文件可文件夹", "音频自动切分输入路径,可文件可文件夹": "音频自动切分输入路径,可文件可文件夹",
"预训练的GPT模型路径": "预训练的GPT模型路径", "预训练的GPT模型路径": "预训练的GPT模型路径",
"预训练的SSL模型路径": "预训练的SSL模型路径", "预训练的SSL模型路径": "预训练的SSL模型路径",

View File

@ -1,157 +1,178 @@
{ {
"*GPT模型列表": "#!*GPT模型列表", "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):對於雙通道混響是最佳選擇,但不能去除單通道混響;",
"*SoVITS模型列表": "#!*SoVITS模型列表", "(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho: 去除延遲效果。Aggressive 比 Normal 去除得更徹底DeReverb 額外去除混響,可去除單聲道混響,但對高頻重的板式混響去不乾淨。",
"*实验/模型名": "#!*实验/模型名", "*GPT模型列表": "*GPT模型列表",
"*文本标注文件": "#!*文本标注文件", "*SoVITS模型列表": "*SoVITS模型列表",
"*训练集音频文件目录": "#!*训练集音频文件目录", "*实验/模型名": "*實驗/模型名",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*文本标注文件": "*文本標注文件",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*训练集音频文件目录": "*訓練集音頻文件目錄",
".list标注文件的路径": "#!.list标注文件的路径", "*请上传并填写参考信息": "*請上傳並填寫參考信息",
"0-前置数据集获取工具": "#!0-前置数据集获取工具", "*请填写需要合成的目标文本和语种模式": "請填寫需要合成的目標文本和語言模式",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "#!0a-UVR5人声伴奏分离&去混响去延迟工具", ".list标注文件的路径": ".list標註文件的路徑",
"0b-语音切分工具": "#!0b-语音切分工具", "0-前置数据集获取工具": "0-前置數據集獲取工具",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人聲伴奏分離&去混響去延遲工具",
"0c-中文批量离线ASR工具": "#!0c-中文批量离线ASR工具", "0b-语音切分工具": "0b-語音切分工具",
"0d-语音文本校对标注工具": "#!0d-语音文本校对标注工具", "0bb-语音降噪工具": "0bb-語音降噪工具",
"1-GPT-SoVITS-TTS": "#!1-GPT-SoVITS-TTS", "0c-中文批量离线ASR工具": "0c-中文批量離線ASR工具",
"1A-训练集格式化工具": "#!1A-训练集格式化工具", "0d-语音文本校对标注工具": "0d-語音文本校對標注工具",
"1Aa-文本内容": "#!1Aa-文本内容", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
"1Aabc-训练集格式化一键三连": "#!1Aabc-训练集格式化一键三连", "1A-训练集格式化工具": "1A-訓練集格式化工具",
"1Ab-SSL自监督特征提取": "#!1Ab-SSL自监督特征提取", "1Aa-文本内容": "1Aa-文本內容",
"1Ac-语义token提取": "#!1Ac-语义token提取", "1Aabc-训练集格式化一键三连": "1Aabc-訓練集格式化一鍵三連",
"1B-微调训练": "#!1B-微调训练", "1Ab-SSL自监督特征提取": "1Ab-SSL自監督特徵提取",
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "#!1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", "1Ac-语义token提取": "1Ac-語義token提取",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "#!1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", "1B-微调训练": "1B-微調訓練",
"1C-推理": "#!1C-推理", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。用於分享的模型文件輸出在SoVITS_weights下。",
"2-GPT-SoVITS-变声": "#!2-GPT-SoVITS-变声", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。用於分享的模型文件輸出在GPT_weights下。",
"ASR 模型": "#!ASR 模型", "1C-推理": "1C-推理",
"ASR 模型尺寸": "#!ASR 模型尺寸", "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1、DeEcho-DeReverb 模型的處理時間是另外兩個 DeEcho 模型的接近兩倍;",
"ASR 语言设置": "#!ASR 语言设置", "1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1、保留人聲不帶和聲的音頻選這個對主人聲保留比HP5更好。內置HP2和HP3兩個模型HP3可能輕微漏伴奏但對主人聲保留比HP2稍微好一點點",
"ASR进程输出信息": "#!ASR进程输出信息", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-變聲",
"GPT模型列表": "#!GPT模型列表", "2、MDX-Net-Dereverb模型挺慢的": "2、MDX-Net-Dereverb 模型的處理時間挺慢的;",
"GPT训练进程输出信息": "#!GPT训练进程输出信息", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2、僅保留主人聲帶和聲的音頻選這個對主人聲可能有削弱。內置HP5一個模型",
"GPU卡号,只能填1个整数": "#!GPU卡号,只能填1个整数", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3、個人推薦的最乾淨的配置是先 MDX-Net 再 DeEcho-Aggressive。",
"GPU卡号以-分割,每个卡号一个进程": "#!GPU卡号以-分割,每个卡号一个进程", "3、去混响、去延迟模型by FoxJoy": "3、去混響、去延遲模型by FoxJoy",
"SSL进程输出信息": "#!SSL进程输出信息", "ASR 模型": "ASR 模型",
"SoVITS模型列表": "#!SoVITS模型列表", "ASR 模型尺寸": "ASR 模型尺寸",
"SoVITS训练进程输出信息": "#!SoVITS训练进程输出信息", "ASR 语言设置": "ASR 語言設置",
"TTS推理WebUI进程输出信息": "#!TTS推理WebUI进程输出信息", "ASR进程输出信息": "ASR進程輸出信息",
"TTS推理进程已关闭": "#!TTS推理进程已关闭", "GPT模型列表": "GPT模型列表",
"TTS推理进程已开启": "#!TTS推理进程已开启", "GPT训练进程输出信息": "GPT訓練進程輸出信息",
"UVR5已关闭": "#!UVR5已关闭", "GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT 采样参数(无参考文本时不要太低。不懂就用默认):",
"UVR5已开启": "#!UVR5已开启", "GPU卡号,只能填1个整数": "GPU卡號,只能填1個整數",
"UVR5进程输出信息": "#!UVR5进程输出信息", "GPU卡号以-分割,每个卡号一个进程": "GPU卡號以-分割,每個卡號一個進程",
"alpha_mix:混多少比例归一化后音频进来": "#!alpha_mix:混多少比例归一化后音频进来", "SSL进程输出信息": "SSL進程輸出信息",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)", "SoVITS模型列表": "SoVITS模型列表",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "#!hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", "SoVITS训练进程输出信息": "SoVITS訓練進程輸出信息",
"max:归一化后最大值多少": "#!max:归一化后最大值多少", "TTS推理WebUI进程输出信息": "TTS推理WebUI進程輸出信息",
"max_sil_kept:切完后静音最多留多长": "#!max_sil_kept:切完后静音最多留多长", "TTS推理进程已关闭": "TTS推理進程已關閉",
"min_interval:最短切割间隔": "#!min_interval:最短切割间隔", "TTS推理进程已开启": "TTS推理進程已開啟",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "#!min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值", "UVR5已关闭": "UVR5已關閉",
"temperature": "#!temperature", "UVR5已开启": "UVR5已開啟",
"threshold:音量小于这个值视作静音的备选切割点": "#!threshold:音量小于这个值视作静音的备选切割点", "UVR5进程输出信息": "UVR5進程輸出信息",
"top_k": "#!top_k", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例歸一化後音頻進來",
"top_p": "#!top_p", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎麼算音量曲線,越小精度越大計算量越高(不是精度越大效果越好)",
"一键三连进程输出信息": "#!一键三连进程输出信息", "max:归一化后最大值多少": "max:歸一化後最大值多少",
"不切": "#!不切", "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切完後靜音最多留多長",
"中文": "#!中文", "min_interval:最短切割间隔": "min_interval:最短切割間隔",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:每段最小多長,如果第一段太短一直和後面段連起來直到超過這個值",
"中英混合": "#!中英混合", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小於這個值視作靜音的備選切割點",
"top_k": "top_k",
"top_p": "top_p",
"一键三连进程输出信息": "一鍵三連進程輸出信息",
"不切": "不切",
"中文": "中文",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文檔https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "中英混合",
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
"人声伴奏分离批量处理, 使用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>&emsp;(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. 消除混響和延遲模型由FoxJoy提供<br>(1) MDX-Net對於立體聲混響的移除是最好的選擇但不能移除單聲道混響<br>&emsp;(234) DeEcho移除延遲效果。Aggressive模式比Normal模式移除得更徹底。DeReverb另外移除混響可以移除單聲道混響但對於高頻重的板式混響移除不乾淨。<br>消除混響/延遲注意事項:<br>1. DeEcho-DeReverb模型的處理時間是其他兩個DeEcho模型的近兩倍<br>2. MDX-Net-Dereverb模型相當慢<br>3. 個人推薦的最乾淨配置是先使用MDX-Net然後使用DeEcho-Aggressive。", "人声伴奏分离批量处理, 使用UVR5模型。": "人聲伴奏分離批量處理, 使用UVR5模型。",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "人聲提取激進程度",
"以下文件或文件夹不存在:": "沒有這樣的檔案或文件夾:",
"以下模型不存在:": "以下模型不存在:",
"伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲", "伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT聽不清參考音頻說的是啥不知道寫啥可以開啟開啟後無視填寫的參考文本。",
"保存频率save_every_epoch": "保存頻率save_every_epoch", "保存频率save_every_epoch": "保存頻率save_every_epoch",
"凑50字一切": "#!凑50字一切", "凑50字一切": "湊50字一切",
"凑四句一切": "#!凑四句一切", "凑四句一切": "湊四句一切",
"切分后文本": "#!切分后文本", "切分后的子音频的输出根目录": "切分後的子音頻的輸出根目錄",
"切分后的子音频的输出根目录": "#!切分后的子音频的输出根目录", "切割使用的进程数": "切割使用的進程數",
"切割使用的进程数": "#!切割使用的进程数", "刷新模型路径": "刷新模型路徑",
"刷新模型路径": "#!刷新模型路径", "前端处理后的文本(每句):": "前端處理後的文本(每句):",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "去混响/去延迟,附:": "去混響/去延遲,附",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "参考音频在3~10秒范围外请更换": "參考音頻在3~10秒範圍外請更換",
"参考音频的文本": "#!参考音频的文本", "参考音频的文本": "參考音頻的文本",
"参考音频的语种": "#!参考音频的语种", "参考音频的语种": "參考音頻的語種",
"合成语音": "#!合成语音", "合成语音": "合成語音",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的文件夾路徑格式舉例: E:\\codes\\py39\\vits_vc_gpu\\白鷺霜華測試樣例(去文件管理器地址欄拷就行了)。",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "填切割後音頻所在目錄!讀取的音頻文件完整路徑=該目錄-拼接-list文件裡波形對應的文件名不是全路徑。如果留空則使用.list文件裡的絕對全路徑。",
"多语种混合": "#!多语种混合", "多语种混合": "多語種混合",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "多語種混合 (粵語)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "實際輸入的參考文本:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "實際輸入的目標文本(切句後):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "實際輸入的目標文本(每句):",
"实际输入的目标文本:": "實際輸入的目標文本:",
"导出文件格式": "導出檔格式", "导出文件格式": "導出檔格式",
"开启GPT训练": "#!开启GPT训练", "开启GPT训练": "開啟GPT訓練",
"开启SSL提取": "#!开启SSL提取", "开启SSL提取": "開啟SSL提取",
"开启SoVITS训练": "#!开启SoVITS训练", "开启SoVITS训练": "開啟SoVITS訓練",
"开启一键三连": "#!开启一键三连", "开启一键三连": "開啟一鍵三連",
"开启文本获取": "#!开启文本获取", "开启文本获取": "開啟文本獲取",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "開啟無參考文本模式。不填參考文本亦相當於開啟。",
"开启离线批量ASR": "#!开启离线批量ASR", "开启离线批量ASR": "開啟離線批量ASR",
"开启语义token提取": "#!开启语义token提取", "开启语义token提取": "開啟語義token提取",
"开启语音切割": "#!开启语音切割", "开启语音切割": "開啟語音切割",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "開啟語音降噪",
"怎么切": "#!怎么切", "怎么切": "怎麼切",
"总训练轮数total_epoch": "總訓練輪數total_epoch", "总训练轮数total_epoch": "總訓練輪數total_epoch",
"总训练轮数total_epoch不建议太高": "#!总训练轮数total_epoch不建议太高", "总训练轮数total_epoch不建议太高": "總訓練輪數total_epoch不建議太高",
"打标工具WebUI已关闭": "#!打标工具WebUI已关闭", "打标工具WebUI已关闭": "打標工具WebUI已關閉",
"打标工具WebUI已开启": "#!打标工具WebUI已开启", "打标工具WebUI已开启": "打標工具WebUI已開啟",
"打标工具进程输出信息": "#!打标工具进程输出信息", "打标工具进程输出信息": "打標工具進程輸出信息",
"指定输出主人声文件夹": "指定输出主人声文件夹", "指定输出主人声文件夹": "指定输出主人声文件夹",
"指定输出非主人声文件夹": "指定输出非主人声文件夹", "指定输出非主人声文件夹": "指定输出非主人声文件夹",
"按中文句号。切": "#!按中文句号。切", "按中文句号。切": "按中文句號。切",
"按标点符号切": "#!按标点符号切", "按标点符号切": "按標點符號切",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "按英文句號.切",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "#!文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "數據類型精度",
"文本模块学习率权重": "#!文本模块学习率权重", "文本模块学习率权重": "文本模塊學習率權重",
"文本进程输出信息": "#!文本进程输出信息", "文本进程输出信息": "文本進程輸出信息",
"施工中,请静候佳音": "#!施工中,请静候佳音", "施工中,请静候佳音": "施工中,請靜候佳音",
"日文": "#!日文", "日文": "日文",
"日英混合": "#!日英混合", "日英混合": "日英混合",
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt文件以節省硬碟空間",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights文件夾",
"是否开启TTS推理WebUI": "#!是否开启TTS推理WebUI", "是否开启TTS推理WebUI": "是否開啟TTS推理WebUI",
"是否开启UVR5-WebUI": "#!是否开启UVR5-WebUI", "是否开启UVR5-WebUI": "是否開啟UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "是否開啟dpo訓練選項(實驗性)",
"是否开启打标WebUI": "#!是否开启打标WebUI", "是否开启打标WebUI": "是否開啟打標WebUI",
"显卡信息": "顯示卡資訊", "是否直接对上次合成结果调整语速。防止随机性。": "是否直接對上次合成結果調整語速。防止隨機性。",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源作者不對軟體具備任何控制力使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄<b>使用需遵守的協議-LICENSE.txt</b>。", "显卡信息": "顯卡信息",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟件以MIT協議開源, 作者不對軟件具備任何控制力, 使用軟件者、傳播軟件導出的聲音者自負全責. <br>如不認可該條款, 則不能使用或引用軟件包內任何代碼和文件. 詳見根目錄<b>LICENSE</b>.",
"模型": "模型", "模型": "模型",
"模型切换": "#!模型切换", "模型分为三类:": "模型分為三類:",
"每张显卡的batch_size": "每张显卡的batch_size", "模型切换": "模型切換",
"终止ASR进程": "#!终止ASR进程", "每张显卡的batch_size": "每張顯卡的batch_size",
"终止GPT训练": "#!终止GPT训练", "版本": "版本",
"终止SSL提取进程": "#!终止SSL提取进程", "粤英混合": "粵英混合",
"终止SoVITS训练": "#!终止SoVITS训练", "粤语": "粵語",
"终止一键三连": "#!终止一键三连", "终止ASR进程": "終止ASR進程",
"终止文本获取进程": "#!终止文本获取进程", "终止GPT训练": "終止GPT訓練",
"终止语义token提取进程": "#!终止语义token提取进程", "终止SSL提取进程": "終止SSL提取進程",
"终止语音切割": "#!终止语音切割", "终止SoVITS训练": "終止SoVITS訓練",
"终止语音降噪进程": "#!终止语音降噪进程", "终止一键三连": "終止一鍵三連",
"英文": "#!英文", "终止文本获取进程": "終止文本獲取進程",
"语义token提取进程输出信息": "#!语义token提取进程输出信息", "终止语义token提取进程": "終止語義token提取進程",
"语音切割进程输出信息": "#!语音切割进程输出信息", "终止语音切割": "終止語音切割",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "终止语音降噪进程": "終止語音降噪進程",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "英文": "英文",
"请输入有效文本": "#!请输入有效文本", "语义token提取进程输出信息": "語義token提取進程輸出信息",
"语速": "語速",
"语速调整,高为更快": "調整語速,高為更快",
"语音切割进程输出信息": "語音切割進程輸出信息",
"语音降噪进程输出信息": "語音降噪進程輸出信息",
"请上传3~10秒内参考音频超过会报错": "請上傳3~10秒內參考音頻超過會報錯",
"请上传参考音频": "請上傳參考音頻",
"请填入推理文本": "請填入推理文本",
"请输入有效文本": "請輸入有效文本",
"转换": "轉換", "转换": "轉換",
"输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑", "输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "輸入文件夾路徑",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "#!输出logs/实验名目录下应有23456开头的文件和文件夹", "输出logs/实验名目录下应有23456开头的文件和文件夹": "輸出logs/實驗名目錄下應有23456開頭的文件和文件夾",
"输出信息": "輸出訊息", "输出信息": "輸出訊息",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "輸出文件夾路徑",
"输出的语音": "#!输出的语音", "输出的语音": "輸出的語音",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "#!选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "選擇訓練完存放在SoVITS_weights和GPT_weights下的模型。默認的一個是底模體驗5秒Zero Shot TTS用。",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "降噪結果輸出文件夾",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "降噪音頻文件輸入文件夾",
"需要合成的切分前文本": "#!需要合成的切分前文本", "需要合成的文本": "需要合成的文本",
"需要合成的文本": "#!需要合成的文本", "需要合成的语种": "需要合成的語種",
"需要合成的语种": "#!需要合成的语种", "韩文": "韓文",
"音频自动切分输入路径,可文件可文件夹": "#!音频自动切分输入路径,可文件可文件夹", "韩英混合": "韓英混合",
"预训练的GPT模型路径": "#!预训练的GPT模型路径", "音频自动切分输入路径,可文件可文件夹": "音頻自動切分輸入路徑,可文件可文件夾",
"预训练的SSL模型路径": "#!预训练的SSL模型路径", "预训练的GPT模型路径": "預訓練的GPT模型路徑",
"预训练的SoVITS-D模型路径": "#!预训练的SoVITS-D模型路径", "预训练的SSL模型路径": "預訓練的SSL模型路徑",
"预训练的SoVITS-G模型路径": "#!预训练的SoVITS-G模型路径", "预训练的SoVITS-D模型路径": "預訓練的SoVITS-D模型路徑",
"预训练的中文BERT模型路径": "#!预训练的中文BERT模型路径" "预训练的SoVITS-G模型路径": "預訓練的SoVITS-G模型路徑",
"预训练的中文BERT模型路径": "預訓練的中文BERT模型路徑"
} }

View File

@ -1,157 +1,178 @@
{ {
"*GPT模型列表": "#!*GPT模型列表", "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):對於雙通道混響是最好的選擇,不能去除單通道混響;",
"*SoVITS模型列表": "#!*SoVITS模型列表", "(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho: Aggressive 比 Normal 去除得更徹底DeReverb 額外去除混響,可去除單聲道混響,但是對高頻重的板式混響去不乾淨。",
"*实验/模型名": "#!*实验/模型名", "*GPT模型列表": "*GPT模型列表",
"*文本标注文件": "#!*文本标注文件", "*SoVITS模型列表": "*SoVITS模型列表",
"*训练集音频文件目录": "#!*训练集音频文件目录", "*实验/模型名": "*實驗/模型名",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*文本标注文件": "*文本標註文件",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*训练集音频文件目录": "*訓練集音頻文件目錄",
".list标注文件的路径": "#!.list标注文件的路径", "*请上传并填写参考信息": "*請上傳並填寫參考信息",
"0-前置数据集获取工具": "#!0-前置数据集获取工具", "*请填写需要合成的目标文本和语种模式": "請填寫需要合成的目標文本和語言模式",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "#!0a-UVR5人声伴奏分离&去混响去延迟工具", ".list标注文件的路径": ".list標註文件的路徑",
"0b-语音切分工具": "#!0b-语音切分工具", "0-前置数据集获取工具": "0-前置數據集獲取工具",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人聲伴奏分離&去混響去延遲工具",
"0c-中文批量离线ASR工具": "#!0c-中文批量离线ASR工具", "0b-语音切分工具": "0b-語音切分工具",
"0d-语音文本校对标注工具": "#!0d-语音文本校对标注工具", "0bb-语音降噪工具": "0bb-語音降噪工具",
"1-GPT-SoVITS-TTS": "#!1-GPT-SoVITS-TTS", "0c-中文批量离线ASR工具": "0c-中文批量離線ASR工具",
"1A-训练集格式化工具": "#!1A-训练集格式化工具", "0d-语音文本校对标注工具": "0d-語音文本校對標註工具",
"1Aa-文本内容": "#!1Aa-文本内容", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
"1Aabc-训练集格式化一键三连": "#!1Aabc-训练集格式化一键三连", "1A-训练集格式化工具": "1A-訓練集格式化工具",
"1Ab-SSL自监督特征提取": "#!1Ab-SSL自监督特征提取", "1Aa-文本内容": "1Aa-文本內容",
"1Ac-语义token提取": "#!1Ac-语义token提取", "1Aabc-训练集格式化一键三连": "1Aabc-訓練集格式化一鍵三連",
"1B-微调训练": "#!1B-微调训练", "1Ab-SSL自监督特征提取": "1Ab-SSL自監督特徵提取",
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "#!1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", "1Ac-语义token提取": "1Ac-語義token提取",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "#!1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", "1B-微调训练": "1B-微調訓練",
"1C-推理": "#!1C-推理", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。用於分享的模型文件輸出在SoVITS_weights下。",
"2-GPT-SoVITS-变声": "#!2-GPT-SoVITS-变声", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。用於分享的模型文件輸出在GPT_weights下。",
"ASR 模型": "#!ASR 模型", "1C-推理": "1C-推理",
"ASR 模型尺寸": "#!ASR 模型尺寸", "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1、DeEcho-DeReverb 模型的耗時是另外兩個 DeEcho 模型的接近兩倍;",
"ASR 语言设置": "#!ASR 语言设置", "1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1、保留人聲不帶和聲的音頻選這個對主人聲保留比HP5更好。內置HP2和HP3兩個模型HP3可能輕微漏伴奏但對主人聲保留比HP2稍微好一丁點",
"ASR进程输出信息": "#!ASR进程输出信息", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-變聲",
"GPT模型列表": "#!GPT模型列表", "2、MDX-Net-Dereverb模型挺慢的": "2、MDX-Net-Dereverb 模型的處理時間挺慢的;",
"GPT训练进程输出信息": "#!GPT训练进程输出信息", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2、僅保留主人聲帶和聲的音頻選這個對主人聲可能有削弱。內置HP5一個模型",
"GPU卡号,只能填1个整数": "#!GPU卡号,只能填1个整数", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3、個人推薦的最乾淨的配置是先 MDX-Net 再 DeEcho-Aggressive。",
"GPU卡号以-分割,每个卡号一个进程": "#!GPU卡号以-分割,每个卡号一个进程", "3、去混响、去延迟模型by FoxJoy": "3、去混響、去延遲模型by FoxJoy",
"SSL进程输出信息": "#!SSL进程输出信息", "ASR 模型": "ASR 模型",
"SoVITS模型列表": "#!SoVITS模型列表", "ASR 模型尺寸": "ASR 模型尺寸",
"SoVITS训练进程输出信息": "#!SoVITS训练进程输出信息", "ASR 语言设置": "ASR 語言設定",
"TTS推理WebUI进程输出信息": "#!TTS推理WebUI进程输出信息", "ASR进程输出信息": "ASR進程輸出資訊",
"TTS推理进程已关闭": "#!TTS推理进程已关闭", "GPT模型列表": "GPT模型列表",
"TTS推理进程已开启": "#!TTS推理进程已开启", "GPT训练进程输出信息": "GPT訓練進程輸出資訊",
"UVR5已关闭": "#!UVR5已关闭", "GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT 采样参数(无参考文本时不要太低。不懂就用默认):",
"UVR5已开启": "#!UVR5已开启", "GPU卡号,只能填1个整数": "GPU卡號,只能填1個整數",
"UVR5进程输出信息": "#!UVR5进程输出信息", "GPU卡号以-分割,每个卡号一个进程": "GPU卡號以-分割,每個卡號一個進程",
"alpha_mix:混多少比例归一化后音频进来": "#!alpha_mix:混多少比例归一化后音频进来", "SSL进程输出信息": "SSL進程輸出資訊",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)", "SoVITS模型列表": "SoVITS模型列表",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "#!hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", "SoVITS训练进程输出信息": "SoVITS訓練進程輸出資訊",
"max:归一化后最大值多少": "#!max:归一化后最大值多少", "TTS推理WebUI进程输出信息": "TTS推理WebUI進程輸出資訊",
"max_sil_kept:切完后静音最多留多长": "#!max_sil_kept:切完后静音最多留多长", "TTS推理进程已关闭": "TTS推理進程已關閉",
"min_interval:最短切割间隔": "#!min_interval:最短切割间隔", "TTS推理进程已开启": "TTS推理進程已開啟",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "#!min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值", "UVR5已关闭": "UVR5已關閉",
"temperature": "#!temperature", "UVR5已开启": "UVR5已開啟",
"threshold:音量小于这个值视作静音的备选切割点": "#!threshold:音量小于这个值视作静音的备选切割点", "UVR5进程输出信息": "UVR5進程輸出資訊",
"top_k": "#!top_k", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例歸一化後音頻進來",
"top_p": "#!top_p", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎麼算音量曲線,越小精度越大計算量越高(不是精度越大效果越好)",
"一键三连进程输出信息": "#!一键三连进程输出信息", "max:归一化后最大值多少": "max:歸一化後最大值多少",
"不切": "#!不切", "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切完後靜音最多留多長",
"中文": "#!中文", "min_interval:最短切割间隔": "min_interval:最短切割間隔",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:每段最小多長,如果第一段太短一直和後面段連起來直到超過這個值",
"中英混合": "#!中英混合", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小於這個值視作靜音的備選切割點",
"top_k": "top_k",
"top_p": "top_p",
"一键三连进程输出信息": "一鍵三連進程輸出資訊",
"不切": "不切",
"中文": "中文",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文檔https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "中英混合",
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
"人声伴奏分离批量处理, 使用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>&emsp;(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. 消除混響和延遲模型由FoxJoy提供<br>(1) MDX-Net對於立體聲混響的移除是最好的選擇但不能移除單聲道混響<br>&emsp;(234) DeEcho移除延遲效果。Aggressive模式比Normal模式移除得更徹底。DeReverb另外移除混響可以移除單聲道混響但對於高頻重的板式混響移除不乾淨。<br>消除混響/延遲注意事項:<br>1. DeEcho-DeReverb模型的處理時間是其他兩個DeEcho模型的近兩倍<br>2. MDX-Net-Dereverb模型相當慢<br>3. 個人推薦的最乾淨配置是先使用MDX-Net然後使用DeEcho-Aggressive。", "人声伴奏分离批量处理, 使用UVR5模型。": "人聲伴奏分離批量處理, 使用UVR5模型。",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "人聲提取激進程度",
"以下文件或文件夹不存在:": "沒有這樣的檔案或文件夾:",
"以下模型不存在:": "以下模型不存在",
"伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲", "伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT聽不清參考音頻說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
"保存频率save_every_epoch": "保存頻率save_every_epoch", "保存频率save_every_epoch": "保存頻率save_every_epoch",
"凑50字一切": "#!凑50字一切", "凑50字一切": "湊50字一切",
"凑四句一切": "#!凑四句一切", "凑四句一切": "湊四句一切",
"切分后文本": "#!切分后文本", "切分后的子音频的输出根目录": "切分後的子音頻的輸出根目錄",
"切分后的子音频的输出根目录": "#!切分后的子音频的输出根目录", "切割使用的进程数": "切割使用的進程數",
"切割使用的进程数": "#!切割使用的进程数", "刷新模型路径": "刷新模型路徑",
"刷新模型路径": "#!刷新模型路径", "前端处理后的文本(每句):": "前端處理後的文本(每句):",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "去混响/去延迟,附:": "去混響/去延遲,附:",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "参考音频在3~10秒范围外请更换": "參考音頻在3~10秒範圍外請更換",
"参考音频的文本": "#!参考音频的文本", "参考音频的文本": "參考音頻的文本",
"参考音频的语种": "#!参考音频的语种", "参考音频的语种": "參考音頻的語種",
"合成语音": "#!合成语音", "合成语音": "合成語音",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的資料夾路徑格式舉例: E:\\codes\\py39\\vits_vc_gpu\\白鷺霜華測試範例(去文件管理器地址欄拷就行了)。",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "填切割後音頻所在目錄!讀取的音頻檔案完整路徑=該目錄-拼接-list檔案裡波形對應的檔案名不是全路徑。如果留空則使用.list檔案裡的絕對全路徑。",
"多语种混合": "#!多语种混合", "多语种混合": "多語種混合",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "多語種混合 (粵語)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "實際輸入的參考文本:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "實際輸入的目標文本(切句後):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "實際輸入的目標文本(每句):",
"实际输入的目标文本:": "實際輸入的目標文本:",
"导出文件格式": "導出檔格式", "导出文件格式": "導出檔格式",
"开启GPT训练": "#!开启GPT训练", "开启GPT训练": "開啟GPT訓練",
"开启SSL提取": "#!开启SSL提取", "开启SSL提取": "開啟SSL提取",
"开启SoVITS训练": "#!开启SoVITS训练", "开启SoVITS训练": "開啟SoVITS訓練",
"开启一键三连": "#!开启一键三连", "开启一键三连": "開啟一鍵三連",
"开启文本获取": "#!开启文本获取", "开启文本获取": "開啟文本獲取",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "開啟無參考文本模式。不填參考文本亦相當於開啟。",
"开启离线批量ASR": "#!开启离线批量ASR", "开启离线批量ASR": "開啟離線批量ASR",
"开启语义token提取": "#!开启语义token提取", "开启语义token提取": "開啟語義token提取",
"开启语音切割": "#!开启语音切割", "开启语音切割": "開啟語音切割",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "開啟語音降噪",
"怎么切": "#!怎么切", "怎么切": "怎麼切",
"总训练轮数total_epoch": "總訓練輪數total_epoch", "总训练轮数total_epoch": "總訓練輪數total_epoch",
"总训练轮数total_epoch不建议太高": "#!总训练轮数total_epoch不建议太高", "总训练轮数total_epoch不建议太高": "總訓練輪數total_epoch不建議太高",
"打标工具WebUI已关闭": "#!打标工具WebUI已关闭", "打标工具WebUI已关闭": "打標工具WebUI已關閉",
"打标工具WebUI已开启": "#!打标工具WebUI已开启", "打标工具WebUI已开启": "打標工具WebUI已開啟",
"打标工具进程输出信息": "#!打标工具进程输出信息", "打标工具进程输出信息": "打標工具進程輸出資訊",
"指定输出主人声文件夹": "指定输出主人声文件夹", "指定输出主人声文件夹": "指定输出主人声文件夹",
"指定输出非主人声文件夹": "指定输出非主人声文件夹", "指定输出非主人声文件夹": "指定输出非主人声文件夹",
"按中文句号。切": "#!按中文句号。切", "按中文句号。切": "按中文句號。切",
"按标点符号切": "#!按标点符号切", "按标点符号切": "按標點符號切",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "按英文句號.切",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "#!文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "數據類型精度",
"文本模块学习率权重": "#!文本模块学习率权重", "文本模块学习率权重": "文本模塊學習率權重",
"文本进程输出信息": "#!文本进程输出信息", "文本进程输出信息": "文本進程輸出資訊",
"施工中,请静候佳音": "#!施工中,请静候佳音", "施工中,请静候佳音": "施工中,請靜候佳音",
"日文": "#!日文", "日文": "日文",
"日英混合": "#!日英混合", "日英混合": "日英混合",
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt文件以節省硬盤空間",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights文件夾",
"是否开启TTS推理WebUI": "#!是否开启TTS推理WebUI", "是否开启TTS推理WebUI": "是否開啟TTS推理WebUI",
"是否开启UVR5-WebUI": "#!是否开启UVR5-WebUI", "是否开启UVR5-WebUI": "是否開啟UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "是否開啟dpo訓練選項(實驗性)",
"是否开启打标WebUI": "#!是否开启打标WebUI", "是否开启打标WebUI": "是否開啟打標WebUI",
"显卡信息": "顯示卡資訊", "是否直接对上次合成结果调整语速。防止随机性。": "是否直接對上次合成結果調整語速。防止隨機性。",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源作者不對軟體具備任何控制力使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄<b>使用需遵守的協議-LICENSE.txt</b>。", "显卡信息": "顯卡資訊",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源作者不對軟體具備任何控制力使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何代碼和文件。詳見根目錄<b>LICENSE</b>。",
"模型": "模型", "模型": "模型",
"模型切换": "#!模型切换", "模型分为三类:": "模型分為三類:",
"每张显卡的batch_size": "每张显卡的batch_size", "模型切换": "模型切換",
"终止ASR进程": "#!终止ASR进程", "每张显卡的batch_size": "每張顯卡的batch_size",
"终止GPT训练": "#!终止GPT训练", "版本": "版本",
"终止SSL提取进程": "#!终止SSL提取进程", "粤英混合": "粵英混合",
"终止SoVITS训练": "#!终止SoVITS训练", "粤语": "粵語",
"终止一键三连": "#!终止一键三连", "终止ASR进程": "終止ASR進程",
"终止文本获取进程": "#!终止文本获取进程", "终止GPT训练": "終止GPT訓練",
"终止语义token提取进程": "#!终止语义token提取进程", "终止SSL提取进程": "終止SSL提取進程",
"终止语音切割": "#!终止语音切割", "终止SoVITS训练": "終止SoVITS訓練",
"终止语音降噪进程": "#!终止语音降噪进程", "终止一键三连": "終止一鍵三連",
"英文": "#!英文", "终止文本获取进程": "終止文本獲取進程",
"语义token提取进程输出信息": "#!语义token提取进程输出信息", "终止语义token提取进程": "終止語義token提取進程",
"语音切割进程输出信息": "#!语音切割进程输出信息", "终止语音切割": "終止語音切割",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "终止语音降噪进程": "終止語音降噪進程",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "英文": "英文",
"请输入有效文本": "#!请输入有效文本", "语义token提取进程输出信息": "語義token提取進程輸出資訊",
"语速": "語速",
"语速调整,高为更快": "調整語速,高為更快",
"语音切割进程输出信息": "語音切割進程輸出資訊",
"语音降噪进程输出信息": "語音降噪進程輸出資訊",
"请上传3~10秒内参考音频超过会报错": "請上傳3~10秒內參考音頻超過會報錯",
"请上传参考音频": "請上傳參考音頻",
"请填入推理文本": "請填入推理文本",
"请输入有效文本": "請輸入有效文本",
"转换": "轉換", "转换": "轉換",
"输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑", "输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "輸入文件夾路徑",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "#!输出logs/实验名目录下应有23456开头的文件和文件夹", "输出logs/实验名目录下应有23456开头的文件和文件夹": "輸出logs/實驗名目錄下應有23456開頭的文件和文件夾",
"输出信息": "輸出訊息", "输出信息": "輸出訊息",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "輸出文件夾路徑",
"输出的语音": "#!输出的语音", "输出的语音": "輸出的語音",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "#!选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "選擇訓練完存放在SoVITS_weights和GPT_weights下的模型。默認的一個是底模體驗5秒Zero Shot TTS用。",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "降噪結果輸出文件夾",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "降噪音頻文件輸入文件夾",
"需要合成的切分前文本": "#!需要合成的切分前文本", "需要合成的文本": "需要合成的文本",
"需要合成的文本": "#!需要合成的文本", "需要合成的语种": "需要合成的語種",
"需要合成的语种": "#!需要合成的语种", "韩文": "韓文",
"音频自动切分输入路径,可文件可文件夹": "#!音频自动切分输入路径,可文件可文件夹", "韩英混合": "韓英混合",
"预训练的GPT模型路径": "#!预训练的GPT模型路径", "音频自动切分输入路径,可文件可文件夹": "音頻自動切分輸入路徑,可文件可文件夾",
"预训练的SSL模型路径": "#!预训练的SSL模型路径", "预训练的GPT模型路径": "預訓練的GPT模型路徑",
"预训练的SoVITS-D模型路径": "#!预训练的SoVITS-D模型路径", "预训练的SSL模型路径": "預訓練的SSL模型路徑",
"预训练的SoVITS-G模型路径": "#!预训练的SoVITS-G模型路径", "预训练的SoVITS-D模型路径": "預訓練的SoVITS-D模型路徑",
"预训练的中文BERT模型路径": "#!预训练的中文BERT模型路径" "预训练的SoVITS-G模型路径": "預訓練的SoVITS-G模型路徑",
"预训练的中文BERT模型路径": "預訓練的中文BERT模型路徑"
} }

View File

@ -1,157 +1,178 @@
{ {
"*GPT模型列表": "#!*GPT模型列表", "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):對於雙通道混響是最好的選擇,不能去除單通道混響;",
"*SoVITS模型列表": "#!*SoVITS模型列表", "(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。": "(234)DeEcho去除延遲效果。Aggressive 比 Normal 去除得更徹底DeReverb 額外去除混響,可去除單聲道混響,但是對高頻重的板式混響去不乾淨。",
"*实验/模型名": "#!*实验/模型名", "*GPT模型列表": "*GPT模型列表",
"*文本标注文件": "#!*文本标注文件", "*SoVITS模型列表": "*SoVITS模型列表",
"*训练集音频文件目录": "#!*训练集音频文件目录", "*实验/模型名": "*實驗/模型名",
"*请上传并填写参考信息": "#!*请上传并填写参考信息", "*文本标注文件": "*文本標注文件",
"*请填写需要合成的目标文本和语种模式": "#!*请填写需要合成的目标文本和语种模式", "*训练集音频文件目录": "*訓練集音頻文件目錄",
".list标注文件的路径": "#!.list标注文件的路径", "*请上传并填写参考信息": "*請上傳並填寫參考資訊",
"0-前置数据集获取工具": "#!0-前置数据集获取工具", "*请填写需要合成的目标文本和语种模式": "請填寫需要合成的目標文本和語言模式",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "#!0a-UVR5人声伴奏分离&去混响去延迟工具", ".list标注文件的路径": ".list標注文件的路徑",
"0b-语音切分工具": "#!0b-语音切分工具", "0-前置数据集获取工具": "0-前置數據集獲取工具",
"0bb-语音降噪工具": "#!0bb-语音降噪工具", "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人聲伴奏分離&去混響去延遲工具",
"0c-中文批量离线ASR工具": "#!0c-中文批量离线ASR工具", "0b-语音切分工具": "0b-語音切分工具",
"0d-语音文本校对标注工具": "#!0d-语音文本校对标注工具", "0bb-语音降噪工具": "0bb-語音降噪工具",
"1-GPT-SoVITS-TTS": "#!1-GPT-SoVITS-TTS", "0c-中文批量离线ASR工具": "0c-中文批量離線ASR工具",
"1A-训练集格式化工具": "#!1A-训练集格式化工具", "0d-语音文本校对标注工具": "0d-語音文本校對標注工具",
"1Aa-文本内容": "#!1Aa-文本内容", "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
"1Aabc-训练集格式化一键三连": "#!1Aabc-训练集格式化一键三连", "1A-训练集格式化工具": "1A-訓練集格式化工具",
"1Ab-SSL自监督特征提取": "#!1Ab-SSL自监督特征提取", "1Aa-文本内容": "1Aa-文本內容",
"1Ac-语义token提取": "#!1Ac-语义token提取", "1Aabc-训练集格式化一键三连": "1Aabc-訓練集格式化一鍵三連",
"1B-微调训练": "#!1B-微调训练", "1Ab-SSL自监督特征提取": "1Ab-SSL自監督特徵提取",
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "#!1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。", "1Ac-语义token提取": "1Ac-語義token提取",
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "#!1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。", "1B-微调训练": "1B-微調訓練",
"1C-推理": "#!1C-推理", "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。用於分享的模型文件輸出在SoVITS_weights下。",
"2-GPT-SoVITS-变声": "#!2-GPT-SoVITS-变声", "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。用於分享的模型文件輸出在GPT_weights下。",
"ASR 模型": "#!ASR 模型", "1C-推理": "1C-推理",
"ASR 模型尺寸": "#!ASR 模型尺寸", "1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍": "1、DeEcho-DeReverb 模型的耗時是另外兩個 DeEcho 模型的接近兩倍;",
"ASR 语言设置": "#!ASR 语言设置", "1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点": "1、保留人聲不帶和聲的音頻選這個對主人聲保留比HP5更好。內置HP2和HP3兩個模型HP3可能輕微漏伴奏但對主人聲保留比HP2稍微好一丁點",
"ASR进程输出信息": "#!ASR进程输出信息", "2-GPT-SoVITS-变声": "2-GPT-SoVITS-變聲",
"GPT模型列表": "#!GPT模型列表", "2、MDX-Net-Dereverb模型挺慢的": "2、MDX-Net-Dereverb模型挺慢的",
"GPT训练进程输出信息": "#!GPT训练进程输出信息", "2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型": "2、僅保留主人聲帶和聲的音頻選這個對主人聲可能有削弱。內置HP5一個模型",
"GPU卡号,只能填1个整数": "#!GPU卡号,只能填1个整数", "3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "3、個人推薦的最乾淨的配置是先 MDX-Net 再 DeEcho-Aggressive。",
"GPU卡号以-分割,每个卡号一个进程": "#!GPU卡号以-分割,每个卡号一个进程", "3、去混响、去延迟模型by FoxJoy": "3、去混響、去延遲模型by FoxJoy",
"SSL进程输出信息": "#!SSL进程输出信息", "ASR 模型": "ASR 模型",
"SoVITS模型列表": "#!SoVITS模型列表", "ASR 模型尺寸": "ASR 模型尺寸",
"SoVITS训练进程输出信息": "#!SoVITS训练进程输出信息", "ASR 语言设置": "ASR 語言設置",
"TTS推理WebUI进程输出信息": "#!TTS推理WebUI进程输出信息", "ASR进程输出信息": "ASR進程輸出資訊",
"TTS推理进程已关闭": "#!TTS推理进程已关闭", "GPT模型列表": "GPT模型列表",
"TTS推理进程已开启": "#!TTS推理进程已开启", "GPT训练进程输出信息": "GPT訓練進程輸出資訊",
"UVR5已关闭": "#!UVR5已关闭", "GPT采样参数(无参考文本时不要太低。不懂就用默认)": "GPT 采样参数(无参考文本时不要太低。不懂就用默认):",
"UVR5已开启": "#!UVR5已开启", "GPU卡号,只能填1个整数": "GPU卡號,只能填1個整數",
"UVR5进程输出信息": "#!UVR5进程输出信息", "GPU卡号以-分割,每个卡号一个进程": "GPU卡號以-分割,每個卡號一個進程",
"alpha_mix:混多少比例归一化后音频进来": "#!alpha_mix:混多少比例归一化后音频进来", "SSL进程输出信息": "SSL進程輸出資訊",
"gpt采样参数(无参考文本时不要太低)": "#!gpt采样参数(无参考文本时不要太低)", "SoVITS模型列表": "SoVITS模型列表",
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "#!hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)", "SoVITS训练进程输出信息": "SoVITS訓練進程輸出資訊",
"max:归一化后最大值多少": "#!max:归一化后最大值多少", "TTS推理WebUI进程输出信息": "TTS推理WebUI進程輸出資訊",
"max_sil_kept:切完后静音最多留多长": "#!max_sil_kept:切完后静音最多留多长", "TTS推理进程已关闭": "TTS推理進程已關閉",
"min_interval:最短切割间隔": "#!min_interval:最短切割间隔", "TTS推理进程已开启": "TTS推理進程已開啟",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "#!min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值", "UVR5已关闭": "UVR5已關閉",
"temperature": "#!temperature", "UVR5已开启": "UVR5已開啟",
"threshold:音量小于这个值视作静音的备选切割点": "#!threshold:音量小于这个值视作静音的备选切割点", "UVR5进程输出信息": "UVR5進程輸出資訊",
"top_k": "#!top_k", "alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例歸一化後音頻進來",
"top_p": "#!top_p", "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎麼算音量曲線,越小精度越大計算量越高(不是精度越大效果越好)",
"一键三连进程输出信息": "#!一键三连进程输出信息", "max:归一化后最大值多少": "max:歸一化後最大值多少",
"不切": "#!不切", "max_sil_kept:切完后静音最多留多长": "max_sil_kept:切完後靜音最多留多長",
"中文": "#!中文", "min_interval:最短切割间隔": "min_interval:最短切割間隔",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "#!中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e", "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length:每段最小多長,如果第一段太短一直和後面段連起來直到超過這個值",
"中英混合": "#!中英混合", "temperature": "temperature",
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小於這個值視作靜音的備選切割點",
"top_k": "top_k",
"top_p": "top_p",
"一键三连进程输出信息": "一鍵三連進程輸出資訊",
"不切": "不切",
"中文": "中文",
"中文教程文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文檔https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
"中英混合": "中英混合",
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹", "也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
"人声伴奏分离批量处理, 使用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>&emsp;(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. 消除混響和延遲模型由FoxJoy提供<br>(1) MDX-Net對於立體聲混響的移除是最好的選擇但不能移除單聲道混響<br>&emsp;(234) DeEcho移除延遲效果。Aggressive模式比Normal模式移除得更徹底。DeReverb另外移除混響可以移除單聲道混響但對於高頻重的板式混響移除不乾淨。<br>消除混響/延遲注意事項:<br>1. DeEcho-DeReverb模型的處理時間是其他兩個DeEcho模型的近兩倍<br>2. MDX-Net-Dereverb模型相當慢<br>3. 個人推薦的最乾淨配置是先使用MDX-Net然後使用DeEcho-Aggressive。", "人声伴奏分离批量处理, 使用UVR5模型。": "人聲伴奏分離批量處理, 使用UVR5模型。",
"人声提取激进程度": "#!人声提取激进程度", "人声提取激进程度": "人聲提取激進程度",
"以下文件或文件夹不存在:": "沒有這樣的檔案或文件夾:",
"以下模型不存在:": "#以下模型不存在",
"伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲", "伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲",
"使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "#!使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。", "使用无参考文本模式时建议使用微调的GPT听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT聽不清參考音頻說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
"保存频率save_every_epoch": "保存頻率save_every_epoch", "保存频率save_every_epoch": "保存頻率save_every_epoch",
"凑50字一切": "#!凑50字一切", "凑50字一切": "湊50字一切",
"凑四句一切": "#!凑四句一切", "凑四句一切": "湊四句一切",
"切分后文本": "#!切分后文本", "切分后的子音频的输出根目录": "切分後的子音頻的輸出根目錄",
"切分后的子音频的输出根目录": "#!切分后的子音频的输出根目录", "切割使用的进程数": "切割使用的進程數",
"切割使用的进程数": "#!切割使用的进程数", "刷新模型路径": "刷新模型路徑",
"刷新模型路径": "#!刷新模型路径", "前端处理后的文本(每句):": "前端處理後的文本(每句):",
"前端处理后的文本(每句):": "#!前端处理后的文本(每句):", "去混响/去延迟,附:": "去混響/去延遲,附:",
"参考音频在3~10秒范围外请更换": "#!参考音频在3~10秒范围外请更换", "参考音频在3~10秒范围外请更换": "參考音頻在3~10秒範圍外請更換",
"参考音频的文本": "#!参考音频的文本", "参考音频的文本": "參考音頻的文本",
"参考音频的语种": "#!参考音频的语种", "参考音频的语种": "參考音頻的語種",
"合成语音": "#!合成语音", "合成语音": "合成語音",
"后续将支持转音素、手工修改音素、语音合成分步执行。": "#!后续将支持转音素、手工修改音素、语音合成分步执行。", "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的資料夾路徑格式舉例: E:\\codes\\py39\\vits_vc_gpu\\白鷺霜華測試範例(去文件管理器地址欄拷就行了)。",
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "#!填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。", "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名不是全路径。如果留空则使用.list文件里的绝对全路径。": "填切割後音頻所在目錄!讀取的音頻檔案完整路徑=該目錄-拼接-list檔案裡波形對應的檔案名不是全路徑。如果留空則使用.list檔案裡的絕對全路徑。",
"多语种混合": "#!多语种混合", "多语种混合": "多語種混合",
"实际输入的参考文本:": "#!实际输入的参考文本:", "多语种混合(粤语)": "多語種混合 (粵語)",
"实际输入的目标文本(切句后):": "#!实际输入的目标文本(切句后):", "实际输入的参考文本:": "實際輸入的參考文本:",
"实际输入的目标文本(每句):": "#!实际输入的目标文本(每句):", "实际输入的目标文本(切句后):": "實際輸入的目標文本(切句後):",
"实际输入的目标文本:": "#!实际输入的目标文本:", "实际输入的目标文本(每句):": "實際輸入的目標文本(每句):",
"实际输入的目标文本:": "實際輸入的目標文本:",
"导出文件格式": "導出檔格式", "导出文件格式": "導出檔格式",
"开启GPT训练": "#!开启GPT训练", "开启GPT训练": "開啟GPT訓練",
"开启SSL提取": "#!开启SSL提取", "开启SSL提取": "開啟SSL提取",
"开启SoVITS训练": "#!开启SoVITS训练", "开启SoVITS训练": "開啟SoVITS訓練",
"开启一键三连": "#!开启一键三连", "开启一键三连": "開啟一鍵三連",
"开启文本获取": "#!开启文本获取", "开启文本获取": "開啟文本獲取",
"开启无参考文本模式。不填参考文本亦相当于开启。": "#!开启无参考文本模式。不填参考文本亦相当于开启。", "开启无参考文本模式。不填参考文本亦相当于开启。": "開啟無參考文本模式。不填參考文本亦相當於開啟。",
"开启离线批量ASR": "#!开启离线批量ASR", "开启离线批量ASR": "開啟離線批量ASR",
"开启语义token提取": "#!开启语义token提取", "开启语义token提取": "開啟語義token提取",
"开启语音切割": "#!开启语音切割", "开启语音切割": "開啟語音切割",
"开启语音降噪": "#!开启语音降噪", "开启语音降噪": "開啟語音降噪",
"怎么切": "#!怎么切", "怎么切": "怎麼切",
"总训练轮数total_epoch": "總訓練輪數total_epoch", "总训练轮数total_epoch": "總訓練輪數total_epoch",
"总训练轮数total_epoch不建议太高": "#!总训练轮数total_epoch不建议太高", "总训练轮数total_epoch不建议太高": "總訓練輪數total_epoch不建議太高",
"打标工具WebUI已关闭": "#!打标工具WebUI已关闭", "打标工具WebUI已关闭": "打標工具WebUI已關閉",
"打标工具WebUI已开启": "#!打标工具WebUI已开启", "打标工具WebUI已开启": "打標工具WebUI已開啟",
"打标工具进程输出信息": "#!打标工具进程输出信息", "打标工具进程输出信息": "打標工具進程輸出資訊",
"指定输出主人声文件夹": "指定输出主人声文件夹", "指定输出主人声文件夹": "指定输出主人声文件夹",
"指定输出非主人声文件夹": "指定输出非主人声文件夹", "指定输出非主人声文件夹": "指定输出非主人声文件夹",
"按中文句号。切": "#!按中文句号。切", "按中文句号。切": "按中文句號。切",
"按标点符号切": "#!按标点符号切", "按标点符号切": "按標點符號切",
"按英文句号.切": "#!按英文句号.切", "按英文句号.切": "按英文句號.切",
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "#!文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。", "数据类型精度": "數據類型精度",
"文本模块学习率权重": "#!文本模块学习率权重", "文本模块学习率权重": "文本模塊學習率權重",
"文本进程输出信息": "#!文本进程输出信息", "文本进程输出信息": "文本進程輸出資訊",
"施工中,请静候佳音": "#!施工中,请静候佳音", "施工中,请静候佳音": "施工中,請靜候佳音",
"日文": "#!日文", "日文": "日文",
"日英混合": "#!日英混合", "日英混合": "日英混合",
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt文件以節省硬盤空間",
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights文件夾",
"是否开启TTS推理WebUI": "#!是否开启TTS推理WebUI", "是否开启TTS推理WebUI": "是否開啟TTS推理WebUI",
"是否开启UVR5-WebUI": "#!是否开启UVR5-WebUI", "是否开启UVR5-WebUI": "是否開啟UVR5-WebUI",
"是否开启dpo训练选项(实验性)": "#!是否开启dpo训练选项(实验性)", "是否开启dpo训练选项(实验性)": "是否開啟dpo訓練選項(實驗性)",
"是否开启打标WebUI": "#!是否开启打标WebUI", "是否开启打标WebUI": "是否開啟打標WebUI",
"显卡信息": "顯示卡資訊", "是否直接对上次合成结果调整语速。防止随机性。": "是否直接對上次合成結果調整語速。防止隨機性。",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源作者不對軟體具備任何控制力使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄<b>使用需遵守的協議-LICENSE.txt</b>。", "显卡信息": "顯卡資訊",
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源作者不對軟體具備任何控制力使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何代碼和文件。詳見根目錄<b>LICENSE</b>。",
"模型": "模型", "模型": "模型",
"模型切换": "#!模型切换", "模型分为三类:": "模型分為三類:",
"每张显卡的batch_size": "每张显卡的batch_size", "模型切换": "模型切換",
"终止ASR进程": "#!终止ASR进程", "每张显卡的batch_size": "每張顯卡的batch_size",
"终止GPT训练": "#!终止GPT训练", "版本": "版本",
"终止SSL提取进程": "#!终止SSL提取进程", "粤英混合": "粵英混合",
"终止SoVITS训练": "#!终止SoVITS训练", "粤语": "粵語",
"终止一键三连": "#!终止一键三连", "终止ASR进程": "終止ASR進程",
"终止文本获取进程": "#!终止文本获取进程", "终止GPT训练": "終止GPT訓練",
"终止语义token提取进程": "#!终止语义token提取进程", "终止SSL提取进程": "終止SSL提取進程",
"终止语音切割": "#!终止语音切割", "终止SoVITS训练": "終止SoVITS訓練",
"终止语音降噪进程": "#!终止语音降噪进程", "终止一键三连": "終止一鍵三連",
"英文": "#!英文", "终止文本获取进程": "終止文本獲取進程",
"语义token提取进程输出信息": "#!语义token提取进程输出信息", "终止语义token提取进程": "終止語義token提取進程",
"语音切割进程输出信息": "#!语音切割进程输出信息", "终止语音切割": "終止語音切割",
"语音降噪进程输出信息": "#!语音降噪进程输出信息", "终止语音降噪进程": "終止語音降噪進程",
"请上传3~10秒内参考音频超过会报错": "#!请上传3~10秒内参考音频超过会报错", "英文": "英文",
"请输入有效文本": "#!请输入有效文本", "语义token提取进程输出信息": "語義token提取進程輸出資訊",
"语速": "語速",
"语速调整,高为更快": "調整語速,高為更快",
"语音切割进程输出信息": "語音切割進程輸出資訊",
"语音降噪进程输出信息": "語音降噪進程輸出資訊",
"请上传3~10秒内参考音频超过会报错": "請上傳3~10秒內參考音頻超過會報錯",
"请上传参考音频": "請上傳參考音頻",
"请填入推理文本": "請填入推理文本",
"请输入有效文本": "請輸入有效文本",
"转换": "轉換", "转换": "轉換",
"输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑", "输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑",
"输入文件夹路径": "#!输入文件夹路径", "输入文件夹路径": "輸入文件夾路徑",
"输出logs/实验名目录下应有23456开头的文件和文件夹": "#!输出logs/实验名目录下应有23456开头的文件和文件夹", "输出logs/实验名目录下应有23456开头的文件和文件夹": "輸出logs/實驗名目錄下應有23456開頭的文件和文件夾",
"输出信息": "輸出訊息", "输出信息": "輸出訊息",
"输出文件夹路径": "#!输出文件夹路径", "输出文件夹路径": "輸出文件夾路徑",
"输出的语音": "#!输出的语音", "输出的语音": "輸出的語音",
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "#!选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。", "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。": "選擇訓練完存放在SoVITS_weights和GPT_weights下的模型。默認的一個是底模體驗5秒Zero Shot TTS用。",
"降噪结果输出文件夹": "#!降噪结果输出文件夹", "降噪结果输出文件夹": "降噪結果輸出文件夾",
"降噪音频文件输入文件夹": "#!降噪音频文件输入文件夹", "降噪音频文件输入文件夹": "降噪音頻文件輸入文件夾",
"需要合成的切分前文本": "#!需要合成的切分前文本", "需要合成的文本": "需要合成的文本",
"需要合成的文本": "#!需要合成的文本", "需要合成的语种": "需要合成的語種",
"需要合成的语种": "#!需要合成的语种", "韩文": "韓文",
"音频自动切分输入路径,可文件可文件夹": "#!音频自动切分输入路径,可文件可文件夹", "韩英混合": "韓英混合",
"预训练的GPT模型路径": "#!预训练的GPT模型路径", "音频自动切分输入路径,可文件可文件夹": "音頻自動切分輸入路徑,可文件可文件夾",
"预训练的SSL模型路径": "#!预训练的SSL模型路径", "预训练的GPT模型路径": "預訓練的GPT模型路徑",
"预训练的SoVITS-D模型路径": "#!预训练的SoVITS-D模型路径", "预训练的SSL模型路径": "預訓練的SSL模型路徑",
"预训练的SoVITS-G模型路径": "#!预训练的SoVITS-G模型路径", "预训练的SoVITS-D模型路径": "預訓練的SoVITS-D模型路徑",
"预训练的中文BERT模型路径": "#!预训练的中文BERT模型路径" "预训练的SoVITS-G模型路径": "預訓練的SoVITS-G模型路徑",
"预训练的中文BERT模型路径": "預訓練的中文BERT模型路徑"
} }

View File

@ -86,11 +86,21 @@ def update_i18n_json(json_file, standard_keys):
print(f"{'Total Keys (After)'.ljust(KEY_LEN)}: {len(json_data)}") print(f"{'Total Keys (After)'.ljust(KEY_LEN)}: {len(json_data)}")
# 识别有待翻译的键 # 识别有待翻译的键
num_miss_translation = 0 num_miss_translation = 0
duplicate_items = {}
for key, value in json_data.items(): for key, value in json_data.items():
if value.startswith("#!"): if value.startswith("#!"):
num_miss_translation += 1 num_miss_translation += 1
if SHOW_KEYS: if SHOW_KEYS:
print(f"{'Missing Translation'.ljust(KEY_LEN)}: {key}") print(f"{'Missing Translation'.ljust(KEY_LEN)}: {key}")
if value in duplicate_items:
duplicate_items[value].append(key)
else:
duplicate_items[value] = [key]
# 打印是否有重复的值
for value, keys in duplicate_items.items():
if len(keys) > 1:
print("\n".join([f"\033[31m{'[Failed] Duplicate Value'.ljust(KEY_LEN)}: {key} -> {value}\033[0m" for key in keys]))
if num_miss_translation > 0: if num_miss_translation > 0:
print(f"\033[31m{'[Failed] Missing Translation'.ljust(KEY_LEN)}: {num_miss_translation}\033[0m") print(f"\033[31m{'[Failed] Missing Translation'.ljust(KEY_LEN)}: {num_miss_translation}\033[0m")
else: else:

View File

@ -28,6 +28,5 @@ def load_audio(file, sr):
def clean_path(path_str:str): def clean_path(path_str:str):
if path_str.endswith(('\\','/')): if path_str.endswith(('\\','/')):
return clean_path(path_str[0:-1]) return clean_path(path_str[0:-1])
if platform.system() == 'Windows': path_str = path_str.replace('/', os.sep).replace('\\', os.sep)
path_str = path_str.replace('/', '\\') return path_str.strip(" ").strip('\'').strip("\n").strip('"').strip(" ").strip("\u202a")
return path_str.strip(" ").strip('"').strip("\n").strip('"').strip(" ").strip("\u202a")

View File

View File

@ -0,0 +1,120 @@
from functools import wraps
from packaging import version
from collections import namedtuple
import torch
from torch import nn, einsum
import torch.nn.functional as F
from einops import rearrange, reduce
# constants
FlashAttentionConfig = namedtuple('FlashAttentionConfig', ['enable_flash', 'enable_math', 'enable_mem_efficient'])
# helpers
def exists(val):
return val is not None
def default(v, d):
return v if exists(v) else d
def once(fn):
called = False
@wraps(fn)
def inner(x):
nonlocal called
if called:
return
called = True
return fn(x)
return inner
print_once = once(print)
# main class
class Attend(nn.Module):
def __init__(
self,
dropout = 0.,
flash = False,
scale = None
):
super().__init__()
self.scale = scale
self.dropout = dropout
self.attn_dropout = nn.Dropout(dropout)
self.flash = flash
assert not (flash and version.parse(torch.__version__) < version.parse('2.0.0')), 'in order to use flash attention, you must be using pytorch 2.0 or above'
# determine efficient attention configs for cuda and cpu
self.cpu_config = FlashAttentionConfig(True, True, True)
self.cuda_config = None
if not torch.cuda.is_available() or not flash:
return
device_properties = torch.cuda.get_device_properties(torch.device('cuda'))
if device_properties.major == 8 and device_properties.minor == 0:
print_once('A100 GPU detected, using flash attention if input tensor is on cuda')
self.cuda_config = FlashAttentionConfig(True, False, False)
else:
print_once('Non-A100 GPU detected, using math or mem efficient attention if input tensor is on cuda')
self.cuda_config = FlashAttentionConfig(False, True, True)
def flash_attn(self, q, k, v):
_, heads, q_len, _, k_len, is_cuda, device = *q.shape, k.shape[-2], q.is_cuda, q.device
if exists(self.scale):
default_scale = q.shape[-1] ** -0.5
q = q * (self.scale / default_scale)
# Check if there is a compatible device for flash attention
config = self.cuda_config if is_cuda else self.cpu_config
# pytorch 2.0 flash attn: q, k, v, mask, dropout, softmax_scale
with torch.backends.cuda.sdp_kernel(**config._asdict()):
out = F.scaled_dot_product_attention(
q, k, v,
dropout_p = self.dropout if self.training else 0.
)
return out
def forward(self, q, k, v):
"""
einstein notation
b - batch
h - heads
n, i, j - sequence length (base sequence length, source, target)
d - feature dimension
"""
q_len, k_len, device = q.shape[-2], k.shape[-2], q.device
scale = default(self.scale, q.shape[-1] ** -0.5)
if self.flash:
return self.flash_attn(q, k, v)
# similarity
sim = einsum(f"b h i d, b h j d -> b h i j", q, k) * scale
# attention
attn = sim.softmax(dim=-1)
attn = self.attn_dropout(attn)
# aggregate values
out = einsum(f"b h i j, b h j d -> b h i d", attn, v)
return out

View File

@ -0,0 +1,583 @@
from functools import partial
import torch
from torch import nn, einsum, Tensor
from torch.nn import Module, ModuleList
import torch.nn.functional as F
from bs_roformer.attend import Attend
from typing import Tuple, Optional, List, Callable
# from beartype.typing import Tuple, Optional, List, Callable
# from beartype import beartype
from rotary_embedding_torch import RotaryEmbedding
from einops import rearrange, pack, unpack
from einops.layers.torch import Rearrange
# helper functions
def exists(val):
return val is not None
def default(v, d):
return v if exists(v) else d
def pack_one(t, pattern):
return pack([t], pattern)
def unpack_one(t, ps, pattern):
return unpack(t, ps, pattern)[0]
# norm
def l2norm(t):
return F.normalize(t, dim = -1, p = 2)
class RMSNorm(Module):
def __init__(self, dim):
super().__init__()
self.scale = dim ** 0.5
self.gamma = nn.Parameter(torch.ones(dim))
def forward(self, x):
return F.normalize(x, dim=-1) * self.scale * self.gamma
# attention
class FeedForward(Module):
def __init__(
self,
dim,
mult=4,
dropout=0.
):
super().__init__()
dim_inner = int(dim * mult)
self.net = nn.Sequential(
RMSNorm(dim),
nn.Linear(dim, dim_inner),
nn.GELU(),
nn.Dropout(dropout),
nn.Linear(dim_inner, dim),
nn.Dropout(dropout)
)
def forward(self, x):
return self.net(x)
class Attention(Module):
def __init__(
self,
dim,
heads=8,
dim_head=64,
dropout=0.,
rotary_embed=None,
flash=True
):
super().__init__()
self.heads = heads
self.scale = dim_head ** -0.5
dim_inner = heads * dim_head
self.rotary_embed = rotary_embed
self.attend = Attend(flash=flash, dropout=dropout)
self.norm = RMSNorm(dim)
self.to_qkv = nn.Linear(dim, dim_inner * 3, bias=False)
self.to_gates = nn.Linear(dim, heads)
self.to_out = nn.Sequential(
nn.Linear(dim_inner, dim, bias=False),
nn.Dropout(dropout)
)
def forward(self, x):
x = self.norm(x)
q, k, v = rearrange(self.to_qkv(x), 'b n (qkv h d) -> qkv b h n d', qkv=3, h=self.heads)
if exists(self.rotary_embed):
q = self.rotary_embed.rotate_queries_or_keys(q)
k = self.rotary_embed.rotate_queries_or_keys(k)
out = self.attend(q, k, v)
gates = self.to_gates(x)
out = out * rearrange(gates, 'b n h -> b h n 1').sigmoid()
out = rearrange(out, 'b h n d -> b n (h d)')
return self.to_out(out)
class LinearAttention(Module):
"""
this flavor of linear attention proposed in https://arxiv.org/abs/2106.09681 by El-Nouby et al.
"""
# @beartype
def __init__(
self,
*,
dim,
dim_head=32,
heads=8,
scale=8,
flash=False,
dropout=0.
):
super().__init__()
dim_inner = dim_head * heads
self.norm = RMSNorm(dim)
self.to_qkv = nn.Sequential(
nn.Linear(dim, dim_inner * 3, bias=False),
Rearrange('b n (qkv h d) -> qkv b h d n', qkv=3, h=heads)
)
self.temperature = nn.Parameter(torch.ones(heads, 1, 1))
self.attend = Attend(
scale=scale,
dropout=dropout,
flash=flash
)
self.to_out = nn.Sequential(
Rearrange('b h d n -> b n (h d)'),
nn.Linear(dim_inner, dim, bias=False)
)
def forward(
self,
x
):
x = self.norm(x)
q, k, v = self.to_qkv(x)
q, k = map(l2norm, (q, k))
q = q * self.temperature.exp()
out = self.attend(q, k, v)
return self.to_out(out)
class Transformer(Module):
def __init__(
self,
*,
dim,
depth,
dim_head=64,
heads=8,
attn_dropout=0.,
ff_dropout=0.,
ff_mult=4,
norm_output=True,
rotary_embed=None,
flash_attn=True,
linear_attn=False
):
super().__init__()
self.layers = ModuleList([])
for _ in range(depth):
if linear_attn:
attn = LinearAttention(dim=dim, dim_head=dim_head, heads=heads, dropout=attn_dropout, flash=flash_attn)
else:
attn = Attention(dim=dim, dim_head=dim_head, heads=heads, dropout=attn_dropout,
rotary_embed=rotary_embed, flash=flash_attn)
self.layers.append(ModuleList([
attn,
FeedForward(dim=dim, mult=ff_mult, dropout=ff_dropout)
]))
self.norm = RMSNorm(dim) if norm_output else nn.Identity()
def forward(self, x):
for attn, ff in self.layers:
x = attn(x) + x
x = ff(x) + x
return self.norm(x)
# bandsplit module
class BandSplit(Module):
# @beartype
def __init__(
self,
dim,
dim_inputs: Tuple[int, ...]
):
super().__init__()
self.dim_inputs = dim_inputs
self.to_features = ModuleList([])
for dim_in in dim_inputs:
net = nn.Sequential(
RMSNorm(dim_in),
nn.Linear(dim_in, dim)
)
self.to_features.append(net)
def forward(self, x):
x = x.split(self.dim_inputs, dim=-1)
outs = []
for split_input, to_feature in zip(x, self.to_features):
split_output = to_feature(split_input)
outs.append(split_output)
return torch.stack(outs, dim=-2)
def MLP(
dim_in,
dim_out,
dim_hidden=None,
depth=1,
activation=nn.Tanh
):
dim_hidden = default(dim_hidden, dim_in)
net = []
dims = (dim_in, *((dim_hidden,) * (depth - 1)), dim_out)
for ind, (layer_dim_in, layer_dim_out) in enumerate(zip(dims[:-1], dims[1:])):
is_last = ind == (len(dims) - 2)
net.append(nn.Linear(layer_dim_in, layer_dim_out))
if is_last:
continue
net.append(activation())
return nn.Sequential(*net)
class MaskEstimator(Module):
# @beartype
def __init__(
self,
dim,
dim_inputs: Tuple[int, ...],
depth,
mlp_expansion_factor=4
):
super().__init__()
self.dim_inputs = dim_inputs
self.to_freqs = ModuleList([])
dim_hidden = dim * mlp_expansion_factor
for dim_in in dim_inputs:
net = []
mlp = nn.Sequential(
MLP(dim, dim_in * 2, dim_hidden=dim_hidden, depth=depth),
nn.GLU(dim=-1)
)
self.to_freqs.append(mlp)
def forward(self, x):
x = x.unbind(dim=-2)
outs = []
for band_features, mlp in zip(x, self.to_freqs):
freq_out = mlp(band_features)
outs.append(freq_out)
return torch.cat(outs, dim=-1)
# main class
DEFAULT_FREQS_PER_BANDS = (
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
12, 12, 12, 12, 12, 12, 12, 12,
24, 24, 24, 24, 24, 24, 24, 24,
48, 48, 48, 48, 48, 48, 48, 48,
128, 129,
)
class BSRoformer(Module):
# @beartype
def __init__(
self,
dim,
*,
depth,
stereo=False,
num_stems=1,
time_transformer_depth=2,
freq_transformer_depth=2,
linear_transformer_depth=0,
freqs_per_bands: Tuple[int, ...] = DEFAULT_FREQS_PER_BANDS,
# in the paper, they divide into ~60 bands, test with 1 for starters
dim_head=64,
heads=8,
attn_dropout=0.,
ff_dropout=0.,
flash_attn=True,
dim_freqs_in=1025,
stft_n_fft=2048,
stft_hop_length=512,
# 10ms at 44100Hz, from sections 4.1, 4.4 in the paper - @faroit recommends // 2 or // 4 for better reconstruction
stft_win_length=2048,
stft_normalized=False,
stft_window_fn: Optional[Callable] = None,
mask_estimator_depth=2,
multi_stft_resolution_loss_weight=1.,
multi_stft_resolutions_window_sizes: Tuple[int, ...] = (4096, 2048, 1024, 512, 256),
multi_stft_hop_size=147,
multi_stft_normalized=False,
multi_stft_window_fn: Callable = torch.hann_window
):
super().__init__()
self.stereo = stereo
self.audio_channels = 2 if stereo else 1
self.num_stems = num_stems
self.layers = ModuleList([])
transformer_kwargs = dict(
dim=dim,
heads=heads,
dim_head=dim_head,
attn_dropout=attn_dropout,
ff_dropout=ff_dropout,
flash_attn=flash_attn,
norm_output=False
)
time_rotary_embed = RotaryEmbedding(dim=dim_head)
freq_rotary_embed = RotaryEmbedding(dim=dim_head)
for _ in range(depth):
tran_modules = []
if linear_transformer_depth > 0:
tran_modules.append(Transformer(depth=linear_transformer_depth, linear_attn=True, **transformer_kwargs))
tran_modules.append(
Transformer(depth=time_transformer_depth, rotary_embed=time_rotary_embed, **transformer_kwargs)
)
tran_modules.append(
Transformer(depth=freq_transformer_depth, rotary_embed=freq_rotary_embed, **transformer_kwargs)
)
self.layers.append(nn.ModuleList(tran_modules))
self.final_norm = RMSNorm(dim)
self.stft_kwargs = dict(
n_fft=stft_n_fft,
hop_length=stft_hop_length,
win_length=stft_win_length,
normalized=stft_normalized
)
self.stft_window_fn = partial(default(stft_window_fn, torch.hann_window), stft_win_length)
freqs = torch.stft(torch.randn(1, 4096), **self.stft_kwargs, return_complex=True).shape[1]
assert len(freqs_per_bands) > 1
assert sum(
freqs_per_bands) == freqs, f'the number of freqs in the bands must equal {freqs} based on the STFT settings, but got {sum(freqs_per_bands)}'
freqs_per_bands_with_complex = tuple(2 * f * self.audio_channels for f in freqs_per_bands)
self.band_split = BandSplit(
dim=dim,
dim_inputs=freqs_per_bands_with_complex
)
self.mask_estimators = nn.ModuleList([])
for _ in range(num_stems):
mask_estimator = MaskEstimator(
dim=dim,
dim_inputs=freqs_per_bands_with_complex,
depth=mask_estimator_depth
)
self.mask_estimators.append(mask_estimator)
# for the multi-resolution stft loss
self.multi_stft_resolution_loss_weight = multi_stft_resolution_loss_weight
self.multi_stft_resolutions_window_sizes = multi_stft_resolutions_window_sizes
self.multi_stft_n_fft = stft_n_fft
self.multi_stft_window_fn = multi_stft_window_fn
self.multi_stft_kwargs = dict(
hop_length=multi_stft_hop_size,
normalized=multi_stft_normalized
)
def forward(
self,
raw_audio,
target=None,
return_loss_breakdown=False
):
"""
einops
b - batch
f - freq
t - time
s - audio channel (1 for mono, 2 for stereo)
n - number of 'stems'
c - complex (2)
d - feature dimension
"""
device = raw_audio.device
if raw_audio.ndim == 2:
raw_audio = rearrange(raw_audio, 'b t -> b 1 t')
channels = raw_audio.shape[1]
assert (not self.stereo and channels == 1) or (
self.stereo and channels == 2), 'stereo needs to be set to True if passing in audio signal that is stereo (channel dimension of 2). also need to be False if mono (channel dimension of 1)'
# to stft
raw_audio, batch_audio_channel_packed_shape = pack_one(raw_audio, '* t')
stft_window = self.stft_window_fn(device=device)
stft_repr = torch.stft(raw_audio, **self.stft_kwargs, window=stft_window, return_complex=True)
stft_repr = torch.view_as_real(stft_repr)
stft_repr = unpack_one(stft_repr, batch_audio_channel_packed_shape, '* f t c')
stft_repr = rearrange(stft_repr,
'b s f t c -> b (f s) t c') # merge stereo / mono into the frequency, with frequency leading dimension, for band splitting
x = rearrange(stft_repr, 'b f t c -> b t (f c)')
# print("460:", x.dtype)#fp32
x = self.band_split(x)
# axial / hierarchical attention
# print("487:",x.dtype)#fp16
for transformer_block in self.layers:
if len(transformer_block) == 3:
linear_transformer, time_transformer, freq_transformer = transformer_block
x, ft_ps = pack([x], 'b * d')
# print("494:", x.dtype)#fp16
x = linear_transformer(x)
# print("496:", x.dtype)#fp16
x, = unpack(x, ft_ps, 'b * d')
else:
time_transformer, freq_transformer = transformer_block
# print("501:", x.dtype)#fp16
x = rearrange(x, 'b t f d -> b f t d')
x, ps = pack([x], '* t d')
x = time_transformer(x)
# print("505:", x.dtype)#fp16
x, = unpack(x, ps, '* t d')
x = rearrange(x, 'b f t d -> b t f d')
x, ps = pack([x], '* f d')
x = freq_transformer(x)
x, = unpack(x, ps, '* f d')
# print("515:", x.dtype)######fp16
x = self.final_norm(x)
num_stems = len(self.mask_estimators)
# print("519:", x.dtype)#fp32
mask = torch.stack([fn(x) for fn in self.mask_estimators], dim=1)
mask = rearrange(mask, 'b n t (f c) -> b n f t c', c=2)
# modulate frequency representation
stft_repr = rearrange(stft_repr, 'b f t c -> b 1 f t c')
# complex number multiplication
stft_repr = torch.view_as_complex(stft_repr)
mask = torch.view_as_complex(mask)
stft_repr = stft_repr * mask
# istft
stft_repr = rearrange(stft_repr, 'b n (f s) t -> (b n s) f t', s=self.audio_channels)
recon_audio = torch.istft(stft_repr, **self.stft_kwargs, window=stft_window, return_complex=False)
recon_audio = rearrange(recon_audio, '(b n s) t -> b n s t', s=self.audio_channels, n=num_stems)
if num_stems == 1:
recon_audio = rearrange(recon_audio, 'b 1 s t -> b s t')
# if a target is passed in, calculate loss for learning
if not exists(target):
return recon_audio
if self.num_stems > 1:
assert target.ndim == 4 and target.shape[1] == self.num_stems
if target.ndim == 2:
target = rearrange(target, '... t -> ... 1 t')
target = target[..., :recon_audio.shape[-1]] # protect against lost length on istft
loss = F.l1_loss(recon_audio, target)
multi_stft_resolution_loss = 0.
for window_size in self.multi_stft_resolutions_window_sizes:
res_stft_kwargs = dict(
n_fft=max(window_size, self.multi_stft_n_fft), # not sure what n_fft is across multi resolution stft
win_length=window_size,
return_complex=True,
window=self.multi_stft_window_fn(window_size, device=device),
**self.multi_stft_kwargs,
)
recon_Y = torch.stft(rearrange(recon_audio, '... s t -> (... s) t'), **res_stft_kwargs)
target_Y = torch.stft(rearrange(target, '... s t -> (... s) t'), **res_stft_kwargs)
multi_stft_resolution_loss = multi_stft_resolution_loss + F.l1_loss(recon_Y, target_Y)
weighted_multi_resolution_loss = multi_stft_resolution_loss * self.multi_stft_resolution_loss_weight
total_loss = loss + weighted_multi_resolution_loss
if not return_loss_breakdown:
return total_loss
return total_loss, (loss, multi_stft_resolution_loss)

216
tools/uvr5/bsroformer.py Normal file
View File

@ -0,0 +1,216 @@
# This code is modified from https://github.com/ZFTurbo/
import pdb
import librosa
from tqdm import tqdm
import os
import torch
import numpy as np
import soundfile as sf
import torch.nn as nn
import warnings
warnings.filterwarnings("ignore")
from bs_roformer.bs_roformer import BSRoformer
class BsRoformer_Loader:
def get_model_from_config(self):
config = {
"attn_dropout": 0.1,
"depth": 12,
"dim": 512,
"dim_freqs_in": 1025,
"dim_head": 64,
"ff_dropout": 0.1,
"flash_attn": True,
"freq_transformer_depth": 1,
"freqs_per_bands":(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 24, 24, 24, 24, 24, 24, 24, 24, 48, 48, 48, 48, 48, 48, 48, 48, 128, 129),
"heads": 8,
"linear_transformer_depth": 0,
"mask_estimator_depth": 2,
"multi_stft_hop_size": 147,
"multi_stft_normalized": False,
"multi_stft_resolution_loss_weight": 1.0,
"multi_stft_resolutions_window_sizes":(4096, 2048, 1024, 512, 256),
"num_stems": 1,
"stereo": True,
"stft_hop_length": 441,
"stft_n_fft": 2048,
"stft_normalized": False,
"stft_win_length": 2048,
"time_transformer_depth": 1,
}
model = BSRoformer(
**dict(config)
)
return model
def demix_track(self, model, mix, device):
C = 352800
# num_overlap
N = 1
fade_size = C // 10
step = int(C // N)
border = C - step
batch_size = 4
length_init = mix.shape[-1]
progress_bar = tqdm(total=length_init // step + 1)
progress_bar.set_description("Processing")
# Do pad from the beginning and end to account floating window results better
if length_init > 2 * border and (border > 0):
mix = nn.functional.pad(mix, (border, border), mode='reflect')
# Prepare windows arrays (do 1 time for speed up). This trick repairs click problems on the edges of segment
window_size = C
fadein = torch.linspace(0, 1, fade_size)
fadeout = torch.linspace(1, 0, fade_size)
window_start = torch.ones(window_size)
window_middle = torch.ones(window_size)
window_finish = torch.ones(window_size)
window_start[-fade_size:] *= fadeout # First audio chunk, no fadein
window_finish[:fade_size] *= fadein # Last audio chunk, no fadeout
window_middle[-fade_size:] *= fadeout
window_middle[:fade_size] *= fadein
with torch.amp.autocast('cuda'):
with torch.inference_mode():
req_shape = (1, ) + tuple(mix.shape)
result = torch.zeros(req_shape, dtype=torch.float32)
counter = torch.zeros(req_shape, dtype=torch.float32)
i = 0
batch_data = []
batch_locations = []
while i < mix.shape[1]:
part = mix[:, i:i + C].to(device)
length = part.shape[-1]
if length < C:
if length > C // 2 + 1:
part = nn.functional.pad(input=part, pad=(0, C - length), mode='reflect')
else:
part = nn.functional.pad(input=part, pad=(0, C - length, 0, 0), mode='constant', value=0)
if(self.is_half==True):
part=part.half()
batch_data.append(part)
batch_locations.append((i, length))
i += step
progress_bar.update(1)
if len(batch_data) >= batch_size or (i >= mix.shape[1]):
arr = torch.stack(batch_data, dim=0)
# print(23333333,arr.dtype)
x = model(arr)
window = window_middle
if i - step == 0: # First audio chunk, no fadein
window = window_start
elif i >= mix.shape[1]: # Last audio chunk, no fadeout
window = window_finish
for j in range(len(batch_locations)):
start, l = batch_locations[j]
result[..., start:start+l] += x[j][..., :l].cpu() * window[..., :l]
counter[..., start:start+l] += window[..., :l]
batch_data = []
batch_locations = []
estimated_sources = result / counter
estimated_sources = estimated_sources.cpu().numpy()
np.nan_to_num(estimated_sources, copy=False, nan=0.0)
if length_init > 2 * border and (border > 0):
# Remove pad
estimated_sources = estimated_sources[..., border:-border]
progress_bar.close()
return {k: v for k, v in zip(['vocals', 'other'], estimated_sources)}
def run_folder(self,input, vocal_root, others_root, format):
# start_time = time.time()
self.model.eval()
path = input
if not os.path.isdir(vocal_root):
os.mkdir(vocal_root)
if not os.path.isdir(others_root):
os.mkdir(others_root)
try:
mix, sr = librosa.load(path, sr=44100, mono=False)
except Exception as e:
print('Can read track: {}'.format(path))
print('Error message: {}'.format(str(e)))
return
# Convert mono to stereo if needed
if len(mix.shape) == 1:
mix = np.stack([mix, mix], axis=0)
mix_orig = mix.copy()
mixture = torch.tensor(mix, dtype=torch.float32)
res = self.demix_track(self.model, mixture, self.device)
estimates = res['vocals'].T
if format in ["wav", "flac"]:
sf.write("{}/{}_{}.{}".format(vocal_root, os.path.basename(path)[:-4], 'vocals', format), estimates, sr)
sf.write("{}/{}_{}.{}".format(others_root, os.path.basename(path)[:-4], 'instrumental', format), mix_orig.T - estimates, sr)
else:
path_vocal = "%s/%s_vocals.wav" % (vocal_root, os.path.basename(path)[:-4])
path_other = "%s/%s_instrumental.wav" % (others_root, os.path.basename(path)[:-4])
sf.write(path_vocal, estimates, sr)
sf.write(path_other, mix_orig.T - estimates, sr)
opt_path_vocal = path_vocal[:-4] + ".%s" % format
opt_path_other = path_other[:-4] + ".%s" % format
if os.path.exists(path_vocal):
os.system(
"ffmpeg -i '%s' -vn '%s' -q:a 2 -y" % (path_vocal, opt_path_vocal)
)
if os.path.exists(opt_path_vocal):
try:
os.remove(path_vocal)
except:
pass
if os.path.exists(path_other):
os.system(
"ffmpeg -i '%s' -vn '%s' -q:a 2 -y" % (path_other, opt_path_other)
)
if os.path.exists(opt_path_other):
try:
os.remove(path_other)
except:
pass
# print("Elapsed time: {:.2f} sec".format(time.time() - start_time))
def __init__(self, model_path, device,is_half):
self.device = device
self.extract_instrumental=True
model = self.get_model_from_config()
state_dict = torch.load(model_path,map_location="cpu")
model.load_state_dict(state_dict)
self.is_half=is_half
if(is_half==False):
self.model = model.to(device)
else:
self.model = model.half().to(device)
def _path_audio_(self, input, others_root, vocal_root, format, is_hp3=False):
self.run_folder(input, vocal_root, others_root, format)

View File

@ -12,12 +12,13 @@ import torch
import sys import sys
from mdxnet import MDXNetDereverb from mdxnet import MDXNetDereverb
from vr import AudioPre, AudioPreDeEcho from vr import AudioPre, AudioPreDeEcho
from bsroformer import BsRoformer_Loader
weight_uvr5_root = "tools/uvr5/uvr5_weights" weight_uvr5_root = "tools/uvr5/uvr5_weights"
uvr5_names = [] uvr5_names = []
for name in os.listdir(weight_uvr5_root): for name in os.listdir(weight_uvr5_root):
if name.endswith(".pth") or "onnx" in name: if name.endswith(".pth") or name.endswith(".ckpt") or "onnx" in name:
uvr5_names.append(name.replace(".pth", "")) uvr5_names.append(name.replace(".pth", "").replace(".ckpt", ""))
device=sys.argv[1] device=sys.argv[1]
is_half=eval(sys.argv[2]) is_half=eval(sys.argv[2])
@ -33,6 +34,13 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format
is_hp3 = "HP3" in model_name is_hp3 = "HP3" in model_name
if model_name == "onnx_dereverb_By_FoxJoy": if model_name == "onnx_dereverb_By_FoxJoy":
pre_fun = MDXNetDereverb(15) pre_fun = MDXNetDereverb(15)
elif model_name == "Bs_Roformer" or "bs_roformer" in model_name.lower():
func = BsRoformer_Loader
pre_fun = func(
model_path = os.path.join(weight_uvr5_root, model_name + ".ckpt"),
device = device,
is_half=is_half
)
else: else:
func = AudioPre if "DeEcho" not in model_name else AudioPreDeEcho func = AudioPre if "DeEcho" not in model_name else AudioPreDeEcho
pre_fun = func( pre_fun = func(
@ -112,9 +120,18 @@ with gr.Blocks(title="UVR5 WebUI") as app:
with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")): with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")):
with gr.Group(): with gr.Group():
gr.Markdown( gr.Markdown(
value=i18n( value=i18n("人声伴奏分离批量处理, 使用UVR5模型。") + "<br>" + \
"人声伴奏分离批量处理, 使用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>&emsp;(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍<br>2、MDX-Net-Dereverb模型挺慢的<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。" i18n("合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。")+ "<br>" + \
) i18n("模型分为三类:") + "<br>" + \
i18n("1、保留人声不带和声的音频选这个对主人声保留比HP5更好。内置HP2和HP3两个模型HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点") + "<br>" + \
i18n("2、仅保留主人声带和声的音频选这个对主人声可能有削弱。内置HP5一个模型") + "<br>" + \
i18n("3、去混响、去延迟模型by FoxJoy") + "<br>" + \
i18n("(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;") + "<br>&emsp;" + \
i18n("(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底DeReverb额外去除混响可去除单声道混响但是对高频重的板式混响去不干净。") + "<br>" + \
i18n("去混响/去延迟,附:") + "<br>" + \
i18n("1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍") + "<br>" + \
i18n("2、MDX-Net-Dereverb模型挺慢的") + "<br>" + \
i18n("3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。")
) )
with gr.Row(): with gr.Row():
with gr.Column(): with gr.Column():

325
webui.py
View File

@ -1,12 +1,15 @@
import os,shutil,sys,pdb,re import os,sys
if len(sys.argv)==1:sys.argv.append('v2')
version="v1"if sys.argv[1]=="v1" else"v2"
os.environ["version"]=version
now_dir = os.getcwd() now_dir = os.getcwd()
sys.path.insert(0, now_dir) sys.path.insert(0, now_dir)
import json,yaml,warnings,torch import warnings
warnings.filterwarnings("ignore")
import json,yaml,torch,pdb,re,shutil
import platform import platform
import psutil import psutil
import signal import signal
warnings.filterwarnings("ignore")
torch.manual_seed(233333) torch.manual_seed(233333)
tmp = os.path.join(now_dir, "TEMP") tmp = os.path.join(now_dir, "TEMP")
os.makedirs(tmp, exist_ok=True) os.makedirs(tmp, exist_ok=True)
@ -45,18 +48,20 @@ from tools import my_utils
import traceback import traceback
import shutil import shutil
import pdb import pdb
import gradio as gr
from subprocess import Popen from subprocess import Popen
import signal import signal
from config import python_exec,infer_device,is_half,exp_root,webui_port_main,webui_port_infer_tts,webui_port_uvr5,webui_port_subfix,is_share from config import python_exec,infer_device,is_half,exp_root,webui_port_main,webui_port_infer_tts,webui_port_uvr5,webui_port_subfix,is_share
from tools.i18n.i18n import I18nAuto from tools.i18n.i18n import I18nAuto, scan_language_list
i18n = I18nAuto() language=sys.argv[-1] if sys.argv[-1] in scan_language_list() else "Auto"
os.environ["language"]=language
i18n = I18nAuto(language=language)
from scipy.io import wavfile from scipy.io import wavfile
from tools.my_utils import load_audio from tools.my_utils import load_audio
from multiprocessing import cpu_count from multiprocessing import cpu_count
# os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 当遇到mps不支持的步骤时使用cpu # os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 当遇到mps不支持的步骤时使用cpu
import gradio.analytics as analytics
analytics.version_check = lambda:None
import gradio as gr
n_cpu=cpu_count() n_cpu=cpu_count()
ngpu = torch.cuda.device_count() ngpu = torch.cuda.device_count()
@ -65,13 +70,16 @@ mem = []
if_gpu_ok = False if_gpu_ok = False
# 判断是否有能用来训练和加速推理的N卡 # 判断是否有能用来训练和加速推理的N卡
ok_gpu_keywords={"10","16","20","30","40","A2","A3","A4","P4","A50","500","A60","70","80","90","M4","T4","TITAN","L4","4060","H"}
set_gpu_numbers=set()
if torch.cuda.is_available() or ngpu != 0: if torch.cuda.is_available() or ngpu != 0:
for i in range(ngpu): for i in range(ngpu):
gpu_name = torch.cuda.get_device_name(i) gpu_name = torch.cuda.get_device_name(i)
if any(value in gpu_name.upper()for value in ["10","16","20","30","40","A2","A3","A4","P4","A50","500","A60","70","80","90","M4","T4","TITAN","L4","4060"]): if any(value in gpu_name.upper()for value in ok_gpu_keywords):
# A10#A100#V100#A40#P40#M40#K80#A4500 # A10#A100#V100#A40#P40#M40#K80#A4500
if_gpu_ok = True # 至少有一张能用的N卡 if_gpu_ok = True # 至少有一张能用的N卡
gpu_infos.append("%s\t%s" % (i, gpu_name)) gpu_infos.append("%s\t%s" % (i, gpu_name))
set_gpu_numbers.add(i)
mem.append(int(torch.cuda.get_device_properties(i).total_memory/ 1024/ 1024/ 1024+ 0.4)) mem.append(int(torch.cuda.get_device_properties(i).total_memory/ 1024/ 1024/ 1024+ 0.4))
# # 判断是否支持mps加速 # # 判断是否支持mps加速
# if torch.backends.mps.is_available(): # if torch.backends.mps.is_available():
@ -85,24 +93,62 @@ if if_gpu_ok and len(gpu_infos) > 0:
else: else:
gpu_info = ("%s\t%s" % ("0", "CPU")) gpu_info = ("%s\t%s" % ("0", "CPU"))
gpu_infos.append("%s\t%s" % ("0", "CPU")) gpu_infos.append("%s\t%s" % ("0", "CPU"))
set_gpu_numbers.add(0)
default_batch_size = int(psutil.virtual_memory().total/ 1024 / 1024 / 1024 / 2) default_batch_size = int(psutil.virtual_memory().total/ 1024 / 1024 / 1024 / 2)
gpus = "-".join([i[0] for i in gpu_infos]) gpus = "-".join([i[0] for i in gpu_infos])
default_gpu_numbers=str(sorted(list(set_gpu_numbers))[0])
def fix_gpu_number(input):#将越界的number强制改到界内
try:
if(int(input)not in set_gpu_numbers):return default_gpu_numbers
except:return input
return input
def fix_gpu_numbers(inputs):
output=[]
try:
for input in inputs.split(","):output.append(str(fix_gpu_number(input)))
return ",".join(output)
except:
return inputs
pretrained_sovits_name="GPT_SoVITS/pretrained_models/s2G488k.pth" pretrained_sovits_name=["GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth", "GPT_SoVITS/pretrained_models/s2G488k.pth"]
pretrained_gpt_name="GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt" pretrained_gpt_name=["GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt", "GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt"]
pretrained_model_list = (pretrained_sovits_name[-int(version[-1])+2],pretrained_sovits_name[-int(version[-1])+2].replace("s2G","s2D"),pretrained_gpt_name[-int(version[-1])+2],"GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large","GPT_SoVITS/pretrained_models/chinese-hubert-base")
_=''
for i in pretrained_model_list:
if os.path.exists(i):...
else:_+=f'\n {i}'
if _:
print("warning:",i18n('以下模型不存在:')+_)
_ =[[],[]]
for i in range(2):
if os.path.exists(pretrained_gpt_name[i]):_[0].append(pretrained_gpt_name[i])
else:_[0].append("")##没有下pretrained模型的说不定他们是想自己从零训底模呢
if os.path.exists(pretrained_sovits_name[i]):_[-1].append(pretrained_sovits_name[i])
else:_[-1].append("")
pretrained_gpt_name,pretrained_sovits_name = _
SoVITS_weight_root=["SoVITS_weights_v2","SoVITS_weights"]
GPT_weight_root=["GPT_weights_v2","GPT_weights"]
for root in SoVITS_weight_root+GPT_weight_root:
os.makedirs(root,exist_ok=True)
def get_weights_names(): def get_weights_names():
SoVITS_names = [pretrained_sovits_name] SoVITS_names = [name for name in pretrained_sovits_name if name!=""]
for name in os.listdir(SoVITS_weight_root): for path in SoVITS_weight_root:
if name.endswith(".pth"):SoVITS_names.append(name) for name in os.listdir(path):
GPT_names = [pretrained_gpt_name] if name.endswith(".pth"): SoVITS_names.append("%s/%s" % (path, name))
for name in os.listdir(GPT_weight_root): GPT_names = [name for name in pretrained_gpt_name if name!=""]
if name.endswith(".ckpt"): GPT_names.append(name) for path in GPT_weight_root:
return SoVITS_names,GPT_names for name in os.listdir(path):
SoVITS_weight_root="SoVITS_weights" if name.endswith(".ckpt"): GPT_names.append("%s/%s" % (path, name))
GPT_weight_root="GPT_weights" return SoVITS_names, GPT_names
os.makedirs(SoVITS_weight_root,exist_ok=True)
os.makedirs(GPT_weight_root,exist_ok=True)
SoVITS_names,GPT_names = get_weights_names() SoVITS_names,GPT_names = get_weights_names()
for path in SoVITS_weight_root+GPT_weight_root:
os.makedirs(path,exist_ok=True)
def custom_sort_key(s): def custom_sort_key(s):
# 使用正则表达式提取字符串中的数字部分和非数字部分 # 使用正则表达式提取字符串中的数字部分和非数字部分
@ -181,11 +227,11 @@ def change_tts_inference(if_tts,bert_path,cnhubert_base_path,gpu_number,gpt_path
os.environ["sovits_path"]=sovits_path if "/"in sovits_path else "%s/%s"%(SoVITS_weight_root,sovits_path) os.environ["sovits_path"]=sovits_path if "/"in sovits_path else "%s/%s"%(SoVITS_weight_root,sovits_path)
os.environ["cnhubert_base_path"]=cnhubert_base_path os.environ["cnhubert_base_path"]=cnhubert_base_path
os.environ["bert_path"]=bert_path os.environ["bert_path"]=bert_path
os.environ["_CUDA_VISIBLE_DEVICES"]=gpu_number os.environ["_CUDA_VISIBLE_DEVICES"]=fix_gpu_number(gpu_number)
os.environ["is_half"]=str(is_half) os.environ["is_half"]=str(is_half)
os.environ["infer_ttswebui"]=str(webui_port_infer_tts) os.environ["infer_ttswebui"]=str(webui_port_infer_tts)
os.environ["is_share"]=str(is_share) os.environ["is_share"]=str(is_share)
cmd = '"%s" GPT_SoVITS/inference_webui.py'%(python_exec) cmd = '"%s" GPT_SoVITS/inference_webui.py "%s"'%(python_exec, language)
yield i18n("TTS推理进程已开启") yield i18n("TTS推理进程已开启")
print(cmd) print(cmd)
p_tts_inference = Popen(cmd, shell=True) p_tts_inference = Popen(cmd, shell=True)
@ -195,26 +241,29 @@ def change_tts_inference(if_tts,bert_path,cnhubert_base_path,gpu_number,gpt_path
yield i18n("TTS推理进程已关闭") yield i18n("TTS推理进程已关闭")
from tools.asr.config import asr_dict from tools.asr.config import asr_dict
def open_asr(asr_inp_dir, asr_opt_dir, asr_model, asr_model_size, asr_lang): def open_asr(asr_inp_dir, asr_opt_dir, asr_model, asr_model_size, asr_lang, asr_precision):
global p_asr global p_asr
if(p_asr==None): if(p_asr==None):
asr_inp_dir=my_utils.clean_path(asr_inp_dir) asr_inp_dir=my_utils.clean_path(asr_inp_dir)
asr_opt_dir=my_utils.clean_path(asr_opt_dir) asr_opt_dir=my_utils.clean_path(asr_opt_dir)
check_for_exists([asr_inp_dir])
cmd = f'"{python_exec}" tools/asr/{asr_dict[asr_model]["path"]}' cmd = f'"{python_exec}" tools/asr/{asr_dict[asr_model]["path"]}'
cmd += f' -i "{asr_inp_dir}"' cmd += f' -i "{asr_inp_dir}"'
cmd += f' -o "{asr_opt_dir}"' cmd += f' -o "{asr_opt_dir}"'
cmd += f' -s {asr_model_size}' cmd += f' -s {asr_model_size}'
cmd += f' -l {asr_lang}' cmd += f' -l {asr_lang}'
cmd += " -p %s"%("float16"if is_half==True else "float32") cmd += f" -p {asr_precision}"
output_file_name = os.path.basename(asr_inp_dir)
yield "ASR任务开启%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} output_folder = asr_opt_dir or "output/asr_opt"
output_file_path = os.path.abspath(f'{output_folder}/{output_file_name}.list')
yield "ASR任务开启%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}, {"__type__":"update"}
print(cmd) print(cmd)
p_asr = Popen(cmd, shell=True) p_asr = Popen(cmd, shell=True)
p_asr.wait() p_asr.wait()
p_asr=None p_asr=None
yield f"ASR任务完成, 查看终端进行下一步",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield f"ASR任务完成, 查看终端进行下一步", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__":"update","value":output_file_path}, {"__type__":"update","value":output_file_path}, {"__type__":"update","value":asr_inp_dir}
else: else:
yield "已有正在进行的ASR任务需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} yield "已有正在进行的ASR任务需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}, {"__type__":"update"}
# return None # return None
def close_asr(): def close_asr():
@ -222,22 +271,23 @@ def close_asr():
if(p_asr!=None): if(p_asr!=None):
kill_process(p_asr.pid) kill_process(p_asr.pid)
p_asr=None p_asr=None
return "已终止ASR进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False} return "已终止ASR进程", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
def open_denoise(denoise_inp_dir, denoise_opt_dir): def open_denoise(denoise_inp_dir, denoise_opt_dir):
global p_denoise global p_denoise
if(p_denoise==None): if(p_denoise==None):
denoise_inp_dir=my_utils.clean_path(denoise_inp_dir) denoise_inp_dir=my_utils.clean_path(denoise_inp_dir)
denoise_opt_dir=my_utils.clean_path(denoise_opt_dir) denoise_opt_dir=my_utils.clean_path(denoise_opt_dir)
check_for_exists([denoise_inp_dir])
cmd = '"%s" tools/cmd-denoise.py -i "%s" -o "%s" -p %s'%(python_exec,denoise_inp_dir,denoise_opt_dir,"float16"if is_half==True else "float32") cmd = '"%s" tools/cmd-denoise.py -i "%s" -o "%s" -p %s'%(python_exec,denoise_inp_dir,denoise_opt_dir,"float16"if is_half==True else "float32")
yield "语音降噪任务开启:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True} yield "语音降噪任务开启:%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}
print(cmd) print(cmd)
p_denoise = Popen(cmd, shell=True) p_denoise = Popen(cmd, shell=True)
p_denoise.wait() p_denoise.wait()
p_denoise=None p_denoise=None
yield f"语音降噪任务完成, 查看终端进行下一步",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield f"语音降噪任务完成, 查看终端进行下一步", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__":"update","value":denoise_opt_dir}, {"__type__":"update","value":denoise_opt_dir}
else: else:
yield "已有正在进行的语音降噪任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} yield "已有正在进行的语音降噪任务,需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}
# return None # return None
def close_denoise(): def close_denoise():
@ -245,7 +295,7 @@ def close_denoise():
if(p_denoise!=None): if(p_denoise!=None):
kill_process(p_denoise.pid) kill_process(p_denoise.pid)
p_denoise=None p_denoise=None
return "已终止语音降噪进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False} return "已终止语音降噪进程", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
p_train_SoVITS=None 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): 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):
@ -256,6 +306,7 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s
data=json.loads(data) data=json.loads(data)
s2_dir="%s/%s"%(exp_root,exp_name) s2_dir="%s/%s"%(exp_root,exp_name)
os.makedirs("%s/logs_s2"%(s2_dir),exist_ok=True) os.makedirs("%s/logs_s2"%(s2_dir),exist_ok=True)
check_for_exists([s2_dir],is_train=True)
if(is_half==False): if(is_half==False):
data["train"]["fp16_run"]=False data["train"]["fp16_run"]=False
batch_size=max(1,batch_size//2) batch_size=max(1,batch_size//2)
@ -268,38 +319,41 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s
data["train"]["if_save_every_weights"]=if_save_every_weights data["train"]["if_save_every_weights"]=if_save_every_weights
data["train"]["save_every_epoch"]=save_every_epoch data["train"]["save_every_epoch"]=save_every_epoch
data["train"]["gpu_numbers"]=gpu_numbers1Ba data["train"]["gpu_numbers"]=gpu_numbers1Ba
data["model"]["version"]=version
data["data"]["exp_dir"]=data["s2_ckpt_dir"]=s2_dir data["data"]["exp_dir"]=data["s2_ckpt_dir"]=s2_dir
data["save_weight_dir"]=SoVITS_weight_root data["save_weight_dir"]=SoVITS_weight_root[-int(version[-1])+2]
data["name"]=exp_name data["name"]=exp_name
data["version"]=version
tmp_config_path="%s/tmp_s2.json"%tmp tmp_config_path="%s/tmp_s2.json"%tmp
with open(tmp_config_path,"w")as f:f.write(json.dumps(data)) 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) 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 "SoVITS训练开始%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
print(cmd) print(cmd)
p_train_SoVITS = Popen(cmd, shell=True) p_train_SoVITS = Popen(cmd, shell=True)
p_train_SoVITS.wait() p_train_SoVITS.wait()
p_train_SoVITS=None p_train_SoVITS=None
yield "SoVITS训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "SoVITS训练完成", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
else: else:
yield "已有正在进行的SoVITS训练任务需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} yield "已有正在进行的SoVITS训练任务需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
def close1Ba(): def close1Ba():
global p_train_SoVITS global p_train_SoVITS
if(p_train_SoVITS!=None): if(p_train_SoVITS!=None):
kill_process(p_train_SoVITS.pid) kill_process(p_train_SoVITS.pid)
p_train_SoVITS=None p_train_SoVITS=None
return "已终止SoVITS训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} return "已终止SoVITS训练", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
p_train_GPT=None p_train_GPT=None
def open1Bb(batch_size,total_epoch,exp_name,if_dpo,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers,pretrained_s1): def open1Bb(batch_size,total_epoch,exp_name,if_dpo,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers,pretrained_s1):
global p_train_GPT global p_train_GPT
if(p_train_GPT==None): if(p_train_GPT==None):
with open("GPT_SoVITS/configs/s1longer.yaml")as f: with open("GPT_SoVITS/configs/s1longer.yaml"if version=="v1"else "GPT_SoVITS/configs/s1longer-v2.yaml")as f:
data=f.read() data=f.read()
data=yaml.load(data, Loader=yaml.FullLoader) data=yaml.load(data, Loader=yaml.FullLoader)
s1_dir="%s/%s"%(exp_root,exp_name) s1_dir="%s/%s"%(exp_root,exp_name)
os.makedirs("%s/logs_s1"%(s1_dir),exist_ok=True) os.makedirs("%s/logs_s1"%(s1_dir),exist_ok=True)
check_for_exists([s1_dir],is_train=True)
if(is_half==False): if(is_half==False):
data["train"]["precision"]="32" data["train"]["precision"]="32"
batch_size = max(1, batch_size // 2) batch_size = max(1, batch_size // 2)
@ -310,46 +364,48 @@ def open1Bb(batch_size,total_epoch,exp_name,if_dpo,if_save_latest,if_save_every_
data["train"]["if_save_every_weights"]=if_save_every_weights data["train"]["if_save_every_weights"]=if_save_every_weights
data["train"]["if_save_latest"]=if_save_latest data["train"]["if_save_latest"]=if_save_latest
data["train"]["if_dpo"]=if_dpo data["train"]["if_dpo"]=if_dpo
data["train"]["half_weights_save_dir"]=GPT_weight_root data["train"]["half_weights_save_dir"]=GPT_weight_root[-int(version[-1])+2]
data["train"]["exp_name"]=exp_name data["train"]["exp_name"]=exp_name
data["train_semantic_path"]="%s/6-name2semantic.tsv"%s1_dir data["train_semantic_path"]="%s/6-name2semantic.tsv"%s1_dir
data["train_phoneme_path"]="%s/2-name2text.txt"%s1_dir data["train_phoneme_path"]="%s/2-name2text.txt"%s1_dir
data["output_dir"]="%s/logs_s1"%s1_dir data["output_dir"]="%s/logs_s1"%s1_dir
# data["version"]=version
os.environ["_CUDA_VISIBLE_DEVICES"]=gpu_numbers.replace("-",",") os.environ["_CUDA_VISIBLE_DEVICES"]=fix_gpu_numbers(gpu_numbers.replace("-",","))
os.environ["hz"]="25hz" os.environ["hz"]="25hz"
tmp_config_path="%s/tmp_s1.yaml"%tmp tmp_config_path="%s/tmp_s1.yaml"%tmp
with open(tmp_config_path, "w") as f:f.write(yaml.dump(data, default_flow_style=False)) 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" --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) 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 "GPT训练开始%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
print(cmd) print(cmd)
p_train_GPT = Popen(cmd, shell=True) p_train_GPT = Popen(cmd, shell=True)
p_train_GPT.wait() p_train_GPT.wait()
p_train_GPT=None p_train_GPT=None
yield "GPT训练完成",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "GPT训练完成", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
else: else:
yield "已有正在进行的GPT训练任务需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True} yield "已有正在进行的GPT训练任务需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
def close1Bb(): def close1Bb():
global p_train_GPT global p_train_GPT
if(p_train_GPT!=None): if(p_train_GPT!=None):
kill_process(p_train_GPT.pid) kill_process(p_train_GPT.pid)
p_train_GPT=None p_train_GPT=None
return "已终止GPT训练",{"__type__":"update","visible":True},{"__type__":"update","visible":False} return "已终止GPT训练", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
ps_slice=[] ps_slice=[]
def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts): def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts):
global ps_slice global ps_slice
inp = my_utils.clean_path(inp) inp = my_utils.clean_path(inp)
opt_root = my_utils.clean_path(opt_root) opt_root = my_utils.clean_path(opt_root)
check_for_exists([inp])
if(os.path.exists(inp)==False): if(os.path.exists(inp)==False):
yield "输入路径不存在",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "输入路径不存在", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
return return
if os.path.isfile(inp):n_parts=1 if os.path.isfile(inp):n_parts=1
elif os.path.isdir(inp):pass elif os.path.isdir(inp):pass
else: else:
yield "输入路径存在但既不是文件也不是文件夹",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "输入路径存在但既不是文件也不是文件夹", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
return return
if (ps_slice == []): if (ps_slice == []):
for i_part in range(n_parts): for i_part in range(n_parts):
@ -357,13 +413,13 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k
print(cmd) print(cmd)
p = Popen(cmd, shell=True) p = Popen(cmd, shell=True)
ps_slice.append(p) ps_slice.append(p)
yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
for p in ps_slice: for p in ps_slice:
p.wait() p.wait()
ps_slice=[] ps_slice=[]
yield "切割结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "切割结束", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update", "value":opt_root}, {"__type__": "update", "value":opt_root}, {"__type__": "update", "value":opt_root}
else: else:
yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
def close_slice(): def close_slice():
global ps_slice global ps_slice
@ -381,6 +437,7 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir):
global ps1a global ps1a
inp_text = my_utils.clean_path(inp_text) inp_text = my_utils.clean_path(inp_text)
inp_wav_dir = my_utils.clean_path(inp_wav_dir) inp_wav_dir = my_utils.clean_path(inp_wav_dir)
check_for_exists([inp_text,inp_wav_dir], is_dataset_processing=True)
if (ps1a == []): if (ps1a == []):
opt_dir="%s/%s"%(exp_root,exp_name) opt_dir="%s/%s"%(exp_root,exp_name)
config={ config={
@ -397,7 +454,7 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir):
{ {
"i_part": str(i_part), "i_part": str(i_part),
"all_parts": str(all_parts), "all_parts": str(all_parts),
"_CUDA_VISIBLE_DEVICES": gpu_names[i_part], "_CUDA_VISIBLE_DEVICES": fix_gpu_number(gpu_names[i_part]),
"is_half": str(is_half) "is_half": str(is_half)
} }
) )
@ -442,6 +499,7 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
global ps1b global ps1b
inp_text = my_utils.clean_path(inp_text) inp_text = my_utils.clean_path(inp_text)
inp_wav_dir = my_utils.clean_path(inp_wav_dir) inp_wav_dir = my_utils.clean_path(inp_wav_dir)
check_for_exists([inp_text,inp_wav_dir], is_dataset_processing=True)
if (ps1b == []): if (ps1b == []):
config={ config={
"inp_text":inp_text, "inp_text":inp_text,
@ -458,7 +516,7 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
{ {
"i_part": str(i_part), "i_part": str(i_part),
"all_parts": str(all_parts), "all_parts": str(all_parts),
"_CUDA_VISIBLE_DEVICES": gpu_names[i_part], "_CUDA_VISIBLE_DEVICES": fix_gpu_number(gpu_names[i_part]),
} }
) )
os.environ.update(config) os.environ.update(config)
@ -470,7 +528,7 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
for p in ps1b: for p in ps1b:
p.wait() p.wait()
ps1b=[] ps1b=[]
yield "SSL提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "SSL提取进程结束", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
else: else:
yield "已有正在进行的SSL提取任务需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} yield "已有正在进行的SSL提取任务需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
@ -489,6 +547,7 @@ ps1c=[]
def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path): def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
global ps1c global ps1c
inp_text = my_utils.clean_path(inp_text) inp_text = my_utils.clean_path(inp_text)
check_for_exists([inp_text,''], is_dataset_processing=True)
if (ps1c == []): if (ps1c == []):
opt_dir="%s/%s"%(exp_root,exp_name) opt_dir="%s/%s"%(exp_root,exp_name)
config={ config={
@ -506,7 +565,7 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
{ {
"i_part": str(i_part), "i_part": str(i_part),
"all_parts": str(all_parts), "all_parts": str(all_parts),
"_CUDA_VISIBLE_DEVICES": gpu_names[i_part], "_CUDA_VISIBLE_DEVICES": fix_gpu_number(gpu_names[i_part]),
} }
) )
os.environ.update(config) os.environ.update(config)
@ -527,7 +586,7 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
with open(path_semantic, "w", encoding="utf8") as f: with open(path_semantic, "w", encoding="utf8") as f:
f.write("\n".join(opt) + "\n") f.write("\n".join(opt) + "\n")
ps1c=[] ps1c=[]
yield "语义token提取进程结束",{"__type__":"update","visible":True},{"__type__":"update","visible":False} yield "语义token提取进程结束", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
else: else:
yield "已有正在进行的语义token提取任务需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True} yield "已有正在进行的语义token提取任务需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
@ -547,6 +606,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
global ps1abc global ps1abc
inp_text = my_utils.clean_path(inp_text) inp_text = my_utils.clean_path(inp_text)
inp_wav_dir = my_utils.clean_path(inp_wav_dir) inp_wav_dir = my_utils.clean_path(inp_wav_dir)
check_for_exists([inp_text,inp_wav_dir])
if (ps1abc == []): if (ps1abc == []):
opt_dir="%s/%s"%(exp_root,exp_name) opt_dir="%s/%s"%(exp_root,exp_name)
try: try:
@ -568,7 +628,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
{ {
"i_part": str(i_part), "i_part": str(i_part),
"all_parts": str(all_parts), "all_parts": str(all_parts),
"_CUDA_VISIBLE_DEVICES": gpu_names[i_part], "_CUDA_VISIBLE_DEVICES": fix_gpu_number(gpu_names[i_part]),
} }
) )
os.environ.update(config) os.environ.update(config)
@ -605,7 +665,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
{ {
"i_part": str(i_part), "i_part": str(i_part),
"all_parts": str(all_parts), "all_parts": str(all_parts),
"_CUDA_VISIBLE_DEVICES": gpu_names[i_part], "_CUDA_VISIBLE_DEVICES": fix_gpu_number(gpu_names[i_part]),
} }
) )
os.environ.update(config) os.environ.update(config)
@ -634,7 +694,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
{ {
"i_part": str(i_part), "i_part": str(i_part),
"all_parts": str(all_parts), "all_parts": str(all_parts),
"_CUDA_VISIBLE_DEVICES": gpu_names[i_part], "_CUDA_VISIBLE_DEVICES": fix_gpu_number(gpu_names[i_part]),
} }
) )
os.environ.update(config) os.environ.update(config)
@ -674,6 +734,47 @@ def close1abc():
ps1abc=[] ps1abc=[]
return "已终止所有一键三连进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False} return "已终止所有一键三连进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
def switch_version(version_):
os.environ['version']=version_
global version
version = version_
if pretrained_sovits_name[-int(version[-1])+2] !='' and pretrained_gpt_name[-int(version[-1])+2] !='':...
else:
gr.Warning(i18n(f'未下载{version.upper()}模型'))
return {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2].replace("s2G","s2D")}, {'__type__':'update', 'value':pretrained_gpt_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_gpt_name[-int(version[-1])+2]}, {'__type__':'update', 'value':pretrained_sovits_name[-int(version[-1])+2]}
def check_for_exists(file_list=None,is_train=False,is_dataset_processing=False):
missing_files=[]
if is_train == True and file_list:
file_list.append(os.path.join(file_list[0],'2-name2text.txt'))
file_list.append(os.path.join(file_list[0],'3-bert'))
file_list.append(os.path.join(file_list[0],'4-cnhubert'))
file_list.append(os.path.join(file_list[0],'5-wav32k'))
file_list.append(os.path.join(file_list[0],'6-name2semantic.tsv'))
for file in file_list:
if os.path.exists(file):pass
else:missing_files.append(file)
if missing_files:
if is_train:
for missing_file in missing_files:
if missing_file != '':
gr.Warning(missing_file)
gr.Warning(i18n('以下文件或文件夹不存在:'))
else:
for missing_file in missing_files:
if missing_file != '':
gr.Warning(missing_file)
if file_list[-1]==[''] and is_dataset_processing:
pass
else:
gr.Warning(i18n('以下文件或文件夹不存在:'))
if os.path.exists('GPT_SoVITS/text/G2PWModel'):...
else:
cmd = '"%s" GPT_SoVITS/download.py'%python_exec
p = Popen(cmd, shell=True)
p.wait()
with gr.Blocks(title="GPT-SoVITS WebUI") as app: with gr.Blocks(title="GPT-SoVITS WebUI") as app:
gr.Markdown( gr.Markdown(
value= value=
@ -692,33 +793,37 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
uvr5_info = gr.Textbox(label=i18n("UVR5进程输出信息")) uvr5_info = gr.Textbox(label=i18n("UVR5进程输出信息"))
gr.Markdown(value=i18n("0b-语音切分工具")) gr.Markdown(value=i18n("0b-语音切分工具"))
with gr.Row(): with gr.Row():
with gr.Row(): with gr.Column(scale=3):
slice_inp_path=gr.Textbox(label=i18n("音频自动切分输入路径,可文件可文件夹"),value="") with gr.Row():
slice_opt_root=gr.Textbox(label=i18n("切分后的子音频的输出根目录"),value="output/slicer_opt") slice_inp_path=gr.Textbox(label=i18n("音频自动切分输入路径,可文件可文件夹"),value="")
threshold=gr.Textbox(label=i18n("threshold:音量小于这个值视作静音的备选切割点"),value="-34") slice_opt_root=gr.Textbox(label=i18n("切分后的子音频的输出根目录"),value="output/slicer_opt")
min_length=gr.Textbox(label=i18n("min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值"),value="4000") with gr.Row():
min_interval=gr.Textbox(label=i18n("min_interval:最短切割间隔"),value="300") threshold=gr.Textbox(label=i18n("threshold:音量小于这个值视作静音的备选切割点"),value="-34")
hop_size=gr.Textbox(label=i18n("hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)"),value="10") min_length=gr.Textbox(label=i18n("min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值"),value="4000")
max_sil_kept=gr.Textbox(label=i18n("max_sil_kept:切完后静音最多留多长"),value="500") min_interval=gr.Textbox(label=i18n("min_interval:最短切割间隔"),value="300")
with gr.Row(): hop_size=gr.Textbox(label=i18n("hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)"),value="10")
open_slicer_button=gr.Button(i18n("开启语音切割"), variant="primary",visible=True) max_sil_kept=gr.Textbox(label=i18n("max_sil_kept:切完后静音最多留多长"),value="500")
close_slicer_button=gr.Button(i18n("终止语音切割"), variant="primary",visible=False) with gr.Row():
_max=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("max:归一化后最大值多少"),value=0.9,interactive=True) _max=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("max:归一化后最大值多少"),value=0.9,interactive=True)
alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True) alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True)
n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True) n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True)
slicer_info = gr.Textbox(label=i18n("语音切割进程输出信息")) with gr.Row():
slicer_info = gr.Textbox(label=i18n("语音切割进程输出信息"))
open_slicer_button=gr.Button(i18n("开启语音切割"), variant="primary",visible=True)
close_slicer_button=gr.Button(i18n("终止语音切割"), variant="primary",visible=False)
gr.Markdown(value=i18n("0bb-语音降噪工具")) gr.Markdown(value=i18n("0bb-语音降噪工具"))
with gr.Row(): with gr.Row():
with gr.Column(scale=3):
with gr.Row():
denoise_input_dir=gr.Textbox(label=i18n("降噪音频文件输入文件夹"),value="")
denoise_output_dir=gr.Textbox(label=i18n("降噪结果输出文件夹"),value="output/denoise_opt")
with gr.Row():
denoise_info = gr.Textbox(label=i18n("语音降噪进程输出信息"))
open_denoise_button = gr.Button(i18n("开启语音降噪"), variant="primary",visible=True) open_denoise_button = gr.Button(i18n("开启语音降噪"), variant="primary",visible=True)
close_denoise_button = gr.Button(i18n("终止语音降噪进程"), variant="primary",visible=False) close_denoise_button = gr.Button(i18n("终止语音降噪进程"), variant="primary",visible=False)
denoise_input_dir=gr.Textbox(label=i18n("降噪音频文件输入文件夹"),value="")
denoise_output_dir=gr.Textbox(label=i18n("降噪结果输出文件夹"),value="output/denoise_opt")
denoise_info = gr.Textbox(label=i18n("语音降噪进程输出信息"))
gr.Markdown(value=i18n("0c-中文批量离线ASR工具")) gr.Markdown(value=i18n("0c-中文批量离线ASR工具"))
with gr.Row(): with gr.Row():
open_asr_button = gr.Button(i18n("开启离线批量ASR"), variant="primary",visible=True) with gr.Column(scale=3):
close_asr_button = gr.Button(i18n("终止ASR进程"), variant="primary",visible=False)
with gr.Column():
with gr.Row(): with gr.Row():
asr_inp_dir = gr.Textbox( asr_inp_dir = gr.Textbox(
label=i18n("输入文件夹路径"), label=i18n("输入文件夹路径"),
@ -745,21 +850,43 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
) )
asr_lang = gr.Dropdown( asr_lang = gr.Dropdown(
label = i18n("ASR 语言设置"), label = i18n("ASR 语言设置"),
choices = ["zh"], choices = ["zh","yue"],
interactive = True, interactive = True,
value="zh" value="zh"
) )
asr_precision = gr.Dropdown(
label = i18n("数据类型精度"),
choices = ["float32"],
interactive = True,
value="float32"
)
with gr.Row(): with gr.Row():
asr_info = gr.Textbox(label=i18n("ASR进程输出信息")) asr_info = gr.Textbox(label=i18n("ASR进程输出信息"))
open_asr_button = gr.Button(i18n("开启离线批量ASR"), variant="primary",visible=True)
close_asr_button = gr.Button(i18n("终止ASR进程"), variant="primary",visible=False)
def change_lang_choices(key): #根据选择的模型修改可选的语言 def change_lang_choices(key): #根据选择的模型修改可选的语言
# return gr.Dropdown(choices=asr_dict[key]['lang']) # return gr.Dropdown(choices=asr_dict[key]['lang'])
return {"__type__": "update", "choices": asr_dict[key]['lang'],"value":asr_dict[key]['lang'][0]} return {"__type__": "update", "choices": asr_dict[key]['lang'],"value":asr_dict[key]['lang'][0]}
def change_size_choices(key): # 根据选择的模型修改可选的模型尺寸 def change_size_choices(key): # 根据选择的模型修改可选的模型尺寸
# return gr.Dropdown(choices=asr_dict[key]['size']) # return gr.Dropdown(choices=asr_dict[key]['size'])
return {"__type__": "update", "choices": asr_dict[key]['size']} return {"__type__": "update", "choices": asr_dict[key]['size'],"value":asr_dict[key]['size'][-1]}
def change_precision_choices(key): #根据选择的模型修改可选的语言
if key =="Faster Whisper (多语种)":
if default_batch_size <= 4:
precision = 'int8'
elif is_half:
precision = 'float16'
else:
precision = 'float32'
else:
precision = 'float32'
# return gr.Dropdown(choices=asr_dict[key]['precision'])
return {"__type__": "update", "choices": asr_dict[key]['precision'],"value":precision}
asr_model.change(change_lang_choices, [asr_model], [asr_lang]) asr_model.change(change_lang_choices, [asr_model], [asr_lang])
asr_model.change(change_size_choices, [asr_model], [asr_size]) asr_model.change(change_size_choices, [asr_model], [asr_size])
asr_model.change(change_precision_choices, [asr_model], [asr_precision])
gr.Markdown(value=i18n("0d-语音文本校对标注工具")) gr.Markdown(value=i18n("0d-语音文本校对标注工具"))
with gr.Row(): with gr.Row():
@ -772,20 +899,15 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
label_info = gr.Textbox(label=i18n("打标工具进程输出信息")) label_info = gr.Textbox(label=i18n("打标工具进程输出信息"))
if_label.change(change_label, [if_label,path_list], [label_info]) if_label.change(change_label, [if_label,path_list], [label_info])
if_uvr5.change(change_uvr5, [if_uvr5], [uvr5_info]) if_uvr5.change(change_uvr5, [if_uvr5], [uvr5_info])
open_asr_button.click(open_asr, [asr_inp_dir, asr_opt_dir, asr_model, asr_size, asr_lang], [asr_info,open_asr_button,close_asr_button])
close_asr_button.click(close_asr, [], [asr_info,open_asr_button,close_asr_button])
open_slicer_button.click(open_slice, [slice_inp_path,slice_opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_process], [slicer_info,open_slicer_button,close_slicer_button])
close_slicer_button.click(close_slice, [], [slicer_info,open_slicer_button,close_slicer_button])
open_denoise_button.click(open_denoise, [denoise_input_dir,denoise_output_dir], [denoise_info,open_denoise_button,close_denoise_button])
close_denoise_button.click(close_denoise, [], [denoise_info,open_denoise_button,close_denoise_button])
with gr.TabItem(i18n("1-GPT-SoVITS-TTS")): with gr.TabItem(i18n("1-GPT-SoVITS-TTS")):
with gr.Row(): with gr.Row():
exp_name = gr.Textbox(label=i18n("*实验/模型名"), value="xxx", interactive=True) exp_name = gr.Textbox(label=i18n("*实验/模型名"), value="xxx", interactive=True)
gpu_info = gr.Textbox(label=i18n("显卡信息"), value=gpu_info, visible=True, interactive=False) gpu_info = gr.Textbox(label=i18n("显卡信息"), value=gpu_info, visible=True, interactive=False)
pretrained_s2G = gr.Textbox(label=i18n("预训练的SoVITS-G模型路径"), value="GPT_SoVITS/pretrained_models/s2G488k.pth", interactive=True) version_checkbox = gr.Radio(label=i18n("版本"),value=version,choices=['v1','v2'])
pretrained_s2D = gr.Textbox(label=i18n("预训练的SoVITS-D模型路径"), value="GPT_SoVITS/pretrained_models/s2D488k.pth", interactive=True) pretrained_s2G = gr.Textbox(label=i18n("预训练的SoVITS-G模型路径"), value=pretrained_sovits_name[-int(version[-1])+2], interactive=True)
pretrained_s1 = gr.Textbox(label=i18n("预训练的GPT模型路径"), value="GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt", interactive=True) pretrained_s2D = gr.Textbox(label=i18n("预训练的SoVITS-D模型路径"), value=pretrained_sovits_name[-int(version[-1])+2].replace("s2G","s2D"), interactive=True)
pretrained_s1 = gr.Textbox(label=i18n("预训练的GPT模型路径"), value=pretrained_gpt_name[-int(version[-1])+2], interactive=True)
with gr.TabItem(i18n("1A-训练集格式化工具")): with gr.TabItem(i18n("1A-训练集格式化工具")):
gr.Markdown(value=i18n("输出logs/实验名目录下应有23456开头的文件和文件夹")) gr.Markdown(value=i18n("输出logs/实验名目录下应有23456开头的文件和文件夹"))
with gr.Row(): with gr.Row():
@ -821,6 +943,14 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
button1abc_open = gr.Button(i18n("开启一键三连"), variant="primary",visible=True) button1abc_open = gr.Button(i18n("开启一键三连"), variant="primary",visible=True)
button1abc_close = gr.Button(i18n("终止一键三连"), variant="primary",visible=False) button1abc_close = gr.Button(i18n("终止一键三连"), variant="primary",visible=False)
info1abc=gr.Textbox(label=i18n("一键三连进程输出信息")) info1abc=gr.Textbox(label=i18n("一键三连进程输出信息"))
open_asr_button.click(open_asr, [asr_inp_dir, asr_opt_dir, asr_model, asr_size, asr_lang, asr_precision], [asr_info,open_asr_button,close_asr_button,path_list,inp_text,inp_wav_dir])
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,asr_inp_dir,denoise_input_dir,inp_wav_dir])
close_slicer_button.click(close_slice, [], [slicer_info,open_slicer_button,close_slicer_button])
open_denoise_button.click(open_denoise, [denoise_input_dir,denoise_output_dir], [denoise_info,open_denoise_button,close_denoise_button,asr_inp_dir,inp_wav_dir])
close_denoise_button.click(close_denoise, [], [denoise_info,open_denoise_button,close_denoise_button])
button1a_open.click(open1a, [inp_text,inp_wav_dir,exp_name,gpu_numbers1a,bert_pretrained_dir], [info1a,button1a_open,button1a_close]) button1a_open.click(open1a, [inp_text,inp_wav_dir,exp_name,gpu_numbers1a,bert_pretrained_dir], [info1a,button1a_open,button1a_close])
button1a_close.click(close1a, [], [info1a,button1a_open,button1a_close]) button1a_close.click(close1a, [], [info1a,button1a_open,button1a_close])
button1b_open.click(open1b, [inp_text,inp_wav_dir,exp_name,gpu_numbers1Ba,cnhubert_base_dir], [info1b,button1b_open,button1b_close]) button1b_open.click(open1b, [inp_text,inp_wav_dir,exp_name,gpu_numbers1Ba,cnhubert_base_dir], [info1b,button1b_open,button1b_close])
@ -863,8 +993,8 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
with gr.TabItem(i18n("1C-推理")): with gr.TabItem(i18n("1C-推理")):
gr.Markdown(value=i18n("选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。")) gr.Markdown(value=i18n("选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模体验5秒Zero Shot TTS用。"))
with gr.Row(): with gr.Row():
GPT_dropdown = gr.Dropdown(label=i18n("*GPT模型列表"), choices=sorted(GPT_names,key=custom_sort_key),value=pretrained_gpt_name,interactive=True) GPT_dropdown = gr.Dropdown(label=i18n("*GPT模型列表"), choices=sorted(GPT_names,key=custom_sort_key),value=pretrained_gpt_name[0],interactive=True)
SoVITS_dropdown = gr.Dropdown(label=i18n("*SoVITS模型列表"), choices=sorted(SoVITS_names,key=custom_sort_key),value=pretrained_sovits_name,interactive=True) SoVITS_dropdown = gr.Dropdown(label=i18n("*SoVITS模型列表"), choices=sorted(SoVITS_names,key=custom_sort_key),value=pretrained_sovits_name[0],interactive=True)
gpu_number_1C=gr.Textbox(label=i18n("GPU卡号,只能填1个整数"), value=gpus, interactive=True) gpu_number_1C=gr.Textbox(label=i18n("GPU卡号,只能填1个整数"), value=gpus, interactive=True)
refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary") refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary")
refresh_button.click(fn=change_choices,inputs=[],outputs=[SoVITS_dropdown,GPT_dropdown]) refresh_button.click(fn=change_choices,inputs=[],outputs=[SoVITS_dropdown,GPT_dropdown])
@ -872,6 +1002,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
if_tts = gr.Checkbox(label=i18n("是否开启TTS推理WebUI"), show_label=True) if_tts = gr.Checkbox(label=i18n("是否开启TTS推理WebUI"), show_label=True)
tts_info = gr.Textbox(label=i18n("TTS推理WebUI进程输出信息")) tts_info = gr.Textbox(label=i18n("TTS推理WebUI进程输出信息"))
if_tts.change(change_tts_inference, [if_tts,bert_pretrained_dir,cnhubert_base_dir,gpu_number_1C,GPT_dropdown,SoVITS_dropdown], [tts_info]) if_tts.change(change_tts_inference, [if_tts,bert_pretrained_dir,cnhubert_base_dir,gpu_number_1C,GPT_dropdown,SoVITS_dropdown], [tts_info])
version_checkbox.change(switch_version,[version_checkbox],[pretrained_s2G,pretrained_s2D,pretrained_s1,GPT_dropdown,SoVITS_dropdown])
with gr.TabItem(i18n("2-GPT-SoVITS-变声")):gr.Markdown(value=i18n("施工中,请静候佳音")) with gr.TabItem(i18n("2-GPT-SoVITS-变声")):gr.Markdown(value=i18n("施工中,请静候佳音"))
app.queue(max_size=1022).launch( app.queue(max_size=1022).launch(
server_name="0.0.0.0", server_name="0.0.0.0",
@ -879,4 +1010,4 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
share=is_share, share=is_share,
server_port=webui_port_main, server_port=webui_port_main,
quiet=True, quiet=True,
) )