mirror of
https://github.com/RVC-Boss/GPT-SoVITS.git
synced 2025-04-05 19:41:56 +08:00
Merge branch 'main' into main
This commit is contained in:
commit
17ee1207d7
@ -304,7 +304,7 @@ class TTS:
|
||||
def init_vits_weights(self, weights_path: str):
|
||||
print(f"Loading VITS weights from {weights_path}")
|
||||
self.configs.vits_weights_path = weights_path
|
||||
dict_s2 = torch.load(weights_path, map_location=self.configs.device)
|
||||
dict_s2 = torch.load(weights_path, map_location=self.configs.device,weights_only=False)
|
||||
hps = dict_s2["config"]
|
||||
if dict_s2['weight']['enc_p.text_embedding.weight'].shape[0] == 322:
|
||||
self.configs.update_version("v1")
|
||||
@ -1031,4 +1031,4 @@ def speed_change(input_audio:np.ndarray, speed:float, sr:int):
|
||||
# 将管道输出解码为 NumPy 数组
|
||||
processed_audio = np.frombuffer(out, np.int16)
|
||||
|
||||
return processed_audio
|
||||
return processed_audio
|
||||
|
@ -28,10 +28,13 @@ try:
|
||||
analytics.version_check = lambda:None
|
||||
except:...
|
||||
version=model_version=os.environ.get("version","v2")
|
||||
pretrained_sovits_name=["GPT_SoVITS/pretrained_models/s2G488k.pth", "GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth","GPT_SoVITS/pretrained_models/s2Gv3.pth"]
|
||||
path_sovits_v3="GPT_SoVITS/pretrained_models/s2Gv3.pth"
|
||||
is_exist_s2gv3=os.path.exists(path_sovits_v3)
|
||||
pretrained_sovits_name=["GPT_SoVITS/pretrained_models/s2G488k.pth", "GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth",path_sovits_v3]
|
||||
pretrained_gpt_name=["GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt","GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt", "GPT_SoVITS/pretrained_models/s1v3.ckpt"]
|
||||
|
||||
|
||||
|
||||
_ =[[],[]]
|
||||
for i in range(3):
|
||||
if os.path.exists(pretrained_gpt_name[i]):_[0].append(pretrained_gpt_name[i])
|
||||
@ -73,6 +76,7 @@ is_share = eval(is_share)
|
||||
if "_CUDA_VISIBLE_DEVICES" in os.environ:
|
||||
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"]
|
||||
is_half = eval(os.environ.get("is_half", "True")) and torch.cuda.is_available()
|
||||
# is_half=False
|
||||
punctuation = set(['!', '?', '…', ',', '.', '-'," "])
|
||||
import gradio as gr
|
||||
from transformers import AutoModelForMaskedLM, AutoTokenizer
|
||||
@ -83,13 +87,26 @@ from feature_extractor import cnhubert
|
||||
cnhubert.cnhubert_base_path = cnhubert_base_path
|
||||
|
||||
from GPT_SoVITS.module.models import SynthesizerTrn,SynthesizerTrnV3
|
||||
import numpy as np
|
||||
import random
|
||||
def set_seed(seed):
|
||||
if seed == -1:
|
||||
seed = random.randint(0, 1000000)
|
||||
seed = int(seed)
|
||||
random.seed(seed)
|
||||
os.environ["PYTHONHASHSEED"] = str(seed)
|
||||
np.random.seed(seed)
|
||||
torch.manual_seed(seed)
|
||||
torch.cuda.manual_seed(seed)
|
||||
# set_seed(42)
|
||||
|
||||
from AR.models.t2s_lightning_module import Text2SemanticLightningModule
|
||||
from text import cleaned_text_to_sequence
|
||||
from text.cleaner import clean_text
|
||||
from time import time as ttime
|
||||
from module.mel_processing import spectrogram_torch
|
||||
from tools.my_utils import load_audio
|
||||
from tools.i18n.i18n import I18nAuto, scan_language_list
|
||||
from peft import LoraConfig, PeftModel, get_peft_model
|
||||
|
||||
language=os.environ.get("language","Auto")
|
||||
language=sys.argv[-1] if sys.argv[-1] in scan_language_list() else language
|
||||
@ -192,42 +209,21 @@ def resample(audio_tensor, sr0):
|
||||
).to(device)
|
||||
return resample_transform_dict[sr0](audio_tensor)
|
||||
|
||||
###todo:put them to process_ckpt and modify my_save func (save sovits weights), gpt save weights use my_save in process_ckpt
|
||||
#symbol_version-model_version-if_lora_v3
|
||||
from process_ckpt import get_sovits_version_from_path_fast,load_sovits_new
|
||||
def change_sovits_weights(sovits_path,prompt_language=None,text_language=None):
|
||||
global vq_model, hps, version, model_version, dict_language
|
||||
'''
|
||||
v1:about 82942KB
|
||||
half thr:82978KB
|
||||
v2:about 83014KB
|
||||
half thr:100MB
|
||||
v1base:103490KB
|
||||
half thr:103520KB
|
||||
v2base:103551KB
|
||||
v3:about 750MB
|
||||
|
||||
~82978K~100M~103420~700M
|
||||
v1-v2-v1base-v2base-v3
|
||||
version:
|
||||
symbols version and timebre_embedding version
|
||||
model_version:
|
||||
sovits is v1/2 (VITS) or v3 (shortcut CFM DiT)
|
||||
'''
|
||||
size=os.path.getsize(sovits_path)
|
||||
if size<82978*1024:
|
||||
model_version=version="v1"
|
||||
elif size<100*1024*1024:
|
||||
model_version=version="v2"
|
||||
elif size<103520*1024:
|
||||
model_version=version="v1"
|
||||
elif size<700*1024*1024:
|
||||
model_version = version = "v2"
|
||||
else:
|
||||
version = "v2"
|
||||
model_version="v3"
|
||||
|
||||
global vq_model, hps, version, model_version, dict_language,if_lora_v3
|
||||
version, model_version, if_lora_v3=get_sovits_version_from_path_fast(sovits_path)
|
||||
# print(sovits_path,version, model_version, if_lora_v3)
|
||||
if if_lora_v3==True and is_exist_s2gv3==False:
|
||||
info= "GPT_SoVITS/pretrained_models/s2Gv3.pth" + i18n("SoVITS V3 底模缺失,无法加载相应 LoRA 权重")
|
||||
gr.Warning(info)
|
||||
raise FileExistsError(info)
|
||||
dict_language = dict_language_v1 if version =='v1' else dict_language_v2
|
||||
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}
|
||||
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("中文")}
|
||||
@ -242,13 +238,15 @@ def change_sovits_weights(sovits_path,prompt_language=None,text_language=None):
|
||||
else:
|
||||
visible_sample_steps=False
|
||||
visible_inp_refs=True
|
||||
yield {'__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,{"__type__": "update", "visible": visible_sample_steps},{"__type__": "update", "visible": visible_inp_refs},{"__type__": "update", "value": False,"interactive":True if model_version!="v3"else False}
|
||||
yield {'__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,{"__type__": "update", "visible": visible_sample_steps},{"__type__": "update", "visible": visible_inp_refs},{"__type__": "update", "value": False,"interactive":True if model_version!="v3"else False},{"__type__": "update", "visible":True if model_version=="v3"else False}
|
||||
|
||||
dict_s2 = torch.load(sovits_path, map_location="cpu", weights_only=False)
|
||||
dict_s2 = load_sovits_new(sovits_path)
|
||||
hps = dict_s2["config"]
|
||||
hps = DictToAttrRecursive(hps)
|
||||
hps.model.semantic_frame_rate = "25hz"
|
||||
if dict_s2['weight']['enc_p.text_embedding.weight'].shape[0] == 322:
|
||||
if 'enc_p.text_embedding.weight'not in dict_s2['weight']:
|
||||
hps.model.version = "v2"#v3model,v2sybomls
|
||||
elif dict_s2['weight']['enc_p.text_embedding.weight'].shape[0] == 322:
|
||||
hps.model.version = "v1"
|
||||
else:
|
||||
hps.model.version = "v2"
|
||||
@ -278,7 +276,24 @@ def change_sovits_weights(sovits_path,prompt_language=None,text_language=None):
|
||||
else:
|
||||
vq_model = vq_model.to(device)
|
||||
vq_model.eval()
|
||||
print("loading sovits_%s"%model_version,vq_model.load_state_dict(dict_s2["weight"], strict=False))
|
||||
if if_lora_v3==False:
|
||||
print("loading sovits_%s"%model_version,vq_model.load_state_dict(dict_s2["weight"], strict=False))
|
||||
else:
|
||||
print("loading sovits_v3pretrained_G", vq_model.load_state_dict(load_sovits_new(path_sovits_v3)["weight"], strict=False))
|
||||
lora_rank=dict_s2["lora_rank"]
|
||||
lora_config = LoraConfig(
|
||||
target_modules=["to_k", "to_q", "to_v", "to_out.0"],
|
||||
r=lora_rank,
|
||||
lora_alpha=lora_rank,
|
||||
init_lora_weights=True,
|
||||
)
|
||||
vq_model.cfm = get_peft_model(vq_model.cfm, lora_config)
|
||||
print("loading sovits_v3_lora%s"%(lora_rank))
|
||||
vq_model.load_state_dict(dict_s2["weight"], strict=False)
|
||||
vq_model.cfm = vq_model.cfm.merge_and_unload()
|
||||
# torch.save(vq_model.state_dict(),"merge_win.pth")
|
||||
vq_model.eval()
|
||||
|
||||
with open("./weight.json")as f:
|
||||
data=f.read()
|
||||
data=json.loads(data)
|
||||
@ -317,23 +332,24 @@ now_dir = os.getcwd()
|
||||
import soundfile
|
||||
|
||||
def init_bigvgan():
|
||||
global model
|
||||
global bigvgan_model
|
||||
from BigVGAN import bigvgan
|
||||
model = bigvgan.BigVGAN.from_pretrained("%s/GPT_SoVITS/pretrained_models/models--nvidia--bigvgan_v2_24khz_100band_256x" % (now_dir,), use_cuda_kernel=False) # if True, RuntimeError: Ninja is required to load C++ extensions
|
||||
bigvgan_model = bigvgan.BigVGAN.from_pretrained("%s/GPT_SoVITS/pretrained_models/models--nvidia--bigvgan_v2_24khz_100band_256x" % (now_dir,), use_cuda_kernel=False) # if True, RuntimeError: Ninja is required to load C++ extensions
|
||||
# remove weight norm in the model and set to eval mode
|
||||
model.remove_weight_norm()
|
||||
model = model.eval()
|
||||
bigvgan_model.remove_weight_norm()
|
||||
bigvgan_model = bigvgan_model.eval()
|
||||
if is_half == True:
|
||||
model = model.half().to(device)
|
||||
bigvgan_model = bigvgan_model.half().to(device)
|
||||
else:
|
||||
model = model.to(device)
|
||||
bigvgan_model = bigvgan_model.to(device)
|
||||
|
||||
if model_version!="v3":model=None
|
||||
if model_version!="v3":bigvgan_model=None
|
||||
else:init_bigvgan()
|
||||
|
||||
|
||||
def get_spepc(hps, filename):
|
||||
audio = load_audio(filename, int(hps.data.sampling_rate))
|
||||
# audio = load_audio(filename, int(hps.data.sampling_rate))
|
||||
audio, sampling_rate = librosa.load(filename, sr=int(hps.data.sampling_rate))
|
||||
audio = torch.FloatTensor(audio)
|
||||
maxx=audio.abs().max()
|
||||
if(maxx>1):audio/=min(2,maxx)
|
||||
@ -350,6 +366,7 @@ def get_spepc(hps, filename):
|
||||
return spec
|
||||
|
||||
def clean_text_inf(text, language, version):
|
||||
language = language.replace("all_","")
|
||||
phones, word2ph, norm_text = clean_text(text, language, version)
|
||||
phones = cleaned_text_to_sequence(phones, version)
|
||||
return phones, word2ph, norm_text
|
||||
@ -379,11 +396,10 @@ def get_first(text):
|
||||
from text import chinese
|
||||
def get_phones_and_bert(text,language,version,final=False):
|
||||
if language in {"en", "all_zh", "all_ja", "all_ko", "all_yue"}:
|
||||
language = language.replace("all_","")
|
||||
formattext = text
|
||||
while " " in formattext:
|
||||
formattext = formattext.replace(" ", " ")
|
||||
if language == "zh":
|
||||
if language == "all_zh":
|
||||
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)
|
||||
@ -391,7 +407,7 @@ def get_phones_and_bert(text,language,version,final=False):
|
||||
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):
|
||||
elif language == "all_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)
|
||||
@ -443,12 +459,14 @@ def get_phones_and_bert(text,language,version,final=False):
|
||||
|
||||
return phones,bert.to(dtype),norm_text
|
||||
|
||||
from module.mel_processing import spectrogram_torch,spec_to_mel_torch
|
||||
def mel_spectrogram(y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False):
|
||||
spec=spectrogram_torch(y,n_fft,sampling_rate,hop_size,win_size,center)
|
||||
mel=spec_to_mel_torch(spec,n_fft,num_mels,sampling_rate,fmin,fmax)
|
||||
return mel
|
||||
mel_fn_args = {
|
||||
from module.mel_processing import spectrogram_torch,mel_spectrogram_torch
|
||||
spec_min = -12
|
||||
spec_max = 2
|
||||
def norm_spec(x):
|
||||
return (x - spec_min) / (spec_max - spec_min) * 2 - 1
|
||||
def denorm_spec(x):
|
||||
return (x + 1) / 2 * (spec_max - spec_min) + spec_min
|
||||
mel_fn=lambda x: mel_spectrogram_torch(x, **{
|
||||
"n_fft": 1024,
|
||||
"win_size": 1024,
|
||||
"hop_size": 256,
|
||||
@ -457,16 +475,7 @@ mel_fn_args = {
|
||||
"fmin": 0,
|
||||
"fmax": None,
|
||||
"center": False
|
||||
}
|
||||
|
||||
spec_min = -12
|
||||
spec_max = 2
|
||||
def norm_spec(x):
|
||||
return (x - spec_min) / (spec_max - spec_min) * 2 - 1
|
||||
def denorm_spec(x):
|
||||
return (x + 1) / 2 * (spec_max - spec_min) + spec_min
|
||||
mel_fn=lambda x: mel_spectrogram(x, **mel_fn_args)
|
||||
|
||||
})
|
||||
|
||||
def merge_short_text_in_array(texts, threshold):
|
||||
if (len(texts)) < 2:
|
||||
@ -485,10 +494,23 @@ def merge_short_text_in_array(texts, threshold):
|
||||
result[len(result) - 1] += text
|
||||
return result
|
||||
|
||||
sr_model=None
|
||||
def audio_sr(audio,sr):
|
||||
global sr_model
|
||||
if sr_model==None:
|
||||
from tools.audio_sr import AP_BWE
|
||||
try:
|
||||
sr_model=AP_BWE(device,DictToAttrRecursive)
|
||||
except FileNotFoundError:
|
||||
gr.Warning(i18n("你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好"))
|
||||
return audio.cpu().detach().numpy(),sr
|
||||
return sr_model(audio,sr)
|
||||
|
||||
|
||||
##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=None,sample_steps=8):
|
||||
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=None,sample_steps=8,if_sr=False,pause_second=0.3):
|
||||
global cache
|
||||
if ref_wav_path:pass
|
||||
else:gr.Warning(i18n('请上传参考音频'))
|
||||
@ -497,7 +519,10 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
t = []
|
||||
if prompt_text is None or len(prompt_text) == 0:
|
||||
ref_free = True
|
||||
if model_version=="v3":ref_free=False#s2v3暂不支持ref_free
|
||||
if model_version=="v3":
|
||||
ref_free=False#s2v3暂不支持ref_free
|
||||
else:
|
||||
if_sr=False
|
||||
t0 = ttime()
|
||||
prompt_language = dict_language[prompt_language]
|
||||
text_language = dict_language[text_language]
|
||||
@ -509,12 +534,17 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
print(i18n("实际输入的参考文本:"), prompt_text)
|
||||
text = text.strip("\n")
|
||||
# if (text[0] not in splits and len(get_first(text)) < 4): text = "。" + text if text_language != "en" else "." + text
|
||||
|
||||
|
||||
print(i18n("实际输入的目标文本:"), text)
|
||||
zero_wav = np.zeros(
|
||||
int(hps.data.sampling_rate * 0.3),
|
||||
int(hps.data.sampling_rate * pause_second),
|
||||
dtype=np.float16 if is_half == True else np.float32,
|
||||
)
|
||||
zero_wav_torch = torch.from_numpy(zero_wav)
|
||||
if is_half == True:
|
||||
zero_wav_torch = zero_wav_torch.half().to(device)
|
||||
else:
|
||||
zero_wav_torch = zero_wav_torch.to(device)
|
||||
if not ref_free:
|
||||
with torch.no_grad():
|
||||
wav16k, sr = librosa.load(ref_wav_path, sr=16000)
|
||||
@ -522,13 +552,10 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
gr.Warning(i18n("参考音频在3~10秒范围外,请更换!"))
|
||||
raise OSError(i18n("参考音频在3~10秒范围外,请更换!"))
|
||||
wav16k = torch.from_numpy(wav16k)
|
||||
zero_wav_torch = torch.from_numpy(zero_wav)
|
||||
if is_half == True:
|
||||
wav16k = wav16k.half().to(device)
|
||||
zero_wav_torch = zero_wav_torch.half().to(device)
|
||||
else:
|
||||
wav16k = wav16k.to(device)
|
||||
zero_wav_torch = zero_wav_torch.to(device)
|
||||
wav16k = torch.cat([wav16k, zero_wav_torch])
|
||||
ssl_content = ssl_model.model(wav16k.unsqueeze(0))[
|
||||
"last_hidden_state"
|
||||
@ -612,11 +639,12 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
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])
|
||||
audio = vq_model.decode(pred_semantic, torch.LongTensor(phones2).to(device).unsqueeze(0), refers,speed=speed)[0][0]#.cpu().detach().numpy()
|
||||
else:
|
||||
refer = get_spepc(hps, ref_wav_path).to(device).to(dtype)#######这里要重采样切到32k,因为src是24k的,没有单独的32k的src,所以不能改成2个路径
|
||||
refer = get_spepc(hps, ref_wav_path).to(device).to(dtype)
|
||||
phoneme_ids0=torch.LongTensor(phones1).to(device).unsqueeze(0)
|
||||
phoneme_ids1=torch.LongTensor(phones2).to(device).unsqueeze(0)
|
||||
# print(11111111, phoneme_ids0, phoneme_ids1)
|
||||
fea_ref,ge = vq_model.decode_encp(prompt.unsqueeze(0), phoneme_ids0, refer)
|
||||
ref_audio, sr = torchaudio.load(ref_wav_path)
|
||||
ref_audio=ref_audio.to(device).float()
|
||||
@ -624,7 +652,8 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
ref_audio = ref_audio.mean(0).unsqueeze(0)
|
||||
if sr!=24000:
|
||||
ref_audio=resample(ref_audio,sr)
|
||||
mel2 = mel_fn(ref_audio.to(dtype))
|
||||
# print("ref_audio",ref_audio.abs().mean())
|
||||
mel2 = mel_fn(ref_audio)
|
||||
mel2 = norm_spec(mel2)
|
||||
T_min = min(mel2.shape[2], fea_ref.shape[2])
|
||||
mel2 = mel2[:, :, :T_min]
|
||||
@ -634,7 +663,12 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
fea_ref = fea_ref[:, :, -468:]
|
||||
T_min = 468
|
||||
chunk_len = 934 - T_min
|
||||
fea_todo, ge = vq_model.decode_encp(pred_semantic, phoneme_ids1, refer, ge)
|
||||
# print("fea_ref",fea_ref,fea_ref.shape)
|
||||
# print("mel2",mel2)
|
||||
mel2=mel2.to(dtype)
|
||||
fea_todo, ge = vq_model.decode_encp(pred_semantic, phoneme_ids1, refer, ge,speed)
|
||||
# print("fea_todo",fea_todo)
|
||||
# print("ge",ge.abs().mean())
|
||||
cfm_resss = []
|
||||
idx = 0
|
||||
while (1):
|
||||
@ -642,29 +676,38 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
||||
if (fea_todo_chunk.shape[-1] == 0): break
|
||||
idx += chunk_len
|
||||
fea = torch.cat([fea_ref, fea_todo_chunk], 2).transpose(2, 1)
|
||||
# set_seed(123)
|
||||
cfm_res = vq_model.cfm.inference(fea, torch.LongTensor([fea.size(1)]).to(fea.device), mel2, sample_steps, inference_cfg_rate=0)
|
||||
cfm_res = cfm_res[:, :, mel2.shape[2]:]
|
||||
mel2 = cfm_res[:, :, -T_min:]
|
||||
# print("fea", fea)
|
||||
# print("mel2in", mel2)
|
||||
fea_ref = fea_todo_chunk[:, :, -T_min:]
|
||||
cfm_resss.append(cfm_res)
|
||||
cmf_res = torch.cat(cfm_resss, 2)
|
||||
cmf_res = denorm_spec(cmf_res)
|
||||
if model==None:init_bigvgan()
|
||||
if bigvgan_model==None:init_bigvgan()
|
||||
with torch.inference_mode():
|
||||
wav_gen = model(cmf_res)
|
||||
audio=wav_gen[0][0].cpu().detach().numpy()
|
||||
max_audio=np.abs(audio).max()#简单防止16bit爆音
|
||||
if max_audio>1:audio/=max_audio
|
||||
wav_gen = bigvgan_model(cmf_res)
|
||||
audio=wav_gen[0][0]#.cpu().detach().numpy()
|
||||
max_audio=torch.abs(audio).max()#简单防止16bit爆音
|
||||
if max_audio>1:audio/=max_audio
|
||||
audio_opt.append(audio)
|
||||
audio_opt.append(zero_wav)
|
||||
audio_opt.append(zero_wav_torch)#zero_wav
|
||||
t4 = ttime()
|
||||
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]))
|
||||
)
|
||||
print("%.3f\t%.3f\t%.3f\t%.3f" % (t[0], sum(t[1::3]), sum(t[2::3]), sum(t[3::3])))
|
||||
audio_opt=torch.cat(audio_opt, 0)#np.concatenate
|
||||
sr=hps.data.sampling_rate if model_version!="v3"else 24000
|
||||
yield sr, (np.concatenate(audio_opt, 0) * 32768).astype(np.int16)
|
||||
if if_sr==True and sr==24000:
|
||||
print(i18n("音频超分中"))
|
||||
audio_opt,sr=audio_sr(audio_opt.unsqueeze(0),sr)
|
||||
max_audio=np.abs(audio_opt).max()
|
||||
if max_audio > 1: audio_opt /= max_audio
|
||||
else:
|
||||
audio_opt=audio_opt.cpu().detach().numpy()
|
||||
yield sr, (audio_opt * 32767).astype(np.int16)
|
||||
|
||||
|
||||
def split(todo_text):
|
||||
@ -821,7 +864,7 @@ def html_left(text, label='p'):
|
||||
|
||||
with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
gr.Markdown(
|
||||
value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
|
||||
value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.") + "<br>" + i18n("如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.")
|
||||
)
|
||||
with gr.Group():
|
||||
gr.Markdown(html_center(i18n("模型切换"),'h3'))
|
||||
@ -834,15 +877,16 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
with gr.Row():
|
||||
inp_ref = gr.Audio(label=i18n("请上传3~10秒内参考音频,超过会报错!"), type="filepath", scale=13)
|
||||
with gr.Column(scale=13):
|
||||
ref_text_free = gr.Checkbox(label=i18n("开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。"), value=False, interactive=True, show_label=True,scale=1)
|
||||
gr.Markdown(html_left(i18n("使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。")))
|
||||
ref_text_free = gr.Checkbox(label=i18n("开启无参考文本模式。不填参考文本亦相当于开启。")+i18n("v3暂不支持该模式,使用了会报错。"), value=False, interactive=True, show_label=True,scale=1)
|
||||
gr.Markdown(html_left(i18n("使用无参考文本模式时建议使用微调的GPT")+"<br>"+i18n("听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。")))
|
||||
prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="", lines=5, max_lines=5,scale=1)
|
||||
with gr.Column(scale=14):
|
||||
prompt_language = gr.Dropdown(
|
||||
label=i18n("参考音频的语种"), choices=list(dict_language.keys()), value=i18n("中文"),
|
||||
)
|
||||
inp_refs = gr.File(label=i18n("可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。"),file_count="multiple")if model_version!="v3"else gr.File(label=i18n("可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。"),file_count="multiple",visible=False)
|
||||
sample_steps = gr.Radio(label=i18n("采样步数,如果觉得电,提高试试,如果觉得慢,降低试试"),value=32,choices=[4,8,16,32],visible=True)if model_version=="v3"else gr.Radio(label=i18n("采样步数,如果觉得电,提高试试,如果觉得慢,降低试试"),value=8,choices=[4,8,16,32],visible=False)
|
||||
sample_steps = gr.Radio(label=i18n("采样步数,如果觉得电,提高试试,如果觉得慢,降低试试"),value=32,choices=[4,8,16,32],visible=True)if model_version=="v3"else gr.Radio(label=i18n("采样步数,如果觉得电,提高试试,如果觉得慢,降低试试"),choices=[4,8,16,32],visible=False,value=32)
|
||||
if_sr_Checkbox=gr.Checkbox(label=i18n("v3输出如果觉得闷可以试试开超分"), value=False, interactive=True, show_label=True,visible=False if model_version!="v3"else True)
|
||||
gr.Markdown(html_center(i18n("*请填写需要合成的目标文本和语种模式"),'h3'))
|
||||
with gr.Row():
|
||||
with gr.Column(scale=13):
|
||||
@ -859,11 +903,13 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
)
|
||||
gr.Markdown(value=html_center(i18n("语速调整,高为更快")))
|
||||
if_freeze=gr.Checkbox(label=i18n("是否直接对上次合成结果调整语速和音色。防止随机性。"), value=False, interactive=True,show_label=True, scale=1)
|
||||
speed = gr.Slider(minimum=0.6,maximum=1.65,step=0.05,label=i18n("语速"),value=1,interactive=True, scale=1)
|
||||
with gr.Row():
|
||||
speed = gr.Slider(minimum=0.6,maximum=1.65,step=0.05,label=i18n("语速"),value=1,interactive=True, scale=1)
|
||||
pause_second_slider = gr.Slider(minimum=0.1,maximum=0.5,step=0.01,label=i18n("句间停顿秒数"),value=0.3,interactive=True, scale=1)
|
||||
gr.Markdown(html_center(i18n("GPT采样参数(无参考文本时不要太低。不懂就用默认):")))
|
||||
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)
|
||||
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="")
|
||||
@ -874,10 +920,10 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
|
||||
inference_button.click(
|
||||
get_tts_wav,
|
||||
[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,sample_steps],
|
||||
[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,sample_steps,if_sr_Checkbox,pause_second_slider],
|
||||
[output],
|
||||
)
|
||||
SoVITS_dropdown.change(change_sovits_weights, [SoVITS_dropdown,prompt_language,text_language], [prompt_language,text_language,prompt_text,prompt_language,text,text_language,sample_steps,inp_refs,ref_text_free])
|
||||
SoVITS_dropdown.change(change_sovits_weights, [SoVITS_dropdown,prompt_language,text_language], [prompt_language,text_language,prompt_text,prompt_language,text,text_language,sample_steps,inp_refs,ref_text_free,if_sr_Checkbox])
|
||||
GPT_dropdown.change(change_gpt_weights, [GPT_dropdown], [])
|
||||
|
||||
# gr.Markdown(value=i18n("文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。"))
|
||||
|
@ -42,7 +42,7 @@ sovits_path = os.environ.get("sovits_path", None)
|
||||
cnhubert_base_path = os.environ.get("cnhubert_base_path", None)
|
||||
bert_path = os.environ.get("bert_path", None)
|
||||
version=os.environ.get("version","v2")
|
||||
|
||||
|
||||
import gradio as gr
|
||||
from TTS_infer_pack.TTS import TTS, TTS_Config
|
||||
from TTS_infer_pack.text_segmentation_method import get_method
|
||||
@ -61,7 +61,7 @@ if torch.cuda.is_available():
|
||||
# device = "mps"
|
||||
else:
|
||||
device = "cpu"
|
||||
|
||||
|
||||
dict_language_v1 = {
|
||||
i18n("中文"): "all_zh",#全部按中文识别
|
||||
i18n("英文"): "en",#全部按英文识别#######不变
|
||||
@ -106,20 +106,20 @@ if cnhubert_base_path is not None:
|
||||
tts_config.cnhuhbert_base_path = cnhubert_base_path
|
||||
if bert_path is not None:
|
||||
tts_config.bert_base_path = bert_path
|
||||
|
||||
|
||||
print(tts_config)
|
||||
tts_pipeline = TTS(tts_config)
|
||||
gpt_path = tts_config.t2s_weights_path
|
||||
sovits_path = tts_config.vits_weights_path
|
||||
version = tts_config.version
|
||||
|
||||
def inference(text, text_lang,
|
||||
ref_audio_path,
|
||||
def inference(text, text_lang,
|
||||
ref_audio_path,
|
||||
aux_ref_audio_paths,
|
||||
prompt_text,
|
||||
prompt_lang, top_k,
|
||||
top_p, temperature,
|
||||
text_split_method, batch_size,
|
||||
prompt_text,
|
||||
prompt_lang, top_k,
|
||||
top_p, temperature,
|
||||
text_split_method, batch_size,
|
||||
speed_factor, ref_text_free,
|
||||
split_bucket,fragment_interval,
|
||||
seed, keep_random, parallel_infer,
|
||||
@ -150,7 +150,7 @@ def inference(text, text_lang,
|
||||
}
|
||||
for item in tts_pipeline.run(inputs):
|
||||
yield item, actual_seed
|
||||
|
||||
|
||||
def custom_sort_key(s):
|
||||
# 使用正则表达式提取字符串中的数字部分和非数字部分
|
||||
parts = re.split('(\d+)', s)
|
||||
@ -201,7 +201,7 @@ def change_sovits_weights(sovits_path,prompt_language=None,text_language=None):
|
||||
dict_language = dict_language_v1 if tts_pipeline.configs.version =='v1' else dict_language_v2
|
||||
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}
|
||||
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("中文")}
|
||||
@ -216,9 +216,9 @@ def change_sovits_weights(sovits_path,prompt_language=None,text_language=None):
|
||||
|
||||
with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
gr.Markdown(
|
||||
value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
|
||||
value=i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.") + "<br>" + i18n("如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.")
|
||||
)
|
||||
|
||||
|
||||
with gr.Column():
|
||||
# with gr.Group():
|
||||
gr.Markdown(value=i18n("模型切换"))
|
||||
@ -228,7 +228,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary")
|
||||
refresh_button.click(fn=change_choices, inputs=[], outputs=[SoVITS_dropdown, GPT_dropdown])
|
||||
|
||||
|
||||
|
||||
with gr.Row():
|
||||
with gr.Column():
|
||||
gr.Markdown(value=i18n("*请上传并填写参考信息"))
|
||||
@ -242,8 +242,8 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
)
|
||||
with gr.Column():
|
||||
ref_text_free = gr.Checkbox(label=i18n("开启无参考文本模式。不填参考文本亦相当于开启。"), value=False, interactive=True, show_label=True)
|
||||
gr.Markdown(i18n("使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。"))
|
||||
|
||||
gr.Markdown(i18n("使用无参考文本模式时建议使用微调的GPT")+"<br>"+i18n("听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。"))
|
||||
|
||||
with gr.Column():
|
||||
gr.Markdown(value=i18n("*请填写需要合成的目标文本和语种模式"))
|
||||
text = gr.Textbox(label=i18n("需要合成的文本"), value="", lines=20, max_lines=20)
|
||||
@ -251,7 +251,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
label=i18n("需要合成的文本的语种"), choices=list(dict_language.keys()), value=i18n("中文")
|
||||
)
|
||||
|
||||
|
||||
|
||||
with gr.Group():
|
||||
gr.Markdown(value=i18n("推理设置"))
|
||||
with gr.Row():
|
||||
@ -274,8 +274,8 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
)
|
||||
parallel_infer = gr.Checkbox(label=i18n("并行推理"), value=True, interactive=True, show_label=True)
|
||||
split_bucket = gr.Checkbox(label=i18n("数据分桶(并行推理时会降低一点计算量)"), value=True, interactive=True, show_label=True)
|
||||
|
||||
with gr.Row():
|
||||
|
||||
with gr.Row():
|
||||
seed = gr.Number(label=i18n("随机种子"),value=-1)
|
||||
keep_random = gr.Checkbox(label=i18n("保持随机"), value=True, interactive=True, show_label=True)
|
||||
|
||||
@ -283,15 +283,15 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
with gr.Row():
|
||||
inference_button = gr.Button(i18n("合成语音"), variant="primary")
|
||||
stop_infer = gr.Button(i18n("终止合成"), variant="primary")
|
||||
|
||||
|
||||
|
||||
|
||||
inference_button.click(
|
||||
inference,
|
||||
[
|
||||
text,text_language, inp_ref, inp_refs,
|
||||
prompt_text, prompt_language,
|
||||
top_k, top_p, temperature,
|
||||
how_to_cut, batch_size,
|
||||
prompt_text, prompt_language,
|
||||
top_k, top_p, temperature,
|
||||
how_to_cut, batch_size,
|
||||
speed_factor, ref_text_free,
|
||||
split_bucket,fragment_interval,
|
||||
seed, keep_random, parallel_infer,
|
||||
@ -315,13 +315,13 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
interactive=True,
|
||||
)
|
||||
cut_text= gr.Button(i18n("切分"), variant="primary")
|
||||
|
||||
|
||||
def to_cut(text_inp, how_to_cut):
|
||||
if len(text_inp.strip()) == 0 or text_inp==[]:
|
||||
return ""
|
||||
method = get_method(cut_method[how_to_cut])
|
||||
return method(text_inp)
|
||||
|
||||
|
||||
text_opt = gr.Textbox(label=i18n("切分后文本"), value="", lines=4)
|
||||
cut_text.click(to_cut, [text_inp, _how_to_cut], [text_opt])
|
||||
gr.Markdown(value=i18n("后续将支持转音素、手工修改音素、语音合成分步执行。"))
|
||||
|
@ -456,6 +456,231 @@ class TextAudioSpeakerCollateV3():
|
||||
|
||||
# return ssl_padded, spec_padded,mel_padded, ssl_lengths, spec_lengths, text_padded, text_lengths, wav_padded, wav_lengths,mel_lengths
|
||||
return ssl_padded, spec_padded,mel_padded, ssl_lengths, spec_lengths, text_padded, text_lengths,mel_lengths
|
||||
class TextAudioSpeakerLoaderV3b(torch.utils.data.Dataset):
|
||||
"""
|
||||
1) loads audio, speaker_id, text pairs
|
||||
2) normalizes text and converts them to sequences of integers
|
||||
3) computes spectrograms from audio files.
|
||||
"""
|
||||
|
||||
def __init__(self, hparams, val=False):
|
||||
exp_dir = hparams.exp_dir
|
||||
self.path2 = "%s/2-name2text.txt" % exp_dir
|
||||
self.path4 = "%s/4-cnhubert" % exp_dir
|
||||
self.path5 = "%s/5-wav32k" % exp_dir
|
||||
assert os.path.exists(self.path2)
|
||||
assert os.path.exists(self.path4)
|
||||
assert os.path.exists(self.path5)
|
||||
names4 = set([name[:-3] for name in list(os.listdir(self.path4))]) # 去除.pt后缀
|
||||
names5 = set(os.listdir(self.path5))
|
||||
self.phoneme_data = {}
|
||||
with open(self.path2, "r", encoding="utf8") as f:
|
||||
lines = f.read().strip("\n").split("\n")
|
||||
|
||||
for line in lines:
|
||||
tmp = line.split("\t")
|
||||
if (len(tmp) != 4):
|
||||
continue
|
||||
self.phoneme_data[tmp[0]] = [tmp[1]]
|
||||
|
||||
self.audiopaths_sid_text = list(set(self.phoneme_data) & names4 & names5)
|
||||
tmp = self.audiopaths_sid_text
|
||||
leng = len(tmp)
|
||||
min_num = 100
|
||||
if (leng < min_num):
|
||||
self.audiopaths_sid_text = []
|
||||
for _ in range(max(2, int(min_num / leng))):
|
||||
self.audiopaths_sid_text += tmp
|
||||
self.max_wav_value = hparams.max_wav_value
|
||||
self.sampling_rate = hparams.sampling_rate
|
||||
self.filter_length = hparams.filter_length
|
||||
self.hop_length = hparams.hop_length
|
||||
self.win_length = hparams.win_length
|
||||
self.sampling_rate = hparams.sampling_rate
|
||||
self.val = val
|
||||
|
||||
random.seed(1234)
|
||||
random.shuffle(self.audiopaths_sid_text)
|
||||
|
||||
print("phoneme_data_len:", len(self.phoneme_data.keys()))
|
||||
print("wav_data_len:", len(self.audiopaths_sid_text))
|
||||
|
||||
audiopaths_sid_text_new = []
|
||||
lengths = []
|
||||
skipped_phone = 0
|
||||
skipped_dur = 0
|
||||
for audiopath in tqdm(self.audiopaths_sid_text):
|
||||
try:
|
||||
phoneme = self.phoneme_data[audiopath][0]
|
||||
phoneme = phoneme.split(' ')
|
||||
phoneme_ids = cleaned_text_to_sequence(phoneme, version)
|
||||
except Exception:
|
||||
print(f"{audiopath} not in self.phoneme_data !")
|
||||
skipped_phone += 1
|
||||
continue
|
||||
|
||||
size = os.path.getsize("%s/%s" % (self.path5, audiopath))
|
||||
duration = size / self.sampling_rate / 2
|
||||
|
||||
if duration == 0:
|
||||
print(f"Zero duration for {audiopath}, skipping...")
|
||||
skipped_dur += 1
|
||||
continue
|
||||
|
||||
if 54 > duration > 0.6 or self.val:
|
||||
audiopaths_sid_text_new.append([audiopath, phoneme_ids])
|
||||
lengths.append(size // (2 * self.hop_length))
|
||||
else:
|
||||
skipped_dur += 1
|
||||
continue
|
||||
|
||||
print("skipped_phone: ", skipped_phone, ", skipped_dur: ", skipped_dur)
|
||||
print("total left: ", len(audiopaths_sid_text_new))
|
||||
assert len(audiopaths_sid_text_new) > 1 # 至少能凑够batch size,这里todo
|
||||
self.audiopaths_sid_text = audiopaths_sid_text_new
|
||||
self.lengths = lengths
|
||||
self.spec_min=-12
|
||||
self.spec_max=2
|
||||
|
||||
self.filter_length_mel=self.win_length_mel=1024
|
||||
self.hop_length_mel=256
|
||||
self.n_mel_channels=100
|
||||
self.sampling_rate_mel=24000
|
||||
self.mel_fmin=0
|
||||
self.mel_fmax=None
|
||||
def norm_spec(self, x):
|
||||
return (x - self.spec_min) / (self.spec_max - self.spec_min) * 2 - 1
|
||||
|
||||
def get_audio_text_speaker_pair(self, audiopath_sid_text):
|
||||
audiopath, phoneme_ids = audiopath_sid_text
|
||||
text = torch.FloatTensor(phoneme_ids)
|
||||
try:
|
||||
spec, mel,wav = self.get_audio("%s/%s" % (self.path5, audiopath))
|
||||
with torch.no_grad():
|
||||
ssl = torch.load("%s/%s.pt" % (self.path4, audiopath), map_location="cpu")
|
||||
if (ssl.shape[-1] != spec.shape[-1]):
|
||||
typee = ssl.dtype
|
||||
ssl = F.pad(ssl.float(), (0, 1), mode="replicate").to(typee)
|
||||
ssl.requires_grad = False
|
||||
except:
|
||||
traceback.print_exc()
|
||||
mel = torch.zeros(100, 180)
|
||||
wav = torch.zeros(1, 96 * self.hop_length)
|
||||
spec = torch.zeros(1025, 96)
|
||||
ssl = torch.zeros(1, 768, 96)
|
||||
text = text[-1:]
|
||||
print("load audio or ssl error!!!!!!", audiopath)
|
||||
return (ssl, spec, wav, mel, text)
|
||||
|
||||
def get_audio(self, filename):
|
||||
audio_array = load_audio(filename,self.sampling_rate)#load_audio的方法是已经归一化到-1~1之间的,不用再/32768
|
||||
audio=torch.FloatTensor(audio_array)#/32768
|
||||
audio_norm = audio
|
||||
audio_norm = audio_norm.unsqueeze(0)
|
||||
audio_array24 = load_audio(filename,24000)#load_audio的方法是已经归一化到-1~1之间的,不用再/32768######这里可以用GPU重采样加速
|
||||
audio24=torch.FloatTensor(audio_array24)#/32768
|
||||
audio_norm24 = audio24
|
||||
audio_norm24 = audio_norm24.unsqueeze(0)
|
||||
|
||||
spec = spectrogram_torch(audio_norm, self.filter_length,
|
||||
self.sampling_rate, self.hop_length, self.win_length,
|
||||
center=False)
|
||||
spec = torch.squeeze(spec, 0)
|
||||
|
||||
|
||||
spec1 = spectrogram_torch(audio_norm24, self.filter_length_mel,self.sampling_rate_mel, self.hop_length_mel, self.win_length_mel,center=False)
|
||||
mel = spec_to_mel_torch(spec1, self.filter_length_mel, self.n_mel_channels, self.sampling_rate_mel, self.mel_fmin, self.mel_fmax)
|
||||
mel = torch.squeeze(mel, 0)
|
||||
mel=self.norm_spec(mel)
|
||||
# print(1111111,spec.shape,mel.shape)
|
||||
return spec, mel,audio_norm
|
||||
|
||||
def get_sid(self, sid):
|
||||
sid = torch.LongTensor([int(sid)])
|
||||
return sid
|
||||
|
||||
def __getitem__(self, index):
|
||||
# with torch.no_grad():
|
||||
return self.get_audio_text_speaker_pair(self.audiopaths_sid_text[index])
|
||||
|
||||
def __len__(self):
|
||||
return len(self.audiopaths_sid_text)
|
||||
class TextAudioSpeakerCollateV3b():
|
||||
""" Zero-pads model inputs and targets
|
||||
"""
|
||||
|
||||
def __init__(self, return_ids=False):
|
||||
self.return_ids = return_ids
|
||||
|
||||
def __call__(self, batch):
|
||||
"""Collate's training batch from normalized text, audio and speaker identities
|
||||
PARAMS
|
||||
------
|
||||
batch: [text_normalized, spec_normalized, wav_normalized, sid]
|
||||
"""
|
||||
#ssl, spec, wav,mel, text
|
||||
# Right zero-pad all one-hot text sequences to max input length
|
||||
_, ids_sorted_decreasing = torch.sort(
|
||||
torch.LongTensor([x[1].size(1) for x in batch]),
|
||||
dim=0, descending=True)
|
||||
#(ssl, spec,mel, text)
|
||||
max_ssl_len = max([x[0].size(2) for x in batch])
|
||||
|
||||
max_ssl_len1 = int(8 * ((max_ssl_len // 8) + 1))
|
||||
max_ssl_len = int(2 * ((max_ssl_len // 2) + 1))
|
||||
|
||||
# max_ssl_len = int(8 * ((max_ssl_len // 8) + 1))
|
||||
# max_ssl_len1=max_ssl_len
|
||||
|
||||
max_spec_len = max([x[1].size(1) for x in batch])
|
||||
max_spec_len = int(2 * ((max_spec_len // 2) + 1))
|
||||
max_wav_len = max([x[2].size(1) for x in batch])
|
||||
max_text_len = max([x[4].size(0) for x in batch])
|
||||
max_mel_len=int(max_ssl_len1*1.25*1.5)###24000/256,32000/640=16000/320
|
||||
|
||||
ssl_lengths = torch.LongTensor(len(batch))
|
||||
spec_lengths = torch.LongTensor(len(batch))
|
||||
text_lengths = torch.LongTensor(len(batch))
|
||||
wav_lengths = torch.LongTensor(len(batch))
|
||||
mel_lengths = torch.LongTensor(len(batch))
|
||||
|
||||
spec_padded = torch.FloatTensor(len(batch), batch[0][1].size(0), max_spec_len)
|
||||
mel_padded = torch.FloatTensor(len(batch), batch[0][3].size(0), max_mel_len)
|
||||
ssl_padded = torch.FloatTensor(len(batch), batch[0][0].size(1), max_ssl_len)
|
||||
text_padded = torch.LongTensor(len(batch), max_text_len)
|
||||
wav_padded = torch.FloatTensor(len(batch), 1, max_wav_len)
|
||||
|
||||
spec_padded.zero_()
|
||||
mel_padded.zero_()
|
||||
ssl_padded.zero_()
|
||||
text_padded.zero_()
|
||||
wav_padded.zero_()
|
||||
|
||||
for i in range(len(ids_sorted_decreasing)):
|
||||
row = batch[ids_sorted_decreasing[i]]
|
||||
# ssl, spec, wav,mel, text
|
||||
ssl = row[0]
|
||||
ssl_padded[i, :, :ssl.size(2)] = ssl[0, :, :]
|
||||
ssl_lengths[i] = ssl.size(2)
|
||||
|
||||
spec = row[1]
|
||||
spec_padded[i, :, :spec.size(1)] = spec
|
||||
spec_lengths[i] = spec.size(1)
|
||||
|
||||
wav = row[2]
|
||||
wav_padded[i, :, :wav.size(1)] = wav
|
||||
wav_lengths[i] = wav.size(1)
|
||||
|
||||
mel = row[3]
|
||||
mel_padded[i, :, :mel.size(1)] = mel
|
||||
mel_lengths[i] = mel.size(1)
|
||||
|
||||
text = row[4]
|
||||
text_padded[i, :text.size(0)] = text
|
||||
text_lengths[i] = text.size(0)
|
||||
|
||||
return ssl_padded, spec_padded,mel_padded, ssl_lengths, spec_lengths, text_padded, text_lengths, wav_padded, wav_lengths,mel_lengths
|
||||
# return ssl_padded, spec_padded,mel_padded, ssl_lengths, spec_lengths, text_padded, text_lengths,mel_lengths
|
||||
|
||||
class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler):
|
||||
"""
|
||||
|
@ -145,7 +145,7 @@ def mel_spectrogram_torch(
|
||||
return_complex=False,
|
||||
)
|
||||
|
||||
spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6)
|
||||
spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-9)
|
||||
|
||||
spec = torch.matmul(mel_basis[fmax_dtype_device], spec)
|
||||
spec = spectral_normalize_torch(spec)
|
||||
|
@ -1099,17 +1099,15 @@ class CFM(torch.nn.Module):
|
||||
return x
|
||||
def forward(self, x1, x_lens, prompt_lens, mu, use_grad_ckpt):
|
||||
b, _, t = x1.shape
|
||||
|
||||
# random timestep
|
||||
t = torch.rand([b], device=mu.device, dtype=x1.dtype)
|
||||
x0 = torch.randn_like(x1,device=mu.device)
|
||||
vt = x1 - x0
|
||||
xt = x0 + t[:, None, None] * vt
|
||||
dt = torch.zeros_like(t,device=mu.device)
|
||||
prompt = torch.zeros_like(x1)
|
||||
for bib in range(b):
|
||||
prompt[bib, :, :prompt_lens[bib]] = x1[bib, :, :prompt_lens[bib]]
|
||||
xt[bib, :, :prompt_lens[bib]] = 0
|
||||
for i in range(b):
|
||||
prompt[i, :, :prompt_lens[i]] = x1[i, :, :prompt_lens[i]]
|
||||
xt[i, :, :prompt_lens[i]] = 0
|
||||
gailv=0.3# if ttime()>1736250488 else 0.1
|
||||
if random.random() < gailv:
|
||||
base = torch.randint(2, 8, (t.shape[0],), device=mu.device)
|
||||
@ -1128,14 +1126,15 @@ class CFM(torch.nn.Module):
|
||||
|
||||
vt_pred = self.estimator(xt, prompt, x_lens, t,dt, mu, use_grad_ckpt).transpose(2,1)
|
||||
loss = 0
|
||||
|
||||
# print(45555555,estimator_out.shape,u.shape,x_lens,prompt_lens)#45555555 torch.Size([7, 465, 100]) torch.Size([7, 100, 465]) tensor([461, 461, 451, 451, 442, 442, 442], device='cuda:0') tensor([ 96, 93, 185, 59, 244, 262, 294], device='cuda:0')
|
||||
for bib in range(b):
|
||||
loss += self.criterion(vt_pred[bib, :, prompt_lens[bib]:x_lens[bib]], vt[bib, :, prompt_lens[bib]:x_lens[bib]])
|
||||
for i in range(b):
|
||||
loss += self.criterion(vt_pred[i, :, prompt_lens[i]:x_lens[i]], vt[i, :, prompt_lens[i]:x_lens[i]])
|
||||
loss /= b
|
||||
|
||||
return loss#, estimator_out + (1 - self.sigma_min) * z
|
||||
return loss
|
||||
|
||||
def set_no_grad(net_g):
|
||||
for name, param in net_g.named_parameters():
|
||||
param.requires_grad=False
|
||||
|
||||
class SynthesizerTrnV3(nn.Module):
|
||||
"""
|
||||
@ -1210,7 +1209,6 @@ class SynthesizerTrnV3(nn.Module):
|
||||
bins=1024
|
||||
)
|
||||
self.freeze_quantizer=freeze_quantizer
|
||||
|
||||
inter_channels2=512
|
||||
self.bridge=nn.Sequential(
|
||||
nn.Conv1d(inter_channels, inter_channels2, 1, stride=1),
|
||||
@ -1219,6 +1217,10 @@ class SynthesizerTrnV3(nn.Module):
|
||||
self.wns1=Encoder(inter_channels2, inter_channels2, inter_channels2, 5, 1, 8,gin_channels=gin_channels)
|
||||
self.linear_mel=nn.Conv1d(inter_channels2,100,1,stride=1)
|
||||
self.cfm = CFM(100,DiT(**dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=inter_channels2, conv_layers=4)),)#text_dim is condition feature dim
|
||||
if self.freeze_quantizer==True:
|
||||
set_no_grad(self.ssl_proj)
|
||||
set_no_grad(self.quantizer)
|
||||
set_no_grad(self.enc_p)
|
||||
|
||||
def forward(self, ssl, y, mel,ssl_lengths,y_lengths, text, text_lengths,mel_lengths, use_grad_ckpt):#ssl_lengths no need now
|
||||
with autocast(enabled=False):
|
||||
@ -1229,13 +1231,13 @@ class SynthesizerTrnV3(nn.Module):
|
||||
if self.freeze_quantizer:
|
||||
self.ssl_proj.eval()#
|
||||
self.quantizer.eval()
|
||||
self.enc_p.eval()
|
||||
ssl = self.ssl_proj(ssl)
|
||||
quantized, codes, commit_loss, quantized_list = self.quantizer(
|
||||
ssl, layers=[0]
|
||||
)
|
||||
with maybe_no_grad:
|
||||
quantized = F.interpolate(quantized, scale_factor=2, mode="nearest")##BCT
|
||||
x, m_p, logs_p, y_mask = self.enc_p(quantized, y_lengths, text, text_lengths, ge)
|
||||
quantized = F.interpolate(quantized, scale_factor=2, mode="nearest")##BCT
|
||||
x, m_p, logs_p, y_mask = self.enc_p(quantized, y_lengths, text, text_lengths, ge)
|
||||
fea=self.bridge(x)
|
||||
fea = F.interpolate(fea, scale_factor=1.875, mode="nearest")##BCT
|
||||
fea, y_mask_ = self.wns1(fea, mel_lengths, ge)##If the 1-minute fine-tuning works fine, no need to manually adjust the learning rate.
|
||||
@ -1248,6 +1250,155 @@ class SynthesizerTrnV3(nn.Module):
|
||||
cfm_loss= self.cfm(mel, mel_lengths, prompt_len, fea, use_grad_ckpt)
|
||||
return cfm_loss
|
||||
|
||||
@torch.no_grad()
|
||||
def decode_encp(self, codes,text, refer,ge=None,speed=1):
|
||||
# print(2333333,refer.shape)
|
||||
# ge=None
|
||||
if(ge==None):
|
||||
refer_lengths = torch.LongTensor([refer.size(2)]).to(refer.device)
|
||||
refer_mask = torch.unsqueeze(commons.sequence_mask(refer_lengths, refer.size(2)), 1).to(refer.dtype)
|
||||
ge = self.ref_enc(refer[:,:704] * refer_mask, refer_mask)
|
||||
y_lengths = torch.LongTensor([int(codes.size(2)*2)]).to(codes.device)
|
||||
if speed==1:
|
||||
sizee=int(codes.size(2)*2.5*1.5)
|
||||
else:
|
||||
sizee=int(codes.size(2)*2.5*1.5/speed)+1
|
||||
y_lengths1 = torch.LongTensor([sizee]).to(codes.device)
|
||||
text_lengths = torch.LongTensor([text.size(-1)]).to(text.device)
|
||||
|
||||
quantized = self.quantizer.decode(codes)
|
||||
if self.semantic_frame_rate == '25hz':
|
||||
quantized = F.interpolate(quantized, scale_factor=2, mode="nearest")##BCT
|
||||
x, m_p, logs_p, y_mask = self.enc_p(quantized, y_lengths, text, text_lengths, ge,speed)
|
||||
fea=self.bridge(x)
|
||||
fea = F.interpolate(fea, scale_factor=1.875, mode="nearest")##BCT
|
||||
####more wn paramter to learn mel
|
||||
fea, y_mask_ = self.wns1(fea, y_lengths1, ge)
|
||||
return fea,ge
|
||||
|
||||
def extract_latent(self, x):
|
||||
ssl = self.ssl_proj(x)
|
||||
quantized, codes, commit_loss, quantized_list = self.quantizer(ssl)
|
||||
return codes.transpose(0,1)
|
||||
|
||||
class SynthesizerTrnV3b(nn.Module):
|
||||
"""
|
||||
Synthesizer for Training
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
spec_channels,
|
||||
segment_size,
|
||||
inter_channels,
|
||||
hidden_channels,
|
||||
filter_channels,
|
||||
n_heads,
|
||||
n_layers,
|
||||
kernel_size,
|
||||
p_dropout,
|
||||
resblock,
|
||||
resblock_kernel_sizes,
|
||||
resblock_dilation_sizes,
|
||||
upsample_rates,
|
||||
upsample_initial_channel,
|
||||
upsample_kernel_sizes,
|
||||
n_speakers=0,
|
||||
gin_channels=0,
|
||||
use_sdp=True,
|
||||
semantic_frame_rate=None,
|
||||
freeze_quantizer=None,
|
||||
**kwargs):
|
||||
|
||||
super().__init__()
|
||||
self.spec_channels = spec_channels
|
||||
self.inter_channels = inter_channels
|
||||
self.hidden_channels = hidden_channels
|
||||
self.filter_channels = filter_channels
|
||||
self.n_heads = n_heads
|
||||
self.n_layers = n_layers
|
||||
self.kernel_size = kernel_size
|
||||
self.p_dropout = p_dropout
|
||||
self.resblock = resblock
|
||||
self.resblock_kernel_sizes = resblock_kernel_sizes
|
||||
self.resblock_dilation_sizes = resblock_dilation_sizes
|
||||
self.upsample_rates = upsample_rates
|
||||
self.upsample_initial_channel = upsample_initial_channel
|
||||
self.upsample_kernel_sizes = upsample_kernel_sizes
|
||||
self.segment_size = segment_size
|
||||
self.n_speakers = n_speakers
|
||||
self.gin_channels = gin_channels
|
||||
|
||||
self.model_dim=512
|
||||
self.use_sdp = use_sdp
|
||||
self.enc_p = TextEncoder(inter_channels,hidden_channels,filter_channels,n_heads,n_layers,kernel_size,p_dropout)
|
||||
# self.ref_enc = modules.MelStyleEncoder(spec_channels, style_vector_dim=gin_channels)###Rollback
|
||||
self.ref_enc = modules.MelStyleEncoder(704, style_vector_dim=gin_channels)###Rollback
|
||||
self.dec = Generator(inter_channels, resblock, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates,
|
||||
upsample_initial_channel, upsample_kernel_sizes, gin_channels=gin_channels)
|
||||
self.enc_q = PosteriorEncoder(spec_channels, inter_channels, hidden_channels, 5, 1, 16,
|
||||
gin_channels=gin_channels)
|
||||
self.flow = ResidualCouplingBlock(inter_channels, hidden_channels, 5, 1, 4, gin_channels=gin_channels)
|
||||
|
||||
|
||||
ssl_dim = 768
|
||||
assert semantic_frame_rate in ['25hz', "50hz"]
|
||||
self.semantic_frame_rate = semantic_frame_rate
|
||||
if semantic_frame_rate == '25hz':
|
||||
self.ssl_proj = nn.Conv1d(ssl_dim, ssl_dim, 2, stride=2)
|
||||
else:
|
||||
self.ssl_proj = nn.Conv1d(ssl_dim, ssl_dim, 1, stride=1)
|
||||
|
||||
self.quantizer = ResidualVectorQuantizer(
|
||||
dimension=ssl_dim,
|
||||
n_q=1,
|
||||
bins=1024
|
||||
)
|
||||
self.freeze_quantizer=freeze_quantizer
|
||||
|
||||
inter_channels2=512
|
||||
self.bridge=nn.Sequential(
|
||||
nn.Conv1d(inter_channels, inter_channels2, 1, stride=1),
|
||||
nn.LeakyReLU()
|
||||
)
|
||||
self.wns1=Encoder(inter_channels2, inter_channels2, inter_channels2, 5, 1, 8,gin_channels=gin_channels)
|
||||
self.linear_mel=nn.Conv1d(inter_channels2,100,1,stride=1)
|
||||
self.cfm = CFM(100,DiT(**dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=inter_channels2, conv_layers=4)),)#text_dim is condition feature dim
|
||||
|
||||
|
||||
def forward(self, ssl, y, mel,ssl_lengths,y_lengths, text, text_lengths,mel_lengths):#ssl_lengths no need now
|
||||
with autocast(enabled=False):
|
||||
y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, y.size(2)), 1).to(y.dtype)
|
||||
ge = self.ref_enc(y[:,:704] * y_mask, y_mask)
|
||||
# ge = self.ref_enc(y * y_mask, y_mask)#change back, new spec setting is whole 24k
|
||||
# ge=None
|
||||
maybe_no_grad = torch.no_grad() if self.freeze_quantizer else contextlib.nullcontext()
|
||||
with maybe_no_grad:
|
||||
if self.freeze_quantizer:
|
||||
self.ssl_proj.eval()
|
||||
self.quantizer.eval()
|
||||
ssl = self.ssl_proj(ssl)
|
||||
quantized, codes, commit_loss, quantized_list = self.quantizer(
|
||||
ssl, layers=[0]
|
||||
)
|
||||
quantized = F.interpolate(quantized, scale_factor=2, mode="nearest")##BCT
|
||||
x, m_p, logs_p, y_mask = self.enc_p(quantized, y_lengths, text, text_lengths, ge)
|
||||
z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=ge)
|
||||
z_p = self.flow(z, y_mask, g=ge)
|
||||
z_slice, ids_slice = commons.rand_slice_segments(z, y_lengths, self.segment_size)
|
||||
o = self.dec(z_slice, g=ge)
|
||||
fea=self.bridge(x)
|
||||
fea = F.interpolate(fea, scale_factor=1.875, mode="nearest")##BCT
|
||||
fea, y_mask_ = self.wns1(fea, mel_lengths, ge)
|
||||
learned_mel = self.linear_mel(fea)
|
||||
B=ssl.shape[0]
|
||||
prompt_len_max = mel_lengths*2/3
|
||||
prompt_len = (torch.rand([B], device=fea.device) * prompt_len_max).floor().to(dtype=torch.long)#
|
||||
minn=min(mel.shape[-1],fea.shape[-1])
|
||||
mel=mel[:,:,:minn]
|
||||
fea=fea[:,:,:minn]
|
||||
cfm_loss= self.cfm(mel, mel_lengths, prompt_len, fea)#fea==cond,y_lengths==target_mel_lengths#ge not need
|
||||
return commit_loss,cfm_loss,F.mse_loss(learned_mel, mel),o, ids_slice, y_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q), quantized
|
||||
|
||||
@torch.no_grad()
|
||||
def decode_encp(self, codes,text, refer,ge=None):
|
||||
# print(2333333,refer.shape)
|
||||
|
@ -14,7 +14,24 @@ def my_save(fea,path):#####fix issue: torch.save doesn't support chinese path
|
||||
torch.save(fea,tmp_path)
|
||||
shutil.move(tmp_path,"%s/%s"%(dir,name))
|
||||
|
||||
def savee(ckpt, name, epoch, steps, hps):
|
||||
'''
|
||||
00:v1
|
||||
01:v2
|
||||
02:v3
|
||||
03:v3lora
|
||||
|
||||
|
||||
'''
|
||||
from io import BytesIO
|
||||
def my_save2(fea,path):
|
||||
bio = BytesIO()
|
||||
torch.save(fea, bio)
|
||||
bio.seek(0)
|
||||
data = bio.getvalue()
|
||||
data = b'03' + data[2:]###temp for v3lora only, todo
|
||||
with open(path, "wb") as f: f.write(data)
|
||||
|
||||
def savee(ckpt, name, epoch, steps, hps,lora_rank=None):
|
||||
try:
|
||||
opt = OrderedDict()
|
||||
opt["weight"] = {}
|
||||
@ -24,8 +41,66 @@ def savee(ckpt, name, epoch, steps, hps):
|
||||
opt["weight"][key] = ckpt[key].half()
|
||||
opt["config"] = hps
|
||||
opt["info"] = "%sepoch_%siteration" % (epoch, steps)
|
||||
# torch.save(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
|
||||
my_save(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
|
||||
if lora_rank:
|
||||
opt["lora_rank"]=lora_rank
|
||||
my_save2(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
|
||||
else:
|
||||
my_save(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
|
||||
return "Success."
|
||||
except:
|
||||
return traceback.format_exc()
|
||||
|
||||
head2version={
|
||||
b'00':["v1","v1",False],
|
||||
b'01':["v2","v2",False],
|
||||
b'02':["v2","v3",False],
|
||||
b'03':["v2","v3",True],
|
||||
}
|
||||
hash_pretrained_dict={
|
||||
"dc3c97e17592963677a4a1681f30c653":["v2","v2",False],#s2G488k.pth#sovits_v1_pretrained
|
||||
"43797be674a37c1c83ee81081941ed0f":["v2","v3",False],#s2Gv3.pth#sovits_v3_pretrained
|
||||
"6642b37f3dbb1f76882b69937c95a5f3":["v2","v2",False],#s2G2333K.pth#sovits_v2_pretrained
|
||||
}
|
||||
import hashlib
|
||||
def get_hash_from_file(sovits_path):
|
||||
with open(sovits_path,"rb")as f:data=f.read(8192)
|
||||
hash_md5 = hashlib.md5()
|
||||
hash_md5.update(data)
|
||||
return hash_md5.hexdigest()
|
||||
def get_sovits_version_from_path_fast(sovits_path):
|
||||
###1-if it is pretrained sovits models, by hash
|
||||
hash=get_hash_from_file(sovits_path)
|
||||
if hash in hash_pretrained_dict:
|
||||
return hash_pretrained_dict[hash]
|
||||
###2-new weights or old weights, by head
|
||||
with open(sovits_path,"rb")as f:version=f.read(2)
|
||||
if version!=b"PK":
|
||||
return head2version[version]
|
||||
###3-old weights, by file size
|
||||
if_lora_v3=False
|
||||
size=os.path.getsize(sovits_path)
|
||||
'''
|
||||
v1weights:about 82942KB
|
||||
half thr:82978KB
|
||||
v2weights:about 83014KB
|
||||
v3weights:about 750MB
|
||||
'''
|
||||
if size < 82978 * 1024:
|
||||
model_version = version = "v1"
|
||||
elif size < 700 * 1024 * 1024:
|
||||
model_version = version = "v2"
|
||||
else:
|
||||
version = "v2"
|
||||
model_version = "v3"
|
||||
return version,model_version,if_lora_v3
|
||||
|
||||
def load_sovits_new(sovits_path):
|
||||
f=open(sovits_path,"rb")
|
||||
meta=f.read(2)
|
||||
if meta!="PK":
|
||||
data = b'PK' + f.read()
|
||||
bio = BytesIO()
|
||||
bio.write(data)
|
||||
bio.seek(0)
|
||||
return torch.load(bio, map_location="cpu", weights_only=False)
|
||||
return torch.load(sovits_path,map_location="cpu", weights_only=False)
|
@ -26,12 +26,7 @@ from AR.utils import get_newest_ckpt
|
||||
from collections import OrderedDict
|
||||
from time import time as ttime
|
||||
import shutil
|
||||
def my_save(fea,path):#####fix issue: torch.save doesn't support chinese path
|
||||
dir=os.path.dirname(path)
|
||||
name=os.path.basename(path)
|
||||
tmp_path="%s.pth"%(ttime())
|
||||
torch.save(fea,tmp_path)
|
||||
shutil.move(tmp_path,"%s/%s"%(dir,name))
|
||||
from process_ckpt import my_save
|
||||
|
||||
|
||||
class my_model_ckpt(ModelCheckpoint):
|
||||
|
@ -205,6 +205,7 @@ def run(rank, n_gpus, hps):
|
||||
net_g,
|
||||
optim_g,
|
||||
)
|
||||
epoch_str+=1
|
||||
global_step = (epoch_str - 1) * len(train_loader)
|
||||
# epoch_str = 1
|
||||
# global_step = 0
|
||||
@ -215,7 +216,7 @@ def run(rank, n_gpus, hps):
|
||||
if hps.train.pretrained_s2G != ""and hps.train.pretrained_s2G != None and os.path.exists(hps.train.pretrained_s2G):
|
||||
if rank == 0:
|
||||
logger.info("loaded pretrained %s" % hps.train.pretrained_s2G)
|
||||
print(
|
||||
print("loaded pretrained %s" % hps.train.pretrained_s2G,
|
||||
net_g.module.load_state_dict(
|
||||
torch.load(hps.train.pretrained_s2G, map_location="cpu")["weight"],
|
||||
strict=False,
|
||||
@ -227,7 +228,7 @@ def run(rank, n_gpus, hps):
|
||||
if hps.train.pretrained_s2D != ""and hps.train.pretrained_s2D != None and os.path.exists(hps.train.pretrained_s2D):
|
||||
if rank == 0:
|
||||
logger.info("loaded pretrained %s" % hps.train.pretrained_s2D)
|
||||
print(
|
||||
print("loaded pretrained %s" % hps.train.pretrained_s2D,
|
||||
net_d.module.load_state_dict(
|
||||
torch.load(hps.train.pretrained_s2D, map_location="cpu")["weight"]
|
||||
) if torch.cuda.is_available() else net_d.load_state_dict(
|
||||
@ -250,6 +251,7 @@ def run(rank, n_gpus, hps):
|
||||
|
||||
scaler = GradScaler(enabled=hps.train.fp16_run)
|
||||
|
||||
print("start training from epoch %s" % epoch_str)
|
||||
for epoch in range(epoch_str, hps.train.epochs + 1):
|
||||
if rank == 0:
|
||||
train_and_evaluate(
|
||||
@ -280,6 +282,7 @@ def run(rank, n_gpus, hps):
|
||||
)
|
||||
scheduler_g.step()
|
||||
scheduler_d.step()
|
||||
print("training done")
|
||||
|
||||
|
||||
def train_and_evaluate(
|
||||
|
@ -178,6 +178,7 @@ def run(rank, n_gpus, hps):
|
||||
net_g,
|
||||
optim_g,
|
||||
)
|
||||
epoch_str+=1
|
||||
global_step = (epoch_str - 1) * len(train_loader)
|
||||
# epoch_str = 1
|
||||
# global_step = 0
|
||||
@ -188,7 +189,7 @@ def run(rank, n_gpus, hps):
|
||||
if hps.train.pretrained_s2G != ""and hps.train.pretrained_s2G != None and os.path.exists(hps.train.pretrained_s2G):
|
||||
if rank == 0:
|
||||
logger.info("loaded pretrained %s" % hps.train.pretrained_s2G)
|
||||
print(
|
||||
print("loaded pretrained %s" % hps.train.pretrained_s2G,
|
||||
net_g.module.load_state_dict(
|
||||
torch.load(hps.train.pretrained_s2G, map_location="cpu")["weight"],
|
||||
strict=False,
|
||||
@ -224,6 +225,7 @@ def run(rank, n_gpus, hps):
|
||||
scaler = GradScaler(enabled=hps.train.fp16_run)
|
||||
|
||||
net_d=optim_d=scheduler_d=None
|
||||
print("start training from epoch %s" % epoch_str)
|
||||
for epoch in range(epoch_str, hps.train.epochs + 1):
|
||||
if rank == 0:
|
||||
train_and_evaluate(
|
||||
@ -254,6 +256,7 @@ def run(rank, n_gpus, hps):
|
||||
)
|
||||
scheduler_g.step()
|
||||
# scheduler_d.step()
|
||||
print("training done")
|
||||
|
||||
|
||||
def train_and_evaluate(
|
||||
|
345
GPT_SoVITS/s2_train_v3_lora.py
Normal file
345
GPT_SoVITS/s2_train_v3_lora.py
Normal file
@ -0,0 +1,345 @@
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
import utils, os
|
||||
hps = utils.get_hparams(stage=2)
|
||||
os.environ["CUDA_VISIBLE_DEVICES"] = hps.train.gpu_numbers.replace("-", ",")
|
||||
import torch
|
||||
from torch.nn import functional as F
|
||||
from torch.utils.data import DataLoader
|
||||
from torch.utils.tensorboard import SummaryWriter
|
||||
import torch.multiprocessing as mp
|
||||
import torch.distributed as dist, traceback
|
||||
from torch.nn.parallel import DistributedDataParallel as DDP
|
||||
from torch.cuda.amp import autocast, GradScaler
|
||||
from tqdm import tqdm
|
||||
import logging, traceback
|
||||
|
||||
logging.getLogger("matplotlib").setLevel(logging.INFO)
|
||||
logging.getLogger("h5py").setLevel(logging.INFO)
|
||||
logging.getLogger("numba").setLevel(logging.INFO)
|
||||
from random import randint
|
||||
from module import commons
|
||||
from peft import LoraConfig, PeftModel, get_peft_model
|
||||
from module.data_utils import (
|
||||
TextAudioSpeakerLoaderV3 as TextAudioSpeakerLoader,
|
||||
TextAudioSpeakerCollateV3 as TextAudioSpeakerCollate,
|
||||
DistributedBucketSampler,
|
||||
)
|
||||
from module.models import (
|
||||
SynthesizerTrnV3 as SynthesizerTrn,
|
||||
MultiPeriodDiscriminator,
|
||||
)
|
||||
from module.losses import generator_loss, discriminator_loss, feature_loss, kl_loss
|
||||
from module.mel_processing import mel_spectrogram_torch, spec_to_mel_torch
|
||||
from process_ckpt import savee
|
||||
from collections import OrderedDict as od
|
||||
torch.backends.cudnn.benchmark = False
|
||||
torch.backends.cudnn.deterministic = False
|
||||
###反正A100fp32更快,那试试tf32吧
|
||||
torch.backends.cuda.matmul.allow_tf32 = True
|
||||
torch.backends.cudnn.allow_tf32 = True
|
||||
torch.set_float32_matmul_precision("medium") # 最低精度但最快(也就快一丁点),对于结果造成不了影响
|
||||
# from config import pretrained_s2G,pretrained_s2D
|
||||
global_step = 0
|
||||
|
||||
device = "cpu" # cuda以外的设备,等mps优化后加入
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
if torch.cuda.is_available():
|
||||
n_gpus = torch.cuda.device_count()
|
||||
else:
|
||||
n_gpus = 1
|
||||
os.environ["MASTER_ADDR"] = "localhost"
|
||||
os.environ["MASTER_PORT"] = str(randint(20000, 55555))
|
||||
|
||||
mp.spawn(
|
||||
run,
|
||||
nprocs=n_gpus,
|
||||
args=(
|
||||
n_gpus,
|
||||
hps,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def run(rank, n_gpus, hps):
|
||||
global global_step,no_grad_names,save_root,lora_rank
|
||||
if rank == 0:
|
||||
logger = utils.get_logger(hps.data.exp_dir)
|
||||
logger.info(hps)
|
||||
# utils.check_git_hash(hps.s2_ckpt_dir)
|
||||
writer = SummaryWriter(log_dir=hps.s2_ckpt_dir)
|
||||
writer_eval = SummaryWriter(log_dir=os.path.join(hps.s2_ckpt_dir, "eval"))
|
||||
|
||||
dist.init_process_group(
|
||||
backend = "gloo" if os.name == "nt" or not torch.cuda.is_available() else "nccl",
|
||||
init_method="env://?use_libuv=False",
|
||||
world_size=n_gpus,
|
||||
rank=rank,
|
||||
)
|
||||
torch.manual_seed(hps.train.seed)
|
||||
if torch.cuda.is_available():
|
||||
torch.cuda.set_device(rank)
|
||||
|
||||
train_dataset = TextAudioSpeakerLoader(hps.data) ########
|
||||
train_sampler = DistributedBucketSampler(
|
||||
train_dataset,
|
||||
hps.train.batch_size,
|
||||
[
|
||||
32,
|
||||
300,
|
||||
400,
|
||||
500,
|
||||
600,
|
||||
700,
|
||||
800,
|
||||
900,
|
||||
1000,
|
||||
# 1100,
|
||||
# 1200,
|
||||
# 1300,
|
||||
# 1400,
|
||||
# 1500,
|
||||
# 1600,
|
||||
# 1700,
|
||||
# 1800,
|
||||
# 1900,
|
||||
],
|
||||
num_replicas=n_gpus,
|
||||
rank=rank,
|
||||
shuffle=True,
|
||||
)
|
||||
collate_fn = TextAudioSpeakerCollate()
|
||||
train_loader = DataLoader(
|
||||
train_dataset,
|
||||
num_workers=6,
|
||||
shuffle=False,
|
||||
pin_memory=True,
|
||||
collate_fn=collate_fn,
|
||||
batch_sampler=train_sampler,
|
||||
persistent_workers=True,
|
||||
prefetch_factor=4,
|
||||
)
|
||||
save_root="%s/logs_s2_%s_lora_%s" % (hps.data.exp_dir,hps.model.version,hps.train.lora_rank)
|
||||
os.makedirs(save_root,exist_ok=True)
|
||||
lora_rank=int(hps.train.lora_rank)
|
||||
lora_config = LoraConfig(
|
||||
target_modules=["to_k", "to_q", "to_v", "to_out.0"],
|
||||
r=lora_rank,
|
||||
lora_alpha=lora_rank,
|
||||
init_lora_weights=True,
|
||||
)
|
||||
def get_model(hps):return SynthesizerTrn(
|
||||
hps.data.filter_length // 2 + 1,
|
||||
hps.train.segment_size // hps.data.hop_length,
|
||||
n_speakers=hps.data.n_speakers,
|
||||
**hps.model,
|
||||
)
|
||||
def get_optim(net_g):
|
||||
return torch.optim.AdamW(
|
||||
filter(lambda p: p.requires_grad, net_g.parameters()), ###默认所有层lr一致
|
||||
hps.train.learning_rate,
|
||||
betas=hps.train.betas,
|
||||
eps=hps.train.eps,
|
||||
)
|
||||
def model2cuda(net_g,rank):
|
||||
if torch.cuda.is_available():
|
||||
net_g = DDP(net_g.cuda(rank), device_ids=[rank], find_unused_parameters=True)
|
||||
else:
|
||||
net_g = net_g.to(device)
|
||||
return net_g
|
||||
try:# 如果能加载自动resume
|
||||
net_g = get_model(hps)
|
||||
net_g.cfm = get_peft_model(net_g.cfm, lora_config)
|
||||
net_g=model2cuda(net_g,rank)
|
||||
optim_g=get_optim(net_g)
|
||||
# _, _, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, optim_g,load_opt=0)
|
||||
_, _, _, epoch_str = utils.load_checkpoint(
|
||||
utils.latest_checkpoint_path(save_root, "G_*.pth"),
|
||||
net_g,
|
||||
optim_g,
|
||||
)
|
||||
epoch_str+=1
|
||||
global_step = (epoch_str - 1) * len(train_loader)
|
||||
except: # 如果首次不能加载,加载pretrain
|
||||
# traceback.print_exc()
|
||||
epoch_str = 1
|
||||
global_step = 0
|
||||
net_g = get_model(hps)
|
||||
if hps.train.pretrained_s2G != ""and hps.train.pretrained_s2G != None and os.path.exists(hps.train.pretrained_s2G):
|
||||
if rank == 0:
|
||||
logger.info("loaded pretrained %s" % hps.train.pretrained_s2G)
|
||||
print("loaded pretrained %s" % hps.train.pretrained_s2G,
|
||||
net_g.load_state_dict(
|
||||
torch.load(hps.train.pretrained_s2G, map_location="cpu")["weight"],
|
||||
strict=False,
|
||||
)
|
||||
)
|
||||
net_g.cfm = get_peft_model(net_g.cfm, lora_config)
|
||||
net_g=model2cuda(net_g,rank)
|
||||
optim_g = get_optim(net_g)
|
||||
|
||||
no_grad_names=set()
|
||||
for name, param in net_g.named_parameters():
|
||||
if not param.requires_grad:
|
||||
no_grad_names.add(name.replace("module.",""))
|
||||
# print(name, "not requires_grad")
|
||||
# print(no_grad_names)
|
||||
# os._exit(233333)
|
||||
|
||||
scheduler_g = torch.optim.lr_scheduler.ExponentialLR(
|
||||
optim_g, gamma=hps.train.lr_decay, last_epoch=-1
|
||||
)
|
||||
for _ in range(epoch_str):
|
||||
scheduler_g.step()
|
||||
|
||||
scaler = GradScaler(enabled=hps.train.fp16_run)
|
||||
|
||||
net_d=optim_d=scheduler_d=None
|
||||
print("start training from epoch %s"%epoch_str)
|
||||
for epoch in range(epoch_str, hps.train.epochs + 1):
|
||||
if rank == 0:
|
||||
train_and_evaluate(
|
||||
rank,
|
||||
epoch,
|
||||
hps,
|
||||
[net_g, net_d],
|
||||
[optim_g, optim_d],
|
||||
[scheduler_g, scheduler_d],
|
||||
scaler,
|
||||
# [train_loader, eval_loader], logger, [writer, writer_eval])
|
||||
[train_loader, None],
|
||||
logger,
|
||||
[writer, writer_eval],
|
||||
)
|
||||
else:
|
||||
train_and_evaluate(
|
||||
rank,
|
||||
epoch,
|
||||
hps,
|
||||
[net_g, net_d],
|
||||
[optim_g, optim_d],
|
||||
[scheduler_g, scheduler_d],
|
||||
scaler,
|
||||
[train_loader, None],
|
||||
None,
|
||||
None,
|
||||
)
|
||||
scheduler_g.step()
|
||||
print("training done")
|
||||
|
||||
def train_and_evaluate(
|
||||
rank, epoch, hps, nets, optims, schedulers, scaler, loaders, logger, writers
|
||||
):
|
||||
net_g, net_d = nets
|
||||
optim_g, optim_d = optims
|
||||
# scheduler_g, scheduler_d = schedulers
|
||||
train_loader, eval_loader = loaders
|
||||
if writers is not None:
|
||||
writer, writer_eval = writers
|
||||
|
||||
train_loader.batch_sampler.set_epoch(epoch)
|
||||
global global_step
|
||||
|
||||
net_g.train()
|
||||
for batch_idx, (ssl, spec, mel, ssl_lengths, spec_lengths, text, text_lengths, mel_lengths) in enumerate(tqdm(train_loader)):
|
||||
if torch.cuda.is_available():
|
||||
spec, spec_lengths = spec.cuda(rank, non_blocking=True), spec_lengths.cuda(
|
||||
rank, non_blocking=True
|
||||
)
|
||||
mel, mel_lengths = mel.cuda(rank, non_blocking=True), mel_lengths.cuda(
|
||||
rank, non_blocking=True
|
||||
)
|
||||
ssl = ssl.cuda(rank, non_blocking=True)
|
||||
ssl.requires_grad = False
|
||||
text, text_lengths = text.cuda(rank, non_blocking=True), text_lengths.cuda(
|
||||
rank, non_blocking=True
|
||||
)
|
||||
else:
|
||||
spec, spec_lengths = spec.to(device), spec_lengths.to(device)
|
||||
mel, mel_lengths = mel.to(device), mel_lengths.to(device)
|
||||
ssl = ssl.to(device)
|
||||
ssl.requires_grad = False
|
||||
text, text_lengths = text.to(device), text_lengths.to(device)
|
||||
|
||||
with autocast(enabled=hps.train.fp16_run):
|
||||
cfm_loss = net_g(ssl, spec, mel,ssl_lengths,spec_lengths, text, text_lengths,mel_lengths, use_grad_ckpt=hps.train.grad_ckpt)
|
||||
loss_gen_all=cfm_loss
|
||||
optim_g.zero_grad()
|
||||
scaler.scale(loss_gen_all).backward()
|
||||
scaler.unscale_(optim_g)
|
||||
grad_norm_g = commons.clip_grad_value_(net_g.parameters(), None)
|
||||
scaler.step(optim_g)
|
||||
scaler.update()
|
||||
|
||||
if rank == 0:
|
||||
if global_step % hps.train.log_interval == 0:
|
||||
lr = optim_g.param_groups[0]['lr']
|
||||
losses = [cfm_loss]
|
||||
logger.info('Train Epoch: {} [{:.0f}%]'.format(
|
||||
epoch,
|
||||
100. * batch_idx / len(train_loader)))
|
||||
logger.info([x.item() for x in losses] + [global_step, lr])
|
||||
|
||||
scalar_dict = {"loss/g/total": loss_gen_all, "learning_rate": lr, "grad_norm_g": grad_norm_g}
|
||||
utils.summarize(
|
||||
writer=writer,
|
||||
global_step=global_step,
|
||||
scalars=scalar_dict)
|
||||
|
||||
global_step += 1
|
||||
if epoch % hps.train.save_every_epoch == 0 and rank == 0:
|
||||
if hps.train.if_save_latest == 0:
|
||||
utils.save_checkpoint(
|
||||
net_g,
|
||||
optim_g,
|
||||
hps.train.learning_rate,
|
||||
epoch,
|
||||
os.path.join(
|
||||
save_root, "G_{}.pth".format(global_step)
|
||||
),
|
||||
)
|
||||
else:
|
||||
utils.save_checkpoint(
|
||||
net_g,
|
||||
optim_g,
|
||||
hps.train.learning_rate,
|
||||
epoch,
|
||||
os.path.join(
|
||||
save_root, "G_{}.pth".format(233333333333)
|
||||
),
|
||||
)
|
||||
if rank == 0 and hps.train.if_save_every_weights == True:
|
||||
if hasattr(net_g, "module"):
|
||||
ckpt = net_g.module.state_dict()
|
||||
else:
|
||||
ckpt = net_g.state_dict()
|
||||
sim_ckpt=od()
|
||||
for key in ckpt:
|
||||
# if "cfm"not in key:
|
||||
# print(key)
|
||||
if key not in no_grad_names:
|
||||
sim_ckpt[key]=ckpt[key].half().cpu()
|
||||
logger.info(
|
||||
"saving ckpt %s_e%s:%s"
|
||||
% (
|
||||
hps.name,
|
||||
epoch,
|
||||
savee(
|
||||
sim_ckpt,
|
||||
hps.name + "_e%s_s%s_l%s" % (epoch, global_step,lora_rank),
|
||||
epoch,
|
||||
global_step,
|
||||
hps,lora_rank=lora_rank
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
if rank == 0:
|
||||
logger.info("====> Epoch: {}".format(epoch))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@ -1,14 +1,74 @@
|
||||
import logging
|
||||
import jieba
|
||||
import re
|
||||
|
||||
# jieba静音
|
||||
import jieba
|
||||
jieba.setLogLevel(logging.CRITICAL)
|
||||
|
||||
# 更改fast_langdetect大模型位置
|
||||
from pathlib import Path
|
||||
import fast_langdetect
|
||||
fast_langdetect.ft_detect.infer.CACHE_DIRECTORY = Path(__file__).parent.parent.parent / "pretrained_models" / "fast_langdetect"
|
||||
import sys
|
||||
sys.modules["fast_langdetect"] = fast_langdetect
|
||||
|
||||
# 防止win下无法读取模型
|
||||
import os
|
||||
from typing import Optional
|
||||
def load_fasttext_model(
|
||||
model_path: Path,
|
||||
download_url: Optional[str] = None,
|
||||
proxy: Optional[str] = None,
|
||||
):
|
||||
"""
|
||||
Load a FastText model, downloading it if necessary.
|
||||
:param model_path: Path to the FastText model file
|
||||
:param download_url: URL to download the model from
|
||||
:param proxy: Proxy URL for downloading the model
|
||||
:return: FastText model
|
||||
:raises DetectError: If model loading fails
|
||||
"""
|
||||
if all([
|
||||
fast_langdetect.ft_detect.infer.VERIFY_FASTTEXT_LARGE_MODEL,
|
||||
model_path.exists(),
|
||||
model_path.name == fast_langdetect.ft_detect.infer.FASTTEXT_LARGE_MODEL_NAME,
|
||||
]):
|
||||
if not fast_langdetect.ft_detect.infer.verify_md5(model_path, fast_langdetect.ft_detect.infer.VERIFY_FASTTEXT_LARGE_MODEL):
|
||||
fast_langdetect.ft_detect.infer.logger.warning(
|
||||
f"fast-langdetect: MD5 hash verification failed for {model_path}, "
|
||||
f"please check the integrity of the downloaded file from {fast_langdetect.ft_detect.infer.FASTTEXT_LARGE_MODEL_URL}. "
|
||||
"\n This may seriously reduce the prediction accuracy. "
|
||||
"If you want to ignore this, please set `fast_langdetect.ft_detect.infer.VERIFY_FASTTEXT_LARGE_MODEL = None` "
|
||||
)
|
||||
if not model_path.exists():
|
||||
if download_url:
|
||||
fast_langdetect.ft_detect.infer.download_model(download_url, model_path, proxy)
|
||||
if not model_path.exists():
|
||||
raise fast_langdetect.ft_detect.infer.DetectError(f"FastText model file not found at {model_path}")
|
||||
|
||||
try:
|
||||
# Load FastText model
|
||||
if (re.match(r'^[A-Za-z0-9_/\\:.]*$', str(model_path))):
|
||||
model = fast_langdetect.ft_detect.infer.fasttext.load_model(str(model_path))
|
||||
else:
|
||||
python_dir = os.getcwd()
|
||||
if (str(model_path)[:len(python_dir)].upper() == python_dir.upper()):
|
||||
model = fast_langdetect.ft_detect.infer.fasttext.load_model(os.path.relpath(model_path, python_dir))
|
||||
else:
|
||||
import tempfile
|
||||
import shutil
|
||||
with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
|
||||
shutil.copyfile(model_path, tmpfile.name)
|
||||
|
||||
model = fast_langdetect.ft_detect.infer.fasttext.load_model(tmpfile.name)
|
||||
os.unlink(tmpfile.name)
|
||||
return model
|
||||
|
||||
except Exception as e:
|
||||
fast_langdetect.ft_detect.infer.logger.warning(f"fast-langdetect:Failed to load FastText model from {model_path}: {e}")
|
||||
raise fast_langdetect.ft_detect.infer.DetectError(f"Failed to load FastText model: {e}")
|
||||
|
||||
if os.name == 'nt':
|
||||
fast_langdetect.ft_detect.infer.load_fasttext_model = load_fasttext_model
|
||||
|
||||
|
||||
from split_lang import LangSplitter
|
||||
|
||||
@ -18,6 +78,32 @@ def full_en(text):
|
||||
return bool(re.match(pattern, text))
|
||||
|
||||
|
||||
def full_cjk(text):
|
||||
# 来自wiki
|
||||
cjk_ranges = [
|
||||
(0x4E00, 0x9FFF), # CJK Unified Ideographs
|
||||
(0x3400, 0x4DB5), # CJK Extension A
|
||||
(0x20000, 0x2A6DD), # CJK Extension B
|
||||
(0x2A700, 0x2B73F), # CJK Extension C
|
||||
(0x2B740, 0x2B81F), # CJK Extension D
|
||||
(0x2B820, 0x2CEAF), # CJK Extension E
|
||||
(0x2CEB0, 0x2EBEF), # CJK Extension F
|
||||
(0x30000, 0x3134A), # CJK Extension G
|
||||
(0x31350, 0x323AF), # CJK Extension H
|
||||
(0x2EBF0, 0x2EE5D), # CJK Extension H
|
||||
]
|
||||
|
||||
pattern = r'[0-9、-〜。!?.!?… ]+$'
|
||||
|
||||
cjk_text = ""
|
||||
for char in text:
|
||||
code_point = ord(char)
|
||||
in_cjk = any(start <= code_point <= end for start, end in cjk_ranges)
|
||||
if in_cjk or re.match(pattern, char):
|
||||
cjk_text += char
|
||||
return cjk_text
|
||||
|
||||
|
||||
def split_jako(tag_lang,item):
|
||||
if tag_lang == "ja":
|
||||
pattern = r"([\u3041-\u3096\u3099\u309A\u30A1-\u30FA\u30FC]+(?:[0-9、-〜。!?.!?… ]+[\u3041-\u3096\u3099\u309A\u30A1-\u30FA\u30FC]*)*)"
|
||||
@ -98,8 +184,12 @@ class LangSegmenter():
|
||||
|
||||
# 未存在非日韩文夹日韩文
|
||||
if len(temp_list) == 1:
|
||||
# 跳过未知语言
|
||||
# 未知语言检查是否为CJK
|
||||
if dict_item['lang'] == 'x':
|
||||
cjk_text = full_cjk(dict_item['text'])
|
||||
if cjk_text:
|
||||
dict_item = {'lang':'zh','text':cjk_text}
|
||||
lang_list = merge_lang(lang_list,dict_item)
|
||||
continue
|
||||
else:
|
||||
lang_list = merge_lang(lang_list,dict_item)
|
||||
@ -107,12 +197,14 @@ class LangSegmenter():
|
||||
|
||||
# 存在非日韩文夹日韩文
|
||||
for _, temp_item in enumerate(temp_list):
|
||||
# 待观察是否会出现带英文或语言为x的中日英韩文
|
||||
# 未知语言检查是否为CJK
|
||||
if temp_item['lang'] == 'x':
|
||||
continue
|
||||
|
||||
lang_list = merge_lang(lang_list,temp_item)
|
||||
|
||||
cjk_text = full_cjk(dict_item['text'])
|
||||
if cjk_text:
|
||||
dict_item = {'lang':'zh','text':cjk_text}
|
||||
lang_list = merge_lang(lang_list,dict_item)
|
||||
else:
|
||||
lang_list = merge_lang(lang_list,temp_item)
|
||||
return lang_list
|
||||
|
||||
|
||||
@ -120,5 +212,6 @@ if __name__ == "__main__":
|
||||
text = "MyGO?,你也喜欢まいご吗?"
|
||||
print(LangSegmenter.getTexts(text))
|
||||
|
||||
|
||||
text = "ねえ、知ってる?最近、僕は天文学を勉強してるんだ。君の瞳が星空みたいにキラキラしてるからさ。"
|
||||
print(LangSegmenter.getTexts(text))
|
||||
|
||||
|
@ -5,6 +5,40 @@ import hashlib
|
||||
try:
|
||||
import pyopenjtalk
|
||||
current_file_path = os.path.dirname(__file__)
|
||||
|
||||
# 防止win下无法读取模型
|
||||
if os.name == 'nt':
|
||||
python_dir = os.getcwd()
|
||||
OPEN_JTALK_DICT_DIR = pyopenjtalk.OPEN_JTALK_DICT_DIR.decode("utf-8")
|
||||
if not (re.match(r'^[A-Za-z0-9_/\\:.]*$', OPEN_JTALK_DICT_DIR)):
|
||||
if (OPEN_JTALK_DICT_DIR[:len(python_dir)].upper() == python_dir.upper()):
|
||||
OPEN_JTALK_DICT_DIR = os.path.join(os.path.relpath(OPEN_JTALK_DICT_DIR,python_dir))
|
||||
else:
|
||||
import shutil
|
||||
if not os.path.exists('TEMP'):
|
||||
os.mkdir('TEMP')
|
||||
if not os.path.exists(os.path.join("TEMP", "ja")):
|
||||
os.mkdir(os.path.join("TEMP", "ja"))
|
||||
if os.path.exists(os.path.join("TEMP", "ja", "open_jtalk_dic")):
|
||||
shutil.rmtree(os.path.join("TEMP", "ja", "open_jtalk_dic"))
|
||||
shutil.copytree(pyopenjtalk.OPEN_JTALK_DICT_DIR.decode("utf-8"), os.path.join("TEMP", "ja", "open_jtalk_dic"), )
|
||||
OPEN_JTALK_DICT_DIR = os.path.join("TEMP", "ja", "open_jtalk_dic")
|
||||
pyopenjtalk.OPEN_JTALK_DICT_DIR = OPEN_JTALK_DICT_DIR.encode("utf-8")
|
||||
|
||||
if not (re.match(r'^[A-Za-z0-9_/\\:.]*$', current_file_path)):
|
||||
if (current_file_path[:len(python_dir)].upper() == python_dir.upper()):
|
||||
current_file_path = os.path.join(os.path.relpath(current_file_path,python_dir))
|
||||
else:
|
||||
if not os.path.exists('TEMP'):
|
||||
os.mkdir('TEMP')
|
||||
if not os.path.exists(os.path.join("TEMP", "ja")):
|
||||
os.mkdir(os.path.join("TEMP", "ja"))
|
||||
if not os.path.exists(os.path.join("TEMP", "ja", "ja_userdic")):
|
||||
os.mkdir(os.path.join("TEMP", "ja", "ja_userdic"))
|
||||
shutil.copyfile(os.path.join(current_file_path, "ja_userdic", "userdict.csv"),os.path.join("TEMP", "ja", "ja_userdic", "userdict.csv"))
|
||||
current_file_path = os.path.join("TEMP", "ja")
|
||||
|
||||
|
||||
def get_hash(fp: str) -> str:
|
||||
hash_md5 = hashlib.md5()
|
||||
with open(fp, "rb") as f:
|
||||
|
@ -5,6 +5,53 @@ from jamo import h2j, j2hcj
|
||||
import ko_pron
|
||||
from g2pk2 import G2p
|
||||
|
||||
import importlib
|
||||
import os
|
||||
|
||||
# 防止win下无法读取模型
|
||||
if os.name == 'nt':
|
||||
class win_G2p(G2p):
|
||||
def check_mecab(self):
|
||||
super().check_mecab()
|
||||
spam_spec = importlib.util.find_spec("eunjeon")
|
||||
non_found = spam_spec is None
|
||||
if non_found:
|
||||
print(f'you have to install eunjeon. install it...')
|
||||
else:
|
||||
installpath = spam_spec.submodule_search_locations[0]
|
||||
if not (re.match(r'^[A-Za-z0-9_/\\:.]*$', installpath)):
|
||||
|
||||
import sys
|
||||
from eunjeon import Mecab as _Mecab
|
||||
class Mecab(_Mecab):
|
||||
def get_dicpath(installpath):
|
||||
if not (re.match(r'^[A-Za-z0-9_/\\:.]*$', installpath)):
|
||||
import shutil
|
||||
python_dir = os.getcwd()
|
||||
if (installpath[:len(python_dir)].upper() == python_dir.upper()):
|
||||
dicpath = os.path.join(os.path.relpath(installpath,python_dir),'data','mecabrc')
|
||||
else:
|
||||
if not os.path.exists('TEMP'):
|
||||
os.mkdir('TEMP')
|
||||
if not os.path.exists(os.path.join('TEMP', 'ko')):
|
||||
os.mkdir(os.path.join('TEMP', 'ko'))
|
||||
if os.path.exists(os.path.join('TEMP', 'ko', 'ko_dict')):
|
||||
shutil.rmtree(os.path.join('TEMP', 'ko', 'ko_dict'))
|
||||
|
||||
shutil.copytree(os.path.join(installpath, 'data'), os.path.join('TEMP', 'ko', 'ko_dict'))
|
||||
dicpath = os.path.join('TEMP', 'ko', 'ko_dict', 'mecabrc')
|
||||
else:
|
||||
dicpath=os.path.abspath(os.path.join(installpath, 'data/mecabrc'))
|
||||
return dicpath
|
||||
|
||||
def __init__(self, dicpath=get_dicpath(installpath)):
|
||||
super().__init__(dicpath=dicpath)
|
||||
|
||||
sys.modules["eunjeon"].Mecab = Mecab
|
||||
|
||||
G2p = win_G2p
|
||||
|
||||
|
||||
from text.symbols2 import symbols
|
||||
|
||||
# This is a list of Korean classifiers preceded by pure Korean numerals.
|
||||
@ -263,3 +310,8 @@ def g2p(text):
|
||||
# text = "".join([post_replace_ph(i) for i in text])
|
||||
text = [post_replace_ph(i) for i in text]
|
||||
return text
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
text = "안녕하세요"
|
||||
print(g2p(text))
|
115
README.md
115
README.md
@ -121,9 +121,7 @@ pip install -r requirements.txt
|
||||
|
||||
0. Regarding image tags: Due to rapid updates in the codebase and the slow process of packaging and testing images, please check [Docker Hub](https://hub.docker.com/r/breakstring/gpt-sovits) for the currently packaged latest images and select as per your situation, or alternatively, build locally using a Dockerfile according to your own needs.
|
||||
1. Environment Variables:
|
||||
|
||||
- is_half: Controls half-precision/double-precision. This is typically the cause if the content under the directories 4-cnhubert/5-wav32k is not generated correctly during the "SSL extracting" step. Adjust to True or False based on your actual situation.
|
||||
|
||||
- is_half: Controls half-precision/double-precision. This is typically the cause if the content under the directories 4-cnhubert/5-wav32k is not generated correctly during the "SSL extracting" step. Adjust to True or False based on your actual situation.
|
||||
2. Volumes Configuration,The application's root directory inside the container is set to /workspace. The default docker-compose.yaml lists some practical examples for uploading/downloading content.
|
||||
3. shm_size: The default available memory for Docker Desktop on Windows is too small, which can cause abnormal operations. Adjust according to your own situation.
|
||||
4. Under the deploy section, GPU-related settings should be adjusted cautiously according to your system and actual circumstances.
|
||||
@ -152,9 +150,13 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
|
||||
|
||||
3. 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`.
|
||||
|
||||
- If you want to use `bs_roformer` or `mel_band_roformer` models for UVR5, you can manually download the model and corresponding configuration file, and put them in `tools/uvr5/uvr5_weights`. **Rename the model file and configuration file, ensure that the model and configuration files have the same and corresponding names except for the suffix**. In addition, the model and configuration file names **must include `roformer`** in order to be recognized as models of the roformer class.
|
||||
|
||||
- The suggestion is to **directly specify the model type** in the model name and configuration file name, such as `mel_mand_roformer`, `bs_roformer`. If not specified, the features will be compared from the configuration file to determine which type of model it is. For example, the model `bs_roformer_ep_368_sdr_12.9628.ckpt` and its corresponding configuration file `bs_roformer_ep_368_sdr_12.9628.yaml` are a pair, `kim_mel_band_roformer.ckpt` and `kim_mel_band_roformer.yaml` are also a pair.
|
||||
|
||||
4. 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`.
|
||||
|
||||
5. 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.
|
||||
5. 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.
|
||||
|
||||
## Dataset Format
|
||||
|
||||
@ -171,7 +173,7 @@ Language dictionary:
|
||||
- 'en': English
|
||||
- 'ko': Korean
|
||||
- 'yue': Cantonese
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
@ -180,61 +182,56 @@ D:\GPT-SoVITS\xxx/xxx.wav|xxx|en|I like playing Genshin.
|
||||
|
||||
## Finetune and inference
|
||||
|
||||
### Open WebUI
|
||||
### Open WebUI
|
||||
|
||||
#### Integrated Package Users
|
||||
#### Integrated Package Users
|
||||
|
||||
Double-click `go-webui.bat`or use `go-webui.ps1`
|
||||
if you want to switch to V1,then double-click`go-webui-v1.bat` or use `go-webui-v1.ps1`
|
||||
Double-click `go-webui.bat`or use `go-webui.ps1`
|
||||
if you want to switch to V1,then double-click`go-webui-v1.bat` or use `go-webui-v1.ps1`
|
||||
|
||||
#### Others
|
||||
#### Others
|
||||
|
||||
```bash
|
||||
python webui.py <language(optional)>
|
||||
```
|
||||
```bash
|
||||
python webui.py <language(optional)>
|
||||
```
|
||||
|
||||
if you want to switch to V1,then
|
||||
if you want to switch to V1,then
|
||||
|
||||
```bash
|
||||
python webui.py v1 <language(optional)>
|
||||
```
|
||||
```bash
|
||||
python webui.py v1 <language(optional)>
|
||||
```
|
||||
Or maunally switch version in WebUI
|
||||
|
||||
### Finetune
|
||||
### Finetune
|
||||
|
||||
#### Path Auto-filling is now supported
|
||||
#### Path Auto-filling is now supported
|
||||
|
||||
1.Fill in the audio path
|
||||
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
|
||||
|
||||
2.Slice the audio into small chunks
|
||||
### Open Inference WebUI
|
||||
|
||||
3.Denoise(optinal)
|
||||
#### Integrated Package Users
|
||||
|
||||
4.ASR
|
||||
Double-click `go-webui-v2.bat` or use `go-webui-v2.ps1` ,then open the inference webui at `1-GPT-SoVITS-TTS/1C-inference`
|
||||
|
||||
5.Proofreading ASR transcriptions
|
||||
#### Others
|
||||
|
||||
6.Go to the next Tab, then finetune the model
|
||||
```bash
|
||||
python GPT_SoVITS/inference_webui.py <language(optional)>
|
||||
```
|
||||
OR
|
||||
|
||||
### Open Inference WebUI
|
||||
|
||||
#### Integrated Package Users
|
||||
|
||||
Double-click `go-webui-v2.bat` or use `go-webui-v2.ps1` ,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
|
||||
```
|
||||
```bash
|
||||
python webui.py
|
||||
```
|
||||
then open the inference webui at `1-GPT-SoVITS-TTS/1C-inference`
|
||||
|
||||
## V2 Release Notes
|
||||
## V2 Release Notes
|
||||
|
||||
New Features:
|
||||
|
||||
@ -244,11 +241,11 @@ New Features:
|
||||
|
||||
3. Pre-trained model extended from 2k hours to 5k hours
|
||||
|
||||
4. Improved synthesis quality for low-quality reference audio
|
||||
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) )
|
||||
[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:
|
||||
Use v2 from v1 environment:
|
||||
|
||||
1. `pip install -r requirements.txt` to update some packages
|
||||
|
||||
@ -257,7 +254,28 @@ Use v2 from v1 environment:
|
||||
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`.
|
||||
|
||||
|
||||
## V3 Release Notes
|
||||
|
||||
New Features:
|
||||
|
||||
1. The timbre similarity is higher, requiring less training data to approximate the target speaker (the timbre similarity is significantly improved using the base model directly without fine-tuning).
|
||||
|
||||
2. GPT model is more stable, with fewer repetitions and omissions, and it is easier to generate speech with richer emotional expression.
|
||||
|
||||
[more details](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7))
|
||||
|
||||
Use v3 from v2 environment:
|
||||
|
||||
1. `pip install -r requirements.txt` to update some packages
|
||||
|
||||
2. Clone the latest codes from github.
|
||||
|
||||
3. Download v3 pretrained models (s1v3.ckpt, s2Gv3.pth and models--nvidia--bigvgan_v2_24khz_100band_256x folder) from [huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main) and put them into `GPT_SoVITS\pretrained_models`.
|
||||
|
||||
additional: for Audio Super Resolution model, you can read [how to download](./tools/AP_BWE_main/24kto48k/readme.txt)
|
||||
|
||||
|
||||
## Todo List
|
||||
|
||||
- [x] **High Priority:**
|
||||
@ -285,7 +303,7 @@ 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
|
||||
```
|
||||
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
|
||||
```
|
||||
@ -294,7 +312,7 @@ python audio_slicer.py \
|
||||
--output_root "<directory_where_subdivided_audio_clips_will_be_saved>" \
|
||||
--threshold <volume_threshold> \
|
||||
--min_length <minimum_duration_of_each_subclip> \
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--hop_size <step_size_for_computing_volume_curve>
|
||||
```
|
||||
This is how dataset ASR processing is done using the command line(Only Chinese)
|
||||
@ -341,6 +359,7 @@ Special thanks to the following projects and contributors:
|
||||
- [gradio](https://github.com/gradio-app/gradio)
|
||||
- [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
|
||||
- [FunASR](https://github.com/alibaba-damo-academy/FunASR)
|
||||
- [AP-BWE](https://github.com/yxlu-0102/AP-BWE)
|
||||
|
||||
Thankful to @Naozumi520 for providing the Cantonese training set and for the guidance on Cantonese-related knowledge.
|
||||
|
||||
|
@ -246,4 +246,43 @@
|
||||
|
||||
### 20250211
|
||||
|
||||
1-增加gpt-sovits-v3模型
|
||||
增加gpt-sovits-v3模型,需要14G显存可以微调
|
||||
|
||||
### 20250212
|
||||
|
||||
sovits-v3微调支持开启梯度检查点,需要12G显存可以微调https://github.com/RVC-Boss/GPT-SoVITS/pull/2040
|
||||
|
||||
### 20250214
|
||||
|
||||
优化多语种混合文本切分策略a https://github.com/RVC-Boss/GPT-SoVITS/pull/2047
|
||||
|
||||
### 20250217
|
||||
|
||||
优化文本里的数字和英文处理逻辑https://github.com/RVC-Boss/GPT-SoVITS/pull/2062
|
||||
|
||||
### 20250218
|
||||
|
||||
优化多语种混合文本切分策略b https://github.com/RVC-Boss/GPT-SoVITS/pull/2073
|
||||
|
||||
### 20250223
|
||||
|
||||
1-sovits-v3微调支持lora训练,需要8G显存可以微调,效果比全参微调更好
|
||||
|
||||
2-人声背景音分离增加mel band roformer模型支持https://github.com/RVC-Boss/GPT-SoVITS/pull/2078
|
||||
|
||||
### 20250226
|
||||
|
||||
https://github.com/RVC-Boss/GPT-SoVITS/pull/2112 https://github.com/RVC-Boss/GPT-SoVITS/pull/2114
|
||||
|
||||
修复中文路径下mecab的报错(具体表现为日文韩文、文本混合语种切分可能会遇到的报错)
|
||||
|
||||
### 20250227
|
||||
|
||||
针对v3生成24k音频感觉闷的问题https://github.com/RVC-Boss/GPT-SoVITS/issues/2085 https://github.com/RVC-Boss/GPT-SoVITS/issues/2117 ,支持使用24k to 48k的音频超分模型缓解。
|
||||
|
||||
|
||||
### 20250228
|
||||
|
||||
修复短文本语种选择出错 https://github.com/RVC-Boss/GPT-SoVITS/pull/2122
|
||||
|
||||
修复v3sovits未传参以支持调节语速
|
||||
|
@ -5,11 +5,13 @@
|
||||
|
||||
[](https://github.com/RVC-Boss/GPT-SoVITS)
|
||||
|
||||
<img src="https://counter.seku.su/cmoe?name=gptsovits&theme=r34" /><br>
|
||||
<a href="https://trendshift.io/repositories/7033" target="_blank"><img src="https://trendshift.io/api/badge/repositories/7033" alt="RVC-Boss%2FGPT-SoVITS | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
|
||||
<!-- img src="https://counter.seku.su/cmoe?name=gptsovits&theme=r34" /><br> -->
|
||||
|
||||
[](https://colab.research.google.com/github/RVC-Boss/GPT-SoVITS/blob/main/colab_webui.ipynb)
|
||||
[](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/LICENSE)
|
||||
[](https://huggingface.co/lj1995/GPT-SoVITS/tree/main)
|
||||
[](https://huggingface.co/spaces/lj1995/GPT-SoVITS-v2)
|
||||
[](https://discord.gg/dnrgs5GHfG)
|
||||
|
||||
[**English**](../../README.md) | **中文简体** | [**日本語**](../ja/README.md) | [**한국어**](../ko/README.md) | [**Türkçe**](../tr/README.md)
|
||||
@ -149,6 +151,11 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
|
||||
|
||||
3. 对于 UVR5(人声/伴奏分离和混响移除,额外功能),从 [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) 下载模型,并将其放置在 `tools/uvr5/uvr5_weights` 目录中。
|
||||
|
||||
- 如果你在 UVR5 中使用 `bs_roformer` 或 `mel_band_roformer`模型,你可以手动下载模型和相应的配置文件,并将它们放在 `tools/UVR5/UVR5_weights` 中。**重命名模型文件和配置文件,确保除后缀外**,模型和配置文件具有相同且对应的名称。此外,模型和配置文件名**必须包含“roformer”**,才能被识别为 roformer 类的模型。
|
||||
|
||||
- 建议在模型名称和配置文件名中**直接指定模型类型**,例如`mel_mand_roformer`、`bs_roformer`。如果未指定,将从配置文中比对特征,以确定它是哪种类型的模型。例如,模型`bs_roformer_ep_368_sdr_12.9628.ckpt` 和对应的配置文件`bs_roformer_ep_368_sdr_12.9628.yaml` 是一对。`kim_mel_band_roformer.ckpt` 和 `kim_mel_band_roformer.yaml` 也是一对。
|
||||
|
||||
|
||||
4. 对于中文 ASR(额外功能),从 [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` 目录中。
|
||||
|
||||
5. 对于英语或日语 ASR(额外功能),从 [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) 下载模型,并将其放置在 `tools/asr/models` 目录中。此外,[其他模型](https://huggingface.co/Systran) 可能具有类似效果且占用更少的磁盘空间。
|
||||
@ -201,17 +208,12 @@ python webui.py v1 <language(optional)>
|
||||
|
||||
#### 现已支持自动填充路径
|
||||
|
||||
1.填入训练音频路径
|
||||
|
||||
2.切割音频
|
||||
|
||||
3.进行降噪(可选)
|
||||
|
||||
4.进行ASR
|
||||
|
||||
5.校对标注
|
||||
|
||||
6.前往下一个窗口,点击训练
|
||||
1. 填入训练音频路径
|
||||
2. 切割音频
|
||||
3. 进行降噪(可选)
|
||||
4. 进行ASR
|
||||
5. 校对标注
|
||||
6. 前往下一个窗口,点击训练
|
||||
|
||||
### 打开推理WebUI
|
||||
|
||||
@ -255,6 +257,27 @@ python webui.py
|
||||
|
||||
中文额外需要下载[G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip)(下载G2PW模型,解压并重命名为`G2PWModel`,将其放到`GPT_SoVITS/text`目录下)
|
||||
|
||||
## V3更新说明
|
||||
|
||||
新模型特点:
|
||||
|
||||
1. 音色相似度更像,需要更少训练集来逼近本人(不训练直接使用底模模式下音色相似性提升更大)
|
||||
|
||||
2. GPT合成更稳定,重复漏字更少,也更容易跑出丰富情感
|
||||
|
||||
详见[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))
|
||||
|
||||
从v2环境迁移至v3
|
||||
|
||||
1. 需要pip安装requirements.txt更新环境
|
||||
|
||||
2. 需要克隆github上的最新代码
|
||||
|
||||
3. 从[huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main)下载这些v3新增预训练模型 (s1v3.ckpt, s2Gv3.pth and models--nvidia--bigvgan_v2_24khz_100band_256x folder)将他们放到`GPT_SoVITS\pretrained_models`目录下
|
||||
|
||||
如果想用音频超分功能缓解v3模型生成24k音频觉得闷的问题,需要下载额外的模型参数,参考[how to download](../../tools/AP_BWE_main/24kto48k/readme.txt)
|
||||
|
||||
|
||||
## 待办事项清单
|
||||
|
||||
- [x] **高优先级:**
|
||||
@ -271,7 +294,7 @@ python webui.py
|
||||
- [x] 改进英语和日语文本前端。
|
||||
- [ ] 开发体积小和更大的 TTS 模型。
|
||||
- [x] Colab 脚本。
|
||||
- [ ] 扩展训练数据集(从 2k 小时到 10k 小时)。
|
||||
- [x] 扩展训练数据集(从 2k 小时到 10k 小时)。
|
||||
- [x] 更好的 sovits 基础模型(增强的音频质量)。
|
||||
- [ ] 模型混合。
|
||||
|
||||
@ -282,7 +305,7 @@ python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>
|
||||
````
|
||||
<!-- 如果打不开浏览器,请按照下面的格式进行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
|
||||
```` -->
|
||||
这是使用命令行完成数据集的音频切分的方式
|
||||
````
|
||||
@ -291,7 +314,7 @@ python audio_slicer.py \
|
||||
--output_root "<directory_where_subdivided_audio_clips_will_be_saved>" \
|
||||
--threshold <volume_threshold> \
|
||||
--min_length <minimum_duration_of_each_subclip> \
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--hop_size <step_size_for_computing_volume_curve>
|
||||
````
|
||||
这是使用命令行完成数据集ASR处理的方式(仅限中文)
|
||||
@ -318,12 +341,15 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p
|
||||
- [contentvec](https://github.com/auspicious3000/contentvec/)
|
||||
- [hifi-gan](https://github.com/jik876/hifi-gan)
|
||||
- [fish-speech](https://github.com/fishaudio/fish-speech/blob/main/tools/llama/generate.py#L41)
|
||||
- [f5-TTS](https://github.com/SWivid/F5-TTS/blob/main/src/f5_tts/model/backbones/dit.py)
|
||||
- [shortcut flow matching](https://github.com/kvfrans/shortcut-models/blob/main/targets_shortcut.py)
|
||||
### 预训练模型
|
||||
- [Chinese Speech Pretrain](https://github.com/TencentGameMate/chinese_speech_pretrain)
|
||||
- [Chinese-Roberta-WWM-Ext-Large](https://huggingface.co/hfl/chinese-roberta-wwm-ext-large)
|
||||
- [BigVGAN](https://github.com/NVIDIA/BigVGAN)
|
||||
### 推理用文本前端
|
||||
- [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization)
|
||||
- [LangSegment](https://github.com/juntaosun/LangSegment)
|
||||
- [split-lang](https://github.com/DoodleBears/split-lang)
|
||||
- [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)
|
||||
@ -335,6 +361,7 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p
|
||||
- [gradio](https://github.com/gradio-app/gradio)
|
||||
- [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
|
||||
- [FunASR](https://github.com/alibaba-damo-academy/FunASR)
|
||||
- [AP-BWE](https://github.com/yxlu-0102/AP-BWE)
|
||||
|
||||
感谢 @Naozumi520 提供粤语训练集,并在粤语相关知识方面给予指导。
|
||||
|
||||
|
@ -186,4 +186,37 @@
|
||||
|
||||
### 20250211 Update
|
||||
|
||||
1. [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) Added GPT-SoVITS v3 Model.
|
||||
- [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) Added GPT-SoVITS v3 Model, Need 14GB GPU Memory to Fine-tune SoVITS v3.
|
||||
|
||||
### 20250212 Update
|
||||
|
||||
- [PR 2040](https://github.com/RVC-Boss/GPT-SoVITS/pull/2040) Added gradient checkpointing to Fine-tune SoVITS v3, Need 12GB GPU Memory.
|
||||
|
||||
### 20250214 Update
|
||||
|
||||
- [PR 2047](https://github.com/RVC-Boss/GPT-SoVITS/pull/2047) Optimize the multilingual mixed text segmentation strategy **A**.
|
||||
-AAdded `split-lang` as a language segmentation tool to improve segmentation capabilities for multi-language mixed text.
|
||||
|
||||
### 20250217 Update
|
||||
|
||||
- [PR 2062](https://github.com/RVC-Boss/GPT-SoVITS/pull/2062) Optimize the logic for handling numbers and English in the text.
|
||||
|
||||
### 20250218 Update
|
||||
|
||||
- [PR 2073](https://github.com/RVC-Boss/GPT-SoVITS/pull/2073) Optimize the multilingual mixed text segmentation strategy **B**.
|
||||
|
||||
### 20250223 Update
|
||||
|
||||
1. LoRA training is supported for fine-tuning with SoVITS V3. It requires 8GB GPU Memory and the results are better than full parameter fine-tuning.
|
||||
2. [PR 2078](https://github.com/RVC-Boss/GPT-SoVITS/pull/2078) Added Mel Band RoFormer model for Vocal & Instrument Separation.
|
||||
|
||||
### 20250226 Update
|
||||
|
||||
1. [PR 2112](https://github.com/RVC-Boss/GPT-SoVITS/pull/2112) Fix issues caused by non-English directories in Windows.
|
||||
- Using `langsegmenter` for Korean.
|
||||
2. [PR 2113](https://github.com/RVC-Boss/GPT-SoVITS/pull/2114) Fix issues caused by non-English directories in Windows.
|
||||
- Using `langsegmenter` for Korean/Japanese.
|
||||
|
||||
### 20250227 Update
|
||||
|
||||
- Added 24K to 48K audio super-resolution models to alleviate the muffled issue when generating 24K audio with V3 model, as reported in [Issue 2085](https://github.com/RVC-Boss/GPT-SoVITS/issues/2085), [Issue 2117](https://github.com/RVC-Boss/GPT-SoVITS/issues/2117).
|
@ -185,4 +185,37 @@
|
||||
|
||||
### 20250211 更新
|
||||
|
||||
1. [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) GPT-SoVITS v3 モデルを追加しました。
|
||||
1. [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) GPT-SoVITS v3 モデルを追加しました。SoVITS v3のファインチューニングには14GBのGPUメモリが必要です。
|
||||
|
||||
### 20250212 更新
|
||||
|
||||
- [PR 2040](https://github.com/RVC-Boss/GPT-SoVITS/pull/2040) SoVITS v3のファインチューニングにグラデーションチェックポイントを追加、12GBのGPUメモリが必要です。
|
||||
|
||||
### 20250214 更新
|
||||
|
||||
- [PR 2047](https://github.com/RVC-Boss/GPT-SoVITS/pull/2047) 多言語混合テキスト分割戦略の最適化 **A**。
|
||||
- `split-lang`を言語分割ツールとして追加し、多言語混合テキストの分割能力を向上させました。
|
||||
|
||||
### 20250217 更新
|
||||
|
||||
- [PR 2062](https://github.com/RVC-Boss/GPT-SoVITS/pull/2062) テキスト内の数字と英語の処理ロジックを最適化。
|
||||
|
||||
### 20250218 更新
|
||||
|
||||
- [PR 2073](https://github.com/RVC-Boss/GPT-SoVITS/pull/2073) 多言語混合テキスト分割戦略の最適化 **B**。
|
||||
|
||||
### 20250223 更新
|
||||
|
||||
1. LoRAトレーニングがSoVITS V3のファインチューニングに対応しました。8GBのGPUメモリが必要で、結果はフルパラメータファインチューニングより優れています。
|
||||
2. [PR 2078](https://github.com/RVC-Boss/GPT-SoVITS/pull/2078) ボーカルと楽器分離のためにMel Band RoFormerモデルを追加しました。
|
||||
|
||||
### 20250226 更新
|
||||
|
||||
1. [PR 2112](https://github.com/RVC-Boss/GPT-SoVITS/pull/2112) Windowsでの非英語ディレクトリによる問題を修正しました。
|
||||
- `langsegmenter`を使用して韓国語の問題を修正。
|
||||
2. [PR 2113](https://github.com/RVC-Boss/GPT-SoVITS/pull/2114) Windowsでの非英語ディレクトリによる問題を修正しました。
|
||||
- `langsegmenter`を使用して韓国語/日本語の問題を修正。
|
||||
|
||||
### 20250227 更新
|
||||
|
||||
- V3モデルで24Kオーディオを生成する際に発生するこもった音の問題を緩和するために、24Kから48Kのオーディオ超解像モデルを追加しました。[Issue 2085](https://github.com/RVC-Boss/GPT-SoVITS/issues/2085)、[Issue 2117](https://github.com/RVC-Boss/GPT-SoVITS/issues/2117)で報告されています。
|
@ -9,7 +9,7 @@
|
||||
|
||||
[](https://colab.research.google.com/github/RVC-Boss/GPT-SoVITS/blob/main/colab_webui.ipynb)
|
||||
[](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/LICENSE)
|
||||
[](https://huggingface.co/lj1995/GPT-SoVITS/tree/main)
|
||||
[](https://huggingface.co/spaces/lj1995/GPT-SoVITS-v2)
|
||||
[](https://discord.gg/dnrgs5GHfG)
|
||||
|
||||
[**English**](../../README.md) | [**中文简体**](../cn/README.md) | **日本語** | [**한국어**](../ko/README.md) | [**Türkçe**](../tr/README.md)
|
||||
@ -142,6 +142,10 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
|
||||
|
||||
3. UVR5(ボーカル/伴奏(BGM等)分離 & リバーブ除去の追加機能)の場合は、[UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) からモデルをダウンロードし、`tools/uvr5/uvr5_weights` ディレクトリに配置してください。
|
||||
|
||||
- UVR5でbs_roformerまたはmel_band_roformerモデルを使用する場合、モデルと対応する設定ファイルを手動でダウンロードし、`tools/UVR5/UVR5_weights`フォルダに配置することができます。**モデルファイルと設定ファイルの名前は、拡張子を除いて同じであることを確認してください**。さらに、モデルと設定ファイルの名前には**「roformer」が含まれている必要があります**。これにより、roformerクラスのモデルとして認識されます。
|
||||
|
||||
- モデル名と設定ファイル名には、**直接モデルタイプを指定することをお勧めします**。例:mel_mand_roformer、bs_roformer。指定しない場合、設定文から特徴を照合して、モデルの種類を特定します。例えば、モデル`bs_roformer_ep_368_sdr_12.9628.ckpt`と対応する設定ファイル`bs_roformer_ep_368_sdr_12.9628.yaml`はペアです。同様に、`kim_mel_band_roformer.ckpt`と`kim_mel_band_roformer.yaml`もペアです。
|
||||
|
||||
4. 中国語ASR(追加機能)の場合は、[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` ディレクトリに配置してください。
|
||||
|
||||
5. 英語または日本語のASR(追加機能)を使用する場合は、[Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) からモデルをダウンロードし、`tools/asr/models` ディレクトリに配置してください。また、[他のモデル](https://huggingface.co/Systran) は、より小さいサイズで高クオリティな可能性があります。
|
||||
@ -191,17 +195,12 @@ python webui.py v1 <言語(オプション)>
|
||||
|
||||
#### パス自動補完のサポート
|
||||
|
||||
1.音声パスを入力する
|
||||
|
||||
2.音声を小さなチャンクに分割する
|
||||
|
||||
3.ノイズ除去(オプション)
|
||||
|
||||
4.ASR
|
||||
|
||||
5.ASR転写を校正する
|
||||
|
||||
6.次のタブに移動し、モデルを微調整する
|
||||
1. 音声パスを入力する
|
||||
2. 音声を小さなチャンクに分割する
|
||||
3. ノイズ除去(オプション)
|
||||
4. ASR
|
||||
5. ASR転写を校正する
|
||||
6. 次のタブに移動し、モデルを微調整する
|
||||
|
||||
### 推論WebUIを開く
|
||||
|
||||
@ -245,7 +244,25 @@ V1環境からV2を使用するには:
|
||||
|
||||
中国語V2追加: [G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip)(G2PWモデルをダウンロードし、解凍して`G2PWModel`にリネームし、`GPT_SoVITS/text`に配置します)
|
||||
|
||||
## V3 リリースノート
|
||||
|
||||
新機能:
|
||||
|
||||
1. 音色の類似性が向上し、ターゲットスピーカーを近似するために必要な学習データが少なくなりました(音色の類似性は、ファインチューニングなしでベースモデルを直接使用することで顕著に改善されます)。
|
||||
|
||||
2. GPTモデルがより安定し、繰り返しや省略が減少し、より豊かな感情表現を持つ音声の生成が容易になりました。
|
||||
|
||||
[詳細情報はこちら](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7))
|
||||
|
||||
v2 環境から v3 を使用する方法:
|
||||
|
||||
1. `pip install -r requirements.txt` を実行して、いくつかのパッケージを更新します。
|
||||
|
||||
2. GitHubから最新のコードをクローンします。
|
||||
|
||||
3. v3の事前学習済みモデル(s1v3.ckpt、s2Gv3.pth、models--nvidia--bigvgan_v2_24khz_100band_256x フォルダ)を[Huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main) からダウンロードし、GPT_SoVITS\pretrained_models フォルダに配置します。
|
||||
|
||||
追加: 音声超解像モデルについては、[ダウンロード方法](../../tools/AP_BWE_main/24kto48k/readme.txt)を参照してください。
|
||||
|
||||
## Todo リスト
|
||||
|
||||
@ -272,10 +289,10 @@ V1環境からV2を使用するには:
|
||||
```
|
||||
python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>
|
||||
```
|
||||
ブラウザを開けない場合は、以下の形式に従って UVR 処理を行ってください。これはオーディオ処理に mdxnet を使用しています。
|
||||
```
|
||||
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
|
||||
<!-- ブラウザを開けない場合は、以下の形式に従って UVR 処理を行ってください。これはオーディオ処理に mdxnet を使用しています。
|
||||
```
|
||||
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
|
||||
``` -->
|
||||
コマンド ラインを使用してデータセットのオーディオ セグメンテーションを行う方法は次のとおりです。
|
||||
```
|
||||
python audio_slicer.py \
|
||||
@ -283,7 +300,7 @@ python audio_slicer.py \
|
||||
--output_root "<directory_where_subdivided_audio_clips_will_be_saved>" \
|
||||
--threshold <volume_threshold> \
|
||||
--min_length <minimum_duration_of_each_subclip> \
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--hop_size <step_size_for_computing_volume_curve>
|
||||
```
|
||||
コマンドラインを使用してデータセット ASR 処理を行う方法です (中国語のみ)
|
||||
@ -310,12 +327,18 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p
|
||||
- [contentvec](https://github.com/auspicious3000/contentvec/)
|
||||
- [hifi-gan](https://github.com/jik876/hifi-gan)
|
||||
- [fish-speech](https://github.com/fishaudio/fish-speech/blob/main/tools/llama/generate.py#L41)
|
||||
- [f5-TTS](https://github.com/SWivid/F5-TTS/blob/main/src/f5_tts/model/backbones/dit.py)
|
||||
- [shortcut flow matching](https://github.com/kvfrans/shortcut-models/blob/main/targets_shortcut.py)
|
||||
### 事前学習モデル
|
||||
- [Chinese Speech Pretrain](https://github.com/TencentGameMate/chinese_speech_pretrain)
|
||||
- [Chinese-Roberta-WWM-Ext-Large](https://huggingface.co/hfl/chinese-roberta-wwm-ext-large)
|
||||
- [BigVGAN](https://github.com/NVIDIA/BigVGAN)
|
||||
### 推論用テキストフロントエンド
|
||||
- [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization)
|
||||
- [LangSegment](https://github.com/juntaosun/LangSegment)
|
||||
- [split-lang](https://github.com/DoodleBears/split-lang)
|
||||
- [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 ツール
|
||||
- [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui)
|
||||
- [audio-slicer](https://github.com/openvpi/audio-slicer)
|
||||
@ -324,6 +347,7 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p
|
||||
- [gradio](https://github.com/gradio-app/gradio)
|
||||
- [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
|
||||
- [FunASR](https://github.com/alibaba-damo-academy/FunASR)
|
||||
- [AP-BWE](https://github.com/yxlu-0102/AP-BWE)
|
||||
|
||||
@Naozumi520 さん、広東語のトレーニングセットの提供と、広東語に関する知識のご指導をいただき、感謝申し上げます。
|
||||
|
||||
|
@ -186,4 +186,37 @@
|
||||
|
||||
### 20250211 업데이트
|
||||
|
||||
1. [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) GPT-SoVITS v3 모델 추가.
|
||||
- [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) GPT-SoVITS v3 모델 추가, SoVITS v3의 파인튜닝에는 14GB GPU 메모리가 필요합니다.
|
||||
|
||||
### 20250212 업데이트
|
||||
|
||||
- [PR 2040](https://github.com/RVC-Boss/GPT-SoVITS/pull/2040) SoVITS v3의 파인튜닝에 그라디언트 체크포인트 추가, 12GB GPU 메모리가 필요합니다.
|
||||
|
||||
### 20250214 업데이트
|
||||
|
||||
- [PR 2047](https://github.com/RVC-Boss/GPT-SoVITS/pull/2047) 다국어 혼합 텍스트 분할 전략 **A** 최적화.
|
||||
- `split-lang`을 언어 분할 도구로 추가하여 다국어 혼합 텍스트의 분할 능력을 향상시켰습니다.
|
||||
|
||||
### 20250217 업데이트
|
||||
|
||||
- [PR 2062](https://github.com/RVC-Boss/GPT-SoVITS/pull/2062) 텍스트 내 숫자와 영어 처리 로직 최적화.
|
||||
|
||||
### 20250218 업데이트
|
||||
|
||||
- [PR 2073](https://github.com/RVC-Boss/GPT-SoVITS/pull/2073) 다국어 혼합 텍스트 분할 전략 **B** 최적화.
|
||||
|
||||
### 20250223 업데이트
|
||||
|
||||
1. SoVITS V3의 파인튜닝에 LoRA 훈련이 지원됩니다. 8GB GPU 메모리가 필요하며, 전체 매개변수 파인튜닝보다 더 나은 결과를 제공합니다.
|
||||
2. [PR 2078](https://github.com/RVC-Boss/GPT-SoVITS/pull/2078) 보컬 및 악기 분리를 위해 Mel Band RoFormer 모델 추가.
|
||||
|
||||
### 20250226 업데이트
|
||||
|
||||
1. [PR 2112](https://github.com/RVC-Boss/GPT-SoVITS/pull/2112) Windows에서 비영어 디렉토리로 인한 문제 수정.
|
||||
- 한국어에 대한 `langsegmenter` 사용 문제 수정.
|
||||
2. [PR 2113](https://github.com/RVC-Boss/GPT-SoVITS/pull/2114) Windows에서 비영어 디렉토리로 인한 문제 수정.
|
||||
- 한국어/일본어에 대한 `langsegmenter` 사용 문제 수정.
|
||||
|
||||
### 20250227 업데이트
|
||||
|
||||
- V3 모델로 24K 오디오를 생성할 때 발생하는 음성 뭉침 문제를 완화하기 위해, 24K에서 48K로의 오디오 초해상도 모델을 추가했습니다. [Issue 2085](https://github.com/RVC-Boss/GPT-SoVITS/issues/2085), [Issue 2117](https://github.com/RVC-Boss/GPT-SoVITS/issues/2117)에서 보고된 문제입니다.
|
@ -9,7 +9,7 @@
|
||||
|
||||
[](https://colab.research.google.com/github/RVC-Boss/GPT-SoVITS/blob/main/colab_webui.ipynb)
|
||||
[](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/LICENSE)
|
||||
[](https://huggingface.co/lj1995/GPT-SoVITS/tree/main)
|
||||
[](https://huggingface.co/spaces/lj1995/GPT-SoVITS-v2)
|
||||
[](https://discord.gg/dnrgs5GHfG)
|
||||
|
||||
[**English**](../../README.md) | [**中文简体**](../cn/README.md) | [**日本語**](../ja/README.md) | **한국어** | [**Türkçe**](../tr/README.md)
|
||||
@ -96,6 +96,8 @@ 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 디렉토리에 넣습니다.
|
||||
|
||||
[Visual Studio 2017](https://aka.ms/vs/17/release/vc_redist.x86.exe) 설치 (Korean TTS 전용)
|
||||
|
||||
##### MacOS 사용자
|
||||
```bash
|
||||
brew install ffmpeg
|
||||
@ -145,6 +147,10 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
|
||||
|
||||
3. UVR5 (보컬/반주 분리 & 잔향 제거 추가 기능)의 경우, [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) 에서 모델을 다운로드하고 `tools/uvr5/uvr5_weights` 디렉토리에 배치하세요.
|
||||
|
||||
- UVR5에서 bs_roformer 또는 mel_band_roformer 모델을 사용할 경우, 모델과 해당 설정 파일을 수동으로 다운로드하여 `tools/UVR5/UVR5_weights` 폴더에 저장할 수 있습니다. **모델 파일과 설정 파일의 이름은 확장자를 제외하고 동일한 이름을 가지도록 해야 합니다**. 또한, 모델과 설정 파일 이름에는 **“roformer”**가 포함되어야 roformer 클래스의 모델로 인식됩니다.
|
||||
|
||||
- 모델 이름과 설정 파일 이름에 **모델 유형을 직접 지정하는 것이 좋습니다**. 예: mel_mand_roformer, bs_roformer. 지정하지 않으면 설정 파일을 기준으로 특성을 비교하여 어떤 유형의 모델인지를 판단합니다. 예를 들어, 모델 `bs_roformer_ep_368_sdr_12.9628.ckpt`와 해당 설정 파일 `bs_roformer_ep_368_sdr_12.9628.yaml`은 한 쌍입니다. `kim_mel_band_roformer.ckpt`와 `kim_mel_band_roformer.yaml`도 한 쌍입니다.
|
||||
|
||||
4. 중국어 ASR (추가 기능)의 경우, [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` 디렉토리에 배치하세요.
|
||||
|
||||
5. 영어 또는 일본어 ASR (추가 기능)의 경우, [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) 에서 모델을 다운로드하고, `tools/asr/models` 디렉토리에 배치하세요. 또한, [다른 모델](https://huggingface.co/Systran) 은 더 적은 디스크 용량으로 비슷한 효과를 가질 수 있습니다.
|
||||
@ -196,15 +202,10 @@ python webui.py v1 <언어(옵션)>
|
||||
#### 경로 자동 채우기가 지원됩니다
|
||||
|
||||
1. 오디오 경로를 입력하십시오.
|
||||
|
||||
2. 오디오를 작은 청크로 분할하십시오.
|
||||
|
||||
3. 노이즈 제거(옵션)
|
||||
|
||||
4. ASR 수행
|
||||
|
||||
5. ASR 전사를 교정하십시오.
|
||||
|
||||
6. 다음 탭으로 이동하여 모델을 미세 조정하십시오.
|
||||
|
||||
### 추론 WebUI 열기
|
||||
@ -249,6 +250,26 @@ V1 환경에서 V2를 사용하려면:
|
||||
|
||||
중국어 V2 추가: [G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip) (G2PW 모델을 다운로드하여 압축을 풀고 `G2PWModel`로 이름을 변경한 다음 `GPT_SoVITS/text`에 배치합니다.)
|
||||
|
||||
## V3 릴리스 노트
|
||||
|
||||
새로운 기능:
|
||||
|
||||
1. 음색 유사성이 더 높아져 목표 음성에 대한 학습 데이터가 적게 필요합니다. (기본 모델을 직접 사용하여 미세 조정 없이 음색 유사성이 크게 향상됩니다.)
|
||||
|
||||
2. GPT 모델이 더 안정적이며 반복 및 생략이 적고, 더 풍부한 감정 표현을 가진 음성을 생성하기가 더 쉽습니다.
|
||||
|
||||
[자세한 내용](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7))
|
||||
|
||||
v2 환경에서 v3 사용하기:
|
||||
|
||||
1. `pip install -r requirements.txt`로 일부 패키지를 업데이트합니다.
|
||||
|
||||
2. 최신 코드를 github 에서 클론합니다.
|
||||
|
||||
3. v3 사전 훈련된 모델(s1v3.ckpt, s2Gv3.pth, 그리고 models--nvidia--bigvgan_v2_24khz_100band_256x 폴더)을 [huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main)에서 다운로드하여 `GPT_SoVITS\pretrained_models` 폴더에 넣습니다.
|
||||
|
||||
추가: 오디오 슈퍼 해상도 모델에 대해서는 [다운로드 방법](../../tools/AP_BWE_main/24kto48k/readme.txt)을 참고하세요.
|
||||
|
||||
|
||||
## 할 일 목록
|
||||
|
||||
@ -276,10 +297,10 @@ V1 환경에서 V2를 사용하려면:
|
||||
```
|
||||
python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>
|
||||
```
|
||||
브라우저를 열 수 없는 경우 UVR 처리를 위해 아래 형식을 따르십시오. 이는 오디오 처리를 위해 mdxnet을 사용하는 것입니다.
|
||||
```
|
||||
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
|
||||
<!-- 브라우저를 열 수 없는 경우 UVR 처리를 위해 아래 형식을 따르십시오. 이는 오디오 처리를 위해 mdxnet을 사용하는 것입니다.
|
||||
```
|
||||
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
|
||||
``` -->
|
||||
명령줄을 사용하여 데이터세트의 오디오 분할을 수행하는 방법은 다음과 같습니다.
|
||||
```
|
||||
python audio_slicer.py \
|
||||
@ -287,7 +308,7 @@ python audio_slicer.py \
|
||||
--output_root "<directory_where_subdivided_audio_clips_will_be_saved>" \
|
||||
--threshold <volume_threshold> \
|
||||
--min_length <minimum_duration_of_each_subclip> \
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--min_interval <shortest_time_gap_between_adjacent_subclips>
|
||||
--hop_size <step_size_for_computing_volume_curve>
|
||||
```
|
||||
명령줄을 사용하여 데이터 세트 ASR 처리를 수행하는 방법입니다(중국어만 해당).
|
||||
@ -314,12 +335,18 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p
|
||||
- [contentvec](https://github.com/auspicious3000/contentvec/)
|
||||
- [hifi-gan](https://github.com/jik876/hifi-gan)
|
||||
- [fish-speech](https://github.com/fishaudio/fish-speech/blob/main/tools/llama/generate.py#L41)
|
||||
- [f5-TTS](https://github.com/SWivid/F5-TTS/blob/main/src/f5_tts/model/backbones/dit.py)
|
||||
- [shortcut flow matching](https://github.com/kvfrans/shortcut-models/blob/main/targets_shortcut.py)
|
||||
### 사전 학습 모델
|
||||
- [Chinese Speech Pretrain](https://github.com/TencentGameMate/chinese_speech_pretrain)
|
||||
- [Chinese-Roberta-WWM-Ext-Large](https://huggingface.co/hfl/chinese-roberta-wwm-ext-large)
|
||||
- [BigVGAN](https://github.com/NVIDIA/BigVGAN)
|
||||
### 추론용 텍스트 프론트엔드
|
||||
- [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization)
|
||||
- [LangSegment](https://github.com/juntaosun/LangSegment)
|
||||
- [split-lang](https://github.com/DoodleBears/split-lang)
|
||||
- [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 도구
|
||||
- [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui)
|
||||
- [audio-slicer](https://github.com/openvpi/audio-slicer)
|
||||
@ -328,6 +355,7 @@ python ./tools/asr/fasterwhisper_asr.py -i <input> -o <output> -l <language> -p
|
||||
- [gradio](https://github.com/gradio-app/gradio)
|
||||
- [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
|
||||
- [FunASR](https://github.com/alibaba-damo-academy/FunASR)
|
||||
- [AP-BWE](https://github.com/yxlu-0102/AP-BWE)
|
||||
|
||||
@Naozumi520 님께 감사드립니다. 광둥어 학습 자료를 제공해 주시고, 광둥어 관련 지식을 지도해 주셔서 감사합니다.
|
||||
|
||||
|
@ -184,6 +184,39 @@
|
||||
3. [PR 1503](https://github.com/RVC-Boss/GPT-SoVITS/pull/1503) API düzeltildi ve optimize edildi.
|
||||
4. [PR 1422](https://github.com/RVC-Boss/GPT-SoVITS/pull/1422) Karıştırmak için yalnızca bir referans sesi yüklenebiliyordu hatası düzeltildi, çeşitli veri seti kontrolleri eklendi ve eksik dosyalar için uyarılar çıkar.
|
||||
|
||||
### 20250211 Güncelleme
|
||||
### 20250211 Güncellemesi
|
||||
|
||||
1. [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) GPT-SoVITS v3 Modeli eklendi.
|
||||
- [Wiki](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7)) GPT-SoVITS v3 Modeli Eklendi, SoVITS v3'ü ince ayar yapmak için 14GB GPU belleği gereklidir.
|
||||
|
||||
### 20250212 Güncellemesi
|
||||
|
||||
- [PR 2040](https://github.com/RVC-Boss/GPT-SoVITS/pull/2040) SoVITS v3'ü ince ayar yapmak için gradyan kontrol noktası ekledi, 12GB GPU belleği gereklidir.
|
||||
|
||||
### 20250214 Güncellemesi
|
||||
|
||||
- [PR 2047](https://github.com/RVC-Boss/GPT-SoVITS/pull/2047) Çok dilli karışık metin segmentasyon stratejisi **A**'yı optimize etti.
|
||||
- `split-lang` bir dil segmentasyon aracı olarak eklendi ve çok dilli karışık metinlerin segmentasyon yeteneklerini iyileştirdi.
|
||||
|
||||
### 20250217 Güncellemesi
|
||||
|
||||
- [PR 2062](https://github.com/RVC-Boss/GPT-SoVITS/pull/2062) Metindeki sayılar ve İngilizceyi işleme mantığını optimize etti.
|
||||
|
||||
### 20250218 Güncellemesi
|
||||
|
||||
- [PR 2073](https://github.com/RVC-Boss/GPT-SoVITS/pull/2073) Çok dilli karışık metin segmentasyon stratejisi **B**'yi optimize etti.
|
||||
|
||||
### 20250223 Güncellemesi
|
||||
|
||||
1. SoVITS V3 için LoRA eğitimi, ince ayar yapmayı destekler. 8GB GPU belleği gereklidir ve sonuçlar tam parametreli ince ayar yapmaktan daha iyidir.
|
||||
2. [PR 2078](https://github.com/RVC-Boss/GPT-SoVITS/pull/2078) Mel Band RoFormer modelini vokal ve enstrüman ayrımı için ekledi.
|
||||
|
||||
### 20250226 Güncellemesi
|
||||
|
||||
1. [PR 2112](https://github.com/RVC-Boss/GPT-SoVITS/pull/2112) Windows'ta İngilizce olmayan dizinlerden kaynaklanan sorunları düzeltti.
|
||||
- Korece için `langsegmenter` kullanımı ile ilgili sorun düzeltildi.
|
||||
2. [PR 2113](https://github.com/RVC-Boss/GPT-SoVITS/pull/2114) Windows'ta İngilizce olmayan dizinlerden kaynaklanan sorunları düzeltti.
|
||||
- Korece/Japonca için `langsegmenter` kullanımı ile ilgili sorun düzeltildi.
|
||||
|
||||
### 20250227 Güncellemesi
|
||||
|
||||
- 24K sesli V3 modeliyle 24K ses oluştururken meydana gelen boğukluk sorununu hafifletmek için, 24K'dan 48K'ya ses süper çözünürlük modelleri eklendi. [Issue 2085](https://github.com/RVC-Boss/GPT-SoVITS/issues/2085), [Issue 2117](https://github.com/RVC-Boss/GPT-SoVITS/issues/2117) de bildirilen sorunlar.
|
@ -5,11 +5,13 @@ Güçlü Birkaç Örnekli Ses Dönüştürme ve Metinden Konuşmaya Web Arayüz
|
||||
|
||||
[](https://github.com/RVC-Boss/GPT-SoVITS)
|
||||
|
||||
<img src="https://counter.seku.su/cmoe?name=gptsovits&theme=r34" /><br>
|
||||
<a href="https://trendshift.io/repositories/7033" target="_blank"><img src="https://trendshift.io/api/badge/repositories/7033" alt="RVC-Boss%2FGPT-SoVITS | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
|
||||
<!-- img src="https://counter.seku.su/cmoe?name=gptsovits&theme=r34" /><br> -->
|
||||
|
||||
[](https://colab.research.google.com/github/RVC-Boss/GPT-SoVITS/blob/main/colab_webui.ipynb)
|
||||
[](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/LICENSE)
|
||||
[](https://huggingface.co/lj1995/GPT-SoVITS/tree/main)
|
||||
[](https://huggingface.co/spaces/lj1995/GPT-SoVITS-v2)
|
||||
[](https://discord.gg/dnrgs5GHfG)
|
||||
|
||||
[**English**](../../README.md) | [**中文简体**](../cn/README.md) | [**日本語**](../ja/README.md) | [**한국어**](../ko/README.md) | **Türkçe**
|
||||
@ -113,9 +115,7 @@ pip install -r requirements.txt
|
||||
|
||||
0. Görüntü etiketleri hakkında: Kod tabanındaki hızlı güncellemeler ve görüntüleri paketleme ve test etme işleminin yavaş olması nedeniyle, lütfen şu anda paketlenmiş en son görüntüleri kontrol etmek için [Docker Hub](https://hub.docker.com/r/breakstring/gpt-sovits) adresini kontrol edin ve durumunuza göre seçim yapın veya alternatif olarak, kendi ihtiyaçlarınıza göre bir Dockerfile kullanarak yerel olarak oluşturun.
|
||||
1. Ortam Değişkenleri:
|
||||
|
||||
- is_half: Yarım hassasiyet/çift hassasiyeti kontrol eder. Bu genellikle "SSL çıkarma" adımı sırasında 4-cnhubert/5-wav32k dizinleri altındaki içeriğin doğru şekilde oluşturulmamasının nedenidir. Gerçek durumunuza göre True veya False olarak ayarlayın.
|
||||
|
||||
- is_half: Yarım hassasiyet/çift hassasiyeti kontrol eder. Bu genellikle "SSL çıkarma" adımı sırasında 4-cnhubert/5-wav32k dizinleri altındaki içeriğin doğru şekilde oluşturulmamasının nedenidir. Gerçek durumunuza göre True veya False olarak ayarlayın.
|
||||
2. Birim Yapılandırması,Kapsayıcı içindeki uygulamanın kök dizini /workspace olarak ayarlanmıştır. Varsayılan docker-compose.yaml, içerik yükleme/indirme için bazı pratik örnekler listeler.
|
||||
3. shm_size: Windows üzerinde Docker Desktop için varsayılan kullanılabilir bellek çok küçüktür, bu da anormal işlemlere neden olabilir. Kendi durumunuza göre ayarlayın.
|
||||
4. Dağıtım bölümü altında, GPU ile ilgili ayarlar sisteminize ve gerçek koşullara göre dikkatlice ayarlanmalıdır.
|
||||
@ -142,6 +142,10 @@ docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-Docker
|
||||
|
||||
3. UVR5 (Vokal/Enstrümantal Ayrımı & Yankı Giderme) için, [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) üzerinden modelleri indirip `tools/uvr5/uvr5_weights` dizinine yerleştirin.
|
||||
|
||||
- UVR5'te bs_roformer veya mel_band_roformer modellerini kullanıyorsanız, modeli ve ilgili yapılandırma dosyasını manuel olarak indirip `tools/UVR5/UVR5_weights` klasörüne yerleştirebilirsiniz. **Model dosyası ve yapılandırma dosyasının adı, uzantı dışında aynı olmalıdır**. Ayrıca, model ve yapılandırma dosyasının adlarında **“roformer”** kelimesi yer almalıdır, böylece roformer sınıfındaki bir model olarak tanınır.
|
||||
|
||||
- Model adı ve yapılandırma dosyası adı içinde **doğrudan model tipini belirtmek önerilir**. Örneğin: mel_mand_roformer, bs_roformer. Belirtilmezse, yapılandırma dosyasından özellikler karşılaştırılarak model tipi belirlenir. Örneğin, `bs_roformer_ep_368_sdr_12.9628.ckpt` modeli ve karşılık gelen yapılandırma dosyası `bs_roformer_ep_368_sdr_12.9628.yaml` bir çifttir. Aynı şekilde, `kim_mel_band_roformer.ckpt` ve `kim_mel_band_roformer.yaml` da bir çifttir.
|
||||
|
||||
4. Çince ASR için, [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) ve [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) üzerinden modelleri indirip `tools/asr/models` dizinine yerleştirin.
|
||||
|
||||
5. İngilizce veya Japonca ASR için, [Faster Whisper Large V3](https://huggingface.co/Systran/faster-whisper-large-v3) üzerinden modeli indirip `tools/asr/models` dizinine yerleştirin. Ayrıca, [diğer modeller](https://huggingface.co/Systran) benzer bir etki yaratabilir ve daha az disk alanı kaplayabilir.
|
||||
@ -159,6 +163,8 @@ Dil sözlüğü:
|
||||
- 'zh': Çince
|
||||
- 'ja': Japonca
|
||||
- 'en': İngilizce
|
||||
- 'ko': Korece
|
||||
- 'yue': Kantonca
|
||||
|
||||
Örnek:
|
||||
|
||||
@ -193,15 +199,10 @@ veya WebUI'de manuel olarak sürüm değiştirin.
|
||||
#### Yol Otomatik Doldurma artık destekleniyor
|
||||
|
||||
1. Ses yolunu doldurun
|
||||
|
||||
2. Sesi küçük parçalara ayırın
|
||||
|
||||
3. Gürültü azaltma (isteğe bağlı)
|
||||
|
||||
4. ASR
|
||||
|
||||
5. ASR transkripsiyonlarını düzeltin
|
||||
|
||||
6. Bir sonraki sekmeye geçin ve modeli ince ayar yapın
|
||||
|
||||
### Çıkarım WebUI'sini Açın
|
||||
@ -246,6 +247,26 @@ V1 ortamından V2'yi kullanmak için:
|
||||
|
||||
Ek olarak Çince V2: [G2PWModel_1.1.zip](https://paddlespeech.bj.bcebos.com/Parakeet/released_models/g2p/G2PWModel_1.1.zip) (G2PW modellerini indirip, zipten çıkarıp, `G2PWModel` olarak yeniden adlandırıp `GPT_SoVITS/text` dizinine yerleştirin.)
|
||||
|
||||
## V3 Sürüm Notları
|
||||
|
||||
### Yeni Özellikler:
|
||||
|
||||
1. **Tını benzerliği** daha yüksek olup, hedef konuşmacıyı yakınsamak için daha az eğitim verisi gerekmektedir (tını benzerliği, base model doğrudan kullanılacak şekilde fine-tuning yapılmadan önemli ölçüde iyileştirilmiştir).
|
||||
|
||||
2. GPT modeli daha **kararlı** hale geldi, tekrarlar ve atlamalar azaldı ve **daha zengin duygusal ifadeler** ile konuşma üretmek daha kolay hale geldi.
|
||||
|
||||
[daha fazla detay](https://github.com/RVC-Boss/GPT-SoVITS/wiki/GPT%E2%80%90SoVITS%E2%80%90v3%E2%80%90features-(%E6%96%B0%E7%89%B9%E6%80%A7))
|
||||
|
||||
### v2 ortamında v3 kullanımı:
|
||||
|
||||
1. `pip install -r requirements.txt` ile bazı paketleri güncelleyin.
|
||||
|
||||
2. GitHub’dan en son kodları klonlayın.
|
||||
|
||||
3. [huggingface](https://huggingface.co/lj1995/GPT-SoVITS/tree/main) üzerinden v3 önceden eğitilmiş modellerini (s1v3.ckpt, s2Gv3.pth ve models--nvidia--bigvgan_v2_24khz_100band_256x klasörünü) indirin ve `GPT_SoVITS\pretrained_models` dizinine yerleştirin.
|
||||
|
||||
ek: Ses Süper Çözünürlük modeli için [nasıl indirileceği](../../tools/AP_BWE_main/24kto48k/readme.txt) hakkında bilgi alabilirsiniz.
|
||||
|
||||
## Yapılacaklar Listesi
|
||||
|
||||
- [x] **Yüksek Öncelikli:**
|
||||
@ -271,10 +292,10 @@ UVR5 için Web Arayüzünü açmak için komut satırını kullanın
|
||||
```
|
||||
python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>
|
||||
```
|
||||
Bir tarayıcı açamıyorsanız, UVR işleme için aşağıdaki formatı izleyin,Bu ses işleme için mdxnet kullanıyor
|
||||
```
|
||||
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
|
||||
<!-- Bir tarayıcı açamıyorsanız, UVR işleme için aşağıdaki formatı izleyin,Bu ses işleme için mdxnet kullanıyor
|
||||
```
|
||||
python mdxnet.py --model --input_root --output_vocal --output_ins --agg_level --format --device --is_half_precision
|
||||
``` -->
|
||||
Veri setinin ses segmentasyonu komut satırı kullanılarak bu şekilde yapılır
|
||||
```
|
||||
python audio_slicer.py \
|
||||
@ -282,7 +303,7 @@ python audio_slicer.py \
|
||||
--output_root "<alt_bölümlere_ayrılmış_ses_kliplerinin_kaydedileceği_dizin>" \
|
||||
--threshold <ses_eşiği> \
|
||||
--min_length <her_bir_alt_klibin_minimum_süresi> \
|
||||
--min_interval <bitişik_alt_klipler_arasındaki_en_kısa_zaman_aralığı>
|
||||
--min_interval <bitişik_alt_klipler_arasındaki_en_kısa_zaman_aralığı>
|
||||
--hop_size <ses_eğrisini_hesaplamak_için_adım_boyutu>
|
||||
```
|
||||
Veri seti ASR işleme komut satırı kullanılarak bu şekilde yapılır (Yalnızca Çince)
|
||||
@ -309,12 +330,18 @@ python ./tools/asr/fasterwhisper_asr.py -i <girdi> -o <çıktı> -l <dil>
|
||||
- [contentvec](https://github.com/auspicious3000/contentvec/)
|
||||
- [hifi-gan](https://github.com/jik876/hifi-gan)
|
||||
- [fish-speech](https://github.com/fishaudio/fish-speech/blob/main/tools/llama/generate.py#L41)
|
||||
- [f5-TTS](https://github.com/SWivid/F5-TTS/blob/main/src/f5_tts/model/backbones/dit.py)
|
||||
- [shortcut flow matching](https://github.com/kvfrans/shortcut-models/blob/main/targets_shortcut.py)
|
||||
### Önceden Eğitilmiş Modeller
|
||||
- [Chinese Speech Pretrain](https://github.com/TencentGameMate/chinese_speech_pretrain)
|
||||
- [Chinese-Roberta-WWM-Ext-Large](https://huggingface.co/hfl/chinese-roberta-wwm-ext-large)
|
||||
- [BigVGAN](https://github.com/NVIDIA/BigVGAN)
|
||||
### Tahmin İçin Metin Ön Ucu
|
||||
- [paddlespeech zh_normalization](https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/paddlespeech/t2s/frontend/zh_normalization)
|
||||
- [LangSegment](https://github.com/juntaosun/LangSegment)
|
||||
- [split-lang](https://github.com/DoodleBears/split-lang)
|
||||
- [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 Araçları
|
||||
- [ultimatevocalremovergui](https://github.com/Anjok07/ultimatevocalremovergui)
|
||||
- [audio-slicer](https://github.com/openvpi/audio-slicer)
|
||||
@ -323,9 +350,10 @@ python ./tools/asr/fasterwhisper_asr.py -i <girdi> -o <çıktı> -l <dil>
|
||||
- [gradio](https://github.com/gradio-app/gradio)
|
||||
- [faster-whisper](https://github.com/SYSTRAN/faster-whisper)
|
||||
- [FunASR](https://github.com/alibaba-damo-academy/FunASR)
|
||||
- [AP-BWE](https://github.com/yxlu-0102/AP-BWE)
|
||||
|
||||
@Naozumi520’ye Kantonca eğitim setini sağladığı ve Kantonca ile ilgili bilgiler konusunda rehberlik ettiği için minnettarım.
|
||||
|
||||
|
||||
## Tüm katkıda bulunanlara çabaları için teşekkürler
|
||||
|
||||
<a href="https://github.com/RVC-Boss/GPT-SoVITS/graphs/contributors" target="_blank">
|
||||
|
@ -1,4 +1,4 @@
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
chcp 65001
|
||||
& "$PSScriptRoot\runtime\python.exe" "$PSScriptRoot\webui.py zh_CN"
|
||||
& "$PSScriptRoot\runtime\python.exe" "$PSScriptRoot\webui.py" zh_CN
|
||||
pause
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
echo "Installing GCC..."
|
||||
conda install -c conda-forge gcc
|
||||
conda install -c conda-forge gcc=14
|
||||
|
||||
echo "Installing G++..."
|
||||
conda install -c conda-forge gxx
|
||||
|
@ -17,13 +17,15 @@ g2p_en
|
||||
torchaudio
|
||||
modelscope==1.10.0
|
||||
sentencepiece
|
||||
transformers
|
||||
transformers>=4.43
|
||||
peft
|
||||
chardet
|
||||
PyYAML
|
||||
psutil
|
||||
jieba_fast
|
||||
jieba
|
||||
split-lang
|
||||
fast_langdetect
|
||||
Faster_Whisper
|
||||
wordsegment
|
||||
rotary_embedding_torch
|
||||
@ -36,3 +38,4 @@ python_mecab_ko; sys_platform != 'win32'
|
||||
fastapi<0.112.2
|
||||
x_transformers
|
||||
torchmetrics<=1.5
|
||||
attrdict
|
||||
|
11
tools/AP_BWE_main/24kto48k/readme.txt
Normal file
11
tools/AP_BWE_main/24kto48k/readme.txt
Normal file
@ -0,0 +1,11 @@
|
||||
For the inference of the v3 model, if you find that the generated audio sounds somewhat muffled, you can try using this audio super-resolution model.
|
||||
对于v3模型的推理,如果你发现生成的音频比较闷,可以尝试这个音频超分模型。
|
||||
|
||||
put g_24kto48k.zip and config.json in this folder
|
||||
把g_24kto48k.zip and config.json下到这个文件夹
|
||||
|
||||
download link 下载链接:
|
||||
https://drive.google.com/drive/folders/1IIYTf2zbJWzelu4IftKD6ooHloJ8mnZF?usp=share_link
|
||||
|
||||
audio sr project page 音频超分项目主页:
|
||||
https://github.com/yxlu-0102/AP-BWE
|
21
tools/AP_BWE_main/LICENSE
Normal file
21
tools/AP_BWE_main/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Ye-Xin Lu
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
91
tools/AP_BWE_main/README.md
Normal file
91
tools/AP_BWE_main/README.md
Normal file
@ -0,0 +1,91 @@
|
||||
# Towards High-Quality and Efficient Speech Bandwidth Extension with Parallel Amplitude and Phase Prediction
|
||||
### Ye-Xin Lu, Yang Ai, Hui-Peng Du, Zhen-Hua Ling
|
||||
|
||||
**Abstract:**
|
||||
Speech bandwidth extension (BWE) refers to widening the frequency bandwidth range of speech signals, enhancing the speech quality towards brighter and fuller.
|
||||
This paper proposes a generative adversarial network (GAN) based BWE model with parallel prediction of Amplitude and Phase spectra, named AP-BWE, which achieves both high-quality and efficient wideband speech waveform generation.
|
||||
The proposed AP-BWE generator is entirely based on convolutional neural networks (CNNs).
|
||||
It features a dual-stream architecture with mutual interaction, where the amplitude stream and the phase stream communicate with each other and respectively extend the high-frequency components from the input narrowband amplitude and phase spectra.
|
||||
To improve the naturalness of the extended speech signals, we employ a multi-period discriminator at the waveform level and design a pair of multi-resolution amplitude and phase discriminators at the spectral level, respectively.
|
||||
Experimental results demonstrate that our proposed AP-BWE achieves state-of-the-art performance in terms of speech quality for BWE tasks targeting sampling rates of both 16 kHz and 48 kHz.
|
||||
In terms of generation efficiency, due to the all-convolutional architecture and all-frame-level operations, the proposed AP-BWE can generate 48 kHz waveform samples 292.3 times faster than real-time on a single RTX 4090 GPU and 18.1 times faster than real-time on a single CPU.
|
||||
Notably, to our knowledge, AP-BWE is the first to achieve the direct extension of the high-frequency phase spectrum, which is beneficial for improving the effectiveness of existing BWE methods.
|
||||
|
||||
**We provide our implementation as open source in this repository. Audio samples can be found at the [demo website](http://yxlu-0102.github.io/AP-BWE).**
|
||||
|
||||
|
||||
## Pre-requisites
|
||||
0. Python >= 3.9.
|
||||
0. Clone this repository.
|
||||
0. Install python requirements. Please refer [requirements.txt](requirements.txt).
|
||||
0. Download datasets
|
||||
1. Download and extract the [VCTK-0.92 dataset](https://datashare.ed.ac.uk/handle/10283/3443), and move its `wav48` directory into [VCTK-Corpus-0.92](VCTK-Corpus-0.92) and rename it as `wav48_origin`.
|
||||
1. Trim the silence of the dataset, and the trimmed files will be saved to `wav48_silence_trimmed`.
|
||||
```
|
||||
cd VCTK-Corpus-0.92
|
||||
python flac2wav.py
|
||||
```
|
||||
1. Move all the trimmed training files from `wav48_silence_trimmed` to [wav48/train](wav48/train) following the indexes in [training.txt](VCTK-Corpus-0.92/training.txt), and move all the untrimmed test files from `wav48_origin` to [wav48/test](wav48/test) following the indexes in [test.txt](VCTK-Corpus-0.92/test.txt).
|
||||
|
||||
## Training
|
||||
```
|
||||
cd train
|
||||
CUDA_VISIBLE_DEVICES=0 python train_16k.py --config [config file path]
|
||||
CUDA_VISIBLE_DEVICES=0 python train_48k.py --config [config file path]
|
||||
```
|
||||
Checkpoints and copies of the configuration file are saved in the `cp_model` directory by default.<br>
|
||||
You can change the path by using the `--checkpoint_path` option.
|
||||
Here is an example:
|
||||
```
|
||||
CUDA_VISIBLE_DEVICES=0 python train_16k.py --config ../configs/config_2kto16k.json --checkpoint_path ../checkpoints/AP-BWE_2kto16k
|
||||
```
|
||||
|
||||
## Inference
|
||||
```
|
||||
cd inference
|
||||
python inference_16k.py --checkpoint_file [generator checkpoint file path]
|
||||
python inference_48k.py --checkpoint_file [generator checkpoint file path]
|
||||
```
|
||||
You can download the [pretrained weights](https://drive.google.com/drive/folders/1IIYTf2zbJWzelu4IftKD6ooHloJ8mnZF?usp=share_link) we provide and move all the files to the `checkpoints` directory.
|
||||
<br>
|
||||
Generated wav files are saved in `generated_files` by default.
|
||||
You can change the path by adding `--output_dir` option.
|
||||
Here is an example:
|
||||
```
|
||||
python inference_16k.py --checkpoint_file ../checkpoints/2kto16k/g_2kto16k --output_dir ../generated_files/2kto16k
|
||||
```
|
||||
|
||||
## Model Structure
|
||||

|
||||
|
||||
## Comparison with other speech BWE methods
|
||||
### 2k/4k/8kHz to 16kHz
|
||||
<p align="center">
|
||||
<img src="Figures/table_16k.png" alt="comparison" width="90%"/>
|
||||
</p>
|
||||
|
||||
### 8k/12k/16/24kHz to 16kHz
|
||||
<p align="center">
|
||||
<img src="Figures/table_48k.png" alt="comparison" width="100%"/>
|
||||
</p>
|
||||
|
||||
## Acknowledgements
|
||||
We referred to [HiFi-GAN](https://github.com/jik876/hifi-gan) and [NSPP](https://github.com/YangAi520/NSPP) to implement this.
|
||||
|
||||
## Citation
|
||||
```
|
||||
@article{lu2024towards,
|
||||
title={Towards high-quality and efficient speech bandwidth extension with parallel amplitude and phase prediction},
|
||||
author={Lu, Ye-Xin and Ai, Yang and Du, Hui-Peng and Ling, Zhen-Hua},
|
||||
journal={arXiv preprint arXiv:2401.06387},
|
||||
year={2024}
|
||||
}
|
||||
|
||||
@inproceedings{lu2024multi,
|
||||
title={Multi-Stage Speech Bandwidth Extension with Flexible Sampling Rate Control},
|
||||
author={Lu, Ye-Xin and Ai, Yang and Sheng, Zheng-Yan and Ling, Zhen-Hua},
|
||||
booktitle={Proc. Interspeech},
|
||||
pages={2270--2274},
|
||||
year={2024}
|
||||
}
|
||||
```
|
1
tools/AP_BWE_main/datasets1/__init__.py
Normal file
1
tools/AP_BWE_main/datasets1/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
|
92
tools/AP_BWE_main/datasets1/dataset.py
Normal file
92
tools/AP_BWE_main/datasets1/dataset.py
Normal file
@ -0,0 +1,92 @@
|
||||
import os
|
||||
import random
|
||||
import torch
|
||||
import torchaudio
|
||||
import torch.utils.data
|
||||
import torchaudio.functional as aF
|
||||
|
||||
def amp_pha_stft(audio, n_fft, hop_size, win_size, center=True):
|
||||
|
||||
hann_window = torch.hann_window(win_size).to(audio.device)
|
||||
stft_spec = torch.stft(audio, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window,
|
||||
center=center, pad_mode='reflect', normalized=False, return_complex=True)
|
||||
log_amp = torch.log(torch.abs(stft_spec)+1e-4)
|
||||
pha = torch.angle(stft_spec)
|
||||
|
||||
com = torch.stack((torch.exp(log_amp)*torch.cos(pha),
|
||||
torch.exp(log_amp)*torch.sin(pha)), dim=-1)
|
||||
|
||||
return log_amp, pha, com
|
||||
|
||||
|
||||
def amp_pha_istft(log_amp, pha, n_fft, hop_size, win_size, center=True):
|
||||
|
||||
amp = torch.exp(log_amp)
|
||||
com = torch.complex(amp*torch.cos(pha), amp*torch.sin(pha))
|
||||
hann_window = torch.hann_window(win_size).to(com.device)
|
||||
audio = torch.istft(com, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window, center=center)
|
||||
|
||||
return audio
|
||||
|
||||
|
||||
def get_dataset_filelist(a):
|
||||
with open(a.input_training_file, 'r', encoding='utf-8') as fi:
|
||||
training_indexes = [x.split('|')[0] for x in fi.read().split('\n') if len(x) > 0]
|
||||
|
||||
with open(a.input_validation_file, 'r', encoding='utf-8') as fi:
|
||||
validation_indexes = [x.split('|')[0] for x in fi.read().split('\n') if len(x) > 0]
|
||||
|
||||
return training_indexes, validation_indexes
|
||||
|
||||
|
||||
class Dataset(torch.utils.data.Dataset):
|
||||
def __init__(self, training_indexes, wavs_dir, segment_size, hr_sampling_rate, lr_sampling_rate,
|
||||
split=True, shuffle=True, n_cache_reuse=1, device=None):
|
||||
self.audio_indexes = training_indexes
|
||||
random.seed(1234)
|
||||
if shuffle:
|
||||
random.shuffle(self.audio_indexes)
|
||||
self.wavs_dir = wavs_dir
|
||||
self.segment_size = segment_size
|
||||
self.hr_sampling_rate = hr_sampling_rate
|
||||
self.lr_sampling_rate = lr_sampling_rate
|
||||
self.split = split
|
||||
self.cached_wav = None
|
||||
self.n_cache_reuse = n_cache_reuse
|
||||
self._cache_ref_count = 0
|
||||
self.device = device
|
||||
|
||||
def __getitem__(self, index):
|
||||
filename = self.audio_indexes[index]
|
||||
if self._cache_ref_count == 0:
|
||||
audio, orig_sampling_rate = torchaudio.load(os.path.join(self.wavs_dir, filename + '.wav'))
|
||||
self.cached_wav = audio
|
||||
self._cache_ref_count = self.n_cache_reuse
|
||||
else:
|
||||
audio = self.cached_wav
|
||||
self._cache_ref_count -= 1
|
||||
|
||||
if orig_sampling_rate == self.hr_sampling_rate:
|
||||
audio_hr = audio
|
||||
else:
|
||||
audio_hr = aF.resample(audio, orig_freq=orig_sampling_rate, new_freq=self.hr_sampling_rate)
|
||||
|
||||
audio_lr = aF.resample(audio, orig_freq=orig_sampling_rate, new_freq=self.lr_sampling_rate)
|
||||
audio_lr = aF.resample(audio_lr, orig_freq=self.lr_sampling_rate, new_freq=self.hr_sampling_rate)
|
||||
audio_lr = audio_lr[:, : audio_hr.size(1)]
|
||||
|
||||
if self.split:
|
||||
if audio_hr.size(1) >= self.segment_size:
|
||||
max_audio_start = audio_hr.size(1) - self.segment_size
|
||||
audio_start = random.randint(0, max_audio_start)
|
||||
audio_hr = audio_hr[:, audio_start: audio_start+self.segment_size]
|
||||
audio_lr = audio_lr[:, audio_start: audio_start+self.segment_size]
|
||||
else:
|
||||
audio_hr = torch.nn.functional.pad(audio_hr, (0, self.segment_size - audio_hr.size(1)), 'constant')
|
||||
audio_lr = torch.nn.functional.pad(audio_lr, (0, self.segment_size - audio_lr.size(1)), 'constant')
|
||||
|
||||
return (audio_hr.squeeze(), audio_lr.squeeze())
|
||||
|
||||
def __len__(self):
|
||||
|
||||
return len(self.audio_indexes)
|
1
tools/AP_BWE_main/models/__init__.py
Normal file
1
tools/AP_BWE_main/models/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
|
455
tools/AP_BWE_main/models/model.py
Normal file
455
tools/AP_BWE_main/models/model.py
Normal file
@ -0,0 +1,455 @@
|
||||
import torch
|
||||
import torch.nn.functional as F
|
||||
import torch.nn as nn
|
||||
from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm
|
||||
# from utils import init_weights, get_padding
|
||||
def get_padding(kernel_size, dilation=1):
|
||||
return int((kernel_size*dilation - dilation)/2)
|
||||
def init_weights(m, mean=0.0, std=0.01):
|
||||
classname = m.__class__.__name__
|
||||
if classname.find("Conv") != -1:
|
||||
m.weight.data.normal_(mean, std)
|
||||
|
||||
import numpy as np
|
||||
from typing import Tuple, List
|
||||
|
||||
LRELU_SLOPE = 0.1
|
||||
|
||||
class ConvNeXtBlock(nn.Module):
|
||||
"""ConvNeXt Block adapted from https://github.com/facebookresearch/ConvNeXt to 1D audio signal.
|
||||
|
||||
Args:
|
||||
dim (int): Number of input channels.
|
||||
intermediate_dim (int): Dimensionality of the intermediate layer.
|
||||
layer_scale_init_value (float, optional): Initial value for the layer scale. None means no scaling.
|
||||
Defaults to None.
|
||||
adanorm_num_embeddings (int, optional): Number of embeddings for AdaLayerNorm.
|
||||
None means non-conditional LayerNorm. Defaults to None.
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
dim: int,
|
||||
layer_scale_init_value= None,
|
||||
adanorm_num_embeddings = None,
|
||||
):
|
||||
super().__init__()
|
||||
self.dwconv = nn.Conv1d(dim, dim, kernel_size=7, padding=3, groups=dim) # depthwise conv
|
||||
self.adanorm = adanorm_num_embeddings is not None
|
||||
|
||||
self.norm = nn.LayerNorm(dim, eps=1e-6)
|
||||
self.pwconv1 = nn.Linear(dim, dim*3) # pointwise/1x1 convs, implemented with linear layers
|
||||
self.act = nn.GELU()
|
||||
self.pwconv2 = nn.Linear(dim*3, dim)
|
||||
self.gamma = (
|
||||
nn.Parameter(layer_scale_init_value * torch.ones(dim), requires_grad=True)
|
||||
if layer_scale_init_value > 0
|
||||
else None
|
||||
)
|
||||
|
||||
def forward(self, x, cond_embedding_id = None) :
|
||||
residual = x
|
||||
x = self.dwconv(x)
|
||||
x = x.transpose(1, 2) # (B, C, T) -> (B, T, C)
|
||||
if self.adanorm:
|
||||
assert cond_embedding_id is not None
|
||||
x = self.norm(x, cond_embedding_id)
|
||||
else:
|
||||
x = self.norm(x)
|
||||
x = self.pwconv1(x)
|
||||
x = self.act(x)
|
||||
x = self.pwconv2(x)
|
||||
if self.gamma is not None:
|
||||
x = self.gamma * x
|
||||
x = x.transpose(1, 2) # (B, T, C) -> (B, C, T)
|
||||
|
||||
x = residual + x
|
||||
return x
|
||||
|
||||
|
||||
class APNet_BWE_Model(torch.nn.Module):
|
||||
def __init__(self, h):
|
||||
super(APNet_BWE_Model, self).__init__()
|
||||
self.h = h
|
||||
self.adanorm_num_embeddings = None
|
||||
layer_scale_init_value = 1 / h.ConvNeXt_layers
|
||||
|
||||
self.conv_pre_mag = nn.Conv1d(h.n_fft//2+1, h.ConvNeXt_channels, 7, 1, padding=get_padding(7, 1))
|
||||
self.norm_pre_mag = nn.LayerNorm(h.ConvNeXt_channels, eps=1e-6)
|
||||
self.conv_pre_pha = nn.Conv1d(h.n_fft//2+1, h.ConvNeXt_channels, 7, 1, padding=get_padding(7, 1))
|
||||
self.norm_pre_pha = nn.LayerNorm(h.ConvNeXt_channels, eps=1e-6)
|
||||
|
||||
self.convnext_mag = nn.ModuleList(
|
||||
[
|
||||
ConvNeXtBlock(
|
||||
dim=h.ConvNeXt_channels,
|
||||
layer_scale_init_value=layer_scale_init_value,
|
||||
adanorm_num_embeddings=self.adanorm_num_embeddings,
|
||||
)
|
||||
for _ in range(h.ConvNeXt_layers)
|
||||
]
|
||||
)
|
||||
|
||||
self.convnext_pha = nn.ModuleList(
|
||||
[
|
||||
ConvNeXtBlock(
|
||||
dim=h.ConvNeXt_channels,
|
||||
layer_scale_init_value=layer_scale_init_value,
|
||||
adanorm_num_embeddings=self.adanorm_num_embeddings,
|
||||
)
|
||||
for _ in range(h.ConvNeXt_layers)
|
||||
]
|
||||
)
|
||||
|
||||
self.norm_post_mag = nn.LayerNorm(h.ConvNeXt_channels, eps=1e-6)
|
||||
self.norm_post_pha = nn.LayerNorm(h.ConvNeXt_channels, eps=1e-6)
|
||||
self.apply(self._init_weights)
|
||||
self.linear_post_mag = nn.Linear(h.ConvNeXt_channels, h.n_fft//2+1)
|
||||
self.linear_post_pha_r = nn.Linear(h.ConvNeXt_channels, h.n_fft//2+1)
|
||||
self.linear_post_pha_i = nn.Linear(h.ConvNeXt_channels, h.n_fft//2+1)
|
||||
|
||||
def _init_weights(self, m):
|
||||
if isinstance(m, (nn.Conv1d, nn.Linear)):
|
||||
nn.init.trunc_normal_(m.weight, std=0.02)
|
||||
nn.init.constant_(m.bias, 0)
|
||||
|
||||
def forward(self, mag_nb, pha_nb):
|
||||
|
||||
x_mag = self.conv_pre_mag(mag_nb)
|
||||
x_pha = self.conv_pre_pha(pha_nb)
|
||||
x_mag = self.norm_pre_mag(x_mag.transpose(1, 2)).transpose(1, 2)
|
||||
x_pha = self.norm_pre_pha(x_pha.transpose(1, 2)).transpose(1, 2)
|
||||
|
||||
for conv_block_mag, conv_block_pha in zip(self.convnext_mag, self.convnext_pha):
|
||||
x_mag = x_mag + x_pha
|
||||
x_pha = x_pha + x_mag
|
||||
x_mag = conv_block_mag(x_mag, cond_embedding_id=None)
|
||||
x_pha = conv_block_pha(x_pha, cond_embedding_id=None)
|
||||
|
||||
x_mag = self.norm_post_mag(x_mag.transpose(1, 2))
|
||||
mag_wb = mag_nb + self.linear_post_mag(x_mag).transpose(1, 2)
|
||||
|
||||
x_pha = self.norm_post_pha(x_pha.transpose(1, 2))
|
||||
x_pha_r = self.linear_post_pha_r(x_pha)
|
||||
x_pha_i = self.linear_post_pha_i(x_pha)
|
||||
pha_wb = torch.atan2(x_pha_i, x_pha_r).transpose(1, 2)
|
||||
|
||||
com_wb = torch.stack((torch.exp(mag_wb)*torch.cos(pha_wb),
|
||||
torch.exp(mag_wb)*torch.sin(pha_wb)), dim=-1)
|
||||
|
||||
return mag_wb, pha_wb, com_wb
|
||||
|
||||
|
||||
|
||||
class DiscriminatorP(torch.nn.Module):
|
||||
def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False):
|
||||
super(DiscriminatorP, self).__init__()
|
||||
self.period = period
|
||||
norm_f = weight_norm if use_spectral_norm == False else spectral_norm
|
||||
self.convs = nn.ModuleList([
|
||||
norm_f(nn.Conv2d(1, 32, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))),
|
||||
norm_f(nn.Conv2d(32, 128, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))),
|
||||
norm_f(nn.Conv2d(128, 512, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))),
|
||||
norm_f(nn.Conv2d(512, 1024, (kernel_size, 1), (stride, 1), padding=(get_padding(5, 1), 0))),
|
||||
norm_f(nn.Conv2d(1024, 1024, (kernel_size, 1), 1, padding=(2, 0))),
|
||||
])
|
||||
self.conv_post = norm_f(nn.Conv2d(1024, 1, (3, 1), 1, padding=(1, 0)))
|
||||
|
||||
def forward(self, x):
|
||||
fmap = []
|
||||
|
||||
# 1d to 2d
|
||||
b, c, t = x.shape
|
||||
if t % self.period != 0: # pad first
|
||||
n_pad = self.period - (t % self.period)
|
||||
x = F.pad(x, (0, n_pad), "reflect")
|
||||
t = t + n_pad
|
||||
x = x.view(b, c, t // self.period, self.period)
|
||||
|
||||
for i,l in enumerate(self.convs):
|
||||
x = l(x)
|
||||
x = F.leaky_relu(x, LRELU_SLOPE)
|
||||
if i > 0:
|
||||
fmap.append(x)
|
||||
x = self.conv_post(x)
|
||||
fmap.append(x)
|
||||
x = torch.flatten(x, 1, -1)
|
||||
|
||||
return x, fmap
|
||||
|
||||
|
||||
class MultiPeriodDiscriminator(torch.nn.Module):
|
||||
def __init__(self):
|
||||
super(MultiPeriodDiscriminator, self).__init__()
|
||||
self.discriminators = nn.ModuleList([
|
||||
DiscriminatorP(2),
|
||||
DiscriminatorP(3),
|
||||
DiscriminatorP(5),
|
||||
DiscriminatorP(7),
|
||||
DiscriminatorP(11),
|
||||
])
|
||||
|
||||
def forward(self, y, y_hat):
|
||||
y_d_rs = []
|
||||
y_d_gs = []
|
||||
fmap_rs = []
|
||||
fmap_gs = []
|
||||
for i, d in enumerate(self.discriminators):
|
||||
y_d_r, fmap_r = d(y)
|
||||
y_d_g, fmap_g = d(y_hat)
|
||||
y_d_rs.append(y_d_r)
|
||||
fmap_rs.append(fmap_r)
|
||||
y_d_gs.append(y_d_g)
|
||||
fmap_gs.append(fmap_g)
|
||||
|
||||
return y_d_rs, y_d_gs, fmap_rs, fmap_gs
|
||||
|
||||
|
||||
class MultiResolutionAmplitudeDiscriminator(nn.Module):
|
||||
def __init__(
|
||||
self,
|
||||
resolutions: Tuple[Tuple[int, int, int]] = ((512, 128, 512), (1024, 256, 1024), (2048, 512, 2048)),
|
||||
num_embeddings: int = None,
|
||||
):
|
||||
super().__init__()
|
||||
self.discriminators = nn.ModuleList(
|
||||
[DiscriminatorAR(resolution=r, num_embeddings=num_embeddings) for r in resolutions]
|
||||
)
|
||||
|
||||
def forward(
|
||||
self, y: torch.Tensor, y_hat: torch.Tensor, bandwidth_id: torch.Tensor = None
|
||||
) -> Tuple[List[torch.Tensor], List[torch.Tensor], List[List[torch.Tensor]], List[List[torch.Tensor]]]:
|
||||
y_d_rs = []
|
||||
y_d_gs = []
|
||||
fmap_rs = []
|
||||
fmap_gs = []
|
||||
|
||||
for d in self.discriminators:
|
||||
y_d_r, fmap_r = d(x=y, cond_embedding_id=bandwidth_id)
|
||||
y_d_g, fmap_g = d(x=y_hat, cond_embedding_id=bandwidth_id)
|
||||
y_d_rs.append(y_d_r)
|
||||
fmap_rs.append(fmap_r)
|
||||
y_d_gs.append(y_d_g)
|
||||
fmap_gs.append(fmap_g)
|
||||
|
||||
return y_d_rs, y_d_gs, fmap_rs, fmap_gs
|
||||
|
||||
|
||||
class DiscriminatorAR(nn.Module):
|
||||
def __init__(
|
||||
self,
|
||||
resolution: Tuple[int, int, int],
|
||||
channels: int = 64,
|
||||
in_channels: int = 1,
|
||||
num_embeddings: int = None,
|
||||
):
|
||||
super().__init__()
|
||||
self.resolution = resolution
|
||||
self.in_channels = in_channels
|
||||
self.convs = nn.ModuleList(
|
||||
[
|
||||
weight_norm(nn.Conv2d(in_channels, channels, kernel_size=(7, 5), stride=(2, 2), padding=(3, 2))),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=(5, 3), stride=(2, 1), padding=(2, 1))),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=(5, 3), stride=(2, 2), padding=(2, 1))),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=3, stride=(2, 1), padding=1)),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=3, stride=(2, 2), padding=1)),
|
||||
]
|
||||
)
|
||||
if num_embeddings is not None:
|
||||
self.emb = torch.nn.Embedding(num_embeddings=num_embeddings, embedding_dim=channels)
|
||||
torch.nn.init.zeros_(self.emb.weight)
|
||||
self.conv_post = weight_norm(nn.Conv2d(channels, 1, (3, 3), padding=(1, 1)))
|
||||
|
||||
def forward(
|
||||
self, x: torch.Tensor, cond_embedding_id: torch.Tensor = None
|
||||
) -> Tuple[torch.Tensor, List[torch.Tensor]]:
|
||||
fmap = []
|
||||
x=x.squeeze(1)
|
||||
|
||||
x = self.spectrogram(x)
|
||||
x = x.unsqueeze(1)
|
||||
for l in self.convs:
|
||||
x = l(x)
|
||||
x = F.leaky_relu(x, LRELU_SLOPE)
|
||||
fmap.append(x)
|
||||
if cond_embedding_id is not None:
|
||||
emb = self.emb(cond_embedding_id)
|
||||
h = (emb.view(1, -1, 1, 1) * x).sum(dim=1, keepdims=True)
|
||||
else:
|
||||
h = 0
|
||||
x = self.conv_post(x)
|
||||
fmap.append(x)
|
||||
x += h
|
||||
x = torch.flatten(x, 1, -1)
|
||||
|
||||
return x, fmap
|
||||
|
||||
def spectrogram(self, x: torch.Tensor) -> torch.Tensor:
|
||||
n_fft, hop_length, win_length = self.resolution
|
||||
amplitude_spectrogram = torch.stft(
|
||||
x,
|
||||
n_fft=n_fft,
|
||||
hop_length=hop_length,
|
||||
win_length=win_length,
|
||||
window=None, # interestingly rectangular window kind of works here
|
||||
center=True,
|
||||
return_complex=True,
|
||||
).abs()
|
||||
|
||||
return amplitude_spectrogram
|
||||
|
||||
|
||||
class MultiResolutionPhaseDiscriminator(nn.Module):
|
||||
def __init__(
|
||||
self,
|
||||
resolutions: Tuple[Tuple[int, int, int]] = ((512, 128, 512), (1024, 256, 1024), (2048, 512, 2048)),
|
||||
num_embeddings: int = None,
|
||||
):
|
||||
super().__init__()
|
||||
self.discriminators = nn.ModuleList(
|
||||
[DiscriminatorPR(resolution=r, num_embeddings=num_embeddings) for r in resolutions]
|
||||
)
|
||||
|
||||
def forward(
|
||||
self, y: torch.Tensor, y_hat: torch.Tensor, bandwidth_id: torch.Tensor = None
|
||||
) -> Tuple[List[torch.Tensor], List[torch.Tensor], List[List[torch.Tensor]], List[List[torch.Tensor]]]:
|
||||
y_d_rs = []
|
||||
y_d_gs = []
|
||||
fmap_rs = []
|
||||
fmap_gs = []
|
||||
|
||||
for d in self.discriminators:
|
||||
y_d_r, fmap_r = d(x=y, cond_embedding_id=bandwidth_id)
|
||||
y_d_g, fmap_g = d(x=y_hat, cond_embedding_id=bandwidth_id)
|
||||
y_d_rs.append(y_d_r)
|
||||
fmap_rs.append(fmap_r)
|
||||
y_d_gs.append(y_d_g)
|
||||
fmap_gs.append(fmap_g)
|
||||
|
||||
return y_d_rs, y_d_gs, fmap_rs, fmap_gs
|
||||
|
||||
|
||||
class DiscriminatorPR(nn.Module):
|
||||
def __init__(
|
||||
self,
|
||||
resolution: Tuple[int, int, int],
|
||||
channels: int = 64,
|
||||
in_channels: int = 1,
|
||||
num_embeddings: int = None,
|
||||
):
|
||||
super().__init__()
|
||||
self.resolution = resolution
|
||||
self.in_channels = in_channels
|
||||
self.convs = nn.ModuleList(
|
||||
[
|
||||
weight_norm(nn.Conv2d(in_channels, channels, kernel_size=(7, 5), stride=(2, 2), padding=(3, 2))),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=(5, 3), stride=(2, 1), padding=(2, 1))),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=(5, 3), stride=(2, 2), padding=(2, 1))),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=3, stride=(2, 1), padding=1)),
|
||||
weight_norm(nn.Conv2d(channels, channels, kernel_size=3, stride=(2, 2), padding=1)),
|
||||
]
|
||||
)
|
||||
if num_embeddings is not None:
|
||||
self.emb = torch.nn.Embedding(num_embeddings=num_embeddings, embedding_dim=channels)
|
||||
torch.nn.init.zeros_(self.emb.weight)
|
||||
self.conv_post = weight_norm(nn.Conv2d(channels, 1, (3, 3), padding=(1, 1)))
|
||||
|
||||
def forward(
|
||||
self, x: torch.Tensor, cond_embedding_id: torch.Tensor = None
|
||||
) -> Tuple[torch.Tensor, List[torch.Tensor]]:
|
||||
fmap = []
|
||||
x=x.squeeze(1)
|
||||
|
||||
x = self.spectrogram(x)
|
||||
x = x.unsqueeze(1)
|
||||
for l in self.convs:
|
||||
x = l(x)
|
||||
x = F.leaky_relu(x, LRELU_SLOPE)
|
||||
fmap.append(x)
|
||||
if cond_embedding_id is not None:
|
||||
emb = self.emb(cond_embedding_id)
|
||||
h = (emb.view(1, -1, 1, 1) * x).sum(dim=1, keepdims=True)
|
||||
else:
|
||||
h = 0
|
||||
x = self.conv_post(x)
|
||||
fmap.append(x)
|
||||
x += h
|
||||
x = torch.flatten(x, 1, -1)
|
||||
|
||||
return x, fmap
|
||||
|
||||
def spectrogram(self, x: torch.Tensor) -> torch.Tensor:
|
||||
n_fft, hop_length, win_length = self.resolution
|
||||
phase_spectrogram = torch.stft(
|
||||
x,
|
||||
n_fft=n_fft,
|
||||
hop_length=hop_length,
|
||||
win_length=win_length,
|
||||
window=None, # interestingly rectangular window kind of works here
|
||||
center=True,
|
||||
return_complex=True,
|
||||
).angle()
|
||||
|
||||
return phase_spectrogram
|
||||
|
||||
|
||||
def feature_loss(fmap_r, fmap_g):
|
||||
loss = 0
|
||||
for dr, dg in zip(fmap_r, fmap_g):
|
||||
for rl, gl in zip(dr, dg):
|
||||
loss += torch.mean(torch.abs(rl - gl))
|
||||
|
||||
return loss
|
||||
|
||||
|
||||
def discriminator_loss(disc_real_outputs, disc_generated_outputs):
|
||||
loss = 0
|
||||
r_losses = []
|
||||
g_losses = []
|
||||
for dr, dg in zip(disc_real_outputs, disc_generated_outputs):
|
||||
r_loss = torch.mean(torch.clamp(1 - dr, min=0))
|
||||
g_loss = torch.mean(torch.clamp(1 + dg, min=0))
|
||||
loss += r_loss + g_loss
|
||||
r_losses.append(r_loss.item())
|
||||
g_losses.append(g_loss.item())
|
||||
|
||||
return loss, r_losses, g_losses
|
||||
|
||||
|
||||
def generator_loss(disc_outputs):
|
||||
loss = 0
|
||||
gen_losses = []
|
||||
for dg in disc_outputs:
|
||||
l = torch.mean(torch.clamp(1 - dg, min=0))
|
||||
gen_losses.append(l)
|
||||
loss += l
|
||||
|
||||
return loss, gen_losses
|
||||
|
||||
|
||||
def phase_losses(phase_r, phase_g):
|
||||
|
||||
ip_loss = torch.mean(anti_wrapping_function(phase_r - phase_g))
|
||||
gd_loss = torch.mean(anti_wrapping_function(torch.diff(phase_r, dim=1) - torch.diff(phase_g, dim=1)))
|
||||
iaf_loss = torch.mean(anti_wrapping_function(torch.diff(phase_r, dim=2) - torch.diff(phase_g, dim=2)))
|
||||
|
||||
return ip_loss, gd_loss, iaf_loss
|
||||
|
||||
def anti_wrapping_function(x):
|
||||
|
||||
return torch.abs(x - torch.round(x / (2 * np.pi)) * 2 * np.pi)
|
||||
|
||||
def stft_mag(audio, n_fft=2048, hop_length=512):
|
||||
hann_window = torch.hann_window(n_fft).to(audio.device)
|
||||
stft_spec = torch.stft(audio, n_fft, hop_length, window=hann_window, return_complex=True)
|
||||
stft_mag = torch.abs(stft_spec)
|
||||
return(stft_mag)
|
||||
|
||||
def cal_snr(pred, target):
|
||||
snr = (20 * torch.log10(torch.norm(target, dim=-1) / torch.norm(pred - target, dim=-1).clamp(min=1e-8))).mean()
|
||||
return snr
|
||||
|
||||
def cal_lsd(pred, target):
|
||||
sp = torch.log10(stft_mag(pred).square().clamp(1e-8))
|
||||
st = torch.log10(stft_mag(target).square().clamp(1e-8))
|
||||
return (sp - st).square().mean(dim=1).sqrt().mean()
|
51
tools/audio_sr.py
Normal file
51
tools/audio_sr.py
Normal file
@ -0,0 +1,51 @@
|
||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||
import sys,os
|
||||
import traceback
|
||||
AP_BWE_main_dir_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'AP_BWE_main')
|
||||
sys.path.append(AP_BWE_main_dir_path)
|
||||
import glob
|
||||
import argparse
|
||||
import json
|
||||
from re import S
|
||||
import torch
|
||||
import numpy as np
|
||||
import torchaudio
|
||||
import time
|
||||
import torchaudio.functional as aF
|
||||
# from attrdict import AttrDict####will be bug in py3.10
|
||||
|
||||
from datasets1.dataset import amp_pha_stft, amp_pha_istft
|
||||
from models.model import APNet_BWE_Model
|
||||
import soundfile as sf
|
||||
import matplotlib.pyplot as plt
|
||||
from rich.progress import track
|
||||
|
||||
class AP_BWE():
|
||||
def __init__(self,device,DictToAttrRecursive,checkpoint_file=None):
|
||||
if checkpoint_file==None:
|
||||
checkpoint_file="%s/24kto48k/g_24kto48k.zip"%(AP_BWE_main_dir_path)
|
||||
if os.path.exists(checkpoint_file)==False:
|
||||
raise FileNotFoundError
|
||||
config_file = os.path.join(os.path.split(checkpoint_file)[0], 'config.json')
|
||||
with open(config_file) as f:data = f.read()
|
||||
json_config = json.loads(data)
|
||||
# h = AttrDict(json_config)
|
||||
h = DictToAttrRecursive(json_config)
|
||||
model = APNet_BWE_Model(h).to(device)
|
||||
state_dict = torch.load(checkpoint_file,map_location="cpu",weights_only=False)
|
||||
model.load_state_dict(state_dict['generator'])
|
||||
model.eval()
|
||||
self.device=device
|
||||
self.model=model
|
||||
self.h=h
|
||||
|
||||
def __call__(self, audio,orig_sampling_rate):
|
||||
with torch.no_grad():
|
||||
# audio, orig_sampling_rate = torchaudio.load(inp_path)
|
||||
# audio = audio.to(self.device)
|
||||
audio = aF.resample(audio, orig_freq=orig_sampling_rate, new_freq=self.h.hr_sampling_rate)
|
||||
amp_nb, pha_nb, com_nb = amp_pha_stft(audio, self.h.n_fft, self.h.hop_size, self.h.win_size)
|
||||
amp_wb_g, pha_wb_g, com_wb_g = self.model(amp_nb, pha_nb)
|
||||
audio_hr_g = amp_pha_istft(amp_wb_g, pha_wb_g, self.h.n_fft, self.h.hop_size, self.h.win_size)
|
||||
# sf.write(opt_path, audio_hr_g.squeeze().cpu().numpy(), self.h.hr_sampling_rate, 'PCM_16')
|
||||
return audio_hr_g.squeeze().cpu().numpy(),self.h.hr_sampling_rate
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(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",
|
||||
"*SoVITS模型列表": "*SoVITS models list",
|
||||
"*实验/模型名": "*Experiment/model name",
|
||||
"*文本标注文件": "*Text labelling file",
|
||||
"*训练集音频文件目录": "*Audio dataset folder",
|
||||
"*请上传并填写参考信息": "*Please upload and fill reference information",
|
||||
"*请填写需要合成的目标文本和语种模式": "*Please fill in the target text and language mode for synthesis",
|
||||
".list标注文件的路径": ".list annotation file path",
|
||||
".限制范围越小判别效果越好。": "Less Multilingual is better",
|
||||
"0-前置数据集获取工具": "0-Fetch dataset",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 webui (for vocal separation, deecho, dereverb and denoise)",
|
||||
"0b-语音切分工具": "0b-Audio slicer",
|
||||
"0bb-语音降噪工具": "0bb-Voice denoiser",
|
||||
"0c-中文批量离线ASR工具": "0c-Chinese ASR tool",
|
||||
"0d-语音文本校对标注工具": "0d-Speech to text proofreading tool",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SOVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Dataset formatting",
|
||||
"1Aa-文本内容": "1Aa-Text",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-One-click formatting",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL self-supervised feature extraction",
|
||||
"1Ac-语义token提取": "1Ac-semantics token extraction",
|
||||
"1B-微调训练": "1B-Fine-tuned training",
|
||||
"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.",
|
||||
"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",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR model",
|
||||
"ASR 模型尺寸": "ASR model size",
|
||||
"ASR 语言设置": "ASR language",
|
||||
"ASR进程输出信息": "ASR output log",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT Training: Model Weights saved in GPT_weights/",
|
||||
"GPT模型列表": "GPT weight list",
|
||||
"GPT训练进程输出信息": "GPT training output log",
|
||||
"GPT训练": "GPT Training",
|
||||
"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卡号以-分割,每个卡号一个进程": "GPU number is separated by -, each GPU will run one process ",
|
||||
"SSL进程输出信息": "SSL output log",
|
||||
"LoRA秩": "LoRA Rank",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "Missing Pretrained SoVITS V3 Model, Cannot Load LoRA Weights",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS Training: Model Weights saved in SoVITS_weights/",
|
||||
"SoVITS模型列表": "SoVITS weight list",
|
||||
"SoVITS训练进程输出信息": "SoVITS training output log",
|
||||
"TTS推理WebUI进程输出信息": "TTS inference webui output log",
|
||||
"TTS推理进程已关闭": "TTS inference process closed",
|
||||
"TTS推理进程已开启": "TTS inference process is opened",
|
||||
"UVR5已关闭": "UVR5 closed",
|
||||
"UVR5已开启": "UVR5 opened ",
|
||||
"UVR5进程输出信息": "UVR5 process output log",
|
||||
"SoVITS训练": "SoVITS Training",
|
||||
"TTS推理WebUI": "TTS Inference WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5 WebUI (Vocal Separation/Deecho/Dereverb)",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proportion of normalized audio merged into dataset",
|
||||
"batch_size": "Batch Size",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: FO hop size, the smaller the value, the higher the accuracy)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "Noise gate threshold (loudness below this value will be treated as noise",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "One-click formatting output",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3 does not support this mode currently, using it will cause an error.",
|
||||
"v3输出如果觉得闷可以试试开超分": "For V3 model, if generated audio sounds somewhat muffled, try enable audio super-resolution.",
|
||||
"不切": "No slice",
|
||||
"中文": "Chinese",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Chinese Tutorial:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Chinese Tutorial",
|
||||
"中英混合": "Chinese-English Mixed",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Primary Reference Audio (Please upload reference audio within 3-10 seconds, exceeding this limit will cause an error!)",
|
||||
"主参考音频的文本": "Text of Primary Reference Audio",
|
||||
"主参考音频的语种": "Language of Primary Reference Audio",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "Multiple audio files can also be imported. If a folder path exists, this input is ignored.",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Batch processing for vocal and instrumental separation, using the UVR5 model.",
|
||||
"人声分离WebUI": "Vocal Separation WebUI",
|
||||
"人声提取激进程度": "Vocal extraction aggressiveness",
|
||||
"以下文件或文件夹不存在": "No Such File or Folder",
|
||||
"以下模型不存在:": "No Such Model:",
|
||||
"伴奏人声分离&去混响&去回声": "Vocals/Accompaniment Separation & Reverberation Removal",
|
||||
"使用无参考文本模式时建议使用微调的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.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Recommended to use a Finetune-GPT when using Prompt-Free Mode. If reference audio is not clear or unsure what to write, enable this option to ignore the reference text.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "Super-Resolution Model Not Found. Please follow the tutorial to download the model file if you want to use it.",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "Recommended to use a Finetune-GPT when using Prompt-Free Mode.",
|
||||
"保存频率save_every_epoch": "Save frequency (save_every_epoch):",
|
||||
"保持随机": "Keep Random",
|
||||
"关闭TTS推理WebUI": "Close TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "Close UVR5-WebUI",
|
||||
"关闭打标WebUI": "Close Labeling WebUI",
|
||||
"关闭": "Close ",
|
||||
"凑50字一切": "Slice per 50 characters",
|
||||
"凑四句一切": "Slice once every 4 sentences",
|
||||
"分桶处理模式已关闭": "Bucket Processing Mode Disabled",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "CPU threads used for audio slicing",
|
||||
"刷新模型路径": "refreshing model paths",
|
||||
"前端处理后的文本(每句):": "Processed text from the frontend (per sentence):",
|
||||
"前置数据集获取工具": "Fetch Datasets",
|
||||
"占用中": " Occupying",
|
||||
"去混响/去延迟,附:": "Dereverberation/Delay Removal, including:",
|
||||
"参考音频在3~10秒范围外,请更换!": "Reference audio is outside the 3-10 second range, please choose another one!",
|
||||
"参考音频的文本": "Text for reference audio",
|
||||
"参考音频的语种": "Language for reference audio",
|
||||
"句间停顿秒数": "Pause Duration between Sentences (Seconds)",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "Optional: Upload multiple reference audio files by dragging and dropping them (recommended to be of the same gender), and average their tone. If this option is left blank, the tone will be controlled by the single reference audio on the left. If fine-tuning the model, it is recommended that all reference audio files have tones within the fine-tuning training set; the pretrained model can be ignored.",
|
||||
"合成语音": "Start inference",
|
||||
"合格的文件夹路径格式举例: 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).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "Support for Phoneme Conversion, Manual Phoneme Editing, and Step-by-Step Speech Synthesis will be added in the future.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "If reference audio is not clear or unsure what to write, enable this option to ignore the reference text.",
|
||||
"启用并行推理版本": "Enable Parallel Inference Version",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-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)",
|
||||
"失败": " Failed",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "If you do not agree with this clause, you cannot use or reference any codes and files within the software package. See the root directory Agreement-LICENSE for details.",
|
||||
"实际输入的参考文本:": "Actual Input Reference Text:",
|
||||
"实际输入的目标文本(切句后):": "Actual Input Target Text (after sentence segmentation):",
|
||||
"实际输入的目标文本(每句):": "Actual Input Target Text (per sentence):",
|
||||
"实际输入的目标文本:": "Actual Input Target Text:",
|
||||
"导出文件格式": "Export file format",
|
||||
"已关闭": " is Closed",
|
||||
"已完成": " Finished",
|
||||
"已开启": " is Opened",
|
||||
"并行推理": "Parallel Inference",
|
||||
"并行推理模式已关闭": "Parallel Inference Mode Disabled",
|
||||
"并行推理模式已开启": "Parallel Inference Mode Enabled",
|
||||
"开启GPT训练": "Start GPT training",
|
||||
"开启SSL提取": "Start SSL extracting",
|
||||
"开启SoVITS训练": "Start SoVITS training",
|
||||
"开启TTS推理WebUI": "Open TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "Open UVR5-WebUI",
|
||||
"开启一键三连": "Start one-click formatting",
|
||||
"开启打标WebUI": "Open Labeling WebUI",
|
||||
"开启文本获取": "Start speech-to-text",
|
||||
"开启": "Open ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Enable no reference mode. If you don't fill 'Text for reference audio', no reference mode will be enabled.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Enable Reference Text-Free Mode. Leaving the reference text field blank is equivalent to enabling this mode. v3 does not support this mode currently, using it will cause an error.",
|
||||
"开启离线批量ASR": "Start batch ASR",
|
||||
"开启语义token提取": "Start semantics token extraction",
|
||||
"开启语音切割": "Start audio slicer",
|
||||
"开启语音降噪": "Start voice denoiser",
|
||||
"微调训练": "Fine-Tuning",
|
||||
"怎么切": "How to slice the sentence",
|
||||
"总训练轮数total_epoch": "Total training epochs (total_epoch):",
|
||||
"总训练轮数total_epoch,不建议太高": "Total epochs, do not increase to a value that is too high",
|
||||
"打标工具WebUI已关闭": "proofreading tool webui is closed",
|
||||
"打标工具WebUI已开启": "proofreading tool webui is opened",
|
||||
"打标工具进程输出信息": "Proofreading tool output log",
|
||||
"指定输出主人声文件夹": "Specify the output folder for vocals:",
|
||||
"指定输出非主人声文件夹": "Specify the output folder for accompaniment:",
|
||||
"按中文句号。切": "Slice by Chinese punct",
|
||||
"按标点符号切": "Slice by every punct",
|
||||
"按英文句号.切": "Slice by English punct",
|
||||
"推理": "Inference",
|
||||
"推理设置": "Inference Settings",
|
||||
"提取文本Bert特征": "Extract Text BERT Features",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Data Bucketing (Reduces Computation Cost in Parallel Inference)",
|
||||
"数据类型精度": "Computing precision",
|
||||
"文本分词与特征提取": "Tokenization & BERT Feature Extraction",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Text Segmentation Tool. Very long text may not yield good synthesis results, so Segmentation is Recommended. Synthesis will be performed based on line breaks and then concatenated.",
|
||||
"文本模块学习率权重": "Text model learning rate weighting",
|
||||
"文本进程输出信息": "Text processing output",
|
||||
"施工中,请静候佳音": "In construction, please wait",
|
||||
"日文": "Japanese",
|
||||
"日英混合": "Japanese-English Mixed",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "Save only the latest '.ckpt' file to save disk space:",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "Save only the latest weight file to save disk space",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Save a small final model to the 'weights' folder at each save point:",
|
||||
"是否开启dpo训练选项(实验性)": "Enable DPO training (experimental feature)",
|
||||
"是否开启DPO训练选项(实验性)": "Enable DPO Training (Experimental)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "Adjust the speech rate and tone of the last synthesis result to prevent randomness.",
|
||||
"显卡信息": "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.",
|
||||
"未下载模型": "Model Not Downloaded",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "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.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Label File Path (with file extension *.list)",
|
||||
"模型": "Model",
|
||||
"模型分为三类:": "Models are categorized into three types:",
|
||||
"模型切换": "Model switch",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Version",
|
||||
"粤英混合": "Yue-English Mixed",
|
||||
"粤语": "Yue",
|
||||
"终止ASR进程": "Stop ASR task",
|
||||
"终止GPT训练": "Stop GPT training",
|
||||
"终止SSL提取进程": "Stop SSL extraction",
|
||||
"终止SoVITS训练": "Stop SoVITS training",
|
||||
"终止一键三连": "Stop one-click formatting",
|
||||
"终止合成": "Terminate Synthesis",
|
||||
"终止文本获取进程": "Stop speech-to-text",
|
||||
"终止语义token提取进程": "Stop semantics token extraction",
|
||||
"终止语音切割": "Stop audio cutting",
|
||||
"终止语音降噪进程": "Stop voice denoising",
|
||||
"缺少Hubert数据集": "Missing Hubert Dataset",
|
||||
"缺少语义数据集": "Missing Semantics Dataset",
|
||||
"缺少音素数据集": "Missing Phoneme Dataset",
|
||||
"缺少音频数据集": "Missing Audio Dataset",
|
||||
"英文": "English",
|
||||
"语义token提取进程输出信息": "Sematics token extraction output log",
|
||||
"训练集格式化一键三连": "Training Set One-Click Formatting",
|
||||
"训练集格式化工具": "Dataset Formatting Tool",
|
||||
"语义Token提取": "Semantics Token Extraction",
|
||||
"语速": "Speech rate",
|
||||
"语速调整,高为更快": "Adjust speech rate, higher for faster",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "Speech Rate Adjustment does not support Bucket Processing, Bucket Processing Disabled automatically",
|
||||
"语音切割进程输出信息": "Audio slicer output log",
|
||||
"语音降噪进程输出信息": "Voice Denoiser Process Output Information",
|
||||
"语音切分": "Speech Slicing",
|
||||
"语音切分工具": "Speech Slicing Tool",
|
||||
"语音文本校对标注工具": "Speech-to-Text Proofreading Tool",
|
||||
"语音自监督特征提取": "Speech SSL Feature Extraction",
|
||||
"语音识别": "Speech Recognition",
|
||||
"语音识别工具": "Speech Recognition Tool",
|
||||
"语音降噪": "Speech Denoising",
|
||||
"语音降噪工具": "Speech Denoising Tool",
|
||||
"请上传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",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Secondary Reference Audio (Multiple Optional, or None)",
|
||||
"输入待处理音频文件夹路径": "Enter the path of the audio folder to be processed:",
|
||||
"输入文件夹路径": "Input folder path",
|
||||
"输入路径不存在": "Input Path Not Found",
|
||||
"输入路径存在但不可用": "Input Path Exists but Unavailable",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "output folder (logs/{experiment name}) should have files and folders starts with 23456.",
|
||||
"输出信息": "Output information",
|
||||
"输出文件夹路径": "Output folder path",
|
||||
"输出的语音": "Inference Result",
|
||||
"运行中": " Running",
|
||||
"进度": "Progress",
|
||||
"进程已终止": " Process Terminated",
|
||||
"进程输出信息": " Process Output Information",
|
||||
"选择训练完存放在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.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Sampling Steps: If feel noisy, try increasing, if feel slow, try decreasing",
|
||||
"重复惩罚": "Repetition Penalty",
|
||||
"降噪结果输出文件夹": "Denoised Results Output Folder",
|
||||
"降噪音频文件输入文件夹": "Denoising Audio File Input Folder",
|
||||
"随机种子": "Random Seed",
|
||||
"需先终止才能开启下一次任务": "Please Terminate First to Start Next Task",
|
||||
"需要合成的切分前文本": "Inference Text Before Segmentation",
|
||||
"需要合成的文本": "Inference text",
|
||||
"需要合成的文本的语种": "Language of the Inference Text",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Korean-English Mixed",
|
||||
"音频加载失败": "Failed to Load Audio",
|
||||
"音频文件不存在,跳过:": "Audio File Not Found, Skipping: ",
|
||||
"音频标注WebUI": "Audio Labeling WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "Audio slicer input (file or folder)",
|
||||
"预训练的GPT模型路径": "Pretrained GPT model path",
|
||||
"预训练的SSL模型路径": "Pretrained SSL model path",
|
||||
"预训练的SoVITS-D模型路径": "Pretrained SoVITS-D model path",
|
||||
"预训练的SoVITS-G模型路径": "Pretrained SoVITS-G model path",
|
||||
"预训练的中文BERT模型路径": " Pretrained BERT model path"
|
||||
"音频超分中": "Running Audio Super-Resolution",
|
||||
"预训练GPT模型路径": "Pretrained GPT Model Path",
|
||||
"预训练SSL模型路径": "Pretrained SSL Model Path",
|
||||
"预训练SoVITS-D模型路径": "Pretrained SoVITS-D Model Path",
|
||||
"预训练SoVITS-G模型路径": "Pretrained SoVITS-G Model Path",
|
||||
"预训练中文BERT模型路径": "Pretrained Chinese BERT Model Path"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(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",
|
||||
"*SoVITS模型列表": "*Lista de modelos SoVITS",
|
||||
"*实验/模型名": "*Nombre del experimento/modelo",
|
||||
"*文本标注文件": "*Archivo de etiquetado de texto",
|
||||
"*训练集音频文件目录": "*Directorio de archivos de audio de entrenamiento",
|
||||
"*请上传并填写参考信息": "*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",
|
||||
".限制范围越小判别效果越好。": ".Cuanto más pequeño sea el rango, mejor será el efecto de discriminación.",
|
||||
"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",
|
||||
"0b-语音切分工具": "0b-Herramienta de división de voz",
|
||||
"0bb-语音降噪工具": "0bb-Herramienta de reducción de ruido de voz",
|
||||
"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",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Herramienta de formateo del conjunto de datos de entrenamiento",
|
||||
"1Aa-文本内容": "1Aa-Contenido del texto",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-Formateo del conjunto de datos de entrenamiento en un solo paso",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-Extracción de características auto-supervisada SSL",
|
||||
"1Ac-语义token提取": "1Ac-Extracción de tokens semánticos",
|
||||
"1B-微调训练": "1B-Entrenamiento de ajuste fino",
|
||||
"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.",
|
||||
"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",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "Modelo ASR",
|
||||
"ASR 模型尺寸": "Tamaño del modelo ASR",
|
||||
"ASR 语言设置": "Configuración del idioma ASR",
|
||||
"ASR进程输出信息": "Información de salida del proceso ASR",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "Entrenamiento de GPT: los archivos de pesos del modelo están en GPT_weights/",
|
||||
"GPT模型列表": "Lista de modelos GPT",
|
||||
"GPT训练进程输出信息": "Información de salida del proceso de entrenamiento de GPT",
|
||||
"GPT训练": "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卡号以-分割,每个卡号一个进程": "Número de tarjeta GPU separado por '-', cada número de tarjeta es un proceso",
|
||||
"SSL进程输出信息": "Información de salida del proceso SSL",
|
||||
"LoRA秩": "Rango de LoRA",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "Falta el modelo base de SoVITS V3, no se pueden cargar los pesos de LoRA correspondientes",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "Entrenamiento de SoVITS: los archivos de pesos del modelo están en SoVITS_weights/",
|
||||
"SoVITS模型列表": "Lista de modelos SoVITS",
|
||||
"SoVITS训练进程输出信息": "Información de salida del proceso de entrenamiento de SoVITS",
|
||||
"TTS推理WebUI进程输出信息": "Información de salida del proceso de interfaz web de inferencia TTS",
|
||||
"TTS推理进程已关闭": "Proceso de inferencia TTS cerrado",
|
||||
"TTS推理进程已开启": "Proceso de inferencia TTS iniciado",
|
||||
"UVR5已关闭": "UVR5 está deshabilitado",
|
||||
"UVR5已开启": "UVR5 está habilitado",
|
||||
"UVR5进程输出信息": "Información de salida del proceso UVR5",
|
||||
"SoVITS训练": "Entrenamiento de SoVITS",
|
||||
"TTS推理WebUI": "WebUI de inferencia TTS",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "Herramienta de separación de voz y acompañamiento UVR5 y eliminación de reverberación y retardo",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proporción de mezcla de audio normalizado que entra",
|
||||
"batch_size": "Tamaño de lote",
|
||||
"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)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "umbral: puntos de corte alternativos considerados como silencio si el volumen es menor que este valor",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "Información de salida del proceso de triple acción",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3 no es compatible con este modo actualmente y su uso generará un error.",
|
||||
"v3输出如果觉得闷可以试试开超分": "Si la salida de V3 parece aburrida, puedes intentar activar la superresolución",
|
||||
"不切": "No cortar",
|
||||
"中文": "Chino",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentación del tutorial en chino: https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Documentación del tutorial en chino",
|
||||
"中英混合": "Chino e inglés mezclados",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Audio de referencia principal (Por favor, suba un audio de referencia de entre 3 y 10 segundos, si supera este límite se producirá un error)",
|
||||
"主参考音频的文本": "Texto del audio de referencia principal",
|
||||
"主参考音频的语种": "Idioma del audio de referencia principal",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "También se pueden ingresar archivos de audio por lotes, seleccionar uno, prioridad para leer carpetas",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Procesamiento por lotes de separación de voz y acompañamiento utilizando el modelo UVR5",
|
||||
"人声分离WebUI": "WebUI de separación de voces",
|
||||
"人声提取激进程度": "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",
|
||||
"使用无参考文本模式时建议使用微调的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.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Se recomienda usar un GPT ajustado cuando se use el modo sin texto de referencia. Si el audio de referencia no es claro o no sabe qué escribir, habilite esta opción para ignorar el texto de referencia.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "No has descargado los parámetros del modelo de superresolución, por lo que no se realizará la superresolución. Si deseas habilitarla, sigue el tutorial y descarga los archivos necesarios",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "Se recomienda usar un GPT ajustado cuando se use el modo sin texto de referencia.",
|
||||
"保存频率save_every_epoch": "Frecuencia de guardado (cada epoch)",
|
||||
"保持随机": "Mantener aleatorio",
|
||||
"关闭TTS推理WebUI": "Cerrar TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "Cerrar UVR5-WebUI",
|
||||
"关闭打标WebUI": "Cerrar Labeling WebUI",
|
||||
"关闭": "Cerrar ",
|
||||
"凑50字一切": "Todo para alcanzar las 50 palabras",
|
||||
"凑四句一切": "Completa cuatro oraciones para rellenar todo",
|
||||
"分桶处理模式已关闭": "Modo de procesamiento por lotes deshabilitado",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "Número de procesos utilizados para la división",
|
||||
"刷新模型路径": "Actualizar la ruta del modelo",
|
||||
"前端处理后的文本(每句):": "Texto después del procesamiento previo (por frase):",
|
||||
"前置数据集获取工具": "Herramienta de adquisición de conjunto de datos previo",
|
||||
"占用中": " En uso",
|
||||
"去混响/去延迟,附:": "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",
|
||||
"参考音频的语种": "Idioma del audio de referencia",
|
||||
"句间停顿秒数": "Segundos de pausa entre frases",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "Opcional: Sube varios archivos de audio de referencia arrastrándolos y soltándolos (se recomienda que sean del mismo género) y promedia sus tonos. Si esta opción se deja en blanco, el tono será controlado por el único audio de referencia a la izquierda. Si se está afinando el modelo, se recomienda que todos los archivos de audio de referencia tengan tonos dentro del conjunto de entrenamiento de ajuste fino; se puede ignorar el modelo preentrenado.",
|
||||
"合成语音": "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).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "Se añadirá soporte para conversión de fonemas, edición manual de fonemas y síntesis de voz por pasos en el futuro.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "Si el audio de referencia no es claro o no sabe qué escribir, habilite esta opción para ignorar el texto de referencia.",
|
||||
"启用并行推理版本": "Habilitar versión de inferencia paralela",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-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)",
|
||||
"失败": " Fallido",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "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 LICENSE en el directorio raíz para obtener más detalles.",
|
||||
"实际输入的参考文本:": "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",
|
||||
"已关闭": " Desactivado",
|
||||
"已完成": " Completado",
|
||||
"已开启": " Activado",
|
||||
"并行推理": "Inferencia paralela",
|
||||
"并行推理模式已关闭": "Modo de inferencia paralela deshabilitado",
|
||||
"并行推理模式已开启": "Modo de inferencia paralela habilitado",
|
||||
"开启GPT训练": "Iniciar entrenamiento de GPT",
|
||||
"开启SSL提取": "Habilitar la extracción SSL",
|
||||
"开启SoVITS训练": "Iniciar entrenamiento de SoVITS",
|
||||
"开启TTS推理WebUI": "Abrir TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "Abrir UVR5-WebUI",
|
||||
"开启一键三连": "Habilitar un solo paso de formateo",
|
||||
"开启打标WebUI": "Abrir Labeling WebUI",
|
||||
"开启文本获取": "Habilitar la obtención de texto",
|
||||
"开启": "Activar ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Habilitar el modo sin texto de referencia. No llenar el texto de referencia también lo habilita.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Habilitar modo sin texto de referencia. No completar el campo de texto de referencia equivale a habilitar este modo. v3 no es compatible con este modo actualmente y su uso generará un error.",
|
||||
"开启离线批量ASR": "Habilitar ASR en lote fuera de línea",
|
||||
"开启语义token提取": "Habilitar la extracción de tokens semánticos",
|
||||
"开启语音切割": "Habilitar la división de voz",
|
||||
"开启语音降噪": "Habilitar la reducción de ruido de voz",
|
||||
"微调训练": "Entrenamiento de ajuste fino",
|
||||
"怎么切": "Cómo cortar",
|
||||
"总训练轮数total_epoch": "Número total de épocas de entrenamiento",
|
||||
"总训练轮数total_epoch,不建议太高": "Número total de épocas de entrenamiento, no se recomienda demasiado alto",
|
||||
"打标工具WebUI已关闭": "Interfaz web de la herramienta de etiquetado cerrada",
|
||||
"打标工具WebUI已开启": "Interfaz web de la herramienta de etiquetado iniciada",
|
||||
"打标工具进程输出信息": "Información de salida del proceso de la herramienta de etiquetado",
|
||||
"指定输出主人声文件夹": "Especificar carpeta de salida de voz principal",
|
||||
"指定输出非主人声文件夹": "Especificar carpeta de salida de no voz principal",
|
||||
"按中文句号。切": "Cortar según puntos en chino",
|
||||
"按标点符号切": "Cortar según los signos de puntuación",
|
||||
"按英文句号.切": "Cortar por puntos en inglés.",
|
||||
"推理": "Inferencia",
|
||||
"推理设置": "Configuración de inferencia",
|
||||
"提取文本Bert特征": "Extraer características de texto con BERT",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Agrupación de datos (Reduce el costo computacional en inferencia paralela)",
|
||||
"数据类型精度": "precisión del tipo de datos",
|
||||
"文本分词与特征提取": "Segmentación de texto y extracción de características",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Herramienta de segmentación de texto. Un texto demasiado largo puede no producir buenos resultados, por lo que se recomienda segmentarlo. La síntesis se realizará por separado según los saltos de línea y luego se unirá.",
|
||||
"文本模块学习率权重": "Peso de la tasa de aprendizaje del módulo de texto",
|
||||
"文本进程输出信息": "Información de salida del proceso de obtención de texto",
|
||||
"施工中,请静候佳音": "En construcción, por favor espere pacientemente",
|
||||
"日文": "Japonés",
|
||||
"日英混合": "Mezcla de japonés e inglés",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "¿Guardar solo el último archivo ckpt para ahorrar espacio en disco?",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "¿Guardar solo el último archivo de pesos más reciente para ahorrar espacio en disco?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "¿Guardar el modelo final pequeño en la carpeta de pesos en cada punto de guardado?",
|
||||
"是否开启dpo训练选项(实验性)": "¿Habilitar la opción de entrenamiento dpo (experimental)?",
|
||||
"是否开启DPO训练选项(实验性)": "¿Habilitar la opción de entrenamiento dpo (experimental)?",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "¿Ajustar directamente la velocidad del habla y el tono del último resultado de síntesis? Para prevenir la aleatoriedad.",
|
||||
"显卡信息": "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.",
|
||||
"未下载模型": "Modelo no descargado",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "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.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Ruta del archivo de anotaciones (con extensión *.list)",
|
||||
"模型": "Modelo",
|
||||
"模型分为三类:": "Los modelos se dividen en tres categorías:",
|
||||
"模型切换": "Cambio de modelo",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Versión",
|
||||
"粤英混合": "Mezcla Cantonés-Inglés",
|
||||
"粤语": "Cantonés",
|
||||
"终止ASR进程": "Terminar el proceso ASR",
|
||||
"终止GPT训练": "Detener entrenamiento de GPT",
|
||||
"终止SSL提取进程": "Terminar el proceso de extracción SSL",
|
||||
"终止SoVITS训练": "Detener entrenamiento de SoVITS",
|
||||
"终止一键三连": "Terminar el proceso de un solo paso de formateo",
|
||||
"终止合成": "Terminar síntesis",
|
||||
"终止文本获取进程": "Terminar el proceso de obtención de texto",
|
||||
"终止语义token提取进程": "Terminar el proceso de extracción de tokens semánticos",
|
||||
"终止语音切割": "Terminar la división de voz",
|
||||
"终止语音降噪进程": "Terminar el proceso de reducción de ruido de voz",
|
||||
"缺少Hubert数据集": "Falta el Conjunto de Datos de Hubert",
|
||||
"缺少语义数据集": "Falta el Conjunto de Datos Semánticos",
|
||||
"缺少音素数据集": "Falta el Conjunto de Datos de Fonemas",
|
||||
"缺少音频数据集": "Falta el Conjunto de Datos de Audio",
|
||||
"英文": "Inglés",
|
||||
"语义token提取进程输出信息": "Información de salida del proceso de extracción de tokens semánticos",
|
||||
"训练集格式化一键三连": "Formato del conjunto de entrenamiento en un solo paso",
|
||||
"训练集格式化工具": "Herramienta de formateo del conjunto de datos de entrenamiento",
|
||||
"语义Token提取": "Extracción de tokens semánticos",
|
||||
"语速": "Velocidad de habla",
|
||||
"语速调整,高为更快": "Ajustar la velocidad de habla, más alta para más rápido",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "El ajuste de velocidad de voz no es compatible con el procesamiento por lotes, se ha deshabilitado automáticamente",
|
||||
"语音切割进程输出信息": "Información de salida del proceso de división de voz",
|
||||
"语音降噪进程输出信息": "Información de salida del proceso de reducción de ruido de voz",
|
||||
"语音切分": "Segmentación de voz",
|
||||
"语音切分工具": "Herramienta de división de voz",
|
||||
"语音文本校对标注工具": "Herramienta de corrección y anotación de texto de voz",
|
||||
"语音自监督特征提取": "Extracción de características de voz con auto-supervisión",
|
||||
"语音识别": "Reconocimiento de voz",
|
||||
"语音识别工具": "Herramienta de reconocimiento de voz",
|
||||
"语音降噪": "Reducción de ruido en la voz",
|
||||
"语音降噪工具": "Herramienta de reducción de ruido de voz",
|
||||
"请上传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",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Audio de referencia secundario (Opcional, se pueden seleccionar varios o ninguno)",
|
||||
"输入待处理音频文件夹路径": "Ingrese la ruta de la carpeta de audio a procesar",
|
||||
"输入文件夹路径": "Ingrese la ruta de la carpeta",
|
||||
"输入路径不存在": "La ruta de entrada no existe",
|
||||
"输入路径存在但不可用": "La ruta de entrada existe pero no es accesible",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Debe haber archivos y carpetas que comiencen con 23456 en el directorio logs/nombre del experimento",
|
||||
"输出信息": "Información de salida",
|
||||
"输出文件夹路径": "Ruta de la carpeta de salida",
|
||||
"输出的语音": "Audio de salida",
|
||||
"运行中": " En ejecución",
|
||||
"进度": "Progreso",
|
||||
"进程已终止": " Proceso terminado",
|
||||
"进程输出信息": " Información de salida del proceso",
|
||||
"选择训练完存放在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.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Pasos de muestreo: si se siente ruidoso, intente aumentarlo; si es lento, intente reducirlo",
|
||||
"重复惩罚": "Penalización por repetición",
|
||||
"降噪结果输出文件夹": "Carpeta de salida de los resultados de reducción de ruido",
|
||||
"降噪音频文件输入文件夹": "Carpeta de entrada de archivos de audio para reducción de ruido",
|
||||
"随机种子": "Semilla aleatoria",
|
||||
"需先终止才能开启下一次任务": " Debe terminarse antes de iniciar la siguiente tarea",
|
||||
"需要合成的切分前文本": "Texto antes de la segmentación para la síntesis",
|
||||
"需要合成的文本": "Texto a sintetizar",
|
||||
"需要合成的文本的语种": "Idioma del texto a sintetizar",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Mezcla Coreano-Inglés",
|
||||
"音频加载失败": "Error al Cargar el Audio",
|
||||
"音频文件不存在,跳过:": "Archivo de audio no encontrado, omitiendo: ",
|
||||
"音频标注WebUI": "WebUI de etiquetado de audio",
|
||||
"音频自动切分输入路径,可文件可文件夹": "Ruta de entrada para la división automática de audio, puede ser un archivo o una carpeta",
|
||||
"预训练的GPT模型路径": "Ruta del modelo GPT preentrenado",
|
||||
"预训练的SSL模型路径": "Ruta del modelo SSL preentrenado",
|
||||
"预训练的SoVITS-D模型路径": "Ruta del modelo SoVITS-D preentrenado",
|
||||
"预训练的SoVITS-G模型路径": "Ruta del modelo SoVITS-G preentrenado",
|
||||
"预训练的中文BERT模型路径": "Ruta del modelo BERT en chino preentrenado"
|
||||
"音频超分中": "Superresolución de audio en proceso",
|
||||
"预训练GPT模型路径": "Ruta del modelo GPT preentrenado",
|
||||
"预训练SSL模型路径": "Ruta del modelo SSL preentrenado",
|
||||
"预训练SoVITS-D模型路径": "Ruta del modelo SoVITS-D preentrenado",
|
||||
"预训练SoVITS-G模型路径": "Ruta del modelo SoVITS-G preentrenado",
|
||||
"预训练中文BERT模型路径": "Ruta del modelo BERT en Chino preentrenado"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(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",
|
||||
"*SoVITS模型列表": "*Liste des modèles SoVITS",
|
||||
"*实验/模型名": "*Nom de l'expérience/modèle",
|
||||
"*文本标注文件": "*Fichier d'annotation de texte",
|
||||
"*训练集音频文件目录": "*Répertoire des fichiers audio d'entraînement",
|
||||
"*请上传并填写参考信息": "*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",
|
||||
".限制范围越小判别效果越好。": "Moins il y a de langues, mieux c'est",
|
||||
"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",
|
||||
"0b-语音切分工具": "0b-Outil de découpage vocal",
|
||||
"0bb-语音降噪工具": "0bb-Outil de réduction du bruit vocal",
|
||||
"0c-中文批量离线ASR工具": "0c-Outil chinois de transcription automatique hors ligne en masse",
|
||||
"0d-语音文本校对标注工具": "0d-Outil de correction et d'annotation de texte vocal",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Outil de formatage du jeu de données d'entraînement",
|
||||
"1Aa-文本内容": "1Aa-Contenu du texte",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-Formatage en un clic du jeu de données d'entraînement",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-Extraction de caractéristiques auto-supervisée SSL",
|
||||
"1Ac-语义token提取": "1Ac-Extraction de jetons sémantiques",
|
||||
"1B-微调训练": "1B-Entraînement fin",
|
||||
"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.",
|
||||
"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",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "Modèle ASR",
|
||||
"ASR 模型尺寸": "Taille du modèle ASR",
|
||||
"ASR 语言设置": "Paramètres de langue ASR",
|
||||
"ASR进程输出信息": "Informations de processus ASR",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "Entraînement GPT : les poids du modèle sont dans GPT_weights/",
|
||||
"GPT模型列表": "Liste des modèles GPT",
|
||||
"GPT训练进程输出信息": "Informations de processus d'entraînement GPT",
|
||||
"GPT训练": "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卡号以-分割,每个卡号一个进程": "Numéro de carte GPU séparé par des tirets, un processus par numéro de carte",
|
||||
"SSL进程输出信息": "Informations de processus SSL",
|
||||
"LoRA秩": "Rang LoRA",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "Modèle de base SoVITS V3 manquant, impossible de charger les poids LoRA correspondants",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "Entraînement SoVITS : les poids du modèle sont dans SoVITS_weights/",
|
||||
"SoVITS模型列表": "Liste des modèles SoVITS",
|
||||
"SoVITS训练进程输出信息": "Informations de processus d'entraînement SoVITS",
|
||||
"TTS推理WebUI进程输出信息": "Informations de processus de l'interface Web d'inférence TTS",
|
||||
"TTS推理进程已关闭": "Le processus d'inférence TTS est terminé",
|
||||
"TTS推理进程已开启": "Le processus d'inférence TTS est en cours",
|
||||
"UVR5已关闭": "UVR5 est désactivé",
|
||||
"UVR5已开启": "UVR5 est activé",
|
||||
"UVR5进程输出信息": "Informations de processus UVR5",
|
||||
"SoVITS训练": "Entraînement SoVITS",
|
||||
"TTS推理WebUI": "Interface Web d'inférence TTS",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "Outil UVR5 de séparation voix/accompagnement & suppression de réverbération et de latence",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: proportion d'audio normalisé mélangé",
|
||||
"batch_size": "Taille de lot",
|
||||
"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)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "seuil: le volume inférieur à cette valeur est considéré comme un point de coupe silencieux alternatif",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "Informations de processus de l'un clic trois connexions",
|
||||
"v3暂不支持该模式,使用了会报错。": "Le mode n'est pas encore supporté par la v3. Une erreur se produira en cas d'utilisation.",
|
||||
"v3输出如果觉得闷可以试试开超分": "Si la sortie v3 semble étouffée, essayez l'upscaling",
|
||||
"不切": "Pas de découpe",
|
||||
"中文": "Chinois",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentation du tutoriel en chinois:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Documentation du tutoriel en chinois",
|
||||
"中英混合": "Mélange de chinois et d'anglais",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Audio de référence principal (Veuillez télécharger un audio de référence entre 3 et 10 secondes, dépasser cette limite entraînera une erreur !)",
|
||||
"主参考音频的文本": "Texte de l’audio de référence principal",
|
||||
"主参考音频的语种": "Langue de l’audio de référence principal",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "Également possible d'entrer en lot des fichiers audio, au choix, privilégiez la lecture du dossier",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Traitement par lot de séparation voix-accompagnement en utilisant le modèle UVR5.",
|
||||
"人声分离WebUI": "Interface Web de séparation des voix",
|
||||
"人声提取激进程度": "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",
|
||||
"使用无参考文本模式时建议使用微调的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.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Il est recommandé d’utiliser un GPT ajusté pour le mode sans texte de référence. Si l’audio de référence est incompréhensible ou si vous ne savez pas quoi écrire, activez cette option pour ignorer le texte de référence.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "Vous n'avez pas téléchargé les paramètres du modèle d'upscaling, donc l'upscaling ne sera pas effectué. Veuillez suivre le tutoriel pour télécharger les fichiers nécessaires",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "Il est recommandé d'utiliser un GPT finement ajusté lors de l'utilisation du mode sans texte de référence.",
|
||||
"保存频率save_every_epoch": "Fréquence de sauvegarde (sauvegarder à chaque époque)",
|
||||
"保持随机": "Garder aléatoire",
|
||||
"关闭TTS推理WebUI": "Fermer TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "Fermer UVR5-WebUI",
|
||||
"关闭打标WebUI": "Fermer Labeling WebUI",
|
||||
"关闭": "Fermer ",
|
||||
"凑50字一切": "Assembler 50 mots tout",
|
||||
"凑四句一切": "Composez quatre phrases pour tout remplir",
|
||||
"分桶处理模式已关闭": "Mode de traitement par regroupement désactivé",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "Nombre de processus utilisés pour le découpage",
|
||||
"刷新模型路径": "Actualiser le chemin du modèle",
|
||||
"前端处理后的文本(每句):": "Texte après traitement frontal (par phrase):",
|
||||
"前置数据集获取工具": "Outil de récupération des ensembles de données",
|
||||
"占用中": " Occupé",
|
||||
"去混响/去延迟,附:": "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",
|
||||
"参考音频的语种": "Langue de l'audio de référence",
|
||||
"句间停顿秒数": "Temps de pause entre les phrases (secondes)",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "Optionnel : Téléchargez plusieurs fichiers audio de référence en les faisant glisser (recommandé d'être du même genre) et fusionnez leur tonalité. Si cette option est laissée vide, la tonalité sera contrôlée par l'unique fichier audio de référence à gauche. Si vous ajustez le modèle, il est recommandé que tous les fichiers audio de référence aient des tonalités dans l'ensemble d'entraînement d'ajustement ; le modèle pré-entrainé peut être ignoré.",
|
||||
"合成语音": "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).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "Le support pour la conversion phonémique, l’édition manuelle des phonèmes et la synthèse vocale par étapes sera ajouté ultérieurement.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "Si vous ne comprenez pas bien l'audio de référence (vous ne savez pas quoi écrire), vous pouvez activer cette option. Une fois activée, le texte de référence sera ignoré.",
|
||||
"启用并行推理版本": "Activer la version d’inférence parallèle",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-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)",
|
||||
"失败": " Échec",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "Si vous n'acceptez pas ces conditions, vous ne pouvez ni utiliser ni citer aucun code ou fichier du package logiciel. Voir LICENSE à la racine.",
|
||||
"实际输入的参考文本:": "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",
|
||||
"已关闭": " Fermé",
|
||||
"已完成": " Terminé",
|
||||
"已开启": " Activé",
|
||||
"并行推理": "Inférence parallèle",
|
||||
"并行推理模式已关闭": "Mode d’inférence parallèle désactivé",
|
||||
"并行推理模式已开启": "Mode d’inférence parallèle activé",
|
||||
"开启GPT训练": "Activer l'entraînement GPT",
|
||||
"开启SSL提取": "Activer l'extraction SSL",
|
||||
"开启SoVITS训练": "Activer l'entraînement SoVITS",
|
||||
"开启TTS推理WebUI": "Ouvrir TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "Ouvrir UVR5-WebUI",
|
||||
"开启一键三连": "Activer l'un clic trois connexions",
|
||||
"开启打标WebUI": "Ouvrir Labeling WebUI",
|
||||
"开启文本获取": "Activer l'extraction de texte",
|
||||
"开启": "Activer ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Activer le mode sans texte de référence. Laisser le texte de référence vide équivaut également à activer le mode.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Activer le mode sans texte de référence. Ne pas remplir le texte de référence revient à activer ce mode. v3 ne prend pas encore en charge ce mode et l’utiliser entraînera une erreur.",
|
||||
"开启离线批量ASR": "Activer la transcription automatique hors ligne en masse",
|
||||
"开启语义token提取": "Activer l'extraction de jetons sémantiques",
|
||||
"开启语音切割": "Activer le découpage vocal",
|
||||
"开启语音降噪": "Activer la réduction de bruit vocal",
|
||||
"微调训练": "Entraînement de fine-tuning",
|
||||
"怎么切": "Comment découper",
|
||||
"总训练轮数total_epoch": "Nombre total d'époques d'entraînement",
|
||||
"总训练轮数total_epoch,不建议太高": "Nombre total d'époques d'entraînement, pas recommandé d'être trop élevé",
|
||||
"打标工具WebUI已关闭": "L'interface Web de l'outil d'annotation est terminée",
|
||||
"打标工具WebUI已开启": "L'interface Web de l'outil d'annotation est en cours",
|
||||
"打标工具进程输出信息": "Informations de processus de l'outil d'annotation",
|
||||
"指定输出主人声文件夹": "Spécifier le dossier de sortie pour la voix principale",
|
||||
"指定输出非主人声文件夹": "Spécifier le dossier de sortie pour la non-voix principale",
|
||||
"按中文句号。切": "Couper selon les points en chinois.",
|
||||
"按标点符号切": "Couper selon les signes de ponctuation",
|
||||
"按英文句号.切": "Découpez par des points en anglais",
|
||||
"推理": "Inférence",
|
||||
"推理设置": "Paramètres d’inférence",
|
||||
"提取文本Bert特征": "Extraire les caractéristiques du texte avec BERT",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Regroupement des données (Réduit le coût de calcul en inférence parallèle)",
|
||||
"数据类型精度": "précision du type de données",
|
||||
"文本分词与特征提取": "Segmentation et extraction de caractéristiques du texte",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Outil de segmentation de texte. Un texte trop long peut donner un mauvais résultat, il est donc recommandé de le segmenter. La synthèse se fera selon les sauts de ligne puis sera assemblée.",
|
||||
"文本模块学习率权重": "Poids du taux d'apprentissage du module de texte",
|
||||
"文本进程输出信息": "Informations de processus de texte",
|
||||
"施工中,请静候佳音": "En construction, veuillez attendre patiemment",
|
||||
"日文": "Japonais",
|
||||
"日英混合": "Mélange Japonais-Anglais",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "Sauvegarder uniquement le dernier fichier ckpt pour économiser de l'espace disque",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "Faut-il ne conserver que les derniers fichiers de poids pour économiser de l'espace disque ?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Sauvegarder le petit modèle final dans le dossier weights à chaque point de sauvegarde",
|
||||
"是否开启dpo训练选项(实验性)": "Activer l'option d'entraînement DPO (expérimental)",
|
||||
"是否开启DPO训练选项(实验性)": "Activer l'option d'entraînement DPO (expérimental) ?",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "Ajuster la vitesse de parole et la tonalité du dernier résultat de synthèse pour prévenir l'aléatoire.",
|
||||
"显卡信息": "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.",
|
||||
"未下载模型": "Modèle non téléchargé",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "Ce logiciel est open-source sous licence MIT. L'auteur n'exerce aucun contrôle sur le logiciel. L'utilisateur et toute personne diffusant les sorties audio générées sont entièrement responsables.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Chemin du fichier d'annotation (avec l'extension *.list)",
|
||||
"模型": "Modèle",
|
||||
"模型分为三类:": "Les modèles sont classés en trois catégories:",
|
||||
"模型切换": "Changement de modèle",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Version",
|
||||
"粤英混合": "Mélange Cantonais-Anglais",
|
||||
"粤语": "Cantonais",
|
||||
"终止ASR进程": "Arrêter le processus ASR",
|
||||
"终止GPT训练": "Arrêter l'entraînement GPT",
|
||||
"终止SSL提取进程": "Arrêter le processus d'extraction SSL",
|
||||
"终止SoVITS训练": "Arrêter l'entraînement SoVITS",
|
||||
"终止一键三连": "Arrêter l'un clic trois connexions",
|
||||
"终止合成": "Terminer la synthèse",
|
||||
"终止文本获取进程": "Arrêter le processus d'extraction de texte",
|
||||
"终止语义token提取进程": "Arrêter le processus d'extraction de jetons sémantiques",
|
||||
"终止语音切割": "Arrêter le découpage vocal",
|
||||
"终止语音降噪进程": "Arrêter le processus de réduction du bruit vocal",
|
||||
"缺少Hubert数据集": "Jeu de Données Hubert Manquant",
|
||||
"缺少语义数据集": "Jeu de Données Sémantiques Manquant",
|
||||
"缺少音素数据集": "Jeu de Données de Phonèmes Manquant",
|
||||
"缺少音频数据集": "Jeu de Données Audio Manquant",
|
||||
"英文": "Anglais",
|
||||
"语义token提取进程输出信息": "Informations de processus d'extraction de jetons sémantiques",
|
||||
"训练集格式化一键三连": "Formatage de l'ensemble d'entraînement en un clic",
|
||||
"训练集格式化工具": "Outil de formatage des ensembles d'entraînement",
|
||||
"语义Token提取": "Extraction de tokens sémantiques",
|
||||
"语速": "Débit de parole",
|
||||
"语速调整,高为更快": "Ajuster la vitesse de parole, plus élevée pour plus rapide",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "Le réglage de la vitesse vocale ne prend pas en charge le regroupement des données, désactivation automatique",
|
||||
"语音切割进程输出信息": "Informations de processus de découpage vocal",
|
||||
"语音降噪进程输出信息": "Informations de sortie du processus de réduction du bruit vocal",
|
||||
"语音切分": "Segmentation vocale",
|
||||
"语音切分工具": "Outil de segmentation vocale",
|
||||
"语音文本校对标注工具": "Outil d'annotation et de correction des transcriptions vocales",
|
||||
"语音自监督特征提取": "Extraction de caractéristiques auto-supervisée pour l'audio",
|
||||
"语音识别": "Reconnaissance vocale",
|
||||
"语音识别工具": "Outil de reconnaissance vocale",
|
||||
"语音降噪": "Réduction du bruit audio",
|
||||
"语音降噪工具": "Outil de réduction du bruit audio",
|
||||
"请上传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",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Audio de référence secondaire (Facultatif, plusieurs possibles ou aucun)",
|
||||
"输入待处理音频文件夹路径": "Entrez le chemin du dossier audio à traiter",
|
||||
"输入文件夹路径": "Chemin du dossier à entrer",
|
||||
"输入路径不存在": "Le chemin d'entrée n'existe pas",
|
||||
"输入路径存在但不可用": "Le chemin d'entrée existe mais est inutilisable",
|
||||
"输出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",
|
||||
"输出文件夹路径": "Chemin du dossier de sortie",
|
||||
"输出的语音": "Audio de sortie",
|
||||
"运行中": " en cours d'exécution",
|
||||
"进度": "Progression",
|
||||
"进程已终止": " Processus terminé",
|
||||
"进程输出信息": " Sortie du processus",
|
||||
"选择训练完存放在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.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Nombre d’étapes d’échantillonnage : si le son est bruité, essayez d’augmenter, si c’est lent, essayez de réduire",
|
||||
"重复惩罚": "Pénalité de répétition",
|
||||
"降噪结果输出文件夹": "Dossier de sortie des résultats de réduction du bruit",
|
||||
"降噪音频文件输入文件夹": "Dossier d'entrée des fichiers audio de réduction du bruit",
|
||||
"随机种子": "Graine aléatoire",
|
||||
"需先终止才能开启下一次任务": "Il faut d'abord arrêter le processus avant de lancer une nouvelle tâche",
|
||||
"需要合成的切分前文本": "Texte avant segmentation pour la synthèse",
|
||||
"需要合成的文本": "Texte à synthétiser",
|
||||
"需要合成的文本的语种": "Langue du texte à synthétiser",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Mezcla Coreano-Inglés",
|
||||
"音频加载失败": "Échec du Chargement de l'Audio",
|
||||
"音频文件不存在,跳过:": "Fichier audio introuvable, passage : ",
|
||||
"音频标注WebUI": "Interface Web d'annotation audio",
|
||||
"音频自动切分输入路径,可文件可文件夹": "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é",
|
||||
"预训练的SSL模型路径": "Chemin du modèle SSL pré-entraîné",
|
||||
"预训练的SoVITS-D模型路径": "Chemin du modèle SoVITS-D pré-entraîné",
|
||||
"预训练的SoVITS-G模型路径": "Chemin du modèle SoVITS-G pré-entraîné",
|
||||
"预训练的中文BERT模型路径": "Chemin du modèle BERT chinois pré-entraîné"
|
||||
"音频超分中": "Upscaling audio en cours",
|
||||
"预训练GPT模型路径": "Chemin du modèle GPT pré-entraîné",
|
||||
"预训练SSL模型路径": "Chemin du modèle SSL pré-entraîné",
|
||||
"预训练SoVITS-D模型路径": "Chemin du modèle SoVITS-D pré-entraîné",
|
||||
"预训练SoVITS-G模型路径": "Chemin du modèle SoVITS-G pré-entraîné",
|
||||
"预训练中文BERT模型路径": "Chemin du modèle BERT chinois pré-entraîné"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(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",
|
||||
"*SoVITS模型列表": "*Lista dei modelli SoVITS",
|
||||
"*实验/模型名": "*Nome dell'esperimento/modello",
|
||||
"*文本标注文件": "*File di annotazione del testo",
|
||||
"*训练集音频文件目录": "*Directory dei file audio del set di addestramento",
|
||||
"*请上传并填写参考信息": "*Carica e compila le informazioni di riferimento",
|
||||
"*请填写需要合成的目标文本和语种模式": "*Si prega di inserire il testo di destinazione da sintetizzare e la modalità lingua",
|
||||
".list标注文件的路径": "Percorso del file di annotazione .list",
|
||||
".限制范围越小判别效果越好。": "Meno multilingue è meglio",
|
||||
"0-前置数据集获取工具": "0-Strumento di acquisizione del dataset preliminare",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Strumento di separazione voce e accompagnamento UVR5 & Rimozione riverbero e ritardo",
|
||||
"0b-语音切分工具": "0b-Strumento di segmentazione vocale",
|
||||
"0bb-语音降噪工具": "0bb-Strumento di riduzione del rumore vocale",
|
||||
"0c-中文批量离线ASR工具": "0c-Strumento di ASR offline batch in cinese",
|
||||
"0d-语音文本校对标注工具": "0d-Strumento di correzione e annotazione testo vocale",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Strumento di formattazione del set di addestramento",
|
||||
"1Aa-文本内容": "1Aa-Contenuto del testo",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-Strumento di formattazione del set di addestramento con tre passaggi",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-Estrazione di caratteristiche auto-supervisionata SSL",
|
||||
"1Ac-语义token提取": "1Ac-Estrazione del token semantico",
|
||||
"1B-微调训练": "1B-Allenamento di affinamento",
|
||||
"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.",
|
||||
"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",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "Modello ASR",
|
||||
"ASR 模型尺寸": "Dimensioni del modello ASR",
|
||||
"ASR 语言设置": "Impostazioni linguistiche ASR",
|
||||
"ASR进程输出信息": "Informazioni sull'output del processo ASR",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "Addestramento GPT: i pesi del modello sono in GPT_weights/",
|
||||
"GPT模型列表": "Elenco dei modelli GPT",
|
||||
"GPT训练进程输出信息": "Informazioni sull'output del processo di allenamento di GPT",
|
||||
"GPT训练": "Addestramento 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卡号以-分割,每个卡号一个进程": "Numero di GPU separati da '-'; ogni numero corrisponde a un processo",
|
||||
"SSL进程输出信息": "Informazioni sull'output del processo SSL",
|
||||
"LoRA秩": "Rango LoRA",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "Modello base SoVITS V3 mancante, impossibile caricare i pesi LoRA corrispondenti",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "Addestramento SoVITS: i pesi del modello sono in SoVITS_weights/",
|
||||
"SoVITS模型列表": "Elenco dei modelli 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推理进程已关闭": "Il processo di inferenza TTS è stato chiuso",
|
||||
"TTS推理进程已开启": "Il processo di inferenza TTS è stato avviato",
|
||||
"UVR5已关闭": "UVR5 è disattivato",
|
||||
"UVR5已开启": "UVR5 è attivato",
|
||||
"UVR5进程输出信息": "Informazioni sull'output del processo UVR5",
|
||||
"SoVITS训练": "Addestramento SoVITS",
|
||||
"TTS推理WebUI": "Interfaccia Web per inferenza TTS",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "Strumento UVR5 per separazione voce/accompagnamento & rimozione riverbero e latenza",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: Quanta proporzione dell'audio normalizzato deve essere miscelata",
|
||||
"batch_size": "Dimensione del batch",
|
||||
"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)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "threshold: Punto di taglio alternativo considerato silenzioso se il volume è inferiore a questo valore",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "Informazioni sull'output del processo di 'One Click Three Connect'",
|
||||
"v3暂不支持该模式,使用了会报错。": "V3 non supporta questa modalità, utilizzarla genererà un errore.",
|
||||
"v3输出如果觉得闷可以试试开超分": "Se l'output v3 sembra ovattato, prova ad attivare il super-risoluzione",
|
||||
"不切": "Nessuna suddivisione",
|
||||
"中文": "Cinese",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentazione del tutorial in cinese:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Documentazione del tutorial in cinese",
|
||||
"中英混合": "Cinese e inglese misti",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Audio di riferimento principale (Si prega di caricare un audio di riferimento tra 3 e 10 secondi, superato questo limite si verificherà un errore!)",
|
||||
"主参考音频的文本": "Testo dell'audio di riferimento principale",
|
||||
"主参考音频的语种": "Lingua dell'audio di riferimento principale",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "È possibile anche inserire file audio in batch, una delle due opzioni, con priorità alla lettura della cartella",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Separazione voce-accompagnamento in batch, utilizza il modello UVR5.",
|
||||
"人声分离WebUI": "Interfaccia Web per separazione vocale",
|
||||
"人声提取激进程度": "Grado di aggressività dell'estrazione vocale",
|
||||
"以下文件或文件夹不存在": "Nessun File o Cartella di Questo Tipo",
|
||||
"以下模型不存在:": "Nessun Modello del Genere:",
|
||||
"伴奏人声分离&去混响&去回声": "Separazione tra accompagnamento e voce & Rimozione dell'eco & Rimozione dell'eco",
|
||||
"使用无参考文本模式时建议使用微调的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.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Si consiglia di usare un GPT fine-tuned quando si usa la modalità senza testo di riferimento. Se l'audio di riferimento non è chiaro o non sai cosa scrivere, abilita questa opzione per ignorare il testo di riferimento.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "Non hai scaricato i parametri del modello di super-risoluzione, quindi l'upscaling non verrà eseguito. Segui il tutorial per scaricare i file necessari.",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "Si consiglia di usare un GPT fine-tuned quando si usa la modalità senza testo di riferimento.",
|
||||
"保存频率save_every_epoch": "Frequenza di salvataggio ogni epoca",
|
||||
"保持随机": "Mantieni casuale",
|
||||
"关闭TTS推理WebUI": "Chiudere TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "Chiudere UVR5-WebUI",
|
||||
"关闭打标WebUI": "Chiudere Labeling WebUI",
|
||||
"关闭": "Chiudi ",
|
||||
"凑50字一切": "Riempire con 50 caratteri per tutto",
|
||||
"凑四句一切": "Riempire con quattro frasi per tutto",
|
||||
"分桶处理模式已关闭": "Modalità di elaborazione per bucket disabilitata",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "Numero di processi utilizzati per il taglio",
|
||||
"刷新模型路径": "Aggiorna il percorso del modello",
|
||||
"前端处理后的文本(每句):": "Testo elaborato dal front-end (per frase):",
|
||||
"前置数据集获取工具": "Strumento per acquisizione dataset",
|
||||
"占用中": " Occupato",
|
||||
"去混响/去延迟,附:": "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",
|
||||
"参考音频的语种": "Lingua dell'audio di riferimento",
|
||||
"句间停顿秒数": "Durata pausa tra le frasi (secondi)",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "Opzionale: Carica più file audio di riferimento trascinandoli (si consiglia dello stesso genere) e media il loro tono. Se questa opzione è lasciata vuota, il tono sarà controllato dal singolo file audio di riferimento a sinistra. Se si sta perfezionando il modello, è consigliato che tutti i file audio di riferimento abbiano toni presenti nel set di addestramento per il perfezionamento; il modello pre-addestrato può essere ignorato.",
|
||||
"合成语音": "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).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "In futuro verrà aggiunto il supporto per la conversione dei fonemi, la modifica manuale dei fonemi e la sintesi vocale passo dopo passo.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "Se l'audio di riferimento non è chiaro o non sai cosa scrivere, abilita questa opzione per ignorare il testo di riferimento.",
|
||||
"启用并行推理版本": "Abilita versione di inferenza parallela",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-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)",
|
||||
"失败": " Fallito",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "Se non accetti questi termini, non puoi utilizzare né citare alcun codice o file del pacchetto software. Vedi LICENSE nella directory principale.",
|
||||
"实际输入的参考文本:": "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",
|
||||
"已关闭": " Chiuso",
|
||||
"已完成": " Completato",
|
||||
"已开启": " Attivato",
|
||||
"并行推理": "Inferenza parallela",
|
||||
"并行推理模式已关闭": "Modalità di inferenza parallela disabilitata",
|
||||
"并行推理模式已开启": "Modalità di inferenza parallela abilitata",
|
||||
"开启GPT训练": "Attivare l'allenamento di GPT",
|
||||
"开启SSL提取": "Attivare l'estrazione SSL",
|
||||
"开启SoVITS训练": "Attivare l'allenamento di SoVITS",
|
||||
"开启TTS推理WebUI": "Aprire TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "Aprire UVR5-WebUI",
|
||||
"开启一键三连": "Attivare la formattazione con tre passaggi",
|
||||
"开启打标WebUI": "Aprire Labeling WebUI",
|
||||
"开启文本获取": "Attivare l'estrazione del testo",
|
||||
"开启": "Attiva ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Attivare la modalità senza testo di riferimento. Anche se non inserisci un testo di riferimento, la modalità verrà attivata.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Abilita modalità senza testo di riferimento. Non compilare il campo del testo di riferimento equivale ad abilitarla. V3 non supporta questa modalità, utilizzarla genererà un errore.",
|
||||
"开启离线批量ASR": "Attivare ASR offline batch",
|
||||
"开启语义token提取": "Attivare l'estrazione del token semantico",
|
||||
"开启语音切割": "Attivare la segmentazione vocale",
|
||||
"开启语音降噪": "Attivare la riduzione del rumore vocale",
|
||||
"微调训练": "Addestramento fine-tuning",
|
||||
"怎么切": "Come tagliare",
|
||||
"总训练轮数total_epoch": "Numero totale di epoche di addestramento",
|
||||
"总训练轮数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 avviata",
|
||||
"打标工具进程输出信息": "Informazioni sull'output del processo di annotazione",
|
||||
"指定输出主人声文件夹": "Specifica la cartella di output per la voce principale",
|
||||
"指定输出非主人声文件夹": "Specifica la cartella di output per la non voce principale",
|
||||
"按中文句号。切": "Taglia secondo il punto cinese.",
|
||||
"按标点符号切": "Taglia secondo i segni di punteggiatura",
|
||||
"按英文句号.切": "Taglia secondo il punto inglese",
|
||||
"推理": "Inferenza",
|
||||
"推理设置": "Impostazioni di inferenza",
|
||||
"提取文本Bert特征": "Estrai caratteristiche Bert dal testo",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Raggruppamento dei dati (Riduce il costo computazionale nell'inferenza parallela)",
|
||||
"数据类型精度": "precisione del tipo di dati",
|
||||
"文本分词与特征提取": "Tokenizzazione ed estrazione delle caratteristiche del testo",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Strumento di segmentazione del testo. Testi troppo lunghi potrebbero non dare buoni risultati, quindi si consiglia di segmentarli. La sintesi verrà eseguita separando il testo in base ai ritorni a capo e poi concatenandolo.",
|
||||
"文本模块学习率权重": "Peso del tasso di apprendimento del modulo di testo",
|
||||
"文本进程输出信息": "Informazioni sull'output del processo di estrazione del testo",
|
||||
"施工中,请静候佳音": "In costruzione, attendi pazientemente le buone notizie",
|
||||
"日文": "Giapponese",
|
||||
"日英混合": "Mix giapponese e inglese",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "Salvare solo il file ckpt più recente per risparmiare spazio su disco",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "Salvare solo i file di pesi più recenti per risparmiare spazio su disco?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Salvare il modello finale più piccolo nella cartella weights ad ogni punto di salvataggio",
|
||||
"是否开启dpo训练选项(实验性)": "Attivare l'opzione di addestramento DPO (sperimentale)",
|
||||
"是否开启DPO训练选项(实验性)": "Attivare l'opzione di addestramento DPO (sperimentale)?",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "Regola la velocità del parlato e il tono dell'ultimo risultato di sintesi per prevenire la casualità.",
|
||||
"显卡信息": "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.",
|
||||
"未下载模型": "Modello non scaricato",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "Questo software è open-source sotto licenza MIT. L'autore non esercita alcun controllo sul software. L'utente e chiunque diffonda gli output audio generati sono pienamente responsabili.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Percorso del file di annotazione (con estensione *.list)",
|
||||
"模型": "Modello",
|
||||
"模型分为三类:": "I modelli sono divisi in tre categorie:",
|
||||
"模型切换": "Cambio del modello",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Versione",
|
||||
"粤英混合": "Misto Cantonese-Inglese",
|
||||
"粤语": "Cantonese",
|
||||
"终止ASR进程": "Terminare il processo ASR",
|
||||
"终止GPT训练": "Terminare l'allenamento di GPT",
|
||||
"终止SSL提取进程": "Terminare il processo di estrazione SSL",
|
||||
"终止SoVITS训练": "Terminare l'allenamento di SoVITS",
|
||||
"终止一键三连": "Terminare la formattazione con tre passaggi",
|
||||
"终止合成": "Termina sintesi",
|
||||
"终止文本获取进程": "Terminare il processo di estrazione del testo",
|
||||
"终止语义token提取进程": "Terminare il processo di estrazione del token semantico",
|
||||
"终止语音切割": "Terminare la segmentazione vocale",
|
||||
"终止语音降噪进程": "Termina il processo di riduzione del rumore vocale",
|
||||
"缺少Hubert数据集": "Dataset di Hubert Mancante",
|
||||
"缺少语义数据集": "Dataset Semantico Mancante",
|
||||
"缺少音素数据集": "Dataset di Fonemi Mancante",
|
||||
"缺少音频数据集": "Dataset Audio Mancante",
|
||||
"英文": "Inglese",
|
||||
"语义token提取进程输出信息": "Informazioni sull'output del processo di estrazione del token semantico",
|
||||
"训练集格式化一键三连": "Formattazione del dataset di addestramento in un clic",
|
||||
"训练集格式化工具": "Strumento di formattazione dataset",
|
||||
"语义Token提取": "Estrazione token semantici",
|
||||
"语速": "Velocità della voce",
|
||||
"语速调整,高为更快": "Regolare la velocità della voce, più alta per più veloce",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "Il controllo della velocità del discorso non supporta l'elaborazione per bucket, l'elaborazione per bucket è stata disabilitata automaticamente",
|
||||
"语音切割进程输出信息": "Informazioni sull'output del processo di segmentazione vocale",
|
||||
"语音降噪进程输出信息": "Informazioni sull'output del processo di riduzione del rumore vocale",
|
||||
"语音切分": "Segmentazione vocale",
|
||||
"语音切分工具": "Strumento di segmentazione vocale",
|
||||
"语音文本校对标注工具": "Strumento di annotazione e correzione testi vocali",
|
||||
"语音自监督特征提取": "Estrazione auto-supervisionata delle caratteristiche audio",
|
||||
"语音识别": "Riconoscimento vocale",
|
||||
"语音识别工具": "Strumento di riconoscimento vocale",
|
||||
"语音降噪": "Riduzione del rumore audio",
|
||||
"语音降噪工具": "Strumento di riduzione del rumore audio",
|
||||
"请上传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",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Audio di riferimento secondario (Facoltativo, seleziona più o nessuno)",
|
||||
"输入待处理音频文件夹路径": "Inserisci il percorso della cartella dei file audio da elaborare",
|
||||
"输入文件夹路径": "Inserisci il percorso della cartella",
|
||||
"输入路径不存在": "Il percorso di input non esiste",
|
||||
"输入路径存在但不可用": "Il percorso di input esiste ma non è utilizzabile",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Nella cartella logs/nome dell'esperimento dovrebbero esserci file e cartelle che iniziano con 23456",
|
||||
"输出信息": "Informazioni di output",
|
||||
"输出文件夹路径": "Percorso della cartella di output",
|
||||
"输出的语音": "Audio di output",
|
||||
"运行中": " In esecuzione",
|
||||
"进度": "Avanzamento",
|
||||
"进程已终止": " Processo terminato",
|
||||
"进程输出信息": " Output del processo",
|
||||
"选择训练完存放在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.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Passi di campionamento: se sembra rumoroso, prova a aumentarlo, se è lento, prova a diminuirlo",
|
||||
"重复惩罚": "Penalità di ripetizione",
|
||||
"降噪结果输出文件夹": "Cartella di output dei risultati di riduzione del rumore",
|
||||
"降噪音频文件输入文件夹": "Cartella di input dei file audio per la riduzione del rumore",
|
||||
"随机种子": "Seme casuale",
|
||||
"需先终止才能开启下一次任务": "Devi prima terminare il processo prima di avviare una nuova attività",
|
||||
"需要合成的切分前文本": "Testo prima della segmentazione per la sintesi",
|
||||
"需要合成的文本": "Testo da sintetizzare",
|
||||
"需要合成的文本的语种": "Lingua del testo da sintetizzare",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Misto Coreano-Inglese",
|
||||
"音频加载失败": "Caricamento Audio Fallito",
|
||||
"音频文件不存在,跳过:": "File audio non trovato, salto: ",
|
||||
"音频标注WebUI": "Interfaccia Web per annotazione audio",
|
||||
"音频自动切分输入路径,可文件可文件夹": "Percorso di input per la segmentazione automatica dell'audio, può essere un file o una cartella",
|
||||
"预训练的GPT模型路径": "Percorso del modello preaddestrato GPT",
|
||||
"预训练的SSL模型路径": "Percorso del modello SSL preaddestrato",
|
||||
"预训练的SoVITS-D模型路径": "Percorso del modello preaddestrato SoVITS-D",
|
||||
"预训练的SoVITS-G模型路径": "Percorso del modello preaddestrato SoVITS-G",
|
||||
"预训练的中文BERT模型路径": "Percorso del modello BERT cinese preaddestrato"
|
||||
"音频超分中": "Super-risoluzione audio in corso",
|
||||
"预训练GPT模型路径": "Percorso del modello GPT pre-addestrato",
|
||||
"预训练SSL模型路径": "Percorso del modello SSL pre-addestrato",
|
||||
"预训练SoVITS-D模型路径": "Percorso del modello SoVITS-D pre-addestrato",
|
||||
"预训练SoVITS-G模型路径": "Percorso del modello SoVITS-G pre-addestrato",
|
||||
"预训练中文BERT模型路径": "Percorso del modello BERT cinese pre-addestrato"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):二重チャンネルのリバーブに最適な選択ですが、単一チャンネルのリバーブは除去できません;",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho:遅延効果を除去します。AggressiveはNormalよりも徹底的に除去し、DeReverbは追加でリバーブを除去し、モノラルリバーブを除去できますが、高周波数のプレートリバーブは完全には除去できません。",
|
||||
"*GPT模型列表": "*GPTモデルリスト",
|
||||
"*SoVITS模型列表": "*SoVITSモデルリスト",
|
||||
"*实验/模型名": "*実験/モデル名",
|
||||
"*文本标注文件": "*テキスト注釈ファイル",
|
||||
"*训练集音频文件目录": "*トレーニングデータのオーディオファイルディレクトリ",
|
||||
"*请上传并填写参考信息": "*参照情報をアップロードして記入してください",
|
||||
"*请填写需要合成的目标文本和语种模式": "*合成対象テキストと言語モードを入力してください",
|
||||
".list标注文件的路径": ".listアノテーションファイルのパス",
|
||||
".限制范围越小判别效果越好。": "多言語対応を減らした方が良い",
|
||||
"0-前置数据集获取工具": "0-データセット取得ツールの事前処理",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5ボーカルアカンパニメント分離&リバーブおよびディレイ除去ツール",
|
||||
"0b-语音切分工具": "0b-音声分割ツール",
|
||||
"0bb-语音降噪工具": "0bb-音声ノイズ除去ツール",
|
||||
"0c-中文批量离线ASR工具": "0c-中国語バッチオフラインASRツール",
|
||||
"0d-语音文本校对标注工具": "0d-音声テキストの校正アノテーションツール",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-トレーニングデータのフォーマットツール",
|
||||
"1Aa-文本内容": "1Aa-テキストの内容",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-トレーニングデータのフォーマットワンクリック三連",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSLセルフスーパーバイズ特徴抽出",
|
||||
"1Ac-语义token提取": "1Ac-セマンティックトークン抽出",
|
||||
"1B-微调训练": "1B-ファインチューニングトレーニング",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITSトレーニング。共有用のモデルファイルはSoVITS_weightsディレクトリに出力されます。",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPTトレーニング。共有用のモデルファイルはGPT_weightsディレクトリに出力されます。",
|
||||
"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-ボイスチェンジャー",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR モデル",
|
||||
"ASR 模型尺寸": "ASRモデルサイズ",
|
||||
"ASR 语言设置": "ASR 言語設定",
|
||||
"ASR进程输出信息": "ASRプロセスの出力情報",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT トレーニング: モデルの重みファイルは GPT_weights/ にあります",
|
||||
"GPT模型列表": "GPTモデルリスト",
|
||||
"GPT训练进程输出信息": "GPTトレーニングプロセスの出力情報",
|
||||
"GPT训练": "GPTトレーニング",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT サンプリングパラメーター(参照テキストがない場合はあまり低くしないでください。わからない場合はデフォルトを使用してください):",
|
||||
"GPU卡号,只能填1个整数": "GPU番号、1つの整数しか入力できません",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPUカード番号はハイフンで区切り、各カード番号ごとに1つのプロセスが実行されます",
|
||||
"SSL进程输出信息": "SSLプロセスの出力情報",
|
||||
"LoRA秩": "LoRAランク",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 のベースモデルが不足しているため、対応する LoRA の重みをロードできません",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS トレーニング: モデルの重みファイルは SoVITS_weights/ にあります",
|
||||
"SoVITS模型列表": "SoVITSモデルリスト",
|
||||
"SoVITS训练进程输出信息": "SoVITSトレーニングプロセスの出力情報",
|
||||
"TTS推理WebUI进程输出信息": "TTS推論WebUIプロセスの出力情報",
|
||||
"TTS推理进程已关闭": "TTS推論プロセスが終了しました",
|
||||
"TTS推理进程已开启": "TTS推論プロセスが開始されました",
|
||||
"UVR5已关闭": "UVR5がオフになっています",
|
||||
"UVR5已开启": "UVR5がオンになっています",
|
||||
"UVR5进程输出信息": "UVR5プロセスの出力情報",
|
||||
"SoVITS训练": "SoVITSトレーニング",
|
||||
"TTS推理WebUI": "TTS推論WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5ボーカルアカンパニメント分離&リバーブおよびディレイ除去ツール",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:正規化後のオーディオが入る割合",
|
||||
"batch_size": "バッチサイズ",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size: 音量曲線の計算方法、小さいほど精度が高くなりますが、計算量が増加します(精度が高いほど必ずしも効果が良いわけではありません)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "閾値:この値未満の音量は静音と見なされ、代替のカットポイントとして扱われます",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "ワンクリック三連プロセスの出力情報",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3では現在このモードをサポートしておらず、使用するとエラーが発生します。",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3の出力がこもっていると感じた場合、超解像を試してください",
|
||||
"不切": "切らない",
|
||||
"中文": "中国語",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中国語チュートリアルドキュメント:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "中国語チュートリアルドキュメント",
|
||||
"中英混合": "中英混合",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "プライマリーFERエンス音声(3〜10秒以内の参考音声をアップロードしてください。これを超えるとエラーが発生します!)",
|
||||
"主参考音频的文本": "プライマリーFERエンス音声のテキスト",
|
||||
"主参考音频的语种": "プライマリーFERエンス音声の言語",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "複数のオーディオファイルもインポートできます。フォルダパスが存在する場合、この入力は無視されます。",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "人声と伴奏の分離をバッチ処理で行い、UVR5モデルを使用します。",
|
||||
"人声分离WebUI": "ボーカル分離WebUI",
|
||||
"人声提取激进程度": "人声抽出の積極性",
|
||||
"以下文件或文件夹不存在": "そのようなファイルまたはフォルダは存在しません",
|
||||
"以下模型不存在:": "モデルが存在しません:",
|
||||
"伴奏人声分离&去混响&去回声": "ボーカル/伴奏の分離と残響の除去",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "参考テキストなしモードを使用する場合は、微調整されたGPTの使用をお勧めします。参考音声が聞き取れない場合(何を書けば良いかわからない場合)は、有効にすると、入力した参考テキストを無視します。",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "参照テキストなしモードを使用する際は、微調整されたGPTを推奨めることをお勧びします。参照音声がはっきり、または何を書くかわからない場合は、このオプションを有効にして参照テキストを無視します。",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "超解像モデルのパラメータをダウンロードしていないため、超解像は行われません。超解像を行いたい場合は、まずチュートリアルを参照してファイルをダウンロードしてください",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "参照テキストなしモードを使用する際は、微調整されたGPTを推奨めることをお勧びします。",
|
||||
"保存频率save_every_epoch": "保存頻度save_every_epoch",
|
||||
"保持随机": "ランダムを維持",
|
||||
"关闭TTS推理WebUI": "TTS Inference WebUIを閉じる",
|
||||
"关闭UVR5-WebUI": "UVR5-WebUIを閉じる",
|
||||
"关闭打标WebUI": "ラベリングWebUIを閉じる",
|
||||
"关闭": "閉じる",
|
||||
"凑50字一切": "50文字ずつカット",
|
||||
"凑四句一切": "4つの文で埋める",
|
||||
"分桶处理模式已关闭": "バケット処理モードを無効化",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "分割に使用されるプロセス数",
|
||||
"刷新模型路径": "モデルのパスを更新",
|
||||
"前端处理后的文本(每句):": "フロントエンド処理後のテキスト(文ごと):",
|
||||
"前置数据集获取工具": "前処理データセット取得ツール",
|
||||
"占用中": "使用中",
|
||||
"去混响/去延迟,附:": "残響除去/遅延除去、附:",
|
||||
"参考音频在3~10秒范围外,请更换!": "参照音声が3~10秒の範囲外です。別の音声に変更してください!",
|
||||
"参考音频的文本": "参照オーディオのテキスト",
|
||||
"参考音频的语种": "参照オーディオの言語",
|
||||
"句间停顿秒数": "文間のポーズ秒数",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "オプション:複数の参照オーディオファイルをドラッグ&ドロップしてアップロードし、それらのトーンを平均化します(同性推奨)。このオプションを空白のままにした場合、トーンは左側の単一の参照オーディオによって制御されます。モデルを微調整する場合、すべての参照オーディオファイルが微調整のトレーニングセット内のトーンを持つことをお勧めします。プリトレーニングモデルは無視しても構いません。",
|
||||
"合成语音": "推論を開始",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "適切なフォルダパスの例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华テストサンプル(ファイルマネージャのアドレスバーからコピーしてください)。",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "今後、フォンメ转换、手動フォンメ編集、音声合成のステップバイステップ実行をサポートします。",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "参照音声がはっきり、または何を書くかわからない場合は、このオプションを有効にして参照テキストを無視します。",
|
||||
"启用并行推理版本": "並列推論バージョンを有効化",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "切断後の音声ファイルが格納されているディレクトリを入力してください!読み取り対象の音声ファイルの完全パス = このディレクトリ - 結合 - listファイル内の波形に対応するファイル名(完全パスではありません)。空白の場合、.listファイル内の絶対完全パスを使用します。",
|
||||
"多语种混合": "多言語混合",
|
||||
"多语种混合(粤语)": "多言語混合(粤語)",
|
||||
"失败": "失敗",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "この条件を認めない場合、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はルートディレクトリのLICENSEを参照してください。",
|
||||
"实际输入的参考文本:": "実際に入力された参照テキスト:",
|
||||
"实际输入的目标文本(切句后):": "実際に入力された目標テキスト(文分割後):",
|
||||
"实际输入的目标文本(每句):": "実際に入力された目標テキスト(文ごと):",
|
||||
"实际输入的目标文本:": "実際に入力された目標テキスト:",
|
||||
"导出文件格式": "エクスポートファイル形式",
|
||||
"已关闭": "閉じました",
|
||||
"已完成": "完了しました",
|
||||
"已开启": "有効化しました",
|
||||
"并行推理": "並列推論",
|
||||
"并行推理模式已关闭": "並列推論モードを無効化",
|
||||
"并行推理模式已开启": "並列推論モードを有効化",
|
||||
"开启GPT训练": "GPTトレーニングを開始",
|
||||
"开启SSL提取": "SSL抽出を開始",
|
||||
"开启SoVITS训练": "SoVITSトレーニングを開始",
|
||||
"开启TTS推理WebUI": "TTS Inference WebUIを開く",
|
||||
"开启UVR5-WebUI": "UVR5-WebUIを開く",
|
||||
"开启一键三连": "ワンクリック三連を開始",
|
||||
"开启打标WebUI": "ラベリングWebUIを開く",
|
||||
"开启文本获取": "テキストの取得を開始",
|
||||
"开启": "有効化",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "参照テキストなしモードを有効にします。参照テキストを入力しない場合も同様に有効になります。",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "参照テキストなしモードを有効化。参照テキストフィールドを空にすると、このモードが有効になります。v3では現在このモードをサポートしておらず、使用するとエラーが発生します。",
|
||||
"开启离线批量ASR": "オフラインバッチASRを開始",
|
||||
"开启语义token提取": "セマンティックトークン抽出を開始",
|
||||
"开启语音切割": "音声の分割を開始",
|
||||
"开启语音降噪": "音声ノイズ除去を有効にする",
|
||||
"微调训练": "ファインチューニング",
|
||||
"怎么切": "どうやって切るか",
|
||||
"总训练轮数total_epoch": "総トレーニングエポック数total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "総トレーニングエポック数total_epoch、高すぎないようにお勧めします",
|
||||
"打标工具WebUI已关闭": "校正ツールWebUIが終了しました",
|
||||
"打标工具WebUI已开启": "校正ツールWebUIが開始されました",
|
||||
"打标工具进程输出信息": "アノテーションツールプロセスの出力情報",
|
||||
"指定输出主人声文件夹": "ボーカルの出力フォルダを指定:",
|
||||
"指定输出非主人声文件夹": "伴奏の出力フォルダを指定:",
|
||||
"按中文句号。切": "中国語の句点でカット",
|
||||
"按标点符号切": "句読点で分割",
|
||||
"按英文句号.切": "英文のピリオドで切ってください",
|
||||
"推理": "推論",
|
||||
"推理设置": "推論設定",
|
||||
"提取文本Bert特征": "テキストBERT特徴を抽出",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "データバケット化(並列推論時に少し計算コストを減らす)",
|
||||
"数据类型精度": "データ型の精度",
|
||||
"文本分词与特征提取": "テキスト分割と特徴抽出",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "テキストセグメントツール。非常に長いテキストは合成結果が良くない可能性があるため、長いテキストは事前にセグメントすることをお勧びします。合成は改行に基づいて分かれ、その後に結合されます。",
|
||||
"文本模块学习率权重": "テキストモジュールの学習率の重み",
|
||||
"文本进程输出信息": "テキストプロセスの出力情報",
|
||||
"施工中,请静候佳音": "施工中、お待ちください",
|
||||
"日文": "日本語",
|
||||
"日英混合": "日英混合",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "最新のckptファイルのみを保存してディスクスペースを節約するかどうか",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "最新の重みファイルのみを保存し、ディスクスペースを節約しますか?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "各保存時間点で最終的な小さなモデルをweightsフォルダに保存するかどうか",
|
||||
"是否开启dpo训练选项(实验性)": "DPOトレーニングオプションを有効にするかどうか(実験的)",
|
||||
"是否开启DPO训练选项(实验性)": "DPO トレーニングオプションを有効にしますか?(実験的)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "ランダム性を防ぐために、前回の合成結果のスピーチ速度とトーンを調整します。",
|
||||
"显卡信息": "グラフィックカード情報",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアから導出される音声を広める者は、自己責任で行ってください。<br>この条件を認めない場合、ソフトウェアパッケージ内の任意のコードやファイルを使用または引用することはできません。詳細はルートディレクトリの<b>LICENSE</b>を参照してください。",
|
||||
"未下载模型": "モデルがダウンロードされていません",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "このソフトウェアはMITライセンスでオープンソース化されており、作者はソフトウェアに対して一切の制御権を持っていません。ソフトウェアを使用する者、ソフトウェアから導出される音声を広める者は、自己責任で行ってください。",
|
||||
"标注文件路径 (含文件后缀 *.list)": "ラベル付けファイルのパス(ファイル拡張子 *.list を含む)",
|
||||
"模型": "モデル",
|
||||
"模型分为三类:": "モデルは3種類に分かれています:",
|
||||
"模型切换": "モデル切り替え",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "バージョン",
|
||||
"粤英混合": "粤英混合",
|
||||
"粤语": "粤語",
|
||||
"终止ASR进程": "ASRプロセスを停止",
|
||||
"终止GPT训练": "GPTトレーニングを停止",
|
||||
"终止SSL提取进程": "SSL抽出プロセスを停止",
|
||||
"终止SoVITS训练": "SoVITSトレーニングを停止",
|
||||
"终止一键三连": "ワンクリック三連を停止",
|
||||
"终止合成": "合成を終了",
|
||||
"终止文本获取进程": "テキスト取得プロセスを停止",
|
||||
"终止语义token提取进程": "セマンティックトークン抽出プロセスを停止",
|
||||
"终止语音切割": "音声の分割を停止",
|
||||
"终止语音降噪进程": "音声ノイズ除去プロセスを終了する",
|
||||
"缺少Hubert数据集": "Hubertデータセットが欠落しています",
|
||||
"缺少语义数据集": "セマンティクスデータセットが欠落しています",
|
||||
"缺少音素数据集": "音素データセットが欠落しています",
|
||||
"缺少音频数据集": "オーディオデータセットが欠落しています",
|
||||
"英文": "英語",
|
||||
"语义token提取进程输出信息": "セマンティックトークン抽出プロセスの出力情報",
|
||||
"训练集格式化一键三连": "トレーニングデータのフォーマットを一括処理",
|
||||
"训练集格式化工具": "トレーニングデータフォーマットツール",
|
||||
"语义Token提取": "セマンティックトークン抽出",
|
||||
"语速": "話速",
|
||||
"语速调整,高为更快": "話速調整、高いほど速く",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "音声調整はバケット処理をサポートしていないため、自動的にバケット処理を無効化",
|
||||
"语音切割进程输出信息": "音声分割プロセスの出力情報",
|
||||
"语音降噪进程输出信息": "音声ノイズ除去プロセスの出力情報",
|
||||
"语音切分": "音声分割",
|
||||
"语音切分工具": "音声分割ツール",
|
||||
"语音文本校对标注工具": "音声テキスト校正・ラベル付けツール",
|
||||
"语音自监督特征提取": "音声自己教師あり特徴抽出",
|
||||
"语音识别": "音声認識",
|
||||
"语音识别工具": "音声認識ツール",
|
||||
"语音降噪": "音声ノイズ除去",
|
||||
"语音降噪工具": "音声ノイズ除去ツール",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "3~10秒以内の参照音声をアップロードしてください。それを超えるとエラーが発生します!",
|
||||
"请上传参考音频": "リファレンスオーディオをアップロードしてください",
|
||||
"请填入推理文本": "ターゲットテキストを入力してください",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "二次参考音声(複数可、またはなし)",
|
||||
"输入待处理音频文件夹路径": "処理するオーディオフォルダのパスを入力してください:",
|
||||
"输入文件夹路径": "入力フォルダのパス",
|
||||
"输入路径不存在": "入力パスが存在しません",
|
||||
"输入路径存在但不可用": "入力パスは存在しますが、使用できません",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/実験名ディレクトリには23456で始まるファイルとフォルダが含まれている必要があります",
|
||||
"输出信息": "出力情報",
|
||||
"输出文件夹路径": "出力フォルダのパス",
|
||||
"输出的语音": "推論結果",
|
||||
"运行中": "実行中",
|
||||
"进度": "進捗",
|
||||
"进程已终止": "プロセスが終了しました",
|
||||
"进程输出信息": "プロセスの出力情報",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "SoVITS_weightsおよびGPT_weightsに保存されたモデルを選択します。デフォルトのものはプレトレインであり、ゼロショットTTSを体験できます。",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "サンプリングステップ数:ノイズが強い場合は増やし、遅い場合は減らしてみてください",
|
||||
"重复惩罚": "繰り返しペナルティ",
|
||||
"降噪结果输出文件夹": "ノイズ除去結果出力フォルダ",
|
||||
"降噪音频文件输入文件夹": "ノイズ除去音声ファイル入力フォルダ",
|
||||
"随机种子": "ランダムシード",
|
||||
"需先终止才能开启下一次任务": "次のタスクを開始する前に、現在のタスクを終了する必要があります",
|
||||
"需要合成的切分前文本": "セグメント前の推論テキスト",
|
||||
"需要合成的文本": "推論テキスト",
|
||||
"需要合成的文本的语种": "推論テキストの言語",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "韓英混合",
|
||||
"音频加载失败": "音声の読み込みに失敗しました",
|
||||
"音频文件不存在,跳过:": "オーディオファイルが見つからない。スキップ:",
|
||||
"音频标注WebUI": "音声ラベリングWebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "オーディオの自動分割入力パス、ファイルまたはフォルダを指定できます",
|
||||
"预训练的GPT模型路径": "事前にトレーニングされたGPTモデルのパス",
|
||||
"预训练的SSL模型路径": "事前にトレーニングされたSSLモデルのパス",
|
||||
"预训练的SoVITS-D模型路径": "事前にトレーニングされたSoVITS-Dモデルのパス",
|
||||
"预训练的SoVITS-G模型路径": "事前にトレーニングされたSoVITS-Gモデルのパス",
|
||||
"预训练的中文BERT模型路径": "事前にトレーニングされた中文BERTモデルのパス"
|
||||
"音频超分中": "音声超解像中",
|
||||
"预训练GPT模型路径": "事前にトレーニングされたGPTモデルのパス",
|
||||
"预训练SSL模型路径": "事前にトレーニングされたSSLモデルのパス",
|
||||
"预训练SoVITS-D模型路径": "事前にトレーニングされたSoVITS-Dモデルのパス",
|
||||
"预训练SoVITS-G模型路径": "事前にトレーニングされたSoVITS-Gモデルのパス",
|
||||
"预训练中文BERT模型路径": "事前にトレーニングされた中国語BERTモデルのパス"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net (onnx_dereverb): 듀얼 채널 리버브에는 가장 적합하지만, 싱글 채널 리버브는 제거할 수 없습니다",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho:지연 효과를 제거합니다. Aggressive는 Normal보다 더 철저하게 제거하며, DeReverb는 추가로 리버브를 제거하여 단일 채널 리버브를 제거할 수 있지만 고주파 리버브는 완전히 제거하지 못합니다.",
|
||||
"*GPT模型列表": "*GPT 모델 목록",
|
||||
"*SoVITS模型列表": "*SoVITS 모델 목록",
|
||||
"*实验/模型名": "*실험/모델 이름",
|
||||
"*文本标注文件": "*텍스트 주석 파일",
|
||||
"*训练集音频文件目录": "*훈련 세트 오디오 파일 디렉터리",
|
||||
"*请上传并填写参考信息": "*참고 정보를 업로드하고 입력하십시오",
|
||||
"*请填写需要合成的目标文本和语种模式": "*합성할 목표 텍스트와 언어 모드를 입력하세요",
|
||||
".list标注文件的路径": ".list 주석 파일 경로",
|
||||
".限制范围越小判别效果越好。": "다언어 지원을 줄이는 것이 더 좋습니다",
|
||||
"0-前置数据集获取工具": "0-전방 데이터 세트 수집 도구",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 보컬 및 반주 분리 및 에코 및 지연 제거 도구",
|
||||
"0b-语音切分工具": "0b-음성 분리 도구",
|
||||
"0bb-语音降噪工具": "0bb-음성 노이즈 제거 도구",
|
||||
"0c-中文批量离线ASR工具": "0c-중국어 대량 오프라인 ASR 도구",
|
||||
"0d-语音文本校对标注工具": "0d-음성 텍스트 교정 주석 도구",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-훈련 세트 형식 지정 도구",
|
||||
"1Aa-文本内容": "1Aa-텍스트 내용",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-훈련 세트 형식 지정 일괄 처리",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL 자기 지도 특징 추출",
|
||||
"1Ac-语义token提取": "1Ac-의미 토큰 추출",
|
||||
"1B-微调训练": "1B-미세 조정 훈련",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS 훈련. 공유 용 모델 파일은 SoVITS_weights 하위에 출력됩니다.",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT 훈련. 공유 용 모델 파일은 GPT_weights 하위에 출력됩니다.",
|
||||
"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-음성 변환",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR 모델",
|
||||
"ASR 模型尺寸": "ASR 모델 크기",
|
||||
"ASR 语言设置": "ASR 언어 설정",
|
||||
"ASR进程输出信息": "ASR 프로세스 출력 정보",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT 훈련: 모델 가중치 파일은 GPT_weights/에 있습니다",
|
||||
"GPT模型列表": "GPT 모델 목록",
|
||||
"GPT训练进程输出信息": "GPT 훈련 프로세스 출력 정보",
|
||||
"GPT训练": "GPT훈련",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT 샘플링 매개변수 (참조 텍스트가 없을 때 너무 낮게 설정하지 마십시오. 확실하지 않으면 기본값을 사용하십시오):",
|
||||
"GPU卡号,只能填1个整数": "GPU 카드 번호, 1개의 정수만 입력 가능",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPU 카드 번호는 -로 구분되며 각 카드 번호에 하나의 프로세스가 있어야 함",
|
||||
"SSL进程输出信息": "SSL 프로세스 출력 정보",
|
||||
"LoRA秩": "LoRA 랭크",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 기본 모델이 없어서 해당 LoRA 가중치를 로드할 수 없습니다",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS 훈련: 모델 가중치 파일은 SoVITS_weights/에 있습니다",
|
||||
"SoVITS模型列表": "SoVITS 모델 목록",
|
||||
"SoVITS训练进程输出信息": "SoVITS 훈련 프로세스 출력 정보",
|
||||
"TTS推理WebUI进程输出信息": "TTS 추론 WebUI 프로세스 출력 정보",
|
||||
"TTS推理进程已关闭": "TTS 추론 프로세스가 닫혔습니다",
|
||||
"TTS推理进程已开启": "TTS 추론 프로세스가 열렸습니다",
|
||||
"UVR5已关闭": "UVR5가 비활성화되었습니다",
|
||||
"UVR5已开启": "UVR5가 활성화되었습니다",
|
||||
"UVR5进程输出信息": "UVR5 프로세스 출력 정보",
|
||||
"SoVITS训练": "SoVITS훈련",
|
||||
"TTS推理WebUI": "TTS 추론 WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5 보컬 및 반주 분리 & 리버브 제거 및 딜레이 제거 도구",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "알파 믹스: 정규화된 오디오가 들어오는 비율",
|
||||
"batch_size": "배치 크기",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop 크기: 볼륨 곡선을 계산하는 방법. 작을수록 정확도가 높아지지만 계산량이 높아집니다 (정확도가 높다고 효과가 좋아지지 않음)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "임계 값: 이 값보다 작은 볼륨은 대체 분리 지점으로 간주됩니다.",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "일괄 처리 프로세스 출력 정보",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3에서는 이 모드를 지원하지 않으며, 사용 시 오류가 발생합니다.",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3 출력이 답답하게 들리면 슈퍼 레졸루션을 켜보세요",
|
||||
"不切": "자르지 않음",
|
||||
"中文": "중국어",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "중국어 튜토리얼 문서:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "중국어 튜토리얼 문서",
|
||||
"中英混合": "중영 혼합",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "주 참조 오디오 (3~10초 이내의 참조 오디오를 업로드하세요. 초과 시 오류 발생!)",
|
||||
"主参考音频的文本": "주 참조 오디오의 텍스트",
|
||||
"主参考音频的语种": "주 참조 오디오의 언어",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "오디오 파일을 일괄로 입력할 수도 있습니다. 둘 중 하나를 선택하고 폴더를 읽기를 우선합니다.",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "보컬과 반주 분리 배치 처리, UVR5 모델 사용.",
|
||||
"人声分离WebUI": "보컬 분리 WebUI",
|
||||
"人声提取激进程度": "보컬 추출의 공격성",
|
||||
"以下文件或文件夹不存在": "해당 파일이나 폴더가 없습니다",
|
||||
"以下模型不存在:": "해당 모델이 존재하지 않습니다:",
|
||||
"伴奏人声分离&去混响&去回声": "반주 및 보컬 분리 & 리버브 제거 & 에코 제거",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "참고 텍스트가 없을 때는 미세 조정된 GPT를 사용하는 것이 좋습니다. 참고 오디오에서 무엇을 말하는지 잘 들리지 않으면 이 모드를 켜서 입력한 참고 텍스트를 무시할 수 있습니다.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "참조 텍스트 없는 모드 사용 시 미세 조정된 GPT 사용을 권장합니다. 참조 오디오가 들리지 않거나 무엇을 쓸지 모를 경우 이 옵션을 활성화하여 참조 텍스트를 무시할 수 있습니다.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "슈퍼 레졸루션 모델의 파라미터를 다운로드하지 않았으므로 슈퍼 레졸루션을 수행하지 않습니다. 사용하려면 먼저 튜토리얼을 참고하여 파일을 다운로드하세요",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "참고 텍스트 없이 사용할 경우 미세 조정된 GPT 사용을 권장합니다",
|
||||
"保存频率save_every_epoch": "저장 빈도 (각 라운드마다)",
|
||||
"保持随机": "랜덤 유지",
|
||||
"关闭TTS推理WebUI": "TTS Inference WebUI 닫기",
|
||||
"关闭UVR5-WebUI": "UVR5-WebUI 닫기",
|
||||
"关闭打标WebUI": "Labeling WebUI 닫기",
|
||||
"关闭": "닫기",
|
||||
"凑50字一切": "50자를 채우십시오",
|
||||
"凑四句一切": "네 문장의 세트를 완성하세요.",
|
||||
"分桶处理模式已关闭": "버킷 처리 모드 비활성화됨",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "사용되는 프로세스 수로 자르기",
|
||||
"刷新模型路径": "모델 경로 새로 고침",
|
||||
"前端处理后的文本(每句):": "프론트엔드 처리 후 텍스트(문장별):",
|
||||
"前置数据集获取工具": "전처리 데이터셋 획득 도구",
|
||||
"占用中": "사용 중",
|
||||
"去混响/去延迟,附:": "리버브 제거/지연 제거, 부록:",
|
||||
"参考音频在3~10秒范围外,请更换!": "참고 오디오가 3~10초 범위를 벗어났습니다. 다른 것으로 바꾸십시오!",
|
||||
"参考音频的文本": "참고 오디오의 텍스트",
|
||||
"参考音频的语种": "참고 오디오의 언어",
|
||||
"句间停顿秒数": "문장 간 정지 시간 (초)",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "선택 사항: 여러 참조 오디오 파일을 드래그하여 업로드하고 (동일한 성별을 권장), 그들의 톤을 평균화합니다. 이 옵션을 비워두면 톤은 왼쪽의 단일 참조 오디오로 제어됩니다. 모델을 미세 조정하는 경우 모든 참조 오디오 파일이 미세 조정 훈련 세트 내의 톤을 가지고 있는 것이 좋으며, 사전 훈련된 모델은 무시할 수 있습니다.",
|
||||
"合成语音": "합성 음성",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "적절한 폴더 경로 형식 예: E:\\codes\\py39\\vits_vc_gpu\\백로서리 테스트 샘플 (파일 관리자 주소 표시줄에서 복사하면 됩니다).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "향후 음소 변환, 수동 음소 편집, 단계별 음성 합성 지원이 추가될 예정입니다.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "참고 오디오의 내용을 정확히 알아들을 수 없을 경우 이 옵션을 활성화하세요. 활성화하면 입력한 참고 텍스트를 무시합니다.",
|
||||
"启用并行推理版本": "병렬 추론 버전 활성화",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "분리된 오디오가 위치한 디렉터리를 입력하세요! 읽어들인 오디오 파일의 전체 경로 = 이 디렉터리 - list 파일에서 파형에 해당하는 파일명(전체 경로가 아님). 비워 두면 .list 파일의 절대 전체 경로를 사용합니다.",
|
||||
"多语种混合": "다국어 혼합",
|
||||
"多语种混合(粤语)": "다국어 혼합(粤語)",
|
||||
"失败": "실패",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "이 조항에 동의하지 않는다면, 소프트웨어 패키지 내의 코드 및 파일을 사용할 수 없습니다. 자세한 내용은 루트 디렉토리 LICENSE를 참조하세요.",
|
||||
"实际输入的参考文本:": "실제 입력된 참고 텍스트:",
|
||||
"实际输入的目标文本(切句后):": "실제 입력된 목표 텍스트(문장 분리 후):",
|
||||
"实际输入的目标文本(每句):": "실제 입력된 목표 텍스트(문장별):",
|
||||
"实际输入的目标文本:": "실제 입력된 목표 텍스트:",
|
||||
"导出文件格式": "내보내기 파일 형식",
|
||||
"已关闭": "닫힘",
|
||||
"已完成": "완료됨",
|
||||
"已开启": "켜짐",
|
||||
"并行推理": "병렬 추론",
|
||||
"并行推理模式已关闭": "병렬 추론 모드 비활성화됨",
|
||||
"并行推理模式已开启": "병렬 추론 모드 활성화됨",
|
||||
"开启GPT训练": "GPT 훈련 활성화",
|
||||
"开启SSL提取": "SSL 추출 활성화",
|
||||
"开启SoVITS训练": "SoVITS 훈련 활성화",
|
||||
"开启TTS推理WebUI": "TTS Inference WebUI 열기",
|
||||
"开启UVR5-WebUI": "UVR5-WebUI 열기",
|
||||
"开启一键三连": "일괄 처리 활성화",
|
||||
"开启打标WebUI": "Labeling WebUI 열기",
|
||||
"开启文本获取": "텍스트 추출 활성화",
|
||||
"开启": "켜기",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "참고 텍스트 없이 모드를 활성화합니다. 참고 텍스트를 입력하지 않으면 자동으로 활성화됩니다.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "참조 텍스트 없는 모드 활성화. 참조 텍스트를 입력하지 않으면 이 모드가 활성화됩니다. v3는 현재 이 모드를 지원하지 않으며, 사용 시 오류가 발생합니다.",
|
||||
"开启离线批量ASR": "오프라인 대량 ASR 활성화",
|
||||
"开启语义token提取": "의미 토큰 추출 활성화",
|
||||
"开启语音切割": "음성 분리 활성화",
|
||||
"开启语音降噪": "음성 노이즈 제거 활성화",
|
||||
"微调训练": "미세 조정 훈련",
|
||||
"怎么切": "자르기 옵션",
|
||||
"总训练轮数total_epoch": "총 훈련 라운드 수 (total_epoch)",
|
||||
"总训练轮数total_epoch,不建议太高": "총 훈련 라운드 수 (total_epoch), 너무 높지 않게 권장됨",
|
||||
"打标工具WebUI已关闭": "주석 도구 WebUI가 닫혔습니다",
|
||||
"打标工具WebUI已开启": "주석 도구 WebUI가 열렸습니다",
|
||||
"打标工具进程输出信息": "주석 도구 프로세스 출력 정보",
|
||||
"指定输出主人声文件夹": "지정된 주인 목소리 출력 폴더",
|
||||
"指定输出非主人声文件夹": "지정된 비주인 목소리 출력 폴더",
|
||||
"按中文句号。切": "중국어 문장으로 분리하십시오.",
|
||||
"按标点符号切": "구두점을 기준으로 자르기",
|
||||
"按英文句号.切": "영어 문장으로 분리하기",
|
||||
"推理": "추론",
|
||||
"推理设置": "추론 설정",
|
||||
"提取文本Bert特征": "텍스트 BERT 특징 추출",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "데이터 버킷팅 (병렬 추론 시 계산량 감소)",
|
||||
"数据类型精度": "데이터 유형 정밀도",
|
||||
"文本分词与特征提取": "텍스트 토큰화 및 특성 추출",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "텍스트 분할 도구. 너무 긴 텍스트는 합성 결과가 좋지 않을 수 있으므로 분할을 권장합니다. 합성은 텍스트의 줄바꿈을 기준으로 분할된 후 결합됩니다.",
|
||||
"文本模块学习率权重": "텍스트 모듈 학습률 가중치",
|
||||
"文本进程输出信息": "텍스트 프로세스 출력 정보",
|
||||
"施工中,请静候佳音": "공사 중입니다. 기다려주십시오.",
|
||||
"日文": "일본어",
|
||||
"日英混合": "일본어와 영어 혼합",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "디스크 공간을 절약하기 위해 최신 ckpt 파일만 저장할지 여부",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "디스크 공간을 절약하기 위해 최신 가중치 파일만 저장할지 여부",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "각 저장 시간에 최종 작은 모델을 weights 폴더에 저장할지 여부",
|
||||
"是否开启dpo训练选项(实验性)": "dpo 훈련 옵션(실험적) 활성화 여부",
|
||||
"是否开启DPO训练选项(实验性)": "DPO 훈련 옵션 활성화 여부 (실험적 기능)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "랜덤성을 방지하기 위해 마지막 합성 결과의 말하기 속도와 톤을 조정합니다.",
|
||||
"显卡信息": "그래픽 카드 정보",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "본 소프트웨어는 MIT 라이선스로 오픈 소스로 제공되며, 제작자는 소프트웨어에 대해 어떠한 제어력도 가지지 않습니다. 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 자는 전적으로 책임져야 합니다. <br>이 조항을 인정하지 않으면 소프트웨어의 코드 및 파일을 사용하거나 인용할 수 없습니다. 루트 디렉터리의 <b>LICENSE</b>를 참조하십시오.",
|
||||
"未下载模型": "모델이 다운로드되지 않음",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "본 소프트웨어는 MIT 라이선스로 오픈소스이며, 개발자는 소프트웨어에 대한 어떠한 통제력도 가지지 않습니다. 사용자는 소프트웨어를 이용하거나 이를 통해 생성된 음성을 배포할 경우 모든 책임을 집니다.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "주석 파일 경로 (*.list 확장자 포함)",
|
||||
"模型": "모델",
|
||||
"模型分为三类:": "모델은 3가지로 나뉩니다:",
|
||||
"模型切换": "모델 전환",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "버전",
|
||||
"粤英混合": "粤영 혼합",
|
||||
"粤语": "粤語",
|
||||
"终止ASR进程": "ASR 프로세스 종료",
|
||||
"终止GPT训练": "GPT 훈련 종료",
|
||||
"终止SSL提取进程": "SSL 추출 프로세스 종료",
|
||||
"终止SoVITS训练": "SoVITS 훈련 종료",
|
||||
"终止一键三连": "일괄 처리 종료",
|
||||
"终止合成": "합성 종료",
|
||||
"终止文本获取进程": "텍스트 추출 프로세스 종료",
|
||||
"终止语义token提取进程": "의미 토큰 추출 프로세스 종료",
|
||||
"终止语音切割": "음성 분리 종료",
|
||||
"终止语音降噪进程": "음성 노이즈 제거 프로세스 종료",
|
||||
"缺少Hubert数据集": "Hubert 데이터셋이 없습니다",
|
||||
"缺少语义数据集": "의미론 데이터셋이 없습니다",
|
||||
"缺少音素数据集": "음소 데이터셋이 없습니다",
|
||||
"缺少音频数据集": "오디오 데이터셋이 없습니다",
|
||||
"英文": "영어",
|
||||
"语义token提取进程输出信息": "의미 토큰 추출 프로세스 출력 정보",
|
||||
"训练集格式化一键三连": "훈련 데이터셋 포맷팅 원클릭 실행",
|
||||
"训练集格式化工具": "훈련 데이터셋 포맷팅 도구",
|
||||
"语义Token提取": "의미론적 토큰 추출",
|
||||
"语速": "언어 속도",
|
||||
"语速调整,高为更快": "언어 속도 조정, 높을수록 빠름",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "음속 조절은 버킷 처리를 지원하지 않아 버킷 처리 자동 비활성화됨",
|
||||
"语音切割进程输出信息": "음성 분리 프로세스 출력 정보",
|
||||
"语音降噪进程输出信息": "음성 노이즈 제거 프로세스 출력 정보",
|
||||
"语音切分": "음성 분할",
|
||||
"语音切分工具": "음성 분할 도구",
|
||||
"语音文本校对标注工具": "음성 텍스트 교정 및 주석 도구",
|
||||
"语音自监督特征提取": "음성 자율 학습 특성 추출",
|
||||
"语音识别": "음성 인식",
|
||||
"语音识别工具": "음성 인식 도구",
|
||||
"语音降噪": "음성 잡음 제거",
|
||||
"语音降噪工具": "음성 잡음 제거 도구",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "3~10초 이내의 참고 오디오를 업로드하십시오. 초과하면 오류가 발생합니다!",
|
||||
"请上传参考音频": "참고 오디오를 업로드하세요",
|
||||
"请填入推理文本": "목표 텍스트를 입력하세요",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "보조 참조 오디오 (여러 개 선택 가능 또는 선택 안 함)",
|
||||
"输入待处理音频文件夹路径": "처리 대기 중인 오디오 폴더 경로 입력",
|
||||
"输入文件夹路径": "폴더 경로 입력",
|
||||
"输入路径不存在": "입력 경로가 존재하지 않음",
|
||||
"输入路径存在但不可用": "입력 경로가 존재하지만 사용할 수 없음",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/실험 이름 디렉터리에는 23456으로 시작하는 파일과 폴더가 있어야 함",
|
||||
"输出信息": "출력 정보",
|
||||
"输出文件夹路径": "출력 폴더 경로",
|
||||
"输出的语音": "출력 음성",
|
||||
"运行中": "실행 중",
|
||||
"进度": "진행 상태",
|
||||
"进程已终止": "프로세스 종료됨",
|
||||
"进程输出信息": "프로세스 출력 정보",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "SoVITS_weights 및 GPT_weights에 저장된 훈련 완료된 모델 중 선택. 기본적으로 하나는 기본 모델이며 5초 Zero Shot TTS를 체험할 수 있습니다.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "샘플링 스텝: 노이즈가 느껴지면 증가, 느리다면 감소 시도",
|
||||
"重复惩罚": "반복 패널티",
|
||||
"降噪结果输出文件夹": "노이즈 제거 결과 출력 폴더",
|
||||
"降噪音频文件输入文件夹": "노이즈 제거 오디오 파일 입력 폴더",
|
||||
"随机种子": "랜덤 시드",
|
||||
"需先终止才能开启下一次任务": "다음 작업을 시작하려면 먼저 종료해야 합니다",
|
||||
"需要合成的切分前文本": "분할 전 추론 텍스트",
|
||||
"需要合成的文本": "합성해야 할 텍스트",
|
||||
"需要合成的文本的语种": "추론 텍스트의 언어",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "한영 혼합",
|
||||
"音频加载失败": "오디오 로드 실패",
|
||||
"音频文件不存在,跳过:": "오디오 파일이 존재하지 않음, 건너뜀: ",
|
||||
"音频标注WebUI": "오디오 주석 WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "오디오 자동 분리 입력 경로, 파일 또는 폴더 가능",
|
||||
"预训练的GPT模型路径": "사전 훈련된 GPT 모델 경로",
|
||||
"预训练的SSL模型路径": "사전 훈련된 SSL 모델 경로",
|
||||
"预训练的SoVITS-D模型路径": "사전 훈련된 SoVITS-D 모델 경로",
|
||||
"预训练的SoVITS-G模型路径": "사전 훈련된 SoVITS-G 모델 경로",
|
||||
"预训练的中文BERT模型路径": "사전 훈련된 중국어 BERT 모델 경로"
|
||||
"音频超分中": "오디오 슈퍼 레졸루션 중",
|
||||
"预训练GPT模型路径": "사전 훈련된 GPT 모델 경로",
|
||||
"预训练SSL模型路径": "사전 훈련된 SSL 모델 경로",
|
||||
"预训练SoVITS-D模型路径": "사전 훈련된 SoVITS-D 모델 경로",
|
||||
"预训练SoVITS-G模型路径": "사전 훈련된 SoVITS-G 모델 경로",
|
||||
"预训练中文BERT模型路径": "사전 훈련된 중국어 BERT 모델 경로"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(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",
|
||||
"*SoVITS模型列表": "*Lista de modelos Sovits",
|
||||
"*实验/模型名": "*Nome do experimento/modelo",
|
||||
"*文本标注文件": "*Arquivo de marcação de texto",
|
||||
"*训练集音频文件目录": "*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标注文件的路径": "Caminho do arquivo de anotação .list",
|
||||
".限制范围越小判别效果越好。": "Menos multilinguismo é melhor",
|
||||
"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",
|
||||
"0b-语音切分工具": "0b- Ferramenta de corte de voz",
|
||||
"0bb-语音降噪工具": "0bb- Ferramenta de redução de ruído de voz",
|
||||
"0c-中文批量离线ASR工具": "0c- Ferramenta chinesa de ASR offline em lote",
|
||||
"0d-语音文本校对标注工具": "0d- Ferramenta de correção e marcação de texto de voz",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SOVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Ferramenta de formatação de conjunto de dados de treinamento",
|
||||
"1Aa-文本内容": "1AA-Conteúdo do texto",
|
||||
"1Aabc-训练集格式化一键三连": "1AABC-Formatação de conjunto de treinamento em um clique",
|
||||
"1Ab-SSL自监督特征提取": "1AB-Extração de características auto-supervisionadas SSL",
|
||||
"1Ac-语义token提取": "1AC-Extração de token semântico",
|
||||
"1B-微调训练": "1B-Treinamento de ajuste fino",
|
||||
"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",
|
||||
"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",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "Modelo ASR",
|
||||
"ASR 模型尺寸": "Tamanho do modelo ASR",
|
||||
"ASR 语言设置": "Configurações de idioma do ASR",
|
||||
"ASR进程输出信息": "Informações de saída do processo ASR",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "Treinamento GPT: O arquivo de pesos do modelo está em GPT_weights/",
|
||||
"GPT模型列表": "Lista de modelos GPT",
|
||||
"GPT训练进程输出信息": "Informações de saída do processo de treinamento GPT",
|
||||
"GPT训练": "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卡号以-分割,每个卡号一个进程": "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",
|
||||
"LoRA秩": "Classificação LoRA",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "O modelo base do SoVITS V3 está ausente, impossibilitando o carregamento dos pesos do LoRA",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "Treinamento SoVITS: O arquivo de pesos do modelo está em SoVITS_weights/",
|
||||
"SoVITS模型列表": "Lista de modelos 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推理进程已关闭": "O processo de inferência TTS foi desativado",
|
||||
"TTS推理进程已开启": "O processo de inferência TTS foi iniciado",
|
||||
"UVR5已关闭": "UVR5 está desativado",
|
||||
"UVR5已开启": "UVR5 está ativado",
|
||||
"UVR5进程输出信息": "Informações de saída do processo UVR5",
|
||||
"SoVITS训练": "Treinamento SoVITS",
|
||||
"TTS推理WebUI": "Inferência TTS WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5 Separação de voz e acompanhamento & remoção de reverberação e atraso",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix: Em que proporção o áudio normalizado é misturado de volta",
|
||||
"batch_size": "Tamanho do Lote",
|
||||
"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)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "Limiar: O volume menor que este valor é considerado como um ponto de corte mudo alternativo",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "Informações de saída do processo de um clique",
|
||||
"v3暂不支持该模式,使用了会报错。": "O v3 não suporta este modo no momento. O uso resultará em erro.",
|
||||
"v3输出如果觉得闷可以试试开超分": "Se a saída do v3 parecer abafada, tente ativar a super-resolução",
|
||||
"不切": "Não dividir",
|
||||
"中文": "Chinês",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Documentação do tutorial em chinês:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Documentação do tutorial em chinês",
|
||||
"中英混合": "Mistura de Chinês e Inglês",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Áudio de Referência Principal (Por favor, carregue um áudio de referência entre 3-10 segundos, exceder esse limite causará um erro!)",
|
||||
"主参考音频的文本": "Texto do Áudio de Referência Principal",
|
||||
"主参考音频的语种": "Idioma do Áudio de Referência Principal",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "Também é possível inserir arquivos de áudio em lote; escolha uma opção, preferencialmente leia a pasta.",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Processamento em lote de separação de voz e acompanhamento, usando o modelo UVR5.",
|
||||
"人声分离WebUI": "WebUI de separação de voz",
|
||||
"人声提取激进程度": "Grau de agressividade da extração de voz",
|
||||
"以下文件或文件夹不存在": "Nenhum Arquivo ou Pasta Encontrado",
|
||||
"以下模型不存在:": "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.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Recomenda-se usar um GPT ajustado ao usar o Modo Sem Texto de Referência. Se o áudio de referência não estiver claro ou não souber o que escrever, ative esta opção para ignorar o texto de referência.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "Os parâmetros do modelo de super-resolução não foram baixados, então a super-resolução não será realizada. Para utilizá-la, siga o tutorial e baixe os arquivos necessários.",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "Recomenda-se o uso de um modelo GPT ajustado ao utilizar o modo sem texto de referência.",
|
||||
"保存频率save_every_epoch": "Frequência de salvamento save_every_epoch",
|
||||
"保持随机": "Manter Aleatório",
|
||||
"关闭TTS推理WebUI": "Fechar TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "Fechar UVR5-WebUI",
|
||||
"关闭打标WebUI": "Fechar Labeling WebUI",
|
||||
"关闭": "Fechar ",
|
||||
"凑50字一切": "Complete com 50 caracteres",
|
||||
"凑四句一切": "Complete com quatro frases",
|
||||
"分桶处理模式已关闭": "Modo de Processamento em Balde Desativado",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "Número de processos para corte",
|
||||
"刷新模型路径": "Atualizar caminho do modelo",
|
||||
"前端处理后的文本(每句):": "Texto após processamento front-end (por frase):",
|
||||
"前置数据集获取工具": "Ferramenta de obtenção de conjunto de dados pré-processado",
|
||||
"占用中": " Ocupado",
|
||||
"去混响/去延迟,附:": "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",
|
||||
"句间停顿秒数": "Tempo de pausa entre frases (segundos)",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "Opcional: Faça upload de vários arquivos de áudio de referência arrastando e soltando-os (recomendado que sejam do mesmo gênero) e faça uma média dos seus tons. Se essa opção for deixada em branco, o tom será controlado pelo único áudio de referência à esquerda. Se estiver ajustando o modelo, é recomendado que todos os arquivos de áudio de referência tenham tons dentro do conjunto de treinamento de ajuste; o modelo pré-treinado pode ser ignorado.",
|
||||
"合成语音": "Voz sintetizada",
|
||||
"合格的文件夹路径格式举例: 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).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "Suporte para Conversão de Fonemas, Edição Manual de Fonemas e Síntese de Fase por Fase será adicionado no futuro.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "Se não conseguir entender claramente o áudio de referência, ative esta opção. Quando ativada, o texto de referência inserido será ignorado.",
|
||||
"启用并行推理版本": "Ativar Versão de Inferência Paralela",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-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)",
|
||||
"失败": " Falha",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "Se você não concorda com estes termos, não poderá usar ou referenciar nenhum código ou arquivo deste pacote de software. Consulte o arquivo LICENSE no diretório raiz para mais detalhes.",
|
||||
"实际输入的参考文本:": "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",
|
||||
"已关闭": " Fechado",
|
||||
"已完成": " Concluído",
|
||||
"已开启": " Ativado",
|
||||
"并行推理": "Inferência Paralela",
|
||||
"并行推理模式已关闭": "Modo de Inferência Paralela Desativado",
|
||||
"并行推理模式已开启": "Modo de Inferência Paralela Ativado",
|
||||
"开启GPT训练": "Ativar treinamento GPT",
|
||||
"开启SSL提取": "Ativar extração SSL",
|
||||
"开启SoVITS训练": "Ativar treinamento SoVITS",
|
||||
"开启TTS推理WebUI": "Abrir TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "Abrir UVR5-WebUI",
|
||||
"开启一键三连": "Ativar um clique",
|
||||
"开启打标WebUI": "Abrir Labeling WebUI",
|
||||
"开启文本获取": "Ativar obtenção de texto",
|
||||
"开启": "Ativar ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Ativar o modo sem texto de referência. Não preencher o texto de referência também equivale a ativar.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Ativar Modo Sem Texto de Referência. Deixar o campo de texto de referência em branco equivale a ativar este modo. v3 não suporta este modo atualmente, usar causará um erro.",
|
||||
"开启离线批量ASR": "Ativar ASR offline em lote",
|
||||
"开启语义token提取": "Ativar extração de token semântico",
|
||||
"开启语音切割": "Ativar corte de voz",
|
||||
"开启语音降噪": "Ativar redução de ruído de voz",
|
||||
"微调训练": "Treinamento de ajuste fino",
|
||||
"怎么切": "Como cortar",
|
||||
"总训练轮数total_epoch": "Total de epoch de treinamento",
|
||||
"总训练轮数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 está ativada",
|
||||
"打标工具进程输出信息": "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",
|
||||
"推理": "Inferência",
|
||||
"推理设置": "Configurações de Inferência",
|
||||
"提取文本Bert特征": "Extrair Características BERT do Texto",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Agrupamento de Dados (Reduz o Custo Computacional na Inferência Paralela)",
|
||||
"数据类型精度": "precisão do tipo de dado",
|
||||
"文本分词与特征提取": "Tokenização de texto e extração de características",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Ferramenta de Segmentação de Texto. Textos muito longos podem não resultar em uma boa síntese, então é recomendado segmentar. A síntese será feita com base nas quebras de linha e depois concatenada.",
|
||||
"文本模块学习率权重": "Weight da taxa de aprendizado do módulo de texto",
|
||||
"文本进程输出信息": "Informações de saída do processo de texto",
|
||||
"施工中,请静候佳音": "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",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "Deseja salvar apenas os arquivos de pesos mais recentes para economizar espaço em disco?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Se deve salvar o modelo pequeno final na pasta Weights em cada ponto de salvamento de tempo",
|
||||
"是否开启dpo训练选项(实验性)": "Se deseja ativar a opção de treinamento DPO (experimental)",
|
||||
"是否开启DPO训练选项(实验性)": "Ativar a opção de treinamento DPO (experimental)?",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "Ajuste a velocidade da fala e o tom do último resultado de síntese para evitar aleatoriedade.",
|
||||
"显卡信息": "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",
|
||||
"未下载模型": "Modelo não baixado",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "Este software é de código aberto sob a licença MIT, e o autor não tem controle sobre seu uso. O usuário e qualquer pessoa que distribua áudio gerado pelo software são totalmente responsáveis.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Caminho do arquivo de anotações (com a extensão *.list)",
|
||||
"模型": "Modelo",
|
||||
"模型分为三类:": "Modelos dividem-se em três categorias:",
|
||||
"模型切换": "Troca de modelo",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Versão",
|
||||
"粤英混合": "Mistura Yue-Inglês",
|
||||
"粤语": "Yue",
|
||||
"终止ASR进程": "Encerrar processo ASR",
|
||||
"终止GPT训练": "Encerrar treinamento GPT",
|
||||
"终止SSL提取进程": "Encerrar processo de extração SSL",
|
||||
"终止SoVITS训练": "Encerrar treinamento SoVITS",
|
||||
"终止一键三连": "Encerrar um clique",
|
||||
"终止合成": "Terminar Síntese",
|
||||
"终止文本获取进程": "Encerrar processo de obtenção de texto",
|
||||
"终止语义token提取进程": "Encerrar processo de extração de token semântico",
|
||||
"终止语音切割": "Encerrar corte de voz",
|
||||
"终止语音降噪进程": "Encerrar o processo de redução de ruído de voz",
|
||||
"缺少Hubert数据集": "Conjunto de Dados Hubert Ausente",
|
||||
"缺少语义数据集": "Conjunto de Dados Semânticos Ausente",
|
||||
"缺少音素数据集": "Conjunto de Dados de Fonemas Ausente",
|
||||
"缺少音频数据集": "Conjunto de Dados de Áudio Ausente",
|
||||
"英文": "Inglês",
|
||||
"语义token提取进程输出信息": "Informações de saída do processo de extração de token semântico",
|
||||
"训练集格式化一键三连": "Formatação do conjunto de treinamento em um clique",
|
||||
"训练集格式化工具": "Ferramenta de formatação do conjunto de treinamento",
|
||||
"语义Token提取": "Extração de tokens semânticos",
|
||||
"语速": "Velocidade da fala",
|
||||
"语速调整,高为更快": "Ajustar a velocidade da fala, mais alta para mais rápido",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "Ajuste de Velocidade de Fala não suporta Processamento em Balde, Processamento em Balde Desativado Automaticamente",
|
||||
"语音切割进程输出信息": "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",
|
||||
"语音切分": "Segmentação de áudio",
|
||||
"语音切分工具": "Ferramenta de segmentação de áudio",
|
||||
"语音文本校对标注工具": "Ferramenta de anotação e revisão de texto de áudio",
|
||||
"语音自监督特征提取": "Extração de características de autoaprendizagem de áudio",
|
||||
"语音识别": "Reconhecimento de voz",
|
||||
"语音识别工具": "Ferramenta de reconhecimento de voz",
|
||||
"语音降噪": "Redução de ruído de áudio",
|
||||
"语音降噪工具": "Ferramenta de redução de ruído de áudio",
|
||||
"请上传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",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Áudio de Referência Secundário (Múltiplos Opcionais ou Nenhum)",
|
||||
"输入待处理音频文件夹路径": "Caminho da pasta de arquivos de áudio a ser processados",
|
||||
"输入文件夹路径": "Caminho da pasta de entrada",
|
||||
"输入路径不存在": "O caminho de entrada não existe",
|
||||
"输入路径存在但不可用": "O caminho de entrada existe, mas não está disponível",
|
||||
"输出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",
|
||||
"运行中": " Em execução",
|
||||
"进度": "Progresso",
|
||||
"进程已终止": " Processo encerrado",
|
||||
"进程输出信息": " Informações de saída do processo",
|
||||
"选择训练完存放在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",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Passos de Amostragem: Se parecer ruidoso, tente aumentar; se parecer lento, tente diminuir",
|
||||
"重复惩罚": "Penalidade de Repetição",
|
||||
"降噪结果输出文件夹": "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",
|
||||
"随机种子": "Semente Aleatória",
|
||||
"需先终止才能开启下一次任务": "É necessário encerrar primeiro para iniciar a próxima tarefa",
|
||||
"需要合成的切分前文本": "Texto de Inferência Antes da Segmentação",
|
||||
"需要合成的文本": "Texto a ser sintetizado",
|
||||
"需要合成的文本的语种": "Idioma do Texto de Inferência",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Mistura Coreano-Inglês",
|
||||
"音频加载失败": "Falha ao Carregar o Áudio",
|
||||
"音频文件不存在,跳过:": "Arquivo de Áudio Não Encontrado, Pulando: ",
|
||||
"音频标注WebUI": "WebUI de anotação de áudio",
|
||||
"音频自动切分输入路径,可文件可文件夹": "Caminho de entrada automático de corte de áudio, pode ser um arquivo ou uma pasta",
|
||||
"预训练的GPT模型路径": "Caminho do modelo GPT pre-train",
|
||||
"预训练的SSL模型路径": "Caminho do modelo SSL pre-train",
|
||||
"预训练的SoVITS-D模型路径": "Caminho do modelo SoVITS-D pre-train",
|
||||
"预训练的SoVITS-G模型路径": "Caminho do modelo SoVITS-G pre-train",
|
||||
"预训练的中文BERT模型路径": "Caminho do modelo BERT chinês pre-train"
|
||||
"音频超分中": "Super-resolução de áudio em andamento",
|
||||
"预训练GPT模型路径": "Caminho do modelo GPT pré-treinado",
|
||||
"预训练SSL模型路径": "Caminho do modelo SSL pré-treinado",
|
||||
"预训练SoVITS-D模型路径": "Caminho do modelo SoVITS-D pré-treinado",
|
||||
"预训练SoVITS-G模型路径": "Caminho do modelo SoVITS-G pré-treinado",
|
||||
"预训练中文BERT模型路径": "Caminho do modelo BERT chinês pré-treinado"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):Это лучший выбор для реверберации с двумя каналами, но он не может устранить реверберацию с одним каналом;",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho:Устраняет эффект задержки. Aggressive устраняет более тщательно, чем Normal, DeReverb дополнительно устраняет реверберацию, может устранить реверберацию с одного канала, но не полностью устраняет высокочастотную реверберацию.",
|
||||
"*GPT模型列表": "*Список моделей GPT",
|
||||
"*SoVITS模型列表": "*Список моделей SoVITS",
|
||||
"*实验/模型名": "*Название эксперимента/модели",
|
||||
"*文本标注文件": "*Файл текстовой аннотации",
|
||||
"*训练集音频文件目录": "*Директория аудиофайлов обучающего набора",
|
||||
"*请上传并填写参考信息": "*Пожалуйста, загрузите и заполните референтные данные",
|
||||
"*请填写需要合成的目标文本和语种模式": "*Пожалуйста, введите целевой текст для синтеза и режим языка",
|
||||
".list标注文件的路径": "Путь к файлу аннотации .list",
|
||||
".限制范围越小判别效果越好。": "Чем меньше языков, тем лучше",
|
||||
"0-前置数据集获取工具": "0-Инструмент для получения предварительного набора данных",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-Инструмент для разделения вокала и аккомпанемента UVR5 & устранения реверберации и задержек",
|
||||
"0b-语音切分工具": "0b-Инструмент для разделения речи",
|
||||
"0bb-语音降噪工具": "0bb-Инструмент для подавления шумов в голосе",
|
||||
"0c-中文批量离线ASR工具": "0c-Инструмент для пакетной офлайн ASR на китайском",
|
||||
"0d-语音文本校对标注工具": "0d-Инструмент для коррекции и аннотации текста речи",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Инструмент для форматирования обучающего набора",
|
||||
"1Aa-文本内容": "1Aa-Содержание текста",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-Форматирование обучающего набора одним нажатием",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-Самоконтролируемое извлечение признаков SSL",
|
||||
"1Ac-语义token提取": "1Ac-Извлечение семантических токенов",
|
||||
"1B-微调训练": "1B-Дообучение",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-Обучение SoVITS. Файлы моделей для распространения находятся в SoVITS_weights.",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-Обучение GPT. Файлы моделей для распространения находятся в GPT_weights.",
|
||||
"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-переозвучивание",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "Модель ASR",
|
||||
"ASR 模型尺寸": "Размер модели ASR",
|
||||
"ASR 语言设置": "Настройки языка ASR",
|
||||
"ASR进程输出信息": "Информация о процессе ASR",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "Обучение GPT: файлы весов модели находятся в GPT_weights/",
|
||||
"GPT模型列表": "Список моделей GPT",
|
||||
"GPT训练进程输出信息": "Информация о процессе обучения GPT",
|
||||
"GPT训练": "Обучение GPT",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "Параметры выборки GPT (не устанавливайте слишком низкие значения, если нет ссылочного текста. Используйте значения по умолчанию, если не уверены):",
|
||||
"GPU卡号,只能填1个整数": "Номер GPU, можно указать только одно целое число",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "Номера GPU разделяются дефисом, на каждый номер отдельный процесс",
|
||||
"SSL进程输出信息": "Информация о процессе SSL",
|
||||
"LoRA秩": "Ранг LoRA",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "Отсутствует базовая модель SoVITS V3, невозможно загрузить соответствующие веса LoRA",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "Обучение SoVITS: файлы весов модели находятся в SoVITS_weights/",
|
||||
"SoVITS模型列表": "Список моделей SoVITS",
|
||||
"SoVITS训练进程输出信息": "Информация о процессе обучения SoVITS",
|
||||
"TTS推理WebUI进程输出信息": "Информация о процессе TTS инференса WebUI",
|
||||
"TTS推理进程已关闭": "Процесс TTS-инференции остановлен",
|
||||
"TTS推理进程已开启": "Процесс TTS-инференции запущен",
|
||||
"UVR5已关闭": "UVR5 выключен",
|
||||
"UVR5已开启": "UVR5 включен",
|
||||
"UVR5进程输出信息": "Вывод информации процесса UVR5",
|
||||
"SoVITS训练": "Обучение SoVITS",
|
||||
"TTS推理WebUI": "TTS WebUI для инференса",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5 Инструмент разделения вокала и сопровождения & удаления реверберации и задержки",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:Какая доля нормализованного аудио смешивается",
|
||||
"batch_size": "размер пакета",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:Как рассчитывается кривая громкости, чем меньше, тем выше точность и больше вычислительная нагрузка (большая точность не всегда означает лучший результат)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "threshold:Значение громкости ниже этого считается тишиной для альтернативной точки разреза",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "Информация о процессе одного нажатия",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3 пока не поддерживает этот режим, при использовании возникнет ошибка.",
|
||||
"v3输出如果觉得闷可以试试开超分": "Если вывод v3 кажется глухим, попробуйте включить супер-разрешение",
|
||||
"不切": "Не разрезать",
|
||||
"中文": "Китайский",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Документация на китайском языке:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Документация по китайскому руководству",
|
||||
"中英混合": "Китайский и английский",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Основной опорный аудиофайл (пожалуйста, загрузите опорный аудиофайл длительностью от 3 до 10 секунд, превышение этого лимита вызовет ошибку!)",
|
||||
"主参考音频的文本": "Текст основного опорного аудиофайла",
|
||||
"主参考音频的语种": "Язык основного опорного аудиофайла",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "Можно также импортировать несколько аудиофайлов. Если путь к папке существует, то этот ввод игнорируется.",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Обработка разделения вокала и аккомпанемента пакетно с использованием модели UVR5.",
|
||||
"人声分离WebUI": "WebUI для разделения вокала",
|
||||
"人声提取激进程度": "Степень агрессивности извлечения вокала",
|
||||
"以下文件或文件夹不存在": "Такого файла или папки не существует",
|
||||
"以下模型不存在:": "Этот модель не существует",
|
||||
"伴奏人声分离&去混响&去回声": "Разделение вокала/аккомпанемента и удаление эхо",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "При использовании режима без референсного текста рекомендуется использовать настроенную модель GPT. Если не удается разобрать, что говорит референсное аудио (не знаете, что писать), можете включить этот режим, и он проигнорирует введенный референсный текст.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Рекомендуется использовать тонко настроенный GPT при использовании режима без опорного текста. Если опорный аудиофайл нечеткий или не уверены, что писать, включите эту опцию, чтобы игнорировать опорный текст.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "Параметры модели супер-разрешения не загружены, поэтому супер-разрешение не будет выполняться. Чтобы использовать его, сначала загрузите необходимые файлы, следуя руководству.",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "При использовании режима без эталонного текста рекомендуется использовать дообученный GPT.",
|
||||
"保存频率save_every_epoch": "Частота сохранения save_every_epoch",
|
||||
"保持随机": "Сохранить случайное значение",
|
||||
"关闭TTS推理WebUI": "Закрыть TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "Закрыть UVR5-WebUI",
|
||||
"关闭打标WebUI": "Закрыть Labeling WebUI",
|
||||
"关闭": "Закрыть ",
|
||||
"凑50字一切": "Соберите все в 50 символов",
|
||||
"凑四句一切": "Собрать четыре предложения и разрезать",
|
||||
"分桶处理模式已关闭": "Режим обработки пакетов отключен",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "Количество процессов, используемых для разрезания",
|
||||
"刷新模型路径": "Обновить путь к модели",
|
||||
"前端处理后的文本(每句):": "Текст после предварительной обработки (каждое предложение):",
|
||||
"前置数据集获取工具": "Инструмент для получения предварительных данных",
|
||||
"占用中": " Занято",
|
||||
"去混响/去延迟,附:": "Удаление реверберации/удаление задержки, примечание:",
|
||||
"参考音频在3~10秒范围外,请更换!": "Референтное аудио вне диапазона 3~10 секунд, пожалуйста, замените!",
|
||||
"参考音频的文本": "Текст референтного аудио",
|
||||
"参考音频的语种": "Язык референтного аудио",
|
||||
"句间停顿秒数": "Время паузы между предложениями (в секундах)",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "Необязательно: загрузите несколько файлов с эталонными аудиозаписями, перетащив их (рекомендуется одного пола), и усредните их тон. Если этот параметр не заполнен, тон будет контролироваться одной эталонной аудиозаписью слева. При тонкой настройке модели рекомендуется, чтобы все эталонные аудиозаписи имели тон в пределах обучающего набора для тонкой настройки; предварительно обученную модель можно игнорировать.",
|
||||
"合成语音": "Синтезированный голос",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "Пример допустимого формата пути к папке: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例 (просто скопируйте из адресной строки файлового менеджера).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "В будущем будет добавлена поддержка преобразования в фонемы, ручного редактирования фонемов и пошагового выполнения синтеза речи.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "Если невозможно разобрать речь в эталонном аудио (и непонятно, что писать), можно включить эту опцию. При включении вводимый эталонный текст будет игнорироваться.",
|
||||
"启用并行推理版本": "Включить параллельную версию вывода",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "Заполните каталог, где находятся аудиофайлы после разрезания! Полный путь к читаемым аудиофайлам = каталог - файл .list, имя файла соответствует волне (не полный путь). Если оставить пустым, будет использоваться абсолютный путь из файла .list.",
|
||||
"多语种混合": "Смешанные языки",
|
||||
"多语种混合(粤语)": "Многоязычная смесь (кантонский)",
|
||||
"失败": " Неудача",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "Если вы не согласны с этими условиями, вы не можете использовать или ссылаться на любой код или файлы из этого программного пакета. Подробности смотрите в LICENSE в корневом каталоге.",
|
||||
"实际输入的参考文本:": "Фактически введенный референсный текст:",
|
||||
"实际输入的目标文本(切句后):": "Фактически введенный целевой текст (после разбиения на предложения):",
|
||||
"实际输入的目标文本(每句):": "Фактически введенный целевой текст (каждое предложение):",
|
||||
"实际输入的目标文本:": "Фактически введенный целевой текст:",
|
||||
"导出文件格式": "Формат выходных файлов",
|
||||
"已关闭": " Закрыто",
|
||||
"已完成": " Завершено",
|
||||
"已开启": " Включено",
|
||||
"并行推理": "Параллельный вывод",
|
||||
"并行推理模式已关闭": "Режим параллельного вывода отключен",
|
||||
"并行推理模式已开启": "Режим параллельного вывода включен",
|
||||
"开启GPT训练": "Включить обучение GPT",
|
||||
"开启SSL提取": "Включить извлечение SSL",
|
||||
"开启SoVITS训练": "Включить обучение SoVITS",
|
||||
"开启TTS推理WebUI": "Открыть TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "Открыть UVR5-WebUI",
|
||||
"开启一键三连": "Включить одно нажатие",
|
||||
"开启打标WebUI": "Открыть Labeling WebUI",
|
||||
"开启文本获取": "Включить получение текста",
|
||||
"开启": "Включить ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Включить режим без референтного текста. Не заполняя референтный текст, вы также включаете этот режим.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Включить режим без опорного текста. Не заполнять опорный текст также эквивалентно включению этого режима. v3 пока не поддерживает этот режим, его использование вызовет ошибку.",
|
||||
"开启离线批量ASR": "Включить пакетную офлайн ASR",
|
||||
"开启语义token提取": "Включить извлечение семантических токенов",
|
||||
"开启语音切割": "Включить разрезание речи",
|
||||
"开启语音降噪": "Включить шумоподавление",
|
||||
"微调训练": "Обучение с тонкой настройкой",
|
||||
"怎么切": "Как разрезать",
|
||||
"总训练轮数total_epoch": "Общее количество эпох обучения total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "Общее количество эпох обучения total_epoch, не рекомендуется слишком высокое",
|
||||
"打标工具WebUI已关闭": "WebUI инструмента маркировки остановлен",
|
||||
"打标工具WebUI已开启": "WebUI инструмента маркировки запущен",
|
||||
"打标工具进程输出信息": "Информация о процессе аннотации",
|
||||
"指定输出主人声文件夹": "Путь к папке для сохранения вокала:",
|
||||
"指定输出非主人声文件夹": "Путь к папке для сохранения аккомпанемента:",
|
||||
"按中文句号。切": "Разделение по китайским точкам.",
|
||||
"按标点符号切": "Разрезать по пунктуационным знакам",
|
||||
"按英文句号.切": "Разрезать по английской точке.",
|
||||
"推理": "Инференс",
|
||||
"推理设置": "Настройки вывода",
|
||||
"提取文本Bert特征": "Извлечь текстовые признаки BERT",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Разбиение данных на пакеты (уменьшает вычислительные затраты при параллельном выводе)",
|
||||
"数据类型精度": "точность типа данных",
|
||||
"文本分词与特征提取": "Токенизация текста и извлечение признаков",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Инструмент для сегментации текста. Очень длинный текст может не дать хороших результатов синтеза, поэтому рекомендуется сначала разбить его на сегменты. Синтез будет выполняться на основе разрывов строк, а затем объединяться.",
|
||||
"文本模块学习率权重": "Веса скорости обучения текстового модуля",
|
||||
"文本进程输出信息": "Информация о процессе обработки текста",
|
||||
"施工中,请静候佳音": "В разработке, ожидайте хороших новостей",
|
||||
"日文": "Японский",
|
||||
"日英混合": "Японский и английский",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "Сохранять только последние файлы ckpt для экономии места на диске?",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "Сохранить только последние файлы весов для экономии дискового пространства?",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Сохранять финальную версию модели в папке weights на каждом этапе сохранения?",
|
||||
"是否开启dpo训练选项(实验性)": "Включить опцию тренировки dpo (экспериментально)",
|
||||
"是否开启DPO训练选项(实验性)": "Включить опцию обучения DPO (экспериментально)?",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "Настройте скорость речи и тон последнего результата синтеза, чтобы избежать случайности.",
|
||||
"显卡信息": "Информация о видеокарте",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "Это программное обеспечение открыто по лицензии MIT, автор не имеет никакого контроля над программным обеспечением, пользователи программного обеспечения и те, кто распространяет звуки, экспортированные программным обеспечением, несут полную ответственность. <br>Если вы не согласны с этими условиями, вы не можете использовать или ссылаться на любой код и файлы в пакете программного обеспечения. Смотрите <b>LICENSE</b> в корневом каталоге.",
|
||||
"未下载模型": "Модель не загружена",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "Эта программа распространяется с открытым исходным кодом по лицензии MIT, и автор не несёт ответственности за её использование. Пользователь и распространитель звука, созданного программой, несут полную ответственность.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Путь к файлу разметки (с расширением *.list)",
|
||||
"模型": "Модели",
|
||||
"模型分为三类:": "Модели делятся на три типа:",
|
||||
"模型切换": "Переключение модели",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Версия",
|
||||
"粤英混合": "Кантоно-английская смесь",
|
||||
"粤语": "Кантонийский",
|
||||
"终止ASR进程": "Прекратить процесс ASR",
|
||||
"终止GPT训练": "Прекратить обучение GPT",
|
||||
"终止SSL提取进程": "Прекратить процесс извлечения SSL",
|
||||
"终止SoVITS训练": "Прекратить обучение SoVITS",
|
||||
"终止一键三连": "Прекратить одно нажатие",
|
||||
"终止合成": "Завершить синтез",
|
||||
"终止文本获取进程": "Прекратить процесс получения текста",
|
||||
"终止语义token提取进程": "Прекратить процесс извлечения семантических токенов",
|
||||
"终止语音切割": "Прекратить разрезание речи",
|
||||
"终止语音降噪进程": "Прекратить процесс шумоподавления",
|
||||
"缺少Hubert数据集": "Отсутствует набор данных Hubert",
|
||||
"缺少语义数据集": "Отсутствует семантический набор данных",
|
||||
"缺少音素数据集": "Отсутствует набор данных фонем",
|
||||
"缺少音频数据集": "Отсутствует набор данных аудио",
|
||||
"英文": "Английский",
|
||||
"语义token提取进程输出信息": "Информация о процессе извлечения семантических токенов",
|
||||
"训练集格式化一键三连": "Форматирование обучающего набора одним кликом",
|
||||
"训练集格式化工具": "Инструмент форматирования обучающего набора",
|
||||
"语义Token提取": "Извлечение семантических токенов",
|
||||
"语速": "Скорость речи",
|
||||
"语速调整,高为更快": "Регулировка скорости речи, чем выше, тем быстрее",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "Регулировка скорости речи не поддерживает обработку пакетов, обработка пакетов отключена автоматически",
|
||||
"语音切割进程输出信息": "Информация о процессе разрезания речи",
|
||||
"语音降噪进程输出信息": "Информация о процессе шумоподавления",
|
||||
"语音切分": "Разделение аудиофайла",
|
||||
"语音切分工具": "Инструмент разделения аудиофайлов",
|
||||
"语音文本校对标注工具": "Инструмент аннотирования и корректировки аудиотекста",
|
||||
"语音自监督特征提取": "Извлечение характеристик самообучающейся модели речи",
|
||||
"语音识别": "Распознавание речи",
|
||||
"语音识别工具": "Инструмент распознавания речи",
|
||||
"语音降噪": "Шумоподавление аудиофайлов",
|
||||
"语音降噪工具": "Инструмент шумоподавления аудиофайлов",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "Пожалуйста, загрузите референтное аудио длительностью от 3 до 10 секунд, иначе будет ошибка!",
|
||||
"请上传参考音频": "Пожалуйста, загрузите эталонное аудио",
|
||||
"请填入推理文本": "Пожалуйста, введите целевой текст",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Дополнительный опорный аудиофайл (несколько файлов по желанию или ни одного)",
|
||||
"输入待处理音频文件夹路径": "Путь к папке с аудиофайлами для обработки:",
|
||||
"输入文件夹路径": "Введите путь к папке",
|
||||
"输入路径不存在": "Путь ввода не существует",
|
||||
"输入路径存在但不可用": "Путь ввода существует, но недоступен",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "В директории logs/имя_эксперимента должны быть файлы и папки, начинающиеся с 23456",
|
||||
"输出信息": "Статистика",
|
||||
"输出文件夹路径": "Путь к папке для вывода",
|
||||
"输出的语音": "Выводимый звук",
|
||||
"运行中": " Выполняется",
|
||||
"进度": "Прогресс",
|
||||
"进程已终止": " Процесс завершён",
|
||||
"进程输出信息": " Выходные данные процесса",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "Выберите модель, сохраненную в SoVITS_weights и GPT_weights после обучения. По умолчанию используется базовая модель для 5-секундного Zero Shot TTS.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Количество шагов выборки: если кажется, что шумно, попробуйте увеличить, если кажется, что медленно, попробуйте уменьшить",
|
||||
"重复惩罚": "Штраф за повторение",
|
||||
"降噪结果输出文件夹": "Папка для вывода результатов шумоподавления",
|
||||
"降噪音频文件输入文件夹": "Папка для ввода аудиофайлов для шумоподавления",
|
||||
"随机种子": "Случайное начальное значение",
|
||||
"需先终止才能开启下一次任务": "Сначала необходимо завершить текущую задачу, прежде чем запускать новую",
|
||||
"需要合成的切分前文本": "Текст для синтеза до сегментации",
|
||||
"需要合成的文本": "Текст для синтеза",
|
||||
"需要合成的文本的语种": "Язык текста для синтеза",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Корейско-английская смесь",
|
||||
"音频加载失败": "Не удалось загрузить аудио",
|
||||
"音频文件不存在,跳过:": "Аудиофайл не найден, пропускается: ",
|
||||
"音频标注WebUI": "WebUI для аннотирования аудиофайлов",
|
||||
"音频自动切分输入路径,可文件可文件夹": "Путь ввода для автоматического разделения аудио, может быть файлом или папкой",
|
||||
"预训练的GPT模型路径": "Путь к предварительно обученной модели GPT",
|
||||
"预训练的SSL模型路径": "Путь к предварительно обученной модели SSL",
|
||||
"预训练的SoVITS-D模型路径": "Путь к предварительно обученной модели SoVITS-D",
|
||||
"预训练的SoVITS-G模型路径": "Путь к предварительно обученной модели SoVITS-G",
|
||||
"预训练的中文BERT模型路径": "Путь к предварительно обученной китайской модели BERT"
|
||||
"音频超分中": "Супер-разрешение аудио в процессе",
|
||||
"预训练GPT模型路径": "Путь к предобученной модели GPT",
|
||||
"预训练SSL模型路径": "Путь к предобученной модели SSL",
|
||||
"预训练SoVITS-D模型路径": "Путь к предобученной модели SoVITS-D",
|
||||
"预训练SoVITS-G模型路径": "Путь к предобученной модели SoVITS-G",
|
||||
"预训练中文BERT模型路径": "Путь к предобученной китайской модели BERT"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(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;",
|
||||
"(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",
|
||||
"*请上传并填写参考信息": "*Lütfen referans bilgilerini yükleyin ve doldurun",
|
||||
"*请填写需要合成的目标文本和语种模式": "*Lütfen sentezlenecek hedef metni ve dil modunu giriniz.",
|
||||
".list标注文件的路径": ".list etiketleme dosyasının yolu",
|
||||
".限制范围越小判别效果越好。": "Daha az çok dilli olmak daha iyidir",
|
||||
"0-前置数据集获取工具": "0-Ön veri seti alma aracı",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 vokal eşlik ayırma & yankıyı giderme gecikme aracı",
|
||||
"0b-语音切分工具": "0b-Ses bölme aracı",
|
||||
"0bb-语音降噪工具": "0bb-Ses gürültü azaltma aracı",
|
||||
"0c-中文批量离线ASR工具": "0c-Çince toplu offline ASR aracı",
|
||||
"0d-语音文本校对标注工具": "0d-Ses ve metin düzeltme etiketleme aracı",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-Eğitim seti formatlama aracı",
|
||||
"1Aa-文本内容": "1Aa-Metin içeriği",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-Eğitim seti formatlama tek tuşla üçleme",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL kendi kendine denetimli özellik çıkarma",
|
||||
"1Ac-语义token提取": "1Ac-Anlamsal token çıkarma",
|
||||
"1B-微调训练": "1B-Fine-tuning eğitimi",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS eğitimi. Paylaşım için model dosyaları SoVITS_weights altında çıkarılır.",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT eğitimi. Paylaşım için model dosyaları GPT_weights altında çıkarılır.",
|
||||
"1C-推理": "1C-Çıkarım",
|
||||
"1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;": "1. DeEcho-DeReverb modelinin işleme süresi, diğer iki DeEcho modelinin neredeyse iki katıdır;",
|
||||
"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;",
|
||||
"2-GPT-SoVITS-变声": "2-GPT-SoVITS-Ses Değiştirme",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR modeli",
|
||||
"ASR 模型尺寸": "ASR model boyutu",
|
||||
"ASR 语言设置": "ASR dil ayarları",
|
||||
"ASR进程输出信息": "ASR işlemi çıktı bilgisi",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT Eğitimi: Model ağırlık dosyaları GPT_weights/ içinde",
|
||||
"GPT模型列表": "GPT model listesi",
|
||||
"GPT训练进程输出信息": "GPT eğitimi işlemi çıktı bilgisi",
|
||||
"GPT训练": "GPT Eğitimi",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT örnekleme parametreleri (referans metin olmadığında çok düşük olmamalıdır. Emin değilseniz varsayılanı kullanın):",
|
||||
"GPU卡号,只能填1个整数": "GPU kart numarası, sadece bir tamsayı girilebilir",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPU kart numaraları - ile ayrılır, her kart numarası için bir işlem",
|
||||
"SSL进程输出信息": "SSL işlemi çıktı bilgisi",
|
||||
"LoRA秩": "LoRA Derecesi",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 temel modeli eksik, ilgili LoRA ağırlıkları yüklenemiyor",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS Eğitimi: Model ağırlık dosyaları SoVITS_weights/ içinde",
|
||||
"SoVITS模型列表": "SoVITS model listesi",
|
||||
"SoVITS训练进程输出信息": "SoVITS eğitimi işlemi çıktı bilgisi",
|
||||
"TTS推理WebUI进程输出信息": "TTS çıkarımı WebUI işlemi çıktı bilgisi",
|
||||
"TTS推理进程已关闭": "TTS çıkarım işlemi kapatıldı",
|
||||
"TTS推理进程已开启": "TTS çıkarım işlemi başlatıldı",
|
||||
"UVR5已关闭": "UVR5 kapandı",
|
||||
"UVR5已开启": "UVR5 açıldı",
|
||||
"UVR5进程输出信息": "UVR5 işlem çıktı bilgisi",
|
||||
"SoVITS训练": "SoVITS Eğitimi",
|
||||
"TTS推理WebUI": "TTS Çıkarım WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5 İnsan Sesli ve Enstrümantal Ayrım & Reverb ve Gecikme Giderme Aracı",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:Normalizasyondan sonraki sesin ne kadarlık bir oranı karıştırılsın",
|
||||
"batch_size": "Toplu Boyut",
|
||||
"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)",
|
||||
@ -62,27 +42,27 @@
|
||||
"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",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3 bu modu desteklemiyor, kullanıldığında hata verecektir.",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3 çıkışı eğer sıkıcıysa, süper çözünürlük açmayı deneyebilirsiniz",
|
||||
"不切": "Kesme",
|
||||
"中文": "Çince",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "Çince öğretici belge:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "Çince Eğitim Belgesi",
|
||||
"中英混合": "Çince ve İngilizce karışık",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "Ana Referans Sesi (Lütfen 3-10 saniye arasında referans sesi yükleyin, bu sınırı aşarsanız hata alırsınız!)",
|
||||
"主参考音频的文本": "Ana Referans Sesinin Metni",
|
||||
"主参考音频的语种": "Ana Referans Sesinin Dili",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "Ses dosyaları ayrıca toplu olarak, iki seçimle, öncelikli okuma klasörüyle içe aktarılabilir",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "Vokal ve akor ayırma toplu işleme, UVR5 modelini kullanarak.",
|
||||
"人声分离WebUI": "İnsan Sesi Ayrım WebUI",
|
||||
"人声提取激进程度": "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",
|
||||
"使用无参考文本模式时建议使用微调的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.",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "Referanssız Metin Modu kullanırken ince ayarlanmış bir GPT kullanılması önerilir. Referans sesi net anlaşılamıyorsa veya ne yazacağınız belli değilse, bu seçeneği etkinleştirerek referans metni yazılmasını yoksayabilirsiniz.",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "Süper çözünürlük model parametrelerini indirmediniz, bu yüzden süper çözünürlük yapılmaz. Süper çözünürlük yapmak için önce kılavuzu takip ederek dosyaları indirin.",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "Referans metinsiz modda, ince ayar yapılmış GPT kullanmanız tavsiye edilir.",
|
||||
"保存频率save_every_epoch": "Kayıt sıklığı save_every_epoch",
|
||||
"保持随机": "Rastgeleliği Koru",
|
||||
"关闭TTS推理WebUI": "TTS Inference WebUI'yi Kapat",
|
||||
"关闭UVR5-WebUI": "UVR5-WebUI'yi Kapat",
|
||||
"关闭打标WebUI": "Labeling WebUI'yi Kapat",
|
||||
"关闭": "Kapat ",
|
||||
"凑50字一切": "50 kelime birleştir ve kes",
|
||||
"凑四句一切": "Dört cümleyi bir araya getirip kes",
|
||||
"分桶处理模式已关闭": "Kovaya İşleme Modu Kapalı",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "Kesim için kullanılan işlem sayısı",
|
||||
"刷新模型路径": "Model yolu yenile",
|
||||
"前端处理后的文本(每句):": "Ön işleme tabi tutulan metin (her cümle):",
|
||||
"前置数据集获取工具": "Ön Veri Kümesi Alma Aracı",
|
||||
"占用中": " Kullanımda",
|
||||
"去混响/去延迟,附:": "Yankı giderme/Geçikme giderme, ek:",
|
||||
"参考音频在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",
|
||||
"句间停顿秒数": "Cümleler Arası Duraklama Süresi",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "İsteğe bağlı: Birden fazla referans ses dosyasını sürükleyip bırakarak yükleyin (aynı cinsiyetten olmaları önerilir) ve tonlarını ortalayın. Bu seçenek boş bırakılırsa, ton soldaki tek referans ses dosyası tarafından kontrol edilir. Modeli ince ayar yapıyorsanız, tüm referans ses dosyalarının ince ayar eğitim seti içindeki tonlara sahip olması önerilir; önceden eğitilmiş model dikkate alınmayabilir.",
|
||||
"合成语音": "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).",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "Sonraki sürümlerde fonem dönüşümü, el ile fonem düzenleme ve adım adım konuşma sentezi desteği eklenecek.",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "Referans ses kaydını anlamıyorsanız (ne yazacağınızı bilmiyorsanız) açabilirsiniz. Açıldığında yazılmış olan referans metni göz ardı edilir.",
|
||||
"启用并行推理版本": "Paralel Çıkarım Versiyonunu Etkinleştir",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-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)",
|
||||
"失败": " Başarısız",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "Bu şartları kabul etmiyorsanız, yazılım paketindeki herhangi bir kodu veya dosyayı kullanamaz veya alıntılayamazsınız. Detaylar için ana dizindeki LICENSE dosyasına bakın.",
|
||||
"实际输入的参考文本:": "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ı",
|
||||
"已关闭": " Kapalı",
|
||||
"已完成": " Tamamlandı",
|
||||
"已开启": " Açık",
|
||||
"并行推理": "Paralel Çıkarım",
|
||||
"并行推理模式已关闭": "Paralel Çıkarım Modu Kapalı",
|
||||
"并行推理模式已开启": "Paralel Çıkarım Modu Etkin",
|
||||
"开启GPT训练": "GPT eğitimini başlat",
|
||||
"开启SSL提取": "SSL çıkarmayı başlat",
|
||||
"开启SoVITS训练": "SoVITS eğitimini başlat",
|
||||
"开启TTS推理WebUI": "TTS Inference WebUI'yi Aç",
|
||||
"开启UVR5-WebUI": "UVR5-WebUI'yi Aç",
|
||||
"开启一键三连": "Tek tuşla üçlemeyi başlat",
|
||||
"开启打标WebUI": "Labeling WebUI'yi Aç",
|
||||
"开启文本获取": "Metin alma başlat",
|
||||
"开启": "Aç ",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "Referans metni olmayan mod açık. Referans metni doldurulmazsa bu mod otomatik olarak açılır.",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "Referanssız Metin Modunu Etkinleştir. Referans metni boş bırakmak da bu modu etkinleştirmekle eşdeğerdir. v3 bu modu henüz desteklemiyor, kullanılırsa hata verecektir.",
|
||||
"开启离线批量ASR": "Offline toplu ASR başlat",
|
||||
"开启语义token提取": "Anlamsal token çıkarmayı başlat",
|
||||
"开启语音切割": "Ses kesimi başlat",
|
||||
"开启语音降噪": "Ses gürültü azaltmayı başlat",
|
||||
"微调训练": "İnce Ayar Eğitimi",
|
||||
"怎么切": "Nasıl kesilir",
|
||||
"总训练轮数total_epoch": "Toplam eğitim turu sayısı total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "Toplam eğitim turu sayısı total_epoch, çok yüksek önerilmez",
|
||||
"打标工具WebUI已关闭": "Etiketleme aracı WebUI'si kapatıldı",
|
||||
"打标工具WebUI已开启": "Etiketleme aracı WebUI'si açıldı",
|
||||
"打标工具进程输出信息": "Etiketleme aracı işlemi çıktı bilgisi",
|
||||
"指定输出主人声文件夹": "Vokal 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",
|
||||
"推理": "Çıkarım",
|
||||
"推理设置": "Çıkarım Ayarları",
|
||||
"提取文本Bert特征": "Metin BERT Özelliklerini Çıkar",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "Veri Kovaya Ayrılması (Paralel Çıkarımda Hesaplama Maliyetini Azaltır)",
|
||||
"数据类型精度": "veri türü doğruluğu",
|
||||
"文本分词与特征提取": "Metin Kelimelemeleri ve Özellik Çıkartma",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "Metin Bölümleme Aracı. Çok uzun metinlerin sentez sonuçları iyi olmayabilir, bu nedenle uzun metinleri önce bölümlere ayırmanız önerilir. Sentez, metnin satır sonlarına göre ayrı ayrı yapılıp sonra birleştirilecektir.",
|
||||
"文本模块学习率权重": "Metin modülü öğrenme oranı ağı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 yeni ckpt dosyasını kaydederek disk alanından tasarruf edilsin mi",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "Sadece en son ağırlık dosyasını kaydedip sabit disk alanı tasarrufu sağlamak isterseniz",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Her kayıt zamanında son küçük modelin weights klasörüne kaydedilmesi gerekiyor mu",
|
||||
"是否开启dpo训练选项(实验性)": "dpo eğitim seçeneği açılsın mı? (deneysel)",
|
||||
"是否开启DPO训练选项(实验性)": "DPO Eğitim Seçeneğini Açmak (Deneysel)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "Rastgeleliği önlemek için son sentez sonucunun konuşma hızını ve tonunu ayarlayın.",
|
||||
"显卡信息": "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 İndirilmedi",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "Bu yazılım MIT lisansı ile açık kaynak olarak sunulmuştur, yazar yazılım üzerinde herhangi bir kontrol sahibi değildir, yazılımı kullanan veya yazılımın çıktısını dağıtan kişiler tüm sorumluluğu üstlenir.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "Etiketleme Dosyası Yolu (dosya uzantısı *.list dahil)",
|
||||
"模型": "Model",
|
||||
"模型分为三类:": "Modeller üç türdedir:",
|
||||
"模型切换": "Model değiştirme",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "Versiyon",
|
||||
"粤英混合": "Yue-İngilizce Karışık",
|
||||
"粤语": "Yue",
|
||||
"终止ASR进程": "ASR işlemini durdur",
|
||||
"终止GPT训练": "GPT eğitimini durdur",
|
||||
"终止SSL提取进程": "SSL çıkarma işlemini durdur",
|
||||
"终止SoVITS训练": "SoVITS eğitimini durdur",
|
||||
"终止一键三连": "Tek tuşla üçlemeyi durdur",
|
||||
"终止合成": "Sentezi Sonlandır",
|
||||
"终止文本获取进程": "Metin alma işlemini durdur",
|
||||
"终止语义token提取进程": "Anlamsal token çıkarma işlemini durdur",
|
||||
"终止语音切割": "Ses kesimini durdur",
|
||||
"终止语音降噪进程": "Gürültü azaltma işlemini durdur",
|
||||
"缺少Hubert数据集": "Hubert Veri Seti Eksik",
|
||||
"缺少语义数据集": "Anlamsal Veri Seti Eksik",
|
||||
"缺少音素数据集": "Fonem Veri Seti Eksik",
|
||||
"缺少音频数据集": "Ses Veri Seti Eksik",
|
||||
"英文": "İngilizce",
|
||||
"语义token提取进程输出信息": "Anlamsal token çıkarma işlemi çıktı bilgisi",
|
||||
"训练集格式化一键三连": "Eğitim Seti Formatlama Tek Tıkla Üçlü",
|
||||
"训练集格式化工具": "Eğitim Seti Formatlama Aracı",
|
||||
"语义Token提取": "Anlamlı Token Çıkartma",
|
||||
"语速": "Konuşma hızı",
|
||||
"语速调整,高为更快": "Konuşma hızını ayarla, yüksek daha hızlı",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "Konuşma Hızı Ayarlaması Kovaya İşlemeyi Desteklemediği İçin Kovaya İşleme Otomatik Olarak Kapatılmıştır",
|
||||
"语音切割进程输出信息": "Ses kesim işlemi çıktı bilgisi",
|
||||
"语音降噪进程输出信息": "Gürültü azaltma işlemi çıktı bilgisi",
|
||||
"语音切分": "Ses Bölme",
|
||||
"语音切分工具": "Ses Bölme Aracı",
|
||||
"语音文本校对标注工具": "Ses Metni Düzeltme Etiketleme Aracı",
|
||||
"语音自监督特征提取": "Ses Kendiliğinden Denetimli Özellik Çıkartma",
|
||||
"语音识别": "Ses Tanıma",
|
||||
"语音识别工具": "Ses Tanıma Aracı",
|
||||
"语音降噪": "Ses Gürültü Azaltma",
|
||||
"语音降噪工具": "Ses Gürültü Azaltma Aracı",
|
||||
"请上传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",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "Yardımcı Referans Sesi (İsteğe bağlı birden çok seçilebilir veya hiç seçilmeyebilir)",
|
||||
"输入待处理音频文件夹路径": "İşlenecek ses klasörünün yolunu girin:",
|
||||
"输入文件夹路径": "Dosya klasörü yolu girin",
|
||||
"输入路径不存在": "Girdi Yolu Mevcut Değil",
|
||||
"输入路径存在但不可用": "Girdi Yolu Mevcut Ama Kullanılamaz",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "Çıktı logs/deney adı dizininde 23456 ile başlayan dosya ve klasörler olmalı",
|
||||
"输出信息": "Çıkış bilgisi",
|
||||
"输出文件夹路径": "Çıktı klasörü yolu",
|
||||
"输出的语音": "Çıktı sesi",
|
||||
"运行中": " Çalışıyor",
|
||||
"进度": "İlerleme",
|
||||
"进程已终止": " İşlem Sonlandırıldı",
|
||||
"进程输出信息": " İşlem Çıktı Bilgisi",
|
||||
"选择训练完存放在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.",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "Örnekleme Adımları: Eğer gürültülü görünüyorsa, adımları artırın; eğer yavaş görünüyorsa, adımları azaltın",
|
||||
"重复惩罚": "Tekrarlama Cezası",
|
||||
"降噪结果输出文件夹": "Gürültü azaltma sonuçları çıktı klasörü",
|
||||
"降噪音频文件输入文件夹": "Gürültü azaltma ses dosyaları giriş klasörü",
|
||||
"随机种子": "Rastgele Tohum",
|
||||
"需先终止才能开启下一次任务": "Bir sonraki görevi başlatmadan önce mevcut işlem sonlandırılmalıdır",
|
||||
"需要合成的切分前文本": "Sentez İçin Bölümlenmemiş Metin",
|
||||
"需要合成的文本": "Sentezlenmesi gereken metin",
|
||||
"需要合成的文本的语种": "Sentez Metninin Dili",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "Korece-İngilizce Karışık",
|
||||
"音频加载失败": "Ses Yüklenemedi",
|
||||
"音频文件不存在,跳过:": "Ses Dosyası Bulunamadı, Atlanıyor: ",
|
||||
"音频标注WebUI": "Ses Etiketleme WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "Ses otomatik bölme giriş yolu, dosya veya klasör olabilir",
|
||||
"预训练的GPT模型路径": "Ön eğitilmiş GPT model yolu",
|
||||
"预训练的SSL模型路径": "Ön eğitilmiş SSL model yolu",
|
||||
"预训练的SoVITS-D模型路径": "Ön eğitilmiş SoVITS-D model yolu",
|
||||
"预训练的SoVITS-G模型路径": "Ön eğitilmiş SoVITS-G model yolu",
|
||||
"预训练的中文BERT模型路径": "Ön eğitilmiş Çince BERT model yolu"
|
||||
"音频超分中": "Ses Süper Çözünürlük Yapılıyor",
|
||||
"预训练GPT模型路径": "Önceden Eğitilmiş GPT Modeli Yolu",
|
||||
"预训练SSL模型路径": "Önceden Eğitilmiş SSL Modeli Yolu",
|
||||
"预训练SoVITS-D模型路径": "Önceden Eğitilmiş SoVITS-D Modeli Yolu",
|
||||
"预训练SoVITS-G模型路径": "Önceden Eğitilmiş SoVITS-G Modeli Yolu",
|
||||
"预训练中文BERT模型路径": "Önceden Eğitilmiş Çince BERT Modeli Yolu"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho:去除延迟效果。Aggressive 比 Normal 去除得更彻底,DeReverb 额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。",
|
||||
"*GPT模型列表": "*GPT模型列表",
|
||||
"*SoVITS模型列表": "*SoVITS模型列表",
|
||||
"*实验/模型名": "*实验/模型名",
|
||||
"*文本标注文件": "*文本标注文件",
|
||||
"*训练集音频文件目录": "*训练集音频文件目录",
|
||||
"*请上传并填写参考信息": "*请上传并填写参考信息",
|
||||
"*请填写需要合成的目标文本和语种模式": "*请填写需要合成的目标文本和语种模式",
|
||||
".list标注文件的路径": ".list标注文件的路径",
|
||||
".限制范围越小判别效果越好。": ".限制范围越小判别效果越好。",
|
||||
"0-前置数据集获取工具": "0-前置数据集获取工具",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人声伴奏分离&去混响去延迟工具",
|
||||
"0b-语音切分工具": "0b-语音切分工具",
|
||||
"0bb-语音降噪工具": "0bb-语音降噪工具",
|
||||
"0c-中文批量离线ASR工具": "0c-中文批量离线ASR工具",
|
||||
"0d-语音文本校对标注工具": "0d-语音文本校对标注工具",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-训练集格式化工具",
|
||||
"1Aa-文本内容": "1Aa-文本内容",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-训练集格式化一键三连",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL自监督特征提取",
|
||||
"1Ac-语义token提取": "1Ac-语义token提取",
|
||||
"1B-微调训练": "1B-微调训练",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。",
|
||||
"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-变声",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR 模型",
|
||||
"ASR 模型尺寸": "ASR 模型尺寸",
|
||||
"ASR 语言设置": "ASR 语言设置",
|
||||
"ASR进程输出信息": "ASR进程输出信息",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT 训练: 模型权重文件在 GPT_weights/",
|
||||
"GPT模型列表": "GPT模型列表",
|
||||
"GPT训练进程输出信息": "GPT训练进程输出信息",
|
||||
"GPT训练": "GPT训练",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT采样参数(无参考文本时不要太低。不懂就用默认):",
|
||||
"GPU卡号,只能填1个整数": "GPU卡号,只能填1个整数",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPU卡号以-分割,每个卡号一个进程",
|
||||
"SSL进程输出信息": "SSL进程输出信息",
|
||||
"LoRA秩": "LoRA秩",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 底模缺失,无法加载相应 LoRA 权重",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS 训练: 模型权重文件在 SoVITS_weights/",
|
||||
"SoVITS模型列表": "SoVITS模型列表",
|
||||
"SoVITS训练进程输出信息": "SoVITS训练进程输出信息",
|
||||
"TTS推理WebUI进程输出信息": "TTS推理WebUI进程输出信息",
|
||||
"TTS推理进程已关闭": "TTS推理进程已关闭",
|
||||
"TTS推理进程已开启": "TTS推理进程已开启",
|
||||
"UVR5已关闭": "UVR5已关闭",
|
||||
"UVR5已开启": "UVR5已开启",
|
||||
"UVR5进程输出信息": "UVR5进程输出信息",
|
||||
"SoVITS训练": "SoVITS训练",
|
||||
"TTS推理WebUI": "TTS推理WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5人声伴奏分离&去混响去延迟工具",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例归一化后音频进来",
|
||||
"batch_size": "batch_size",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小于这个值视作静音的备选切割点",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "一键三连进程输出信息",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3暂不支持该模式,使用了会报错。",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3输出如果觉得闷可以试试开超分",
|
||||
"不切": "不切",
|
||||
"中文": "中文",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "中文教程文档",
|
||||
"中英混合": "中英混合",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "主参考音频(请上传3~10秒内参考音频,超过会报错!)",
|
||||
"主参考音频的文本": "主参考音频的文本",
|
||||
"主参考音频的语种": "主参考音频的语种",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "人声伴奏分离批量处理, 使用UVR5模型。",
|
||||
"人声分离WebUI": "人声分离WebUI",
|
||||
"人声提取激进程度": "人声提取激进程度",
|
||||
"以下文件或文件夹不存在": "以下文件或文件夹不存在",
|
||||
"以下模型不存在:": "以下模型不存在:",
|
||||
"伴奏人声分离&去混响&去回声": "伴奏人声分离&去混响&去回声",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "使用无参考文本模式时建议使用微调的GPT",
|
||||
"保存频率save_every_epoch": "保存频率save_every_epoch",
|
||||
"保持随机": "保持随机",
|
||||
"关闭TTS推理WebUI": "关闭TTS推理WebUI",
|
||||
"关闭UVR5-WebUI": "关闭UVR5-WebUI",
|
||||
"关闭打标WebUI": "关闭打标WebUI",
|
||||
"关闭": "关闭",
|
||||
"凑50字一切": "凑50字一切",
|
||||
"凑四句一切": "凑四句一切",
|
||||
"分桶处理模式已关闭": "分桶处理模式已关闭",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "切割使用的进程数",
|
||||
"刷新模型路径": "刷新模型路径",
|
||||
"前端处理后的文本(每句):": "前端处理后的文本(每句):",
|
||||
"前置数据集获取工具": "前置数据集获取工具",
|
||||
"占用中": "占用中",
|
||||
"去混响/去延迟,附:": "去混响/去延迟,附:",
|
||||
"参考音频在3~10秒范围外,请更换!": "参考音频在3~10秒范围外,请更换!",
|
||||
"参考音频的文本": "参考音频的文本",
|
||||
"参考音频的语种": "参考音频的语种",
|
||||
"句间停顿秒数": "句间停顿秒数",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。",
|
||||
"合成语音": "合成语音",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "后续将支持转音素、手工修改音素、语音合成分步执行。",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。",
|
||||
"启用并行推理版本": "启用并行推理版本",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。",
|
||||
"多语种混合": "多语种混合",
|
||||
"多语种混合(粤语)": "多语种混合(粤语)",
|
||||
"失败": "失败",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.",
|
||||
"实际输入的参考文本:": "实际输入的参考文本:",
|
||||
"实际输入的目标文本(切句后):": "实际输入的目标文本(切句后):",
|
||||
"实际输入的目标文本(每句):": "实际输入的目标文本(每句):",
|
||||
"实际输入的目标文本:": "实际输入的目标文本:",
|
||||
"导出文件格式": "导出文件格式",
|
||||
"已关闭": "已关闭",
|
||||
"已完成": "已完成",
|
||||
"已开启": "已开启",
|
||||
"并行推理": "并行推理",
|
||||
"并行推理模式已关闭": "并行推理模式已关闭",
|
||||
"并行推理模式已开启": "并行推理模式已开启",
|
||||
"开启GPT训练": "开启GPT训练",
|
||||
"开启SSL提取": "开启SSL提取",
|
||||
"开启SoVITS训练": "开启SoVITS训练",
|
||||
"开启TTS推理WebUI": "开启TTS推理WebUI",
|
||||
"开启UVR5-WebUI": "开启UVR5-WebUI",
|
||||
"开启一键三连": "开启一键三连",
|
||||
"开启打标WebUI": "开启打标WebUI",
|
||||
"开启文本获取": "开启文本获取",
|
||||
"开启": "开启",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "开启无参考文本模式。不填参考文本亦相当于开启。",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。",
|
||||
"开启离线批量ASR": "开启离线批量ASR",
|
||||
"开启语义token提取": "开启语义token提取",
|
||||
"开启语音切割": "开启语音切割",
|
||||
"开启语音降噪": "开启语音降噪",
|
||||
"微调训练": "微调训练",
|
||||
"怎么切": "怎么切",
|
||||
"总训练轮数total_epoch": "总训练轮数total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "总训练轮数total_epoch,不建议太高",
|
||||
"打标工具WebUI已关闭": "打标工具WebUI已关闭",
|
||||
"打标工具WebUI已开启": "打标工具WebUI已开启",
|
||||
"打标工具进程输出信息": "打标工具进程输出信息",
|
||||
"指定输出主人声文件夹": "指定输出主人声文件夹",
|
||||
"指定输出非主人声文件夹": "指定输出非主人声文件夹",
|
||||
"按中文句号。切": "按中文句号。切",
|
||||
"按标点符号切": "按标点符号切",
|
||||
"按英文句号.切": "按英文句号.切",
|
||||
"推理": "推理",
|
||||
"推理设置": "推理设置",
|
||||
"提取文本Bert特征": "提取文本Bert特征",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "数据分桶(并行推理时会降低一点计算量)",
|
||||
"数据类型精度": "数据类型精度",
|
||||
"文本分词与特征提取": "文本分词与特征提取",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。",
|
||||
"文本模块学习率权重": "文本模块学习率权重",
|
||||
"文本进程输出信息": "文本进程输出信息",
|
||||
"施工中,请静候佳音": "施工中,请静候佳音",
|
||||
"日文": "日文",
|
||||
"日英混合": "日英混合",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "是否仅保存最新的权重文件以节省硬盘空间",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹",
|
||||
"是否开启dpo训练选项(实验性)": "是否开启dpo训练选项(实验性)",
|
||||
"是否开启DPO训练选项(实验性)": "是否开启DPO训练选项(实验性)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "是否直接对上次合成结果调整语速和音色。防止随机性。",
|
||||
"显卡信息": "显卡信息",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.",
|
||||
"未下载模型": "未下载模型",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "标注文件路径 (含文件后缀 *.list)",
|
||||
"模型": "模型",
|
||||
"模型分为三类:": "模型分为三类:",
|
||||
"模型切换": "模型切换",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "版本",
|
||||
"粤英混合": "粤英混合",
|
||||
"粤语": "粤语",
|
||||
"终止ASR进程": "终止ASR进程",
|
||||
"终止GPT训练": "终止GPT训练",
|
||||
"终止SSL提取进程": "终止SSL提取进程",
|
||||
"终止SoVITS训练": "终止SoVITS训练",
|
||||
"终止一键三连": "终止一键三连",
|
||||
"终止合成": "终止合成",
|
||||
"终止文本获取进程": "终止文本获取进程",
|
||||
"终止语义token提取进程": "终止语义token提取进程",
|
||||
"终止语音切割": "终止语音切割",
|
||||
"终止语音降噪进程": "终止语音降噪进程",
|
||||
"缺少Hubert数据集": "缺少Hubert数据集",
|
||||
"缺少语义数据集": "缺少语义数据集",
|
||||
"缺少音素数据集": "缺少音素数据集",
|
||||
"缺少音频数据集": "缺少音频数据集",
|
||||
"英文": "英文",
|
||||
"语义token提取进程输出信息": "语义token提取进程输出信息",
|
||||
"训练集格式化一键三连": "训练集格式化一键三连",
|
||||
"训练集格式化工具": "训练集格式化工具",
|
||||
"语义Token提取": "语义Token提取",
|
||||
"语速": "语速",
|
||||
"语速调整,高为更快": "语速调整,高为更快",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "语速调节不支持分桶处理,已自动关闭分桶处理",
|
||||
"语音切割进程输出信息": "语音切割进程输出信息",
|
||||
"语音降噪进程输出信息": "语音降噪进程输出信息",
|
||||
"语音切分": "语音切分",
|
||||
"语音切分工具": "语音切分工具",
|
||||
"语音文本校对标注工具": "语音文本校对标注工具",
|
||||
"语音自监督特征提取": "语音自监督特征提取",
|
||||
"语音识别": "语音识别",
|
||||
"语音识别工具": "语音识别工具",
|
||||
"语音降噪": "语音降噪",
|
||||
"语音降噪工具": "语音降噪工具",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "请上传3~10秒内参考音频,超过会报错!",
|
||||
"请上传参考音频": "请上传参考音频",
|
||||
"请填入推理文本": "请填入推理文本",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "辅参考音频(可选多个,或不选)",
|
||||
"输入待处理音频文件夹路径": "输入待处理音频文件夹路径",
|
||||
"输入文件夹路径": "输入文件夹路径",
|
||||
"输入路径不存在": "输入路径不存在",
|
||||
"输入路径存在但不可用": "输入路径存在但不可用",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "输出logs/实验名目录下应有23456开头的文件和文件夹",
|
||||
"输出信息": "输出信息",
|
||||
"输出文件夹路径": "输出文件夹路径",
|
||||
"输出的语音": "输出的语音",
|
||||
"运行中": "运行中",
|
||||
"进度": "进度",
|
||||
"进程已终止": "进程已终止",
|
||||
"进程输出信息": "进程输出信息",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "采样步数,如果觉得电,提高试试,如果觉得慢,降低试试",
|
||||
"重复惩罚": "重复惩罚",
|
||||
"降噪结果输出文件夹": "降噪结果输出文件夹",
|
||||
"降噪音频文件输入文件夹": "降噪音频文件输入文件夹",
|
||||
"随机种子": "随机种子",
|
||||
"需先终止才能开启下一次任务": "需先终止才能开启下一次任务",
|
||||
"需要合成的切分前文本": "需要合成的切分前文本",
|
||||
"需要合成的文本": "需要合成的文本",
|
||||
"需要合成的文本的语种": "需要合成的文本的语种",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "韩英混合",
|
||||
"音频加载失败": "音频加载失败",
|
||||
"音频文件不存在,跳过:": "音频文件不存在,跳过:",
|
||||
"音频标注WebUI": "音频标注WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "音频自动切分输入路径,可文件可文件夹",
|
||||
"预训练的GPT模型路径": "预训练的GPT模型路径",
|
||||
"预训练的SSL模型路径": "预训练的SSL模型路径",
|
||||
"预训练的SoVITS-D模型路径": "预训练的SoVITS-D模型路径",
|
||||
"预训练的SoVITS-G模型路径": "预训练的SoVITS-G模型路径",
|
||||
"预训练的中文BERT模型路径": "预训练的中文BERT模型路径"
|
||||
"音频超分中": "音频超分中",
|
||||
"预训练GPT模型路径": "预训练GPT模型路径",
|
||||
"预训练SSL模型路径": "预训练SSL模型路径",
|
||||
"预训练SoVITS-D模型路径": "预训练SoVITS-D模型路径",
|
||||
"预训练SoVITS-G模型路径": "预训练SoVITS-G模型路径",
|
||||
"预训练中文BERT模型路径": "预训练中文BERT模型路径"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):對於雙通道混響是最佳選擇,但不能去除單通道混響;",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho: 去除延遲效果。Aggressive 比 Normal 去除得更徹底,DeReverb 額外去除混響,可去除單聲道混響,但對高頻重的板式混響去不乾淨。",
|
||||
"*GPT模型列表": "*GPT模型列表",
|
||||
"*SoVITS模型列表": "*SoVITS模型列表",
|
||||
"*实验/模型名": "*實驗/模型名",
|
||||
"*文本标注文件": "*文本標注文件",
|
||||
"*训练集音频文件目录": "*訓練集音頻文件目錄",
|
||||
"*请上传并填写参考信息": "*請上傳並填寫參考信息",
|
||||
"*请填写需要合成的目标文本和语种模式": "請填寫需要合成的目標文本和語言模式",
|
||||
".list标注文件的路径": ".list標註文件的路徑",
|
||||
".限制范围越小判别效果越好。": ".限制范围越小判别效果越好。",
|
||||
"0-前置数据集获取工具": "0-前置數據集獲取工具",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人聲伴奏分離&去混響去延遲工具",
|
||||
"0b-语音切分工具": "0b-語音切分工具",
|
||||
"0bb-语音降噪工具": "0bb-語音降噪工具",
|
||||
"0c-中文批量离线ASR工具": "0c-中文批量離線ASR工具",
|
||||
"0d-语音文本校对标注工具": "0d-語音文本校對標注工具",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-訓練集格式化工具",
|
||||
"1Aa-文本内容": "1Aa-文本內容",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-訓練集格式化一鍵三連",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL自監督特徵提取",
|
||||
"1Ac-语义token提取": "1Ac-語義token提取",
|
||||
"1B-微调训练": "1B-微調訓練",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。用於分享的模型文件輸出在SoVITS_weights下。",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。用於分享的模型文件輸出在GPT_weights下。",
|
||||
"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-變聲",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR 模型",
|
||||
"ASR 模型尺寸": "ASR 模型尺寸",
|
||||
"ASR 语言设置": "ASR 語言設置",
|
||||
"ASR进程输出信息": "ASR進程輸出信息",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT 訓練: 模型權重檔案在 GPT_weights/",
|
||||
"GPT模型列表": "GPT模型列表",
|
||||
"GPT训练进程输出信息": "GPT訓練進程輸出信息",
|
||||
"GPT训练": "GPT訓練",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT 采样参数(无参考文本时不要太低。不懂就用默认):",
|
||||
"GPU卡号,只能填1个整数": "GPU卡號,只能填1個整數",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPU卡號以-分割,每個卡號一個進程",
|
||||
"SSL进程输出信息": "SSL進程輸出信息",
|
||||
"LoRA秩": "LoRA秩",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 底模缺失,無法加載相應 LoRA 權重",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS 訓練: 模型權重檔案在 SoVITS_weights/",
|
||||
"SoVITS模型列表": "SoVITS模型列表",
|
||||
"SoVITS训练进程输出信息": "SoVITS訓練進程輸出信息",
|
||||
"TTS推理WebUI进程输出信息": "TTS推理WebUI進程輸出信息",
|
||||
"TTS推理进程已关闭": "TTS推理進程已關閉",
|
||||
"TTS推理进程已开启": "TTS推理進程已開啟",
|
||||
"UVR5已关闭": "UVR5已關閉",
|
||||
"UVR5已开启": "UVR5已開啟",
|
||||
"UVR5进程输出信息": "UVR5進程輸出信息",
|
||||
"SoVITS训练": "SoVITS訓練",
|
||||
"TTS推理WebUI": "TTS推理WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5人聲伴奏分離&去混響去延遲工具",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例歸一化後音頻進來",
|
||||
"batch_size": "批次大小",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎麼算音量曲線,越小精度越大計算量越高(不是精度越大效果越好)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小於這個值視作靜音的備選切割點",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "一鍵三連進程輸出信息",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3暫不支持該模式,使用了會報錯。",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3輸出如果覺得悶可以試試開超分",
|
||||
"不切": "不切",
|
||||
"中文": "中文",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文檔:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "中文教程文檔",
|
||||
"中英混合": "中英混合",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "主參考音頻(請上傳3~10秒內參考音頻,超過會報錯!)",
|
||||
"主参考音频的文本": "主參考音頻的文本",
|
||||
"主参考音频的语种": "主參考音頻的語種",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "人聲伴奏分離批量處理, 使用UVR5模型。",
|
||||
"人声分离WebUI": "人聲分離WebUI",
|
||||
"人声提取激进程度": "人聲提取激進程度",
|
||||
"以下文件或文件夹不存在": "沒有此文件或文件夾",
|
||||
"以下模型不存在:": "以下模型不存在:",
|
||||
"伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT,聽不清參考音頻說的是啥(不知道寫啥)可以開啟,開啟後無視填寫的參考文本。",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT,聽不清參考音頻說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "你沒有下載超分模型的參數,因此不進行超分。如想超分請先參照教程把文件下載好",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "使用無參考文本模式時建議使用微調的GPT",
|
||||
"保存频率save_every_epoch": "保存頻率save_every_epoch",
|
||||
"保持随机": "保持隨機",
|
||||
"关闭TTS推理WebUI": "關閉 TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "關閉 UVR5-WebUI",
|
||||
"关闭打标WebUI": "關閉 Labeling WebUI",
|
||||
"关闭": "關閉",
|
||||
"凑50字一切": "湊50字一切",
|
||||
"凑四句一切": "湊四句一切",
|
||||
"分桶处理模式已关闭": "分桶處理模式已關閉",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "切割使用的進程數",
|
||||
"刷新模型路径": "刷新模型路徑",
|
||||
"前端处理后的文本(每句):": "前端處理後的文本(每句):",
|
||||
"前置数据集获取工具": "前置數據集獲取工具",
|
||||
"占用中": "佔用中",
|
||||
"去混响/去延迟,附:": "去混響/去延遲,附",
|
||||
"参考音频在3~10秒范围外,请更换!": "參考音頻在3~10秒範圍外,請更換!",
|
||||
"参考音频的文本": "參考音頻的文本",
|
||||
"参考音频的语种": "參考音頻的語種",
|
||||
"句间停顿秒数": "句間停頓秒數",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "可選項:通過拖曳多個文件上傳多個參考音頻(建議同性),平均融合他們的音色。如不填寫此項,音色由左側單個參考音頻控制。如是微調模型,建議參考音頻全部在微調訓練集音色內,底模不用管。",
|
||||
"合成语音": "合成語音",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的文件夾路徑格式舉例: E:\\codes\\py39\\vits_vc_gpu\\白鷺霜華測試樣例(去文件管理器地址欄拷就行了)。",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "後續將支持轉音素、手工修改音素、語音合成分步執行。",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "聽不清參考音頻說的啥(不曉得寫啥)可以開。開啟後無視填寫的參考文本。",
|
||||
"启用并行推理版本": "啟用並行推理版本",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "填切割後音頻所在目錄!讀取的音頻文件完整路徑=該目錄-拼接-list文件裡波形對應的文件名(不是全路徑)。如果留空則使用.list文件裡的絕對全路徑。",
|
||||
"多语种混合": "多語種混合",
|
||||
"多语种混合(粤语)": "多語種混合 (粵語)",
|
||||
"失败": "失敗",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "如不認可該條款, 則不能使用或引用軟體包內任何程式碼和文件. 詳見根目錄LICENSE.",
|
||||
"实际输入的参考文本:": "實際輸入的參考文本:",
|
||||
"实际输入的目标文本(切句后):": "實際輸入的目標文本(切句後):",
|
||||
"实际输入的目标文本(每句):": "實際輸入的目標文本(每句):",
|
||||
"实际输入的目标文本:": "實際輸入的目標文本:",
|
||||
"导出文件格式": "導出檔格式",
|
||||
"已关闭": "已關閉",
|
||||
"已完成": "已完成",
|
||||
"已开启": "已開啟",
|
||||
"并行推理": "並行推理",
|
||||
"并行推理模式已关闭": "並行推理模式已關閉",
|
||||
"并行推理模式已开启": "並行推理模式已開啟",
|
||||
"开启GPT训练": "開啟GPT訓練",
|
||||
"开启SSL提取": "開啟SSL提取",
|
||||
"开启SoVITS训练": "開啟SoVITS訓練",
|
||||
"开启TTS推理WebUI": "開啟 TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "開啟 UVR5-WebUI",
|
||||
"开启一键三连": "開啟一鍵三連",
|
||||
"开启打标WebUI": "開啟 Labeling WebUI",
|
||||
"开启文本获取": "開啟文本獲取",
|
||||
"开启": "開啟",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "開啟無參考文本模式。不填參考文本亦相當於開啟。",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "開啟無參考文本模式。不填參考文本亦相當於開啟。v3暫不支持該模式,使用了會報錯。",
|
||||
"开启离线批量ASR": "開啟離線批量ASR",
|
||||
"开启语义token提取": "開啟語義token提取",
|
||||
"开启语音切割": "開啟語音切割",
|
||||
"开启语音降噪": "開啟語音降噪",
|
||||
"微调训练": "微調訓練",
|
||||
"怎么切": "怎麼切",
|
||||
"总训练轮数total_epoch": "總訓練輪數total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "總訓練輪數total_epoch,不建議太高",
|
||||
"打标工具WebUI已关闭": "打標工具WebUI已關閉",
|
||||
"打标工具WebUI已开启": "打標工具WebUI已開啟",
|
||||
"打标工具进程输出信息": "打標工具進程輸出信息",
|
||||
"指定输出主人声文件夹": "指定输出主人声文件夹",
|
||||
"指定输出非主人声文件夹": "指定输出非主人声文件夹",
|
||||
"按中文句号。切": "按中文句號。切",
|
||||
"按标点符号切": "按標點符號切",
|
||||
"按英文句号.切": "按英文句號.切",
|
||||
"推理": "推理",
|
||||
"推理设置": "推理設置",
|
||||
"提取文本Bert特征": "提取文本BERT特徵",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "數據分桶(並行推理時會降低一點計算量)",
|
||||
"数据类型精度": "數據類型精度",
|
||||
"文本分词与特征提取": "文本分詞與特徵提取",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "文本切分工具。太長的文本合成出來效果不一定好,所以太長建議先切。合成會根據文本的換行分開合成再拼起來。",
|
||||
"文本模块学习率权重": "文本模塊學習率權重",
|
||||
"文本进程输出信息": "文本進程輸出信息",
|
||||
"施工中,请静候佳音": "施工中,請靜候佳音",
|
||||
"日文": "日文",
|
||||
"日英混合": "日英混合",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt文件以節省硬碟空間",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "是否僅保存最新的權重文件以節省硬碟空間",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights文件夾",
|
||||
"是否开启dpo训练选项(实验性)": "是否開啟dpo訓練選項(實驗性)",
|
||||
"是否开启DPO训练选项(实验性)": "是否開啟DPO訓練選項(實驗性)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "是否直接對上次合成結果調整語速和音色,以防止隨機性。",
|
||||
"显卡信息": "顯卡信息",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟件以MIT協議開源, 作者不對軟件具備任何控制力, 使用軟件者、傳播軟件導出的聲音者自負全責. <br>如不認可該條款, 則不能使用或引用軟件包內任何代碼和文件. 詳見根目錄<b>LICENSE</b>.",
|
||||
"未下载模型": "未下載模型",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "本軟體以MIT協議開源, 作者不對軟體具備任何控制力, 使用軟體者、傳播軟體導出的聲音者自負全責.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "標註文件路徑 (含文件後綴 *.list)",
|
||||
"模型": "模型",
|
||||
"模型分为三类:": "模型分為三類:",
|
||||
"模型切换": "模型切換",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "版本",
|
||||
"粤英混合": "粵英混合",
|
||||
"粤语": "粵語",
|
||||
"终止ASR进程": "終止ASR進程",
|
||||
"终止GPT训练": "終止GPT訓練",
|
||||
"终止SSL提取进程": "終止SSL提取進程",
|
||||
"终止SoVITS训练": "終止SoVITS訓練",
|
||||
"终止一键三连": "終止一鍵三連",
|
||||
"终止合成": "終止合成",
|
||||
"终止文本获取进程": "終止文本獲取進程",
|
||||
"终止语义token提取进程": "終止語義token提取進程",
|
||||
"终止语音切割": "終止語音切割",
|
||||
"终止语音降噪进程": "終止語音降噪進程",
|
||||
"缺少Hubert数据集": "缺少Hubert數據集",
|
||||
"缺少语义数据集": "缺少語義數據集",
|
||||
"缺少音素数据集": "缺少音素數據集",
|
||||
"缺少音频数据集": "缺少音頻數據集",
|
||||
"英文": "英文",
|
||||
"语义token提取进程输出信息": "語義token提取進程輸出信息",
|
||||
"训练集格式化一键三连": "訓練集格式化一鍵三連",
|
||||
"训练集格式化工具": "訓練集格式化工具",
|
||||
"语义Token提取": "語義Token提取",
|
||||
"语速": "語速",
|
||||
"语速调整,高为更快": "調整語速,高為更快",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "語速調節不支持分桶處理,已自動關閉分桶處理",
|
||||
"语音切割进程输出信息": "語音切割進程輸出信息",
|
||||
"语音降噪进程输出信息": "語音降噪進程輸出信息",
|
||||
"语音切分": "語音切分",
|
||||
"语音切分工具": "語音切分工具",
|
||||
"语音文本校对标注工具": "語音文本校對標註工具",
|
||||
"语音自监督特征提取": "語音自監督特徵提取",
|
||||
"语音识别": "語音識別",
|
||||
"语音识别工具": "語音識別工具",
|
||||
"语音降噪": "語音降噪",
|
||||
"语音降噪工具": "語音降噪工具",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "請上傳3~10秒內參考音頻,超過會報錯!",
|
||||
"请上传参考音频": "請上傳參考音頻",
|
||||
"请填入推理文本": "請填入推理文本",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "輔參考音頻(可選多個,或不選)",
|
||||
"输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑",
|
||||
"输入文件夹路径": "輸入文件夾路徑",
|
||||
"输入路径不存在": "輸入路徑不存在",
|
||||
"输入路径存在但不可用": "輸入路徑存在但不可用",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "輸出logs/實驗名目錄下應有23456開頭的文件和文件夾",
|
||||
"输出信息": "輸出訊息",
|
||||
"输出文件夹路径": "輸出文件夾路徑",
|
||||
"输出的语音": "輸出的語音",
|
||||
"运行中": "運行中",
|
||||
"进度": "進度",
|
||||
"进程已终止": "進程已終止",
|
||||
"进程输出信息": "進程輸出信息",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "選擇訓練完存放在SoVITS_weights和GPT_weights下的模型。默認的一個是底模,體驗5秒Zero Shot TTS用。",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "採樣步數,如果覺得電,提高試試,如果覺得慢,降低試試",
|
||||
"重复惩罚": "重複懲罰",
|
||||
"降噪结果输出文件夹": "降噪結果輸出文件夾",
|
||||
"降噪音频文件输入文件夹": "降噪音頻文件輸入文件夾",
|
||||
"随机种子": "隨機種子",
|
||||
"需先终止才能开启下一次任务": "需先終止才能開啟下一次任務",
|
||||
"需要合成的切分前文本": "需要合成的切分前文本",
|
||||
"需要合成的文本": "需要合成的文本",
|
||||
"需要合成的文本的语种": "需要合成的文本的語種",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "韓英混合",
|
||||
"音频加载失败": "無法加載音頻",
|
||||
"音频文件不存在,跳过:": "音頻檔案不存在,跳過:",
|
||||
"音频标注WebUI": "音頻標註WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "音頻自動切分輸入路徑,可文件可文件夾",
|
||||
"预训练的GPT模型路径": "預訓練的GPT模型路徑",
|
||||
"预训练的SSL模型路径": "預訓練的SSL模型路徑",
|
||||
"预训练的SoVITS-D模型路径": "預訓練的SoVITS-D模型路徑",
|
||||
"预训练的SoVITS-G模型路径": "預訓練的SoVITS-G模型路徑",
|
||||
"预训练的中文BERT模型路径": "預訓練的中文BERT模型路徑"
|
||||
"音频超分中": "音頻超分中",
|
||||
"预训练GPT模型路径": "預訓練GPT模型路徑",
|
||||
"预训练SSL模型路径": "預訓練SSL模型路徑",
|
||||
"预训练SoVITS-D模型路径": "預訓練SoVITS-D模型路徑",
|
||||
"预训练SoVITS-G模型路径": "預訓練SoVITS-G模型路徑",
|
||||
"预训练中文BERT模型路径": "預訓練中文BERT模型路徑"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):對於雙通道混響是最好的選擇,不能去除單通道混響;",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho:去除延遲效果。Aggressive 比 Normal 去除得更徹底,DeReverb 額外去除混響,可去除單聲道混響,但是對高頻重的板式混響去不乾淨。",
|
||||
"*GPT模型列表": "*GPT模型列表",
|
||||
"*SoVITS模型列表": "*SoVITS模型列表",
|
||||
"*实验/模型名": "*實驗/模型名",
|
||||
"*文本标注文件": "*文本標註文件",
|
||||
"*训练集音频文件目录": "*訓練集音頻文件目錄",
|
||||
"*请上传并填写参考信息": "*請上傳並填寫參考信息",
|
||||
"*请填写需要合成的目标文本和语种模式": "請填寫需要合成的目標文本和語言模式",
|
||||
".list标注文件的路径": ".list標註文件的路徑",
|
||||
".限制范围越小判别效果越好。": ".限制范围越小判别效果越好。",
|
||||
"0-前置数据集获取工具": "0-前置數據集獲取工具",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人聲伴奏分離&去混響去延遲工具",
|
||||
"0b-语音切分工具": "0b-語音切分工具",
|
||||
"0bb-语音降噪工具": "0bb-語音降噪工具",
|
||||
"0c-中文批量离线ASR工具": "0c-中文批量離線ASR工具",
|
||||
"0d-语音文本校对标注工具": "0d-語音文本校對標註工具",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-訓練集格式化工具",
|
||||
"1Aa-文本内容": "1Aa-文本內容",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-訓練集格式化一鍵三連",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL自監督特徵提取",
|
||||
"1Ac-语义token提取": "1Ac-語義token提取",
|
||||
"1B-微调训练": "1B-微調訓練",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。用於分享的模型文件輸出在SoVITS_weights下。",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。用於分享的模型文件輸出在GPT_weights下。",
|
||||
"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-變聲",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR 模型",
|
||||
"ASR 模型尺寸": "ASR 模型尺寸",
|
||||
"ASR 语言设置": "ASR 語言設定",
|
||||
"ASR进程输出信息": "ASR進程輸出資訊",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT 训练: 模型权重文件在 GPT_weights/ 目錄下",
|
||||
"GPT模型列表": "GPT模型列表",
|
||||
"GPT训练进程输出信息": "GPT訓練進程輸出資訊",
|
||||
"GPT训练": "GPT訓練",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT 采样参数(无参考文本时不要太低。不懂就用默认):",
|
||||
"GPU卡号,只能填1个整数": "GPU卡號,只能填1個整數",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPU卡號以-分割,每個卡號一個進程",
|
||||
"SSL进程输出信息": "SSL進程輸出資訊",
|
||||
"LoRA秩": "LoRA秩",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 底模缺失,無法加載相應 LoRA 權重",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS 訓練: 模型權重文件在 SoVITS_weights/ 目錄下",
|
||||
"SoVITS模型列表": "SoVITS模型列表",
|
||||
"SoVITS训练进程输出信息": "SoVITS訓練進程輸出資訊",
|
||||
"TTS推理WebUI进程输出信息": "TTS推理WebUI進程輸出資訊",
|
||||
"TTS推理进程已关闭": "TTS推理進程已關閉",
|
||||
"TTS推理进程已开启": "TTS推理進程已開啟",
|
||||
"UVR5已关闭": "UVR5已關閉",
|
||||
"UVR5已开启": "UVR5已開啟",
|
||||
"UVR5进程输出信息": "UVR5進程輸出資訊",
|
||||
"SoVITS训练": "SoVITS訓練",
|
||||
"TTS推理WebUI": "TTS推理WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5人聲伴奏分離&去混響去延遲工具",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例歸一化後音頻進來",
|
||||
"batch_size": "批次大小",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎麼算音量曲線,越小精度越大計算量越高(不是精度越大效果越好)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小於這個值視作靜音的備選切割點",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "一鍵三連進程輸出資訊",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3暫不支援該模式,使用了會報錯。",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3輸出如果覺得悶可以試試開超分",
|
||||
"不切": "不切",
|
||||
"中文": "中文",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文檔:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "中文教程文檔",
|
||||
"中英混合": "中英混合",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "主參考音檔(請上傳3~10秒內參考音檔,超過會報錯!)",
|
||||
"主参考音频的文本": "主參考音檔的文本",
|
||||
"主参考音频的语种": "主參考音檔的語種",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "人聲伴奏分離批量處理, 使用UVR5模型。",
|
||||
"人声分离WebUI": "人聲分離WebUI",
|
||||
"人声提取激进程度": "人聲提取激進程度",
|
||||
"以下文件或文件夹不存在": "沒有此文件或文件夾",
|
||||
"以下模型不存在:": "以下模型不存在",
|
||||
"伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT,聽不清參考音頻說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT,聽不清參考音檔說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "你沒有下載超分模型的參數,因此不進行超分。如想超分請先參照教程把文件下載好",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "使用無參考文本模式時建議使用微調的GPT",
|
||||
"保存频率save_every_epoch": "保存頻率save_every_epoch",
|
||||
"保持随机": "保持隨機",
|
||||
"关闭TTS推理WebUI": "關閉 TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "關閉 UVR5-WebUI",
|
||||
"关闭打标WebUI": "關閉 Labeling WebUI",
|
||||
"关闭": "關閉",
|
||||
"凑50字一切": "湊50字一切",
|
||||
"凑四句一切": "湊四句一切",
|
||||
"分桶处理模式已关闭": "分桶處理模式已關閉",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "切割使用的進程數",
|
||||
"刷新模型路径": "刷新模型路徑",
|
||||
"前端处理后的文本(每句):": "前端處理後的文本(每句):",
|
||||
"前置数据集获取工具": "前置數據集獲取工具",
|
||||
"占用中": "占用中",
|
||||
"去混响/去延迟,附:": "去混響/去延遲,附:",
|
||||
"参考音频在3~10秒范围外,请更换!": "參考音頻在3~10秒範圍外,請更換!",
|
||||
"参考音频的文本": "參考音頻的文本",
|
||||
"参考音频的语种": "參考音頻的語種",
|
||||
"句间停顿秒数": "句間停頓秒數",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "可選項:通過拖曳多個文件上傳多個參考音頻(建議同性),平均融合他們的音色。如不填寫此項,音色由左側單個參考音頻控制。如是微調模型,建議參考音頻全部在微調訓練集音色內,底模不用管。",
|
||||
"合成语音": "合成語音",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的資料夾路徑格式舉例: E:\\codes\\py39\\vits_vc_gpu\\白鷺霜華測試範例(去文件管理器地址欄拷就行了)。",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "後續將支援轉音素、手工修改音素、語音合成分步執行。",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "聽不清參考音頻說的啥(不曉得寫啥)可以開。開啟後無視填寫的參考文本。",
|
||||
"启用并行推理版本": "啟用並行推理版本",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "填切割後音頻所在目錄!讀取的音頻檔案完整路徑=該目錄-拼接-list檔案裡波形對應的檔案名(不是全路徑)。如果留空則使用.list檔案裡的絕對全路徑。",
|
||||
"多语种混合": "多語種混合",
|
||||
"多语种混合(粤语)": "多語種混合 (粵語)",
|
||||
"失败": "失敗",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "如不認可該條款, 則不能使用或引用軟體包內任何代碼和文件. 詳見根目錄LICENSE.",
|
||||
"实际输入的参考文本:": "實際輸入的參考文本:",
|
||||
"实际输入的目标文本(切句后):": "實際輸入的目標文本(切句後):",
|
||||
"实际输入的目标文本(每句):": "實際輸入的目標文本(每句):",
|
||||
"实际输入的目标文本:": "實際輸入的目標文本:",
|
||||
"导出文件格式": "導出檔格式",
|
||||
"已关闭": "已關閉",
|
||||
"已完成": "已完成",
|
||||
"已开启": "已開啟",
|
||||
"并行推理": "並行推理",
|
||||
"并行推理模式已关闭": "並行推理模式已關閉",
|
||||
"并行推理模式已开启": "並行推理模式已開啟",
|
||||
"开启GPT训练": "開啟GPT訓練",
|
||||
"开启SSL提取": "開啟SSL提取",
|
||||
"开启SoVITS训练": "開啟SoVITS訓練",
|
||||
"开启TTS推理WebUI": "開啟 TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "開啟 UVR5-WebUI",
|
||||
"开启一键三连": "開啟一鍵三連",
|
||||
"开启打标WebUI": "開啟 Labeling WebUI",
|
||||
"开启文本获取": "開啟文本獲取",
|
||||
"开启": "開啟",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "開啟無參考文本模式。不填參考文本亦相當於開啟。",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "開啟無參考文本模式。不填參考文本亦相當於開啟。v3暫不支援該模式,使用了會報錯。",
|
||||
"开启离线批量ASR": "開啟離線批量ASR",
|
||||
"开启语义token提取": "開啟語義token提取",
|
||||
"开启语音切割": "開啟語音切割",
|
||||
"开启语音降噪": "開啟語音降噪",
|
||||
"微调训练": "微調訓練",
|
||||
"怎么切": "怎麼切",
|
||||
"总训练轮数total_epoch": "總訓練輪數total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "總訓練輪數total_epoch,不建議太高",
|
||||
"打标工具WebUI已关闭": "打標工具WebUI已關閉",
|
||||
"打标工具WebUI已开启": "打標工具WebUI已開啟",
|
||||
"打标工具进程输出信息": "打標工具進程輸出資訊",
|
||||
"指定输出主人声文件夹": "指定输出主人声文件夹",
|
||||
"指定输出非主人声文件夹": "指定输出非主人声文件夹",
|
||||
"按中文句号。切": "按中文句號。切",
|
||||
"按标点符号切": "按標點符號切",
|
||||
"按英文句号.切": "按英文句號.切",
|
||||
"推理": "推理",
|
||||
"推理设置": "推理設定",
|
||||
"提取文本Bert特征": "提取文本BERT特徵",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "資料分桶(並行推理時會降低一點計算量)",
|
||||
"数据类型精度": "數據類型精度",
|
||||
"文本分词与特征提取": "文本分詞與特徵提取",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "文本切分工具。太長的文本合成出來效果不一定好,所以太長建議先切。合成會根據文本的換行分開合成再拼起來。",
|
||||
"文本模块学习率权重": "文本模塊學習率權重",
|
||||
"文本进程输出信息": "文本進程輸出資訊",
|
||||
"施工中,请静候佳音": "施工中,請靜候佳音",
|
||||
"日文": "日文",
|
||||
"日英混合": "日英混合",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt文件以節省硬盤空間",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "是否僅保存最新的權重文件以節省硬碟空間",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights文件夾",
|
||||
"是否开启dpo训练选项(实验性)": "是否開啟dpo訓練選項(實驗性)",
|
||||
"是否开启DPO训练选项(实验性)": "是否開啟DPO訓練選項(實驗性)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "是否直接對上次合成結果調整語速和音色,以防止隨機性。",
|
||||
"显卡信息": "顯卡資訊",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何代碼和文件。詳見根目錄<b>LICENSE</b>。",
|
||||
"未下载模型": "未下載模型",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "本軟體以MIT協議開源, 作者不對軟體具備任何控制力, 使用軟體者、傳播軟體導出的聲音者自負全責.",
|
||||
"标注文件路径 (含文件后缀 *.list)": "標註文件路徑 (含文件後綴 *.list)",
|
||||
"模型": "模型",
|
||||
"模型分为三类:": "模型分為三類:",
|
||||
"模型切换": "模型切換",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "版本",
|
||||
"粤英混合": "粵英混合",
|
||||
"粤语": "粵語",
|
||||
"终止ASR进程": "終止ASR進程",
|
||||
"终止GPT训练": "終止GPT訓練",
|
||||
"终止SSL提取进程": "終止SSL提取進程",
|
||||
"终止SoVITS训练": "終止SoVITS訓練",
|
||||
"终止一键三连": "終止一鍵三連",
|
||||
"终止合成": "終止合成",
|
||||
"终止文本获取进程": "終止文本獲取進程",
|
||||
"终止语义token提取进程": "終止語義token提取進程",
|
||||
"终止语音切割": "終止語音切割",
|
||||
"终止语音降噪进程": "終止語音降噪進程",
|
||||
"缺少Hubert数据集": "缺少Hubert數據集",
|
||||
"缺少语义数据集": "缺少語義數據集",
|
||||
"缺少音素数据集": "缺少音素數據集",
|
||||
"缺少音频数据集": "缺少音頻數據集",
|
||||
"英文": "英文",
|
||||
"语义token提取进程输出信息": "語義token提取進程輸出資訊",
|
||||
"训练集格式化一键三连": "訓練集格式化一鍵三連",
|
||||
"训练集格式化工具": "訓練集格式化工具",
|
||||
"语义Token提取": "語義Token提取",
|
||||
"语速": "語速",
|
||||
"语速调整,高为更快": "調整語速,高為更快",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "語速調節不支援分桶處理,已自動關閉分桶處理",
|
||||
"语音切割进程输出信息": "語音切割進程輸出資訊",
|
||||
"语音降噪进程输出信息": "語音降噪進程輸出資訊",
|
||||
"语音切分": "語音切分",
|
||||
"语音切分工具": "語音切分工具",
|
||||
"语音文本校对标注工具": "語音文本校對標註工具",
|
||||
"语音自监督特征提取": "語音自監督特徵提取",
|
||||
"语音识别": "語音識別",
|
||||
"语音识别工具": "語音識別工具",
|
||||
"语音降噪": "語音降噪",
|
||||
"语音降噪工具": "語音降噪工具",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "請上傳3~10秒內參考音頻,超過會報錯!",
|
||||
"请上传参考音频": "請上傳參考音頻",
|
||||
"请填入推理文本": "請填入推理文本",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "輔參考音檔(可選多個,或不選)",
|
||||
"输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑",
|
||||
"输入文件夹路径": "輸入文件夾路徑",
|
||||
"输入路径不存在": "輸入路徑不存在",
|
||||
"输入路径存在但不可用": "輸入路徑存在但不可用",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "輸出logs/實驗名目錄下應有23456開頭的文件和文件夾",
|
||||
"输出信息": "輸出訊息",
|
||||
"输出文件夹路径": "輸出文件夾路徑",
|
||||
"输出的语音": "輸出的語音",
|
||||
"运行中": "運行中",
|
||||
"进度": "進度",
|
||||
"进程已终止": "進程已終止",
|
||||
"进程输出信息": "進程輸出信息",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "選擇訓練完存放在SoVITS_weights和GPT_weights下的模型。默認的一個是底模,體驗5秒Zero Shot TTS用。",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "採樣步數,如果覺得電,提高試試,如果覺得慢,降低試試",
|
||||
"重复惩罚": "重複懲罰",
|
||||
"降噪结果输出文件夹": "降噪結果輸出文件夾",
|
||||
"降噪音频文件输入文件夹": "降噪音頻文件輸入文件夾",
|
||||
"随机种子": "隨機種子",
|
||||
"需先终止才能开启下一次任务": "需先終止才能開啟下一次任務",
|
||||
"需要合成的切分前文本": "需要合成的切分前文本",
|
||||
"需要合成的文本": "需要合成的文本",
|
||||
"需要合成的文本的语种": "需要合成的文本的語種",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "韓英混合",
|
||||
"音频加载失败": "無法加載音頻",
|
||||
"音频文件不存在,跳过:": "音檔不存在,跳過:",
|
||||
"音频标注WebUI": "音頻標註WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "音頻自動切分輸入路徑,可文件可文件夾",
|
||||
"预训练的GPT模型路径": "預訓練的GPT模型路徑",
|
||||
"预训练的SSL模型路径": "預訓練的SSL模型路徑",
|
||||
"预训练的SoVITS-D模型路径": "預訓練的SoVITS-D模型路徑",
|
||||
"预训练的SoVITS-G模型路径": "預訓練的SoVITS-G模型路徑",
|
||||
"预训练的中文BERT模型路径": "預訓練的中文BERT模型路徑"
|
||||
"音频超分中": "音頻超分中",
|
||||
"预训练GPT模型路径": "預訓練GPT模型路徑",
|
||||
"预训练SSL模型路径": "預訓練SSL模型路徑",
|
||||
"预训练SoVITS-D模型路径": "預訓練SoVITS-D模型路徑",
|
||||
"预训练SoVITS-G模型路径": "預訓練SoVITS-G模型路徑",
|
||||
"预训练中文BERT模型路径": "預訓練中文BERT模型路徑"
|
||||
}
|
||||
|
@ -1,31 +1,13 @@
|
||||
{
|
||||
"(1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;": "(1)MDX-Net(onnx_dereverb):對於雙通道混響是最好的選擇,不能去除單通道混響;",
|
||||
"(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。": "(234)DeEcho:去除延遲效果。Aggressive 比 Normal 去除得更徹底,DeReverb 額外去除混響,可去除單聲道混響,但是對高頻重的板式混響去不乾淨。",
|
||||
"*GPT模型列表": "*GPT模型列表",
|
||||
"*SoVITS模型列表": "*SoVITS模型列表",
|
||||
"*实验/模型名": "*實驗/模型名",
|
||||
"*文本标注文件": "*文本標注文件",
|
||||
"*训练集音频文件目录": "*訓練集音頻文件目錄",
|
||||
"*请上传并填写参考信息": "*請上傳並填寫參考資訊",
|
||||
"*请填写需要合成的目标文本和语种模式": "請填寫需要合成的目標文本和語言模式",
|
||||
".list标注文件的路径": ".list標注文件的路徑",
|
||||
".限制范围越小判别效果越好。": ".限制范围越小判别效果越好。",
|
||||
"0-前置数据集获取工具": "0-前置數據集獲取工具",
|
||||
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5人聲伴奏分離&去混響去延遲工具",
|
||||
"0b-语音切分工具": "0b-語音切分工具",
|
||||
"0bb-语音降噪工具": "0bb-語音降噪工具",
|
||||
"0c-中文批量离线ASR工具": "0c-中文批量離線ASR工具",
|
||||
"0d-语音文本校对标注工具": "0d-語音文本校對標注工具",
|
||||
"1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
|
||||
"1A-训练集格式化工具": "1A-訓練集格式化工具",
|
||||
"1Aa-文本内容": "1Aa-文本內容",
|
||||
"1Aabc-训练集格式化一键三连": "1Aabc-訓練集格式化一鍵三連",
|
||||
"1Ab-SSL自监督特征提取": "1Ab-SSL自監督特徵提取",
|
||||
"1Ac-语义token提取": "1Ac-語義token提取",
|
||||
"1B-微调训练": "1B-微調訓練",
|
||||
"1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS訓練。用於分享的模型文件輸出在SoVITS_weights下。",
|
||||
"1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT訓練。用於分享的模型文件輸出在GPT_weights下。",
|
||||
"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-變聲",
|
||||
@ -36,21 +18,19 @@
|
||||
"ASR 模型": "ASR 模型",
|
||||
"ASR 模型尺寸": "ASR 模型尺寸",
|
||||
"ASR 语言设置": "ASR 語言設置",
|
||||
"ASR进程输出信息": "ASR進程輸出資訊",
|
||||
"GPT 训练: 模型权重文件在 GPT_weights/": "GPT 訓練: 模型權重文件在 GPT_weights/",
|
||||
"GPT模型列表": "GPT模型列表",
|
||||
"GPT训练进程输出信息": "GPT訓練進程輸出資訊",
|
||||
"GPT训练": "GPT訓練",
|
||||
"GPT采样参数(无参考文本时不要太低。不懂就用默认):": "GPT 采样参数(无参考文本时不要太低。不懂就用默认):",
|
||||
"GPU卡号,只能填1个整数": "GPU卡號,只能填1個整數",
|
||||
"GPU卡号以-分割,每个卡号一个进程": "GPU卡號以-分割,每個卡號一個進程",
|
||||
"SSL进程输出信息": "SSL進程輸出資訊",
|
||||
"LoRA秩": "LoRA階",
|
||||
"SoVITS V3 底模缺失,无法加载相应 LoRA 权重": "SoVITS V3 底模缺失,無法加載相應 LoRA 權重",
|
||||
"SoVITS 训练: 模型权重文件在 SoVITS_weights/": "SoVITS 訓練: 模型權重文件在 SoVITS_weights/",
|
||||
"SoVITS模型列表": "SoVITS模型列表",
|
||||
"SoVITS训练进程输出信息": "SoVITS訓練進程輸出資訊",
|
||||
"TTS推理WebUI进程输出信息": "TTS推理WebUI進程輸出資訊",
|
||||
"TTS推理进程已关闭": "TTS推理進程已關閉",
|
||||
"TTS推理进程已开启": "TTS推理進程已開啟",
|
||||
"UVR5已关闭": "UVR5已關閉",
|
||||
"UVR5已开启": "UVR5已開啟",
|
||||
"UVR5进程输出信息": "UVR5進程輸出資訊",
|
||||
"SoVITS训练": "SoVITS訓練",
|
||||
"TTS推理WebUI": "TTS推理WebUI",
|
||||
"UVR5人声伴奏分离&去混响去延迟工具": "UVR5人聲伴奏分離&去混響去延遲工具",
|
||||
"alpha_mix:混多少比例归一化后音频进来": "alpha_mix:混多少比例歸一化後音頻進來",
|
||||
"batch_size": "批次大小",
|
||||
"hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop_size:怎麼算音量曲線,越小精度越大計算量越高(不是精度越大效果越好)",
|
||||
@ -62,27 +42,27 @@
|
||||
"threshold:音量小于这个值视作静音的备选切割点": "threshold:音量小於這個值視作靜音的備選切割點",
|
||||
"top_k": "top_k",
|
||||
"top_p": "top_p",
|
||||
"一键三连进程输出信息": "一鍵三連進程輸出資訊",
|
||||
"v3暂不支持该模式,使用了会报错。": "v3暫不支援該模式,使用了會報錯。",
|
||||
"v3输出如果觉得闷可以试试开超分": "v3輸出如果覺得悶可以試試開超分",
|
||||
"不切": "不切",
|
||||
"中文": "中文",
|
||||
"中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e": "中文教程文檔:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e",
|
||||
"中文教程文档": "中文教程文檔",
|
||||
"中英混合": "中英混合",
|
||||
"主参考音频(请上传3~10秒内参考音频,超过会报错!)": "主參考音檔(請上傳3~10秒內參考音檔,超過會報錯!)",
|
||||
"主参考音频的文本": "主參考音檔的文字",
|
||||
"主参考音频的语种": "主參考音檔的語種",
|
||||
"也可批量输入音频文件, 二选一, 优先读文件夹": "也可批量输入音频文件, 二选一, 优先读文件夹",
|
||||
"人声伴奏分离批量处理, 使用UVR5模型。": "人聲伴奏分離批量處理, 使用UVR5模型。",
|
||||
"人声分离WebUI": "人聲分離WebUI",
|
||||
"人声提取激进程度": "人聲提取激進程度",
|
||||
"以下文件或文件夹不存在": "沒有此文件或文件夾",
|
||||
"以下模型不存在:": "#以下模型不存在",
|
||||
"伴奏人声分离&去混响&去回声": "伴奏人聲分離&去混響&去回聲",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开。<br>开启后无视填写的参考文本。": "使用無參考文本模式時建議使用微調的GPT,聽不清參考音頻說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
|
||||
"使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。": "使用無參考文字模式時建議使用微調的GPT,聽不清參考音檔說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文字。",
|
||||
"你没有下载超分模型的参数,因此不进行超分。如想超分请先参照教程把文件下载好": "你沒有下載超分模型的參數,因此不進行超分。如想超分請先參照教程把文件下載好",
|
||||
"使用无参考文本模式时建议使用微调的GPT": "使用無參考文本模式時建議使用微調的GPT",
|
||||
"保存频率save_every_epoch": "保存頻率save_every_epoch",
|
||||
"保持随机": "保持隨機",
|
||||
"关闭TTS推理WebUI": "關閉 TTS Inference WebUI",
|
||||
"关闭UVR5-WebUI": "關閉 UVR5-WebUI",
|
||||
"关闭打标WebUI": "關閉 Labeling WebUI",
|
||||
"关闭": "關閉",
|
||||
"凑50字一切": "湊50字一切",
|
||||
"凑四句一切": "湊四句一切",
|
||||
"分桶处理模式已关闭": "分桶處理模式已關閉",
|
||||
@ -98,67 +78,65 @@
|
||||
"切割使用的进程数": "切割使用的進程數",
|
||||
"刷新模型路径": "刷新模型路徑",
|
||||
"前端处理后的文本(每句):": "前端處理後的文本(每句):",
|
||||
"前置数据集获取工具": "前置數據集獲取工具",
|
||||
"占用中": "佔用中",
|
||||
"去混响/去延迟,附:": "去混響/去延遲,附:",
|
||||
"参考音频在3~10秒范围外,请更换!": "參考音頻在3~10秒範圍外,請更換!",
|
||||
"参考音频的文本": "參考音頻的文本",
|
||||
"参考音频的语种": "參考音頻的語種",
|
||||
"句间停顿秒数": "句間停頓秒數",
|
||||
"可选项:通过拖拽多个文件上传多个参考音频(建议同性),平均融合他们的音色。如不填写此项,音色由左侧单个参考音频控制。如是微调模型,建议参考音频全部在微调训练集音色内,底模不用管。": "可選項:通過拖曳多個文件上傳多個參考音頻(建議同性),平均融合他們的音色。如不填寫此項,音色由左側單個參考音頻控制。如是微調模型,建議參考音頻全部在微調訓練集音色內,底模不用管。",
|
||||
"合成语音": "合成語音",
|
||||
"合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。": "合格的資料夾路徑格式舉例: E:\\codes\\py39\\vits_vc_gpu\\白鷺霜華測試範例(去文件管理器地址欄拷就行了)。",
|
||||
"后续将支持转音素、手工修改音素、语音合成分步执行。": "後續將支援轉音素、手工修改音素、語音合成分步執行。",
|
||||
"听不清参考音频说的啥(不晓得写啥)可以开。开启后无视填写的参考文本。": "聽不清參考音頻說的啥(不曉得寫啥)可以開,開啟後無視填寫的參考文本。",
|
||||
"启用并行推理版本": "啟用並行推理版本",
|
||||
"填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。": "填切割後音頻所在目錄!讀取的音頻檔案完整路徑=該目錄-拼接-list檔案裡波形對應的檔案名(不是全路徑)。如果留空則使用.list檔案裡的絕對全路徑。",
|
||||
"多语种混合": "多語種混合",
|
||||
"多语种混合(粤语)": "多語種混合 (粵語)",
|
||||
"失败": "失敗",
|
||||
"如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "如不認可該條款,則不能使用或引用軟體包內任何代碼和文件。詳見根目錄LICENSE",
|
||||
"实际输入的参考文本:": "實際輸入的參考文本:",
|
||||
"实际输入的目标文本(切句后):": "實際輸入的目標文本(切句後):",
|
||||
"实际输入的目标文本(每句):": "實際輸入的目標文本(每句):",
|
||||
"实际输入的目标文本:": "實際輸入的目標文本:",
|
||||
"导出文件格式": "導出檔格式",
|
||||
"已关闭": "已關閉",
|
||||
"已完成": "已完成",
|
||||
"已开启": "已開啟",
|
||||
"并行推理": "並行推理",
|
||||
"并行推理模式已关闭": "並行推理模式已關閉",
|
||||
"并行推理模式已开启": "並行推理模式已開啟",
|
||||
"开启GPT训练": "開啟GPT訓練",
|
||||
"开启SSL提取": "開啟SSL提取",
|
||||
"开启SoVITS训练": "開啟SoVITS訓練",
|
||||
"开启TTS推理WebUI": "開啟 TTS Inference WebUI",
|
||||
"开启UVR5-WebUI": "開啟 UVR5-WebUI",
|
||||
"开启一键三连": "開啟一鍵三連",
|
||||
"开启打标WebUI": "開啟 Labeling WebUI",
|
||||
"开启文本获取": "開啟文本獲取",
|
||||
"开启": "開啟",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。": "開啟無參考文本模式。不填參考文本亦相當於開啟。",
|
||||
"开启无参考文本模式。不填参考文本亦相当于开启。v3暂不支持该模式,使用了会报错。": "開啟無參考文字模式。不填參考文字亦相當於開啟。v3暫不支援該模式,使用了會報錯。",
|
||||
"开启离线批量ASR": "開啟離線批量ASR",
|
||||
"开启语义token提取": "開啟語義token提取",
|
||||
"开启语音切割": "開啟語音切割",
|
||||
"开启语音降噪": "開啟語音降噪",
|
||||
"微调训练": "微調訓練",
|
||||
"怎么切": "怎麼切",
|
||||
"总训练轮数total_epoch": "總訓練輪數total_epoch",
|
||||
"总训练轮数total_epoch,不建议太高": "總訓練輪數total_epoch,不建議太高",
|
||||
"打标工具WebUI已关闭": "打標工具WebUI已關閉",
|
||||
"打标工具WebUI已开启": "打標工具WebUI已開啟",
|
||||
"打标工具进程输出信息": "打標工具進程輸出資訊",
|
||||
"指定输出主人声文件夹": "指定输出主人声文件夹",
|
||||
"指定输出非主人声文件夹": "指定输出非主人声文件夹",
|
||||
"按中文句号。切": "按中文句號。切",
|
||||
"按标点符号切": "按標點符號切",
|
||||
"按英文句号.切": "按英文句號.切",
|
||||
"推理": "推理",
|
||||
"推理设置": "推理設定",
|
||||
"提取文本Bert特征": "提取文字BERT特徵",
|
||||
"数据分桶(并行推理时会降低一点计算量)": "資料分桶(並行推理時會降低一點計算量)",
|
||||
"数据类型精度": "數據類型精度",
|
||||
"文本分词与特征提取": "文本分詞與特徵提取",
|
||||
"文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "文字切分工具。太長的文字合成出來效果不一定好,所以太長建議先切。合成會根據文字的換行分開合成再拼起來。",
|
||||
"文本模块学习率权重": "文本模塊學習率權重",
|
||||
"文本进程输出信息": "文本進程輸出資訊",
|
||||
"施工中,请静候佳音": "施工中,請靜候佳音",
|
||||
"日文": "日文",
|
||||
"日英混合": "日英混合",
|
||||
"是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt文件以節省硬盤空間",
|
||||
"是否仅保存最新的权重文件以节省硬盘空间": "是否僅保存最新的權重文件以節省硬盤空間",
|
||||
"是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights文件夾",
|
||||
"是否开启dpo训练选项(实验性)": "是否開啟dpo訓練選項(實驗性)",
|
||||
"是否开启DPO训练选项(实验性)": "是否開啟DPO訓練選項(實驗性)",
|
||||
"是否直接对上次合成结果调整语速和音色。防止随机性。": "是否直接對上次合成結果調整語速和音色,以防止隨機性。",
|
||||
"显卡信息": "顯卡資訊",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。<br>如不認可該條款,則不能使用或引用軟體包內任何代碼和文件。詳見根目錄<b>LICENSE</b>。",
|
||||
"未下载模型": "未下載模型",
|
||||
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。",
|
||||
"标注文件路径 (含文件后缀 *.list)": "標註文件路徑 (含文件後綴 *.list)",
|
||||
"模型": "模型",
|
||||
"模型分为三类:": "模型分為三類:",
|
||||
"模型切换": "模型切換",
|
||||
@ -166,27 +144,26 @@
|
||||
"版本": "版本",
|
||||
"粤英混合": "粵英混合",
|
||||
"粤语": "粵語",
|
||||
"终止ASR进程": "終止ASR進程",
|
||||
"终止GPT训练": "終止GPT訓練",
|
||||
"终止SSL提取进程": "終止SSL提取進程",
|
||||
"终止SoVITS训练": "終止SoVITS訓練",
|
||||
"终止一键三连": "終止一鍵三連",
|
||||
"终止合成": "終止合成",
|
||||
"终止文本获取进程": "終止文本獲取進程",
|
||||
"终止语义token提取进程": "終止語義token提取進程",
|
||||
"终止语音切割": "終止語音切割",
|
||||
"终止语音降噪进程": "終止語音降噪進程",
|
||||
"缺少Hubert数据集": "缺少Hubert數據集",
|
||||
"缺少语义数据集": "缺少語義數據集",
|
||||
"缺少音素数据集": "缺少音素數據集",
|
||||
"缺少音频数据集": "缺少音頻數據集",
|
||||
"英文": "英文",
|
||||
"语义token提取进程输出信息": "語義token提取進程輸出資訊",
|
||||
"训练集格式化一键三连": "訓練集格式化一鍵三連",
|
||||
"训练集格式化工具": "訓練集格式化工具",
|
||||
"语义Token提取": "語義Token提取",
|
||||
"语速": "語速",
|
||||
"语速调整,高为更快": "調整語速,高為更快",
|
||||
"语速调节不支持分桶处理,已自动关闭分桶处理": "語速調節不支援分桶處理,已自動關閉分桶處理",
|
||||
"语音切割进程输出信息": "語音切割進程輸出資訊",
|
||||
"语音降噪进程输出信息": "語音降噪進程輸出資訊",
|
||||
"语音切分": "語音切分",
|
||||
"语音切分工具": "語音切分工具",
|
||||
"语音文本校对标注工具": "語音文本校對標註工具",
|
||||
"语音自监督特征提取": "語音自監督特徵提取",
|
||||
"语音识别": "語音識別",
|
||||
"语音识别工具": "語音識別工具",
|
||||
"语音降噪": "語音降噪",
|
||||
"语音降噪工具": "語音降噪工具",
|
||||
"请上传3~10秒内参考音频,超过会报错!": "請上傳3~10秒內參考音頻,超過會報錯!",
|
||||
"请上传参考音频": "請上傳參考音頻",
|
||||
"请填入推理文本": "請填入推理文本",
|
||||
@ -200,16 +177,21 @@
|
||||
"辅参考音频(可选多个,或不选)": "輔參考音檔(可選多個,或不選)",
|
||||
"输入待处理音频文件夹路径": "輸入待處理音頻資料夾路徑",
|
||||
"输入文件夹路径": "輸入文件夾路徑",
|
||||
"输入路径不存在": "輸入路徑不存在",
|
||||
"输入路径存在但不可用": "輸入路徑存在但不可用",
|
||||
"输出logs/实验名目录下应有23456开头的文件和文件夹": "輸出logs/實驗名目錄下應有23456開頭的文件和文件夾",
|
||||
"输出信息": "輸出訊息",
|
||||
"输出文件夹路径": "輸出文件夾路徑",
|
||||
"输出的语音": "輸出的語音",
|
||||
"运行中": "運行中",
|
||||
"进度": "進度",
|
||||
"进程已终止": "進程已終止",
|
||||
"进程输出信息": "進程輸出資訊",
|
||||
"选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "選擇訓練完存放在SoVITS_weights和GPT_weights下的模型。默認的一個是底模,體驗5秒Zero Shot TTS用。",
|
||||
"采样步数,如果觉得电,提高试试,如果觉得慢,降低试试": "採樣步數,如果覺得電,提高試試,如果覺得慢,降低試試",
|
||||
"重复惩罚": "重複懲罰",
|
||||
"降噪结果输出文件夹": "降噪結果輸出文件夾",
|
||||
"降噪音频文件输入文件夹": "降噪音頻文件輸入文件夾",
|
||||
"随机种子": "隨機種子",
|
||||
"需先终止才能开启下一次任务": "需先終止才能開啟下一次任務",
|
||||
"需要合成的切分前文本": "需要合成的切分前文字",
|
||||
"需要合成的文本": "需要合成的文本",
|
||||
"需要合成的文本的语种": "需要合成的文字語種",
|
||||
@ -218,10 +200,12 @@
|
||||
"韩英混合": "韓英混合",
|
||||
"音频加载失败": "無法加載音頻",
|
||||
"音频文件不存在,跳过:": "音檔不存在,跳過:",
|
||||
"音频标注WebUI": "音頻標註WebUI",
|
||||
"音频自动切分输入路径,可文件可文件夹": "音頻自動切分輸入路徑,可文件可文件夾",
|
||||
"预训练的GPT模型路径": "預訓練的GPT模型路徑",
|
||||
"预训练的SSL模型路径": "預訓練的SSL模型路徑",
|
||||
"预训练的SoVITS-D模型路径": "預訓練的SoVITS-D模型路徑",
|
||||
"预训练的SoVITS-G模型路径": "預訓練的SoVITS-G模型路徑",
|
||||
"预训练的中文BERT模型路径": "預訓練的中文BERT模型路徑"
|
||||
"音频超分中": "音頻超分中",
|
||||
"预训练GPT模型路径": "預訓練GPT模型路徑",
|
||||
"预训练SSL模型路径": "預訓練SSL模型路徑",
|
||||
"预训练SoVITS-D模型路径": "預訓練SoVITS-D模型路徑",
|
||||
"预训练SoVITS-G模型路径": "預訓練SoVITS-G模型路徑",
|
||||
"预训练中文BERT模型路径": "預訓練中文BERT模型路徑"
|
||||
}
|
||||
|
@ -1,18 +1,8 @@
|
||||
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
|
||||
@ -20,21 +10,6 @@ def exists(val):
|
||||
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,
|
||||
@ -50,43 +25,16 @@ class Attend(nn.Module):
|
||||
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
|
||||
# _, 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
|
||||
# with torch.backends.cuda.sdp_kernel(enable_flash=True, enable_math=True, enable_mem_efficient=True):
|
||||
return F.scaled_dot_product_attention(q, k, v,dropout_p = self.dropout if self.training else 0.)
|
||||
|
||||
def forward(self, q, k, v):
|
||||
"""
|
||||
@ -97,7 +45,7 @@ class Attend(nn.Module):
|
||||
d - feature dimension
|
||||
"""
|
||||
|
||||
q_len, k_len, device = q.shape[-2], k.shape[-2], q.device
|
||||
# q_len, k_len, device = q.shape[-2], k.shape[-2], q.device
|
||||
|
||||
scale = default(self.scale, q.shape[-1] ** -0.5)
|
||||
|
||||
|
@ -6,6 +6,7 @@ from torch.nn import Module, ModuleList
|
||||
import torch.nn.functional as F
|
||||
|
||||
from bs_roformer.attend import Attend
|
||||
from torch.utils.checkpoint import checkpoint
|
||||
|
||||
from typing import Tuple, Optional, List, Callable
|
||||
# from beartype.typing import Tuple, Optional, List, Callable
|
||||
@ -356,13 +357,18 @@ class BSRoformer(Module):
|
||||
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
|
||||
multi_stft_window_fn: Callable = torch.hann_window,
|
||||
mlp_expansion_factor=4,
|
||||
use_torch_checkpoint=False,
|
||||
skip_connection=False,
|
||||
):
|
||||
super().__init__()
|
||||
|
||||
self.stereo = stereo
|
||||
self.audio_channels = 2 if stereo else 1
|
||||
self.num_stems = num_stems
|
||||
self.use_torch_checkpoint = use_torch_checkpoint
|
||||
self.skip_connection = skip_connection
|
||||
|
||||
self.layers = ModuleList([])
|
||||
|
||||
@ -402,7 +408,7 @@ class BSRoformer(Module):
|
||||
|
||||
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]
|
||||
freqs = torch.stft(torch.randn(1, 4096), **self.stft_kwargs, window=torch.ones(stft_win_length), return_complex=True).shape[1]
|
||||
|
||||
assert len(freqs_per_bands) > 1
|
||||
assert sum(
|
||||
@ -421,7 +427,8 @@ class BSRoformer(Module):
|
||||
mask_estimator = MaskEstimator(
|
||||
dim=dim,
|
||||
dim_inputs=freqs_per_bands_with_complex,
|
||||
depth=mask_estimator_depth
|
||||
depth=mask_estimator_depth,
|
||||
mlp_expansion_factor=mlp_expansion_factor,
|
||||
)
|
||||
|
||||
self.mask_estimators.append(mask_estimator)
|
||||
@ -458,12 +465,14 @@ class BSRoformer(Module):
|
||||
|
||||
device = raw_audio.device
|
||||
|
||||
# defining whether model is loaded on MPS (MacOS GPU accelerator)
|
||||
x_is_mps = True if device.type == "mps" else False
|
||||
|
||||
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)'
|
||||
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
|
||||
|
||||
@ -471,53 +480,79 @@ class BSRoformer(Module):
|
||||
|
||||
stft_window = self.stft_window_fn(device=device)
|
||||
|
||||
stft_repr = torch.stft(raw_audio, **self.stft_kwargs, window=stft_window, return_complex=True)
|
||||
# RuntimeError: FFT operations are only supported on MacOS 14+
|
||||
# Since it's tedious to define whether we're on correct MacOS version - simple try-catch is used
|
||||
try:
|
||||
stft_repr = torch.stft(raw_audio, **self.stft_kwargs, window=stft_window, return_complex=True)
|
||||
except:
|
||||
stft_repr = torch.stft(raw_audio.cpu() if x_is_mps else raw_audio, **self.stft_kwargs, window=stft_window.cpu() if x_is_mps else stft_window, return_complex=True).to(device)
|
||||
|
||||
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
|
||||
|
||||
# merge stereo / mono into the frequency, with frequency leading dimension, for band splitting
|
||||
stft_repr = rearrange(stft_repr,'b s f t c -> b (f s) t c')
|
||||
|
||||
x = rearrange(stft_repr, 'b f t c -> b t (f c)')
|
||||
# print("460:", x.dtype)#fp32
|
||||
x = self.band_split(x)
|
||||
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(self.band_split, x, use_reentrant=False)
|
||||
else:
|
||||
x = self.band_split(x)
|
||||
|
||||
# axial / hierarchical attention
|
||||
|
||||
# print("487:",x.dtype)#fp16
|
||||
for transformer_block in self.layers:
|
||||
store = [None] * len(self.layers)
|
||||
for i, transformer_block in enumerate(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
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(linear_transformer, x, use_reentrant=False)
|
||||
else:
|
||||
x = linear_transformer(x)
|
||||
x, = unpack(x, ft_ps, 'b * d')
|
||||
else:
|
||||
time_transformer, freq_transformer = transformer_block
|
||||
|
||||
# print("501:", x.dtype)#fp16
|
||||
if self.skip_connection:
|
||||
# Sum all previous
|
||||
for j in range(i):
|
||||
x = x + store[j]
|
||||
|
||||
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
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(time_transformer, x, use_reentrant=False)
|
||||
else:
|
||||
x = time_transformer(x)
|
||||
|
||||
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)
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(freq_transformer, x, use_reentrant=False)
|
||||
else:
|
||||
x = freq_transformer(x)
|
||||
|
||||
x, = unpack(x, ps, '* f d')
|
||||
|
||||
# print("515:", x.dtype)######fp16
|
||||
if self.skip_connection:
|
||||
store[i] = x
|
||||
|
||||
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)
|
||||
|
||||
if self.use_torch_checkpoint:
|
||||
mask = torch.stack([checkpoint(fn, x, use_reentrant=False) for fn in self.mask_estimators], dim=1)
|
||||
else:
|
||||
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
|
||||
@ -535,7 +570,11 @@ class BSRoformer(Module):
|
||||
|
||||
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)
|
||||
# same as torch.stft() fix for MacOS MPS above
|
||||
try:
|
||||
recon_audio = torch.istft(stft_repr, **self.stft_kwargs, window=stft_window, return_complex=False, length=raw_audio.shape[-1])
|
||||
except:
|
||||
recon_audio = torch.istft(stft_repr.cpu() if x_is_mps else stft_repr, **self.stft_kwargs, window=stft_window.cpu() if x_is_mps else stft_window, return_complex=False, length=raw_audio.shape[-1]).to(device)
|
||||
|
||||
recon_audio = rearrange(recon_audio, '(b n s) t -> b n s t', s=self.audio_channels, n=num_stems)
|
||||
|
||||
|
669
tools/uvr5/bs_roformer/mel_band_roformer.py
Normal file
669
tools/uvr5/bs_roformer/mel_band_roformer.py
Normal file
@ -0,0 +1,669 @@
|
||||
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 torch.utils.checkpoint import checkpoint
|
||||
|
||||
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, reduce, repeat
|
||||
from einops.layers.torch import Rearrange
|
||||
|
||||
from librosa import filters
|
||||
|
||||
|
||||
# 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]
|
||||
|
||||
|
||||
def pad_at_dim(t, pad, dim=-1, value=0.):
|
||||
dims_from_right = (- dim - 1) if dim < 0 else (t.ndim - dim - 1)
|
||||
zeros = ((0, 0) * dims_from_right)
|
||||
return F.pad(t, (*zeros, *pad), value=value)
|
||||
|
||||
|
||||
def l2norm(t):
|
||||
return F.normalize(t, dim=-1, p=2)
|
||||
|
||||
|
||||
# norm
|
||||
|
||||
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), 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
|
||||
|
||||
class MelBandRoformer(Module):
|
||||
|
||||
# @beartype
|
||||
def __init__(
|
||||
self,
|
||||
dim,
|
||||
*,
|
||||
depth,
|
||||
stereo=False,
|
||||
num_stems=1,
|
||||
time_transformer_depth=2,
|
||||
freq_transformer_depth=2,
|
||||
linear_transformer_depth=0,
|
||||
num_bands=60,
|
||||
dim_head=64,
|
||||
heads=8,
|
||||
attn_dropout=0.1,
|
||||
ff_dropout=0.1,
|
||||
flash_attn=True,
|
||||
dim_freqs_in=1025,
|
||||
sample_rate=44100, # needed for mel filter bank from librosa
|
||||
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=1,
|
||||
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,
|
||||
match_input_audio_length=False, # if True, pad output tensor to match length of input tensor
|
||||
mlp_expansion_factor=4,
|
||||
use_torch_checkpoint=False,
|
||||
skip_connection=False,
|
||||
):
|
||||
super().__init__()
|
||||
|
||||
self.stereo = stereo
|
||||
self.audio_channels = 2 if stereo else 1
|
||||
self.num_stems = num_stems
|
||||
self.use_torch_checkpoint = use_torch_checkpoint
|
||||
self.skip_connection = skip_connection
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
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.stft_window_fn = partial(default(stft_window_fn, torch.hann_window), stft_win_length)
|
||||
|
||||
self.stft_kwargs = dict(
|
||||
n_fft=stft_n_fft,
|
||||
hop_length=stft_hop_length,
|
||||
win_length=stft_win_length,
|
||||
normalized=stft_normalized
|
||||
)
|
||||
|
||||
freqs = torch.stft(torch.randn(1, 4096), **self.stft_kwargs, window=torch.ones(stft_n_fft), return_complex=True).shape[1]
|
||||
|
||||
# create mel filter bank
|
||||
# with librosa.filters.mel as in section 2 of paper
|
||||
|
||||
mel_filter_bank_numpy = filters.mel(sr=sample_rate, n_fft=stft_n_fft, n_mels=num_bands)
|
||||
|
||||
mel_filter_bank = torch.from_numpy(mel_filter_bank_numpy)
|
||||
|
||||
# for some reason, it doesn't include the first freq? just force a value for now
|
||||
|
||||
mel_filter_bank[0][0] = 1.
|
||||
|
||||
# In some systems/envs we get 0.0 instead of ~1.9e-18 in the last position,
|
||||
# so let's force a positive value
|
||||
|
||||
mel_filter_bank[-1, -1] = 1.
|
||||
|
||||
# binary as in paper (then estimated masks are averaged for overlapping regions)
|
||||
|
||||
freqs_per_band = mel_filter_bank > 0
|
||||
assert freqs_per_band.any(dim=0).all(), 'all frequencies need to be covered by all bands for now'
|
||||
|
||||
repeated_freq_indices = repeat(torch.arange(freqs), 'f -> b f', b=num_bands)
|
||||
freq_indices = repeated_freq_indices[freqs_per_band]
|
||||
|
||||
if stereo:
|
||||
freq_indices = repeat(freq_indices, 'f -> f s', s=2)
|
||||
freq_indices = freq_indices * 2 + torch.arange(2)
|
||||
freq_indices = rearrange(freq_indices, 'f s -> (f s)')
|
||||
|
||||
self.register_buffer('freq_indices', freq_indices, persistent=False)
|
||||
self.register_buffer('freqs_per_band', freqs_per_band, persistent=False)
|
||||
|
||||
num_freqs_per_band = reduce(freqs_per_band, 'b f -> b', 'sum')
|
||||
num_bands_per_freq = reduce(freqs_per_band, 'b f -> f', 'sum')
|
||||
|
||||
self.register_buffer('num_freqs_per_band', num_freqs_per_band, persistent=False)
|
||||
self.register_buffer('num_bands_per_freq', num_bands_per_freq, persistent=False)
|
||||
|
||||
# band split and mask estimator
|
||||
|
||||
freqs_per_bands_with_complex = tuple(2 * f * self.audio_channels for f in num_freqs_per_band.tolist())
|
||||
|
||||
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,
|
||||
mlp_expansion_factor=mlp_expansion_factor,
|
||||
)
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
self.match_input_audio_length = match_input_audio_length
|
||||
|
||||
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')
|
||||
|
||||
batch, channels, raw_audio_length = raw_audio.shape
|
||||
|
||||
istft_length = raw_audio_length if self.match_input_audio_length else None
|
||||
|
||||
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')
|
||||
|
||||
# merge stereo / mono into the frequency, with frequency leading dimension, for band splitting
|
||||
stft_repr = rearrange(stft_repr,'b s f t c -> b (f s) t c')
|
||||
|
||||
# index out all frequencies for all frequency ranges across bands ascending in one go
|
||||
|
||||
batch_arange = torch.arange(batch, device=device)[..., None]
|
||||
|
||||
# account for stereo
|
||||
|
||||
x = stft_repr[batch_arange, self.freq_indices]
|
||||
|
||||
# fold the complex (real and imag) into the frequencies dimension
|
||||
|
||||
x = rearrange(x, 'b f t c -> b t (f c)')
|
||||
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(self.band_split, x, use_reentrant=False)
|
||||
else:
|
||||
x = self.band_split(x)
|
||||
|
||||
# axial / hierarchical attention
|
||||
|
||||
store = [None] * len(self.layers)
|
||||
for i, transformer_block in enumerate(self.layers):
|
||||
|
||||
if len(transformer_block) == 3:
|
||||
linear_transformer, time_transformer, freq_transformer = transformer_block
|
||||
|
||||
x, ft_ps = pack([x], 'b * d')
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(linear_transformer, x, use_reentrant=False)
|
||||
else:
|
||||
x = linear_transformer(x)
|
||||
x, = unpack(x, ft_ps, 'b * d')
|
||||
else:
|
||||
time_transformer, freq_transformer = transformer_block
|
||||
|
||||
if self.skip_connection:
|
||||
# Sum all previous
|
||||
for j in range(i):
|
||||
x = x + store[j]
|
||||
|
||||
x = rearrange(x, 'b t f d -> b f t d')
|
||||
x, ps = pack([x], '* t d')
|
||||
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(time_transformer, x, use_reentrant=False)
|
||||
else:
|
||||
x = time_transformer(x)
|
||||
|
||||
x, = unpack(x, ps, '* t d')
|
||||
x = rearrange(x, 'b f t d -> b t f d')
|
||||
x, ps = pack([x], '* f d')
|
||||
|
||||
if self.use_torch_checkpoint:
|
||||
x = checkpoint(freq_transformer, x, use_reentrant=False)
|
||||
else:
|
||||
x = freq_transformer(x)
|
||||
|
||||
x, = unpack(x, ps, '* f d')
|
||||
|
||||
if self.skip_connection:
|
||||
store[i] = x
|
||||
|
||||
num_stems = len(self.mask_estimators)
|
||||
if self.use_torch_checkpoint:
|
||||
masks = torch.stack([checkpoint(fn, x, use_reentrant=False) for fn in self.mask_estimators], dim=1)
|
||||
else:
|
||||
masks = torch.stack([fn(x) for fn in self.mask_estimators], dim=1)
|
||||
masks = rearrange(masks, '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)
|
||||
masks = torch.view_as_complex(masks)
|
||||
|
||||
masks = masks.type(stft_repr.dtype)
|
||||
|
||||
# need to average the estimated mask for the overlapped frequencies
|
||||
|
||||
scatter_indices = repeat(self.freq_indices, 'f -> b n f t', b=batch, n=num_stems, t=stft_repr.shape[-1])
|
||||
|
||||
stft_repr_expanded_stems = repeat(stft_repr, 'b 1 ... -> b n ...', n=num_stems)
|
||||
masks_summed = torch.zeros_like(stft_repr_expanded_stems).scatter_add_(2, scatter_indices, masks)
|
||||
|
||||
denom = repeat(self.num_bands_per_freq, 'f -> (f r) 1', r=channels)
|
||||
|
||||
masks_averaged = masks_summed / denom.clamp(min=1e-8)
|
||||
|
||||
# modulate stft repr with estimated mask
|
||||
|
||||
stft_repr = stft_repr * masks_averaged
|
||||
|
||||
# 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,
|
||||
length=istft_length)
|
||||
|
||||
recon_audio = rearrange(recon_audio, '(b n s) t -> b n s t', b=batch, 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)
|
@ -1,6 +1,4 @@
|
||||
# This code is modified from https://github.com/ZFTurbo/
|
||||
import pdb
|
||||
|
||||
import librosa
|
||||
from tqdm import tqdm
|
||||
import os
|
||||
@ -8,61 +6,113 @@ import torch
|
||||
import numpy as np
|
||||
import soundfile as sf
|
||||
import torch.nn as nn
|
||||
|
||||
import yaml
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
from bs_roformer.bs_roformer import BSRoformer
|
||||
|
||||
class BsRoformer_Loader:
|
||||
|
||||
class Roformer_Loader:
|
||||
def get_config(self, config_path):
|
||||
with open(config_path, 'r', encoding='utf-8') as f:
|
||||
# use fullloader to load tag !!python/tuple, code can be improved
|
||||
config = yaml.load(f, Loader=yaml.FullLoader)
|
||||
return config
|
||||
|
||||
def get_default_config(self):
|
||||
default_config = None
|
||||
if self.model_type == 'bs_roformer':
|
||||
# Use model_bs_roformer_ep_368_sdr_12.9628.yaml and model_bs_roformer_ep_317_sdr_12.9755.yaml as default configuration files
|
||||
# Other BS_Roformer models may not be compatible
|
||||
default_config = {
|
||||
"audio": {"chunk_size": 352800, "sample_rate": 44100},
|
||||
"model": {
|
||||
"dim": 512,
|
||||
"depth": 12,
|
||||
"stereo": True,
|
||||
"num_stems": 1,
|
||||
"time_transformer_depth": 1,
|
||||
"freq_transformer_depth": 1,
|
||||
"linear_transformer_depth": 0,
|
||||
"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),
|
||||
"dim_head": 64,
|
||||
"heads": 8,
|
||||
"attn_dropout": 0.1,
|
||||
"ff_dropout": 0.1,
|
||||
"flash_attn": True,
|
||||
"dim_freqs_in": 1025,
|
||||
"stft_n_fft": 2048,
|
||||
"stft_hop_length": 441,
|
||||
"stft_win_length": 2048,
|
||||
"stft_normalized": False,
|
||||
"mask_estimator_depth": 2,
|
||||
"multi_stft_resolution_loss_weight": 1.0,
|
||||
"multi_stft_resolutions_window_sizes": (4096, 2048, 1024, 512, 256),
|
||||
"multi_stft_hop_size": 147,
|
||||
"multi_stft_normalized": False,
|
||||
},
|
||||
"training": {"instruments": ["vocals", "other"], "target_instrument": "vocals"},
|
||||
"inference": {"batch_size": 2, "num_overlap": 2}
|
||||
}
|
||||
elif self.model_type == 'mel_band_roformer':
|
||||
# Use model_mel_band_roformer_ep_3005_sdr_11.4360.yaml as default configuration files
|
||||
# Other Mel_Band_Roformer models may not be compatible
|
||||
default_config = {
|
||||
"audio": {"chunk_size": 352800, "sample_rate": 44100},
|
||||
"model": {
|
||||
"dim": 384,
|
||||
"depth": 12,
|
||||
"stereo": True,
|
||||
"num_stems": 1,
|
||||
"time_transformer_depth": 1,
|
||||
"freq_transformer_depth": 1,
|
||||
"linear_transformer_depth": 0,
|
||||
"num_bands": 60,
|
||||
"dim_head": 64,
|
||||
"heads": 8,
|
||||
"attn_dropout": 0.1,
|
||||
"ff_dropout": 0.1,
|
||||
"flash_attn": True,
|
||||
"dim_freqs_in": 1025,
|
||||
"sample_rate": 44100,
|
||||
"stft_n_fft": 2048,
|
||||
"stft_hop_length": 441,
|
||||
"stft_win_length": 2048,
|
||||
"stft_normalized": False,
|
||||
"mask_estimator_depth": 2,
|
||||
"multi_stft_resolution_loss_weight": 1.0,
|
||||
"multi_stft_resolutions_window_sizes": (4096, 2048, 1024, 512, 256),
|
||||
"multi_stft_hop_size": 147,
|
||||
"multi_stft_normalized": False
|
||||
},
|
||||
"training": {"instruments": ["vocals", "other"], "target_instrument": "vocals"},
|
||||
"inference": {"batch_size": 2, "num_overlap": 2}
|
||||
}
|
||||
return default_config
|
||||
|
||||
|
||||
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)
|
||||
)
|
||||
|
||||
if self.model_type == 'bs_roformer':
|
||||
from bs_roformer.bs_roformer import BSRoformer
|
||||
model = BSRoformer(**dict(self.config["model"]))
|
||||
elif self.model_type == 'mel_band_roformer':
|
||||
from bs_roformer.mel_band_roformer import MelBandRoformer
|
||||
model = MelBandRoformer(**dict(self.config["model"]))
|
||||
else:
|
||||
print('Error: Unknown model: {}'.format(self.model_type))
|
||||
model = None
|
||||
return model
|
||||
|
||||
|
||||
|
||||
def demix_track(self, model, mix, device):
|
||||
C = 352800
|
||||
# num_overlap
|
||||
N = 1
|
||||
C = self.config["audio"]["chunk_size"] # chunk_size
|
||||
N = self.config["inference"]["num_overlap"]
|
||||
fade_size = C // 10
|
||||
step = int(C // N)
|
||||
border = C - step
|
||||
batch_size = 4
|
||||
batch_size = self.config["inference"]["batch_size"]
|
||||
|
||||
length_init = mix.shape[-1]
|
||||
|
||||
progress_bar = tqdm(total=length_init // step + 1)
|
||||
progress_bar.set_description("Processing")
|
||||
progress_bar = tqdm(total=length_init // step + 1, desc="Processing", leave=False)
|
||||
|
||||
# Do pad from the beginning and end to account floating window results better
|
||||
if length_init > 2 * border and (border > 0):
|
||||
@ -82,7 +132,10 @@ class BsRoformer_Loader:
|
||||
|
||||
with torch.amp.autocast('cuda'):
|
||||
with torch.inference_mode():
|
||||
req_shape = (1, ) + tuple(mix.shape)
|
||||
if self.config["training"]["target_instrument"] is None:
|
||||
req_shape = (len(self.config["training"]["instruments"]),) + tuple(mix.shape)
|
||||
else:
|
||||
req_shape = (1, ) + tuple(mix.shape)
|
||||
|
||||
result = torch.zeros(req_shape, dtype=torch.float32)
|
||||
counter = torch.zeros(req_shape, dtype=torch.float32)
|
||||
@ -97,7 +150,7 @@ class BsRoformer_Loader:
|
||||
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):
|
||||
if self.is_half:
|
||||
part=part.half()
|
||||
batch_data.append(part)
|
||||
batch_locations.append((i, length))
|
||||
@ -133,78 +186,109 @@ class BsRoformer_Loader:
|
||||
|
||||
progress_bar.close()
|
||||
|
||||
return {k: v for k, v in zip(['vocals', 'other'], estimated_sources)}
|
||||
if self.config["training"]["target_instrument"] is None:
|
||||
return {k: v for k, v in zip(self.config["training"]["instruments"], estimated_sources)}
|
||||
else:
|
||||
return {k: v for k, v in zip([self.config["training"]["target_instrument"]], estimated_sources)}
|
||||
|
||||
|
||||
def run_folder(self,input, vocal_root, others_root, format):
|
||||
# start_time = time.time()
|
||||
def run_folder(self, input, vocal_root, others_root, format):
|
||||
self.model.eval()
|
||||
path = input
|
||||
os.makedirs(vocal_root, exist_ok=True)
|
||||
os.makedirs(others_root, exist_ok=True)
|
||||
file_base_name = os.path.splitext(os.path.basename(path))[0]
|
||||
|
||||
if not os.path.isdir(vocal_root):
|
||||
os.mkdir(vocal_root)
|
||||
|
||||
if not os.path.isdir(others_root):
|
||||
os.mkdir(others_root)
|
||||
sample_rate = 44100
|
||||
if 'sample_rate' in self.config["audio"]:
|
||||
sample_rate = self.config["audio"]['sample_rate']
|
||||
|
||||
try:
|
||||
mix, sr = librosa.load(path, sr=44100, mono=False)
|
||||
mix, sr = librosa.load(path, sr=sample_rate, 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)
|
||||
# in case if model only supports mono tracks
|
||||
isstereo = self.config["model"].get("stereo", True)
|
||||
if not isstereo and len(mix.shape) != 1:
|
||||
mix = np.mean(mix, axis=0) # if more than 2 channels, take mean
|
||||
print("Warning: Track has more than 1 channels, but model is mono, taking mean of all channels.")
|
||||
|
||||
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)
|
||||
if self.config["training"]["target_instrument"] is not None:
|
||||
# if target instrument is specified, save target instrument as vocal and other instruments as others
|
||||
# other instruments are caculated by subtracting target instrument from mixture
|
||||
target_instrument = self.config["training"]["target_instrument"]
|
||||
other_instruments = [i for i in self.config["training"]["instruments"] if i != target_instrument]
|
||||
other = mix_orig - res[target_instrument] # caculate other instruments
|
||||
|
||||
path_vocal = "{}/{}_{}.wav".format(vocal_root, file_base_name, target_instrument)
|
||||
path_other = "{}/{}_{}.wav".format(others_root, file_base_name, other_instruments[0])
|
||||
self.save_audio(path_vocal, res[target_instrument].T, sr, format)
|
||||
self.save_audio(path_other, other.T, sr, format)
|
||||
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))
|
||||
# if target instrument is not specified, save the first instrument as vocal and the rest as others
|
||||
vocal_inst = self.config["training"]["instruments"][0]
|
||||
path_vocal = "{}/{}_{}.wav".format(vocal_root, file_base_name, vocal_inst)
|
||||
self.save_audio(path_vocal, res[vocal_inst].T, sr, format)
|
||||
for other in self.config["training"]["instruments"][1:]: # save other instruments
|
||||
path_other = "{}/{}_{}.wav".format(others_root, file_base_name, other)
|
||||
self.save_audio(path_other, res[other].T, sr, format)
|
||||
|
||||
|
||||
def __init__(self, model_path, device,is_half):
|
||||
def save_audio(self, path, data, sr, format):
|
||||
# input path should be endwith '.wav'
|
||||
if format in ["wav", "flac"]:
|
||||
if format == "flac":
|
||||
path = path[:-3] + "flac"
|
||||
sf.write(path, data, sr)
|
||||
else:
|
||||
sf.write(path, data, sr)
|
||||
os.system("ffmpeg -i \"{}\" -vn \"{}\" -q:a 2 -y".format(path, path[:-3] + format))
|
||||
try: os.remove(path)
|
||||
except: pass
|
||||
|
||||
|
||||
def __init__(self, model_path, config_path, device, is_half):
|
||||
self.device = device
|
||||
self.extract_instrumental=True
|
||||
self.is_half = is_half
|
||||
self.model_type = None
|
||||
self.config = None
|
||||
|
||||
# get model_type, first try:
|
||||
if "bs_roformer" in model_path.lower() or "bsroformer" in model_path.lower():
|
||||
self.model_type = "bs_roformer"
|
||||
elif "mel_band_roformer" in model_path.lower() or "melbandroformer" in model_path.lower():
|
||||
self.model_type = "mel_band_roformer"
|
||||
|
||||
if not os.path.exists(config_path):
|
||||
if self.model_type is None:
|
||||
# if model_type is still None, raise an error
|
||||
raise ValueError("Error: Unknown model type. If you are using a model without a configuration file, Ensure that your model name includes 'bs_roformer', 'bsroformer', 'mel_band_roformer', or 'melbandroformer'. Otherwise, you can manually place the model configuration file into 'tools/uvr5/uvr5w_weights' and ensure that the configuration file is named as '<model_name>.yaml' then try it again.")
|
||||
self.config = self.get_default_config()
|
||||
else:
|
||||
# if there is a configuration file
|
||||
self.config = self.get_config(config_path)
|
||||
if self.model_type is None:
|
||||
# if model_type is still None, second try, get model_type from the configuration file
|
||||
if "freqs_per_bands" in self.config["model"]:
|
||||
# if freqs_per_bands in config, it's a bs_roformer model
|
||||
self.model_type = "bs_roformer"
|
||||
else:
|
||||
# else it's a mel_band_roformer model
|
||||
self.model_type = "mel_band_roformer"
|
||||
|
||||
print("Detected model type: {}".format(self.model_type))
|
||||
model = self.get_model_from_config()
|
||||
state_dict = torch.load(model_path,map_location="cpu")
|
||||
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:
|
||||
|
@ -12,7 +12,7 @@ import torch
|
||||
import sys
|
||||
from mdxnet import MDXNetDereverb
|
||||
from vr import AudioPre, AudioPreDeEcho
|
||||
from bsroformer import BsRoformer_Loader
|
||||
from bsroformer import Roformer_Loader
|
||||
|
||||
try:
|
||||
import gradio.analytics as analytics
|
||||
@ -49,13 +49,17 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format
|
||||
is_hp3 = "HP3" in model_name
|
||||
if model_name == "onnx_dereverb_By_FoxJoy":
|
||||
pre_fun = MDXNetDereverb(15)
|
||||
elif model_name == "Bs_Roformer" or "bs_roformer" in model_name.lower():
|
||||
func = BsRoformer_Loader
|
||||
elif "roformer" in model_name.lower():
|
||||
func = Roformer_Loader
|
||||
pre_fun = func(
|
||||
model_path = os.path.join(weight_uvr5_root, model_name + ".ckpt"),
|
||||
config_path = os.path.join(weight_uvr5_root, model_name + ".yaml"),
|
||||
device = device,
|
||||
is_half=is_half
|
||||
)
|
||||
if not os.path.exists(os.path.join(weight_uvr5_root, model_name + ".yaml")):
|
||||
infos.append("Warning: You are using a model without a configuration file. The program will automatically use the default configuration file. However, the default configuration file cannot guarantee that all models will run successfully. You can manually place the model configuration file into 'tools/uvr5/uvr5w_weights' and ensure that the configuration file is named as '<model_name>.yaml' then try it again. (For example, the configuration file corresponding to the model 'bs_roformer_ep_368_sdr_12.9628.ckpt' should be 'bs_roformer_ep_368_sdr_12.9628.yaml'.) Or you can just ignore this warning.")
|
||||
yield "\n".join(infos)
|
||||
else:
|
||||
func = AudioPre if "DeEcho" not in model_name else AudioPreDeEcho
|
||||
pre_fun = func(
|
||||
@ -129,7 +133,7 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg, format
|
||||
with gr.Blocks(title="UVR5 WebUI") as app:
|
||||
gr.Markdown(
|
||||
value=
|
||||
i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
|
||||
i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.") + "<br>" + i18n("如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.")
|
||||
)
|
||||
with gr.Group():
|
||||
gr.Markdown(html_center(i18n("伴奏人声分离&去混响&去回声"),'h2'))
|
||||
|
517
webui.py
517
webui.py
@ -50,6 +50,7 @@ for site_packages_root in site_packages_roots:
|
||||
from tools import my_utils
|
||||
import shutil
|
||||
import pdb
|
||||
import subprocess
|
||||
from subprocess import Popen
|
||||
import signal
|
||||
from config import python_exec,infer_device,is_half,exp_root,webui_port_main,webui_port_infer_tts,webui_port_uvr5,webui_port_subfix,is_share
|
||||
@ -67,7 +68,7 @@ try:
|
||||
except:...
|
||||
import gradio as gr
|
||||
n_cpu=cpu_count()
|
||||
|
||||
|
||||
ngpu = torch.cuda.device_count()
|
||||
gpu_infos = []
|
||||
mem = []
|
||||
@ -91,13 +92,32 @@ if torch.cuda.is_available() or ngpu != 0:
|
||||
# gpu_infos.append("%s\t%s" % ("0", "Apple GPU"))
|
||||
# mem.append(psutil.virtual_memory().total/ 1024 / 1024 / 1024) # 实测使用系统内存作为显存不会爆显存
|
||||
|
||||
|
||||
def set_default():
|
||||
global default_batch_size,default_max_batch_size,gpu_info,default_sovits_epoch,default_sovits_save_every_epoch,max_sovits_epoch,max_sovits_save_every_epoch,default_batch_size_s1
|
||||
global default_batch_size,default_max_batch_size,gpu_info,default_sovits_epoch,default_sovits_save_every_epoch,max_sovits_epoch,max_sovits_save_every_epoch,default_batch_size_s1,if_force_ckpt
|
||||
if_force_ckpt = False
|
||||
if if_gpu_ok and len(gpu_infos) > 0:
|
||||
gpu_info = "\n".join(gpu_infos)
|
||||
minmem = min(mem)
|
||||
default_batch_size = minmem // 2 if version!="v3"else minmem//14
|
||||
# if version == "v3" and minmem < 14:
|
||||
# # API读取不到共享显存,直接填充确认
|
||||
# try:
|
||||
# torch.zeros((1024,1024,1024,14),dtype=torch.int8,device="cuda")
|
||||
# torch.cuda.empty_cache()
|
||||
# minmem = 14
|
||||
# except RuntimeError as _:
|
||||
# # 强制梯度检查只需要12G显存
|
||||
# if minmem >= 12 :
|
||||
# if_force_ckpt = True
|
||||
# minmem = 14
|
||||
# else:
|
||||
# try:
|
||||
# torch.zeros((1024,1024,1024,12),dtype=torch.int8,device="cuda")
|
||||
# torch.cuda.empty_cache()
|
||||
# if_force_ckpt = True
|
||||
# minmem = 14
|
||||
# except RuntimeError as _:
|
||||
# print("显存不足以开启V3训练")
|
||||
default_batch_size = minmem // 2 if version!="v3"else minmem//8
|
||||
default_batch_size_s1=minmem // 2
|
||||
else:
|
||||
gpu_info = ("%s\t%s" % ("0", "CPU"))
|
||||
@ -107,17 +127,17 @@ def set_default():
|
||||
if version!="v3":
|
||||
default_sovits_epoch=8
|
||||
default_sovits_save_every_epoch=4
|
||||
max_sovits_epoch=25
|
||||
max_sovits_save_every_epoch=25
|
||||
max_sovits_epoch=25#40
|
||||
max_sovits_save_every_epoch=25#10
|
||||
else:
|
||||
default_sovits_epoch=2
|
||||
default_sovits_save_every_epoch=1
|
||||
max_sovits_epoch=3
|
||||
max_sovits_save_every_epoch=3
|
||||
|
||||
max_sovits_epoch=3#40
|
||||
max_sovits_save_every_epoch=3#10
|
||||
|
||||
default_batch_size = max(1, default_batch_size)
|
||||
default_batch_size_s1 = max(1, default_batch_size_s1)
|
||||
default_max_batch_size=default_batch_size*3
|
||||
default_max_batch_size = default_batch_size * 3
|
||||
|
||||
set_default()
|
||||
|
||||
@ -141,13 +161,14 @@ pretrained_gpt_name=["GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=6
|
||||
|
||||
pretrained_model_list = (pretrained_sovits_name[int(version[-1])-1],pretrained_sovits_name[int(version[-1])-1].replace("s2G","s2D"),pretrained_gpt_name[int(version[-1])-1],"GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large","GPT_SoVITS/pretrained_models/chinese-hubert-base")
|
||||
|
||||
_=''
|
||||
_ = ''
|
||||
for i in pretrained_model_list:
|
||||
if "s2Dv3"not in i and os.path.exists(i)==False:_+=f'\n {i}'
|
||||
if "s2Dv3" not in i and os.path.exists(i) == False:
|
||||
_ += f'\n {i}'
|
||||
if _:
|
||||
print("warning:",i18n('以下模型不存在:')+_)
|
||||
print("warning: ", i18n('以下模型不存在:') + _)
|
||||
|
||||
_ =[[],[]]
|
||||
_ = [[],[]]
|
||||
for i in range(3):
|
||||
if os.path.exists(pretrained_gpt_name[i]):_[0].append(pretrained_gpt_name[i])
|
||||
else:_[0].append("")##没有下pretrained模型的,说不定他们是想自己从零训底模呢
|
||||
@ -174,7 +195,6 @@ 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):
|
||||
# 使用正则表达式提取字符串中的数字部分和非数字部分
|
||||
parts = re.split('(\d+)', s)
|
||||
@ -212,40 +232,66 @@ def kill_proc_tree(pid, including_parent=True):
|
||||
pass
|
||||
|
||||
system=platform.system()
|
||||
def kill_process(pid):
|
||||
def kill_process(pid, process_name=""):
|
||||
if(system=="Windows"):
|
||||
cmd = "taskkill /t /f /pid %s" % pid
|
||||
os.system(cmd)
|
||||
# os.system(cmd)
|
||||
subprocess.run(cmd,shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
else:
|
||||
kill_proc_tree(pid)
|
||||
print(process_name + i18n("进程已终止"))
|
||||
|
||||
def process_info(process_name="", indicator=""):
|
||||
if indicator == "opened":
|
||||
return process_name + i18n("已开启")
|
||||
elif indicator == "open":
|
||||
return i18n("开启") + process_name
|
||||
elif indicator == "closed":
|
||||
return process_name + i18n("已关闭")
|
||||
elif indicator == "close":
|
||||
return i18n("关闭") + process_name
|
||||
elif indicator == "running":
|
||||
return process_name + i18n("运行中")
|
||||
elif indicator == "occupy":
|
||||
return process_name + i18n("占用中") + "," + i18n("需先终止才能开启下一次任务")
|
||||
elif indicator == "finish":
|
||||
return process_name + i18n("已完成")
|
||||
elif indicator == "failed":
|
||||
return process_name + i18n("失败")
|
||||
elif indicator == "info":
|
||||
return process_name + i18n("进程输出信息")
|
||||
else:
|
||||
return process_name
|
||||
|
||||
process_name_subfix = i18n("音频标注WebUI")
|
||||
def change_label(path_list):
|
||||
global p_label
|
||||
if(p_label==None):
|
||||
if p_label is None:
|
||||
check_for_existance([path_list])
|
||||
path_list=my_utils.clean_path(path_list)
|
||||
path_list = my_utils.clean_path(path_list)
|
||||
cmd = '"%s" tools/subfix_webui.py --load_list "%s" --webui_port %s --is_share %s'%(python_exec,path_list,webui_port_subfix,is_share)
|
||||
yield i18n("打标工具WebUI已开启"), {'__type__':'update','visible':False}, {'__type__':'update','visible':True}
|
||||
yield process_info(process_name_subfix, "opened"), {'__type__':'update','visible':False}, {'__type__':'update','visible':True}
|
||||
print(cmd)
|
||||
p_label = Popen(cmd, shell=True)
|
||||
elif(p_label!=None):
|
||||
kill_process(p_label.pid)
|
||||
p_label=None
|
||||
yield i18n("打标工具WebUI已关闭"), {'__type__':'update','visible':True}, {'__type__':'update','visible':False}
|
||||
else:
|
||||
kill_process(p_label.pid, process_name_subfix)
|
||||
p_label = None
|
||||
yield process_info(process_name_subfix, "closed"), {'__type__':'update','visible':True}, {'__type__':'update','visible':False}
|
||||
|
||||
process_name_uvr5 = i18n("人声分离WebUI")
|
||||
def change_uvr5():
|
||||
global p_uvr5
|
||||
if(p_uvr5==None):
|
||||
if p_uvr5 is None:
|
||||
cmd = '"%s" tools/uvr5/webui.py "%s" %s %s %s'%(python_exec,infer_device,is_half,webui_port_uvr5,is_share)
|
||||
yield i18n("UVR5已开启"), {'__type__':'update','visible':False}, {'__type__':'update','visible':True}
|
||||
yield process_info(process_name_uvr5, "opened"), {'__type__':'update','visible':False}, {'__type__':'update','visible':True}
|
||||
print(cmd)
|
||||
p_uvr5 = Popen(cmd, shell=True)
|
||||
elif(p_uvr5!=None):
|
||||
kill_process(p_uvr5.pid)
|
||||
p_uvr5=None
|
||||
yield i18n("UVR5已关闭"), {'__type__':'update','visible':True}, {'__type__':'update','visible':False}
|
||||
else:
|
||||
kill_process(p_uvr5.pid, process_name_uvr5)
|
||||
p_uvr5 = None
|
||||
yield process_info(process_name_uvr5, "closed"), {'__type__':'update','visible':True}, {'__type__':'update','visible':False}
|
||||
|
||||
process_name_tts = i18n("TTS推理WebUI")
|
||||
def change_tts_inference(bert_path,cnhubert_base_path,gpu_number,gpt_path,sovits_path, batched_infer_enabled):
|
||||
global p_tts_inference
|
||||
if batched_infer_enabled:
|
||||
@ -255,7 +301,7 @@ def change_tts_inference(bert_path,cnhubert_base_path,gpu_number,gpt_path,sovits
|
||||
#####v3暂不支持加速推理
|
||||
if version=="v3":
|
||||
cmd = '"%s" GPT_SoVITS/inference_webui.py "%s"'%(python_exec, language)
|
||||
if(p_tts_inference==None):
|
||||
if p_tts_inference is None:
|
||||
os.environ["gpt_path"]=gpt_path if "/" in gpt_path else "%s/%s"%(GPT_weight_root,gpt_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
|
||||
@ -264,18 +310,20 @@ def change_tts_inference(bert_path,cnhubert_base_path,gpu_number,gpt_path,sovits
|
||||
os.environ["is_half"]=str(is_half)
|
||||
os.environ["infer_ttswebui"]=str(webui_port_infer_tts)
|
||||
os.environ["is_share"]=str(is_share)
|
||||
yield i18n("TTS推理进程已开启"), {'__type__':'update','visible':False}, {'__type__':'update','visible':True}
|
||||
yield process_info(process_name_tts, "opened"), {'__type__':'update','visible':False}, {'__type__':'update','visible':True}
|
||||
print(cmd)
|
||||
p_tts_inference = Popen(cmd, shell=True)
|
||||
elif(p_tts_inference!=None):
|
||||
kill_process(p_tts_inference.pid)
|
||||
p_tts_inference=None
|
||||
yield i18n("TTS推理进程已关闭"), {'__type__':'update','visible':True}, {'__type__':'update','visible':False}
|
||||
else:
|
||||
kill_process(p_tts_inference.pid, process_name_tts)
|
||||
p_tts_inference = None
|
||||
yield process_info(process_name_tts, "closed"), {'__type__':'update','visible':True}, {'__type__':'update','visible':False}
|
||||
|
||||
from tools.asr.config import asr_dict
|
||||
|
||||
process_name_asr = i18n("语音识别")
|
||||
def open_asr(asr_inp_dir, asr_opt_dir, asr_model, asr_model_size, asr_lang, asr_precision):
|
||||
global p_asr
|
||||
if(p_asr==None):
|
||||
if p_asr is None:
|
||||
asr_inp_dir=my_utils.clean_path(asr_inp_dir)
|
||||
asr_opt_dir=my_utils.clean_path(asr_opt_dir)
|
||||
check_for_existance([asr_inp_dir])
|
||||
@ -288,22 +336,23 @@ def open_asr(asr_inp_dir, asr_opt_dir, asr_model, asr_model_size, asr_lang, asr_
|
||||
output_file_name = os.path.basename(asr_inp_dir)
|
||||
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"}
|
||||
yield process_info(process_name_asr, "opened"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
print(cmd)
|
||||
p_asr = Popen(cmd, shell=True)
|
||||
p_asr.wait()
|
||||
p_asr=None
|
||||
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}
|
||||
p_asr = None
|
||||
yield process_info(process_name_asr, "finish"), {"__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:
|
||||
yield "已有正在进行的ASR任务,需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}, {"__type__":"update"}
|
||||
# return None
|
||||
yield process_info(process_name_asr, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
|
||||
def close_asr():
|
||||
global p_asr
|
||||
if(p_asr!=None):
|
||||
kill_process(p_asr.pid)
|
||||
p_asr=None
|
||||
return "已终止ASR进程", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
if p_asr is not None:
|
||||
kill_process(p_asr.pid, process_name_asr)
|
||||
p_asr = None
|
||||
return process_info(process_name_asr, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
process_name_denoise = i18n("语音降噪")
|
||||
def open_denoise(denoise_inp_dir, denoise_opt_dir):
|
||||
global p_denoise
|
||||
if(p_denoise==None):
|
||||
@ -312,25 +361,25 @@ def open_denoise(denoise_inp_dir, denoise_opt_dir):
|
||||
check_for_existance([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")
|
||||
|
||||
yield "语音降噪任务开启:%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}
|
||||
yield process_info(process_name_denoise, "opened"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}
|
||||
print(cmd)
|
||||
p_denoise = Popen(cmd, shell=True)
|
||||
p_denoise.wait()
|
||||
p_denoise=None
|
||||
yield f"语音降噪任务完成, 查看终端进行下一步", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__":"update","value":denoise_opt_dir}, {"__type__":"update","value":denoise_opt_dir}
|
||||
yield process_info(process_name_denoise, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}, {"__type__": "update", "value": denoise_opt_dir}, {"__type__": "update", "value": denoise_opt_dir}
|
||||
else:
|
||||
yield "已有正在进行的语音降噪任务,需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}, {"__type__":"update"}, {"__type__":"update"}
|
||||
# return None
|
||||
yield process_info(process_name_denoise, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}
|
||||
|
||||
def close_denoise():
|
||||
global p_denoise
|
||||
if(p_denoise!=None):
|
||||
kill_process(p_denoise.pid)
|
||||
p_denoise=None
|
||||
return "已终止语音降噪进程", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
if p_denoise is not None:
|
||||
kill_process(p_denoise.pid, process_name_denoise)
|
||||
p_denoise = None
|
||||
return process_info(process_name_denoise, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
p_train_SoVITS=None
|
||||
def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers1Ba,pretrained_s2G,pretrained_s2D,if_grad_ckpt):
|
||||
process_name_sovits = i18n("SoVITS训练")
|
||||
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,if_grad_ckpt,lora_rank):
|
||||
global p_train_SoVITS
|
||||
if(p_train_SoVITS==None):
|
||||
with open("GPT_SoVITS/configs/s2.json")as f:
|
||||
@ -353,6 +402,7 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s
|
||||
data["train"]["save_every_epoch"]=save_every_epoch
|
||||
data["train"]["gpu_numbers"]=gpu_numbers1Ba
|
||||
data["train"]["grad_ckpt"]=if_grad_ckpt
|
||||
data["train"]["lora_rank"]=lora_rank
|
||||
data["model"]["version"]=version
|
||||
data["data"]["exp_dir"]=data["s2_ckpt_dir"]=s2_dir
|
||||
data["save_weight_dir"]=SoVITS_weight_root[int(version[-1])-1]
|
||||
@ -363,24 +413,25 @@ def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_s
|
||||
if version in ["v1","v2"]:
|
||||
cmd = '"%s" GPT_SoVITS/s2_train.py --config "%s"'%(python_exec,tmp_config_path)
|
||||
else:
|
||||
cmd = '"%s" GPT_SoVITS/s2_train_v3.py --config "%s"'%(python_exec,tmp_config_path)
|
||||
yield "SoVITS训练开始:%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
|
||||
cmd = '"%s" GPT_SoVITS/s2_train_v3_lora.py --config "%s"'%(python_exec,tmp_config_path)
|
||||
yield process_info(process_name_sovits, "opened"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
print(cmd)
|
||||
p_train_SoVITS = Popen(cmd, shell=True)
|
||||
p_train_SoVITS.wait()
|
||||
p_train_SoVITS=None
|
||||
yield "SoVITS训练完成", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
p_train_SoVITS = None
|
||||
yield process_info(process_name_sovits, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
|
||||
yield process_info(process_name_sovits, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
|
||||
def close1Ba():
|
||||
global p_train_SoVITS
|
||||
if(p_train_SoVITS!=None):
|
||||
kill_process(p_train_SoVITS.pid)
|
||||
p_train_SoVITS=None
|
||||
return "已终止SoVITS训练", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
if p_train_SoVITS is not None:
|
||||
kill_process(p_train_SoVITS.pid, process_name_sovits)
|
||||
p_train_SoVITS = None
|
||||
return process_info(process_name_sovits, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
p_train_GPT=None
|
||||
process_name_gpt = i18n("GPT训练")
|
||||
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
|
||||
if(p_train_GPT==None):
|
||||
@ -414,35 +465,36 @@ def open1Bb(batch_size,total_epoch,exp_name,if_dpo,if_save_latest,if_save_every_
|
||||
with open(tmp_config_path, "w") as f:f.write(yaml.dump(data, default_flow_style=False))
|
||||
# cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" --train_semantic_path "%s/6-name2semantic.tsv" --train_phoneme_path "%s/2-name2text.txt" --output_dir "%s/logs_s1"'%(python_exec,tmp_config_path,s1_dir,s1_dir,s1_dir)
|
||||
cmd = '"%s" GPT_SoVITS/s1_train.py --config_file "%s" '%(python_exec,tmp_config_path)
|
||||
yield "GPT训练开始:%s"%cmd, {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
|
||||
yield process_info(process_name_gpt, "opened"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
print(cmd)
|
||||
p_train_GPT = Popen(cmd, shell=True)
|
||||
p_train_GPT.wait()
|
||||
p_train_GPT=None
|
||||
yield "GPT训练完成", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
p_train_GPT = None
|
||||
yield process_info(process_name_gpt, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "已有正在进行的GPT训练任务,需先终止才能开启下一次任务", {"__type__":"update","visible":False}, {"__type__":"update","visible":True}
|
||||
yield process_info(process_name_gpt, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
|
||||
def close1Bb():
|
||||
global p_train_GPT
|
||||
if(p_train_GPT!=None):
|
||||
kill_process(p_train_GPT.pid)
|
||||
p_train_GPT=None
|
||||
return "已终止GPT训练", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
if p_train_GPT is not None:
|
||||
kill_process(p_train_GPT.pid, process_name_gpt)
|
||||
p_train_GPT = None
|
||||
return process_info(process_name_gpt, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
ps_slice=[]
|
||||
process_name_slice = i18n("语音切分")
|
||||
def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_parts):
|
||||
global ps_slice
|
||||
inp = my_utils.clean_path(inp)
|
||||
opt_root = my_utils.clean_path(opt_root)
|
||||
check_for_existance([inp])
|
||||
if(os.path.exists(inp)==False):
|
||||
yield "输入路径不存在", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
yield i18n("输入路径不存在"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
return
|
||||
if os.path.isfile(inp):n_parts=1
|
||||
elif os.path.isdir(inp):pass
|
||||
else:
|
||||
yield "输入路径存在但既不是文件也不是文件夹", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
yield i18n("输入路径存在但不可用"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
return
|
||||
if (ps_slice == []):
|
||||
for i_part in range(n_parts):
|
||||
@ -450,26 +502,27 @@ def open_slice(inp,opt_root,threshold,min_length,min_interval,hop_size,max_sil_k
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps_slice.append(p)
|
||||
yield "切割执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
yield process_info(process_name_slice, "opened"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
for p in ps_slice:
|
||||
p.wait()
|
||||
ps_slice=[]
|
||||
yield "切割结束", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}, {"__type__": "update", "value":opt_root}, {"__type__": "update", "value":opt_root}, {"__type__": "update", "value":opt_root}
|
||||
yield process_info(process_name_slice, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}, {"__type__": "update", "value": opt_root}, {"__type__": "update", "value": opt_root}, {"__type__": "update", "value": opt_root}
|
||||
else:
|
||||
yield "已有正在进行的切割任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
yield process_info(process_name_slice, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}, {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
|
||||
|
||||
def close_slice():
|
||||
global ps_slice
|
||||
if (ps_slice != []):
|
||||
for p_slice in ps_slice:
|
||||
try:
|
||||
kill_process(p_slice.pid)
|
||||
kill_process(p_slice.pid, process_name_slice)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
ps_slice=[]
|
||||
return "已终止所有切割进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
return process_info(process_name_slice, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
ps1a=[]
|
||||
process_name_1a = i18n("文本分词与特征提取")
|
||||
def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir):
|
||||
global ps1a
|
||||
inp_text = my_utils.clean_path(inp_text)
|
||||
@ -501,7 +554,7 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir):
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps1a.append(p)
|
||||
yield "文本进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1a, "running"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
for p in ps1a:
|
||||
p.wait()
|
||||
opt = []
|
||||
@ -515,24 +568,25 @@ def open1a(inp_text,inp_wav_dir,exp_name,gpu_numbers,bert_pretrained_dir):
|
||||
f.write("\n".join(opt) + "\n")
|
||||
ps1a=[]
|
||||
if len("".join(opt)) > 0:
|
||||
yield "文本进程成功", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
yield process_info(process_name_1a, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "文本进程失败", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
yield process_info(process_name_1a, "failed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "已有正在进行的文本任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1a, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
|
||||
def close1a():
|
||||
global ps1a
|
||||
if (ps1a != []):
|
||||
if ps1a != []:
|
||||
for p1a in ps1a:
|
||||
try:
|
||||
kill_process(p1a.pid)
|
||||
kill_process(p1a.pid, process_name_1a)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
ps1a=[]
|
||||
return "已终止所有1a进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
ps1a = []
|
||||
return process_info(process_name_1a, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
ps1b=[]
|
||||
process_name_1b = i18n("语音自监督特征提取")
|
||||
def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
|
||||
global ps1b
|
||||
inp_text = my_utils.clean_path(inp_text)
|
||||
@ -544,7 +598,7 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
|
||||
"inp_text":inp_text,
|
||||
"inp_wav_dir":inp_wav_dir,
|
||||
"exp_name":exp_name,
|
||||
"opt_dir":"%s/%s"%(exp_root,exp_name),
|
||||
"opt_dir": "%s/%s"%(exp_root,exp_name),
|
||||
"cnhubert_base_dir":ssl_pretrained_dir,
|
||||
"is_half": str(is_half)
|
||||
}
|
||||
@ -563,26 +617,27 @@ def open1b(inp_text,inp_wav_dir,exp_name,gpu_numbers,ssl_pretrained_dir):
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps1b.append(p)
|
||||
yield "SSL提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1b, "running"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
for p in ps1b:
|
||||
p.wait()
|
||||
ps1b=[]
|
||||
yield "SSL提取进程结束", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
yield process_info(process_name_1b, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "已有正在进行的SSL提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1b, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
|
||||
def close1b():
|
||||
global ps1b
|
||||
if (ps1b != []):
|
||||
for p1b in ps1b:
|
||||
try:
|
||||
kill_process(p1b.pid)
|
||||
kill_process(p1b.pid, process_name_1b)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
ps1b=[]
|
||||
return "已终止所有1b进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
return process_info(process_name_1b, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
ps1c=[]
|
||||
process_name_1c = i18n("语义Token提取")
|
||||
def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
|
||||
global ps1c
|
||||
inp_text = my_utils.clean_path(inp_text)
|
||||
@ -613,7 +668,7 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps1c.append(p)
|
||||
yield "语义token提取进程执行中", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1c, "running"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
for p in ps1c:
|
||||
p.wait()
|
||||
opt = ["item_name\tsemantic_audio"]
|
||||
@ -626,22 +681,23 @@ def open1c(inp_text,exp_name,gpu_numbers,pretrained_s2G_path):
|
||||
with open(path_semantic, "w", encoding="utf8") as f:
|
||||
f.write("\n".join(opt) + "\n")
|
||||
ps1c=[]
|
||||
yield "语义token提取进程结束", {"__type__":"update","visible":True}, {"__type__":"update","visible":False}
|
||||
yield process_info(process_name_1c, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "已有正在进行的语义token提取任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1c, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
|
||||
def close1c():
|
||||
global ps1c
|
||||
if (ps1c != []):
|
||||
for p1c in ps1c:
|
||||
try:
|
||||
kill_process(p1c.pid)
|
||||
kill_process(p1c.pid, process_name_1c)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
ps1c=[]
|
||||
return "已终止所有语义token进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
#####inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,cnhubert_base_dir,pretrained_s2G
|
||||
return process_info(process_name_1c, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
ps1abc=[]
|
||||
process_name_1abc = i18n("训练集格式化一键三连")
|
||||
def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,ssl_pretrained_dir,pretrained_s2G_path):
|
||||
global ps1abc
|
||||
inp_text = my_utils.clean_path(inp_text)
|
||||
@ -677,7 +733,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps1abc.append(p)
|
||||
yield "进度:1a-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield i18n("进度") + ": 1A-Doing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
for p in ps1abc:p.wait()
|
||||
|
||||
opt = []
|
||||
@ -688,8 +744,8 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
||||
os.remove(txt_path)
|
||||
with open(path_text, "w",encoding="utf8") as f:
|
||||
f.write("\n".join(opt) + "\n")
|
||||
assert len("".join(opt)) > 0, "1Aa-文本获取进程失败"
|
||||
yield "进度:1a-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
assert len("".join(opt)) > 0, process_info(process_name_1a, "failed")
|
||||
yield i18n("进度") + ": 1A-Done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
ps1abc=[]
|
||||
#############################1b
|
||||
config={
|
||||
@ -714,9 +770,9 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps1abc.append(p)
|
||||
yield "进度:1a-done, 1b-ing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield i18n("进度") + ": 1A-Done, 1B-Doing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
for p in ps1abc:p.wait()
|
||||
yield "进度:1a1b-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield i18n("进度") + ": 1A-Done, 1B-Done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
ps1abc=[]
|
||||
#############################1c
|
||||
path_semantic = "%s/6-name2semantic.tsv" % opt_dir
|
||||
@ -743,7 +799,7 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
||||
print(cmd)
|
||||
p = Popen(cmd, shell=True)
|
||||
ps1abc.append(p)
|
||||
yield "进度:1a1b-done, 1cing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield i18n("进度") + ": 1A-Done, 1B-Done, 1C-Doing", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
for p in ps1abc:p.wait()
|
||||
|
||||
opt = ["item_name\tsemantic_audio"]
|
||||
@ -754,26 +810,26 @@ def open1abc(inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numb
|
||||
os.remove(semantic_path)
|
||||
with open(path_semantic, "w",encoding="utf8") as f:
|
||||
f.write("\n".join(opt) + "\n")
|
||||
yield "进度:all-done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield i18n("进度") + ": 1A-Done, 1B-Done, 1C-Done", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
ps1abc = []
|
||||
yield "一键三连进程结束", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
yield process_info(process_name_1abc, "finish"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
except:
|
||||
traceback.print_exc()
|
||||
close1abc()
|
||||
yield "一键三连中途报错", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
yield process_info(process_name_1abc, "failed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
else:
|
||||
yield "已有正在进行的一键三连任务,需先终止才能开启下一次任务", {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
yield process_info(process_name_1abc, "occupy"), {"__type__": "update", "visible": False}, {"__type__": "update", "visible": True}
|
||||
|
||||
def close1abc():
|
||||
global ps1abc
|
||||
if (ps1abc != []):
|
||||
for p1abc in ps1abc:
|
||||
try:
|
||||
kill_process(p1abc.pid)
|
||||
kill_process(p1abc.pid, process_name_1abc)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
ps1abc=[]
|
||||
return "已终止所有一键三连进程", {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
return process_info(process_name_1abc, "closed"), {"__type__": "update", "visible": True}, {"__type__": "update", "visible": False}
|
||||
|
||||
def switch_version(version_):
|
||||
os.environ["version"]=version_
|
||||
@ -781,9 +837,20 @@ def switch_version(version_):
|
||||
version = version_
|
||||
if pretrained_sovits_name[int(version[-1])-1] !='' and pretrained_gpt_name[int(version[-1])-1] !='':...
|
||||
else:
|
||||
gr.Warning(i18n(f'未下载{version.upper()}模型'))
|
||||
gr.Warning(i18n('未下载模型') + ": " + version.upper())
|
||||
set_default()
|
||||
return {'__type__':'update', 'value':pretrained_sovits_name[int(version[-1])-1]}, {'__type__':'update', 'value':pretrained_sovits_name[int(version[-1])-1].replace("s2G","s2D")}, {'__type__':'update', 'value':pretrained_gpt_name[int(version[-1])-1]}, {'__type__':'update', 'value':pretrained_gpt_name[int(version[-1])-1]}, {'__type__':'update', 'value':pretrained_sovits_name[int(version[-1])-1]},{'__type__':'update',"value":default_batch_size,"maximum":default_max_batch_size},{'__type__':'update',"value":default_sovits_epoch,"maximum":max_sovits_epoch},{'__type__':'update',"value":default_sovits_save_every_epoch,"maximum":max_sovits_save_every_epoch},{'__type__':'update',"interactive":True if version!="v3"else False},{'__type__':'update',"interactive":True if version == "v3" else False},{'__type__':'update',"interactive":False if version == "v3" else True,"value":False}
|
||||
return {'__type__': 'update', 'value': pretrained_sovits_name[int(version[-1])-1]}, \
|
||||
{'__type__': 'update', 'value': pretrained_sovits_name[int(version[-1])-1].replace("s2G","s2D")}, \
|
||||
{'__type__': 'update', 'value': pretrained_gpt_name[int(version[-1])-1]}, \
|
||||
{'__type__': 'update', 'value': pretrained_gpt_name[int(version[-1])-1]}, \
|
||||
{'__type__': 'update', 'value': pretrained_sovits_name[int(version[-1])-1]}, \
|
||||
{'__type__': 'update', "value": default_batch_size, "maximum": default_max_batch_size}, \
|
||||
{'__type__': 'update', "value": default_sovits_epoch, "maximum": max_sovits_epoch}, \
|
||||
{'__type__': 'update', "value": default_sovits_save_every_epoch,"maximum": max_sovits_save_every_epoch}, \
|
||||
{'__type__': 'update', "visible": True if version!="v3"else False}, \
|
||||
{'__type__': 'update', "value": False if not if_force_ckpt else True, "interactive": True if not if_force_ckpt else False}, \
|
||||
{'__type__': 'update', "interactive": False if version == "v3" else True, "value": False}, \
|
||||
{'__type__': 'update', "visible": True if version== "v3" else False}
|
||||
|
||||
if os.path.exists('GPT_SoVITS/text/G2PWModel'):...
|
||||
else:
|
||||
@ -792,27 +859,29 @@ else:
|
||||
p.wait()
|
||||
|
||||
def sync(text):
|
||||
return {'__type__':'update','value':text}
|
||||
return {'__type__': 'update', 'value': text}
|
||||
|
||||
with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
gr.Markdown(
|
||||
value=
|
||||
i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.")
|
||||
i18n("本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.") + "<br>" + i18n("如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.")
|
||||
)
|
||||
gr.Markdown(
|
||||
value=
|
||||
i18n("中文教程文档:https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e")
|
||||
i18n("中文教程文档") + ": " + "https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e"
|
||||
)
|
||||
|
||||
with gr.Tabs():
|
||||
with gr.TabItem(i18n("0-前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标
|
||||
gr.Markdown(value=i18n("0a-UVR5人声伴奏分离&去混响去延迟工具"))
|
||||
with gr.TabItem("0-"+i18n("前置数据集获取工具")):#提前随机切片防止uvr5爆内存->uvr5->slicer->asr->打标
|
||||
gr.Markdown(value="0a-"+i18n("UVR5人声伴奏分离&去混响去延迟工具"))
|
||||
with gr.Row():
|
||||
with gr.Column(scale=3):
|
||||
with gr.Row():
|
||||
uvr5_info = gr.Textbox(label=i18n("UVR5进程输出信息"))
|
||||
open_uvr5 = gr.Button(value=i18n("开启UVR5-WebUI"),variant="primary",visible=True)
|
||||
close_uvr5 = gr.Button(value=i18n("关闭UVR5-WebUI"),variant="primary",visible=False)
|
||||
gr.Markdown(value=i18n("0b-语音切分工具"))
|
||||
uvr5_info = gr.Textbox(label=process_info(process_name_uvr5, "info"))
|
||||
open_uvr5 = gr.Button(value=process_info(process_name_uvr5, "open"),variant="primary",visible=True)
|
||||
close_uvr5 = gr.Button(value=process_info(process_name_uvr5, "close"),variant="primary",visible=False)
|
||||
|
||||
gr.Markdown(value="0b-"+i18n("语音切分工具"))
|
||||
with gr.Row():
|
||||
with gr.Column(scale=3):
|
||||
with gr.Row():
|
||||
@ -829,69 +898,41 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True)
|
||||
with gr.Row():
|
||||
n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True)
|
||||
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-语音降噪工具"))
|
||||
slicer_info = gr.Textbox(label=process_info(process_name_slice, "info"))
|
||||
open_slicer_button = gr.Button(value=process_info(process_name_slice, "open"),variant="primary",visible=True)
|
||||
close_slicer_button = gr.Button(value=process_info(process_name_slice, "close"),variant="primary",visible=False)
|
||||
|
||||
gr.Markdown(value="0bb-"+i18n("语音降噪工具"))
|
||||
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")
|
||||
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)
|
||||
close_denoise_button = gr.Button(i18n("终止语音降噪进程"), variant="primary",visible=False)
|
||||
gr.Markdown(value=i18n("0c-中文批量离线ASR工具"))
|
||||
denoise_info = gr.Textbox(label=process_info(process_name_denoise, "info"))
|
||||
open_denoise_button = gr.Button(value=process_info(process_name_denoise, "open"),variant="primary",visible=True)
|
||||
close_denoise_button = gr.Button(value=process_info(process_name_denoise, "close"),variant="primary",visible=False)
|
||||
|
||||
gr.Markdown(value="0c-"+i18n("语音识别工具"))
|
||||
with gr.Row():
|
||||
with gr.Column(scale=3):
|
||||
with gr.Row():
|
||||
asr_inp_dir = gr.Textbox(
|
||||
label=i18n("输入文件夹路径"),
|
||||
value="D:\\GPT-SoVITS\\raw\\xxx",
|
||||
interactive=True,
|
||||
)
|
||||
asr_opt_dir = gr.Textbox(
|
||||
label = i18n("输出文件夹路径"),
|
||||
value = "output/asr_opt",
|
||||
interactive = True,
|
||||
)
|
||||
asr_inp_dir = gr.Textbox(label=i18n("输入文件夹路径"), value="D:\\GPT-SoVITS\\raw\\xxx", interactive=True)
|
||||
asr_opt_dir = gr.Textbox(label=i18n("输出文件夹路径"), value="output/asr_opt", interactive=True)
|
||||
with gr.Row():
|
||||
asr_model = gr.Dropdown(
|
||||
label = i18n("ASR 模型"),
|
||||
choices = list(asr_dict.keys()),
|
||||
interactive = True,
|
||||
value="达摩 ASR (中文)"
|
||||
)
|
||||
asr_size = gr.Dropdown(
|
||||
label = i18n("ASR 模型尺寸"),
|
||||
choices = ["large"],
|
||||
interactive = True,
|
||||
value="large"
|
||||
)
|
||||
asr_lang = gr.Dropdown(
|
||||
label = i18n("ASR 语言设置"),
|
||||
choices = ["zh","yue"],
|
||||
interactive = True,
|
||||
value="zh"
|
||||
)
|
||||
asr_precision = gr.Dropdown(
|
||||
label = i18n("数据类型精度"),
|
||||
choices = ["float32"],
|
||||
interactive = True,
|
||||
value="float32"
|
||||
)
|
||||
asr_model = gr.Dropdown(label=i18n("ASR 模型"), choices=list(asr_dict.keys()), interactive=True, value="达摩 ASR (中文)")
|
||||
asr_size = gr.Dropdown(label=i18n("ASR 模型尺寸"), choices=["large"], interactive=True, value="large")
|
||||
asr_lang = gr.Dropdown(label=i18n("ASR 语言设置"), choices=["zh","yue"], interactive=True, value="zh")
|
||||
asr_precision = gr.Dropdown(label=i18n("数据类型精度"), choices=["float32"], interactive=True, value="float32")
|
||||
with gr.Row():
|
||||
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)
|
||||
asr_info = gr.Textbox(label=process_info(process_name_asr, "info"))
|
||||
open_asr_button = gr.Button(value=process_info(process_name_asr, "open"),variant="primary",visible=True)
|
||||
close_asr_button = gr.Button(value=process_info(process_name_asr, "close"),variant="primary",visible=False)
|
||||
|
||||
def change_lang_choices(key): #根据选择的模型修改可选的语言
|
||||
# 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): # 根据选择的模型修改可选的模型尺寸
|
||||
# return gr.Dropdown(choices=asr_dict[key]['size'])
|
||||
return {"__type__": "update", "choices": asr_dict[key]['size'],"value":asr_dict[key]['size'][-1]}
|
||||
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:
|
||||
@ -902,26 +943,20 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
precision = 'float32'
|
||||
else:
|
||||
precision = 'float32'
|
||||
# return gr.Dropdown(choices=asr_dict[key]['precision'])
|
||||
return {"__type__": "update", "choices": asr_dict[key]['precision'],"value":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_size_choices, [asr_model], [asr_size])
|
||||
asr_model.change(change_precision_choices, [asr_model], [asr_precision])
|
||||
|
||||
|
||||
gr.Markdown(value=i18n("0d-语音文本校对标注工具"))
|
||||
gr.Markdown(value="0d-"+i18n("语音文本校对标注工具"))
|
||||
with gr.Row():
|
||||
with gr.Column(scale=3):
|
||||
with gr.Row():
|
||||
path_list = gr.Textbox(
|
||||
label=i18n(".list标注文件的路径"),
|
||||
value="D:\\RVC1006\\GPT-SoVITS\\raw\\xxx.list",
|
||||
interactive=True,
|
||||
)
|
||||
label_info = gr.Textbox(label=i18n("打标工具进程输出信息"))
|
||||
path_list = gr.Textbox(label=i18n("标注文件路径 (含文件后缀 *.list)"), value="D:\\RVC1006\\GPT-SoVITS\\raw\\xxx.list", interactive=True)
|
||||
label_info = gr.Textbox(label=process_info(process_name_subfix, "info"))
|
||||
open_label = gr.Button(value=process_info(process_name_subfix, "open"),variant="primary",visible=True)
|
||||
close_label = gr.Button(value=process_info(process_name_subfix, "close"),variant="primary",visible=False)
|
||||
|
||||
open_label = gr.Button(value=i18n("开启打标WebUI"),variant="primary",visible=True)
|
||||
close_label = gr.Button(value=i18n("关闭打标WebUI"),variant="primary",visible=False)
|
||||
open_label.click(change_label, [path_list], [label_info,open_label,close_label])
|
||||
close_label.click(change_label, [path_list], [label_info,open_label,close_label])
|
||||
open_uvr5.click(change_uvr5, [], [uvr5_info,open_uvr5,close_uvr5])
|
||||
@ -934,10 +969,11 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
gpu_info = gr.Textbox(label=i18n("显卡信息"), value=gpu_info, visible=True, interactive=False)
|
||||
version_checkbox = gr.Radio(label=i18n("版本"),value=version,choices=['v1','v2','v3'])
|
||||
with gr.Row():
|
||||
pretrained_s2G = gr.Textbox(label=i18n("预训练的SoVITS-G模型路径"), value=pretrained_sovits_name[int(version[-1])-1], interactive=True, lines=2, max_lines=3,scale=9)
|
||||
pretrained_s2D = gr.Textbox(label=i18n("预训练的SoVITS-D模型路径"), value=pretrained_sovits_name[int(version[-1])-1].replace("s2G","s2D"), interactive=True, lines=2, max_lines=3,scale=9)
|
||||
pretrained_s1 = gr.Textbox(label=i18n("预训练的GPT模型路径"), value=pretrained_gpt_name[int(version[-1])-1], interactive=True, lines=2, max_lines=3,scale=10)
|
||||
with gr.TabItem(i18n("1A-训练集格式化工具")):
|
||||
pretrained_s2G = gr.Textbox(label=i18n("预训练SoVITS-G模型路径"), value=pretrained_sovits_name[int(version[-1])-1], interactive=True, lines=2, max_lines=3,scale=9)
|
||||
pretrained_s2D = gr.Textbox(label=i18n("预训练SoVITS-D模型路径"), value=pretrained_sovits_name[int(version[-1])-1].replace("s2G","s2D"), interactive=True, lines=2, max_lines=3,scale=9)
|
||||
pretrained_s1 = gr.Textbox(label=i18n("预训练GPT模型路径"), value=pretrained_gpt_name[int(version[-1])-1], interactive=True, lines=2, max_lines=3,scale=10)
|
||||
|
||||
with gr.TabItem("1A-"+i18n("训练集格式化工具")):
|
||||
gr.Markdown(value=i18n("输出logs/实验名目录下应有23456开头的文件和文件夹"))
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
@ -949,46 +985,50 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
interactive=True,
|
||||
placeholder=i18n("填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。如果留空则使用.list文件里的绝对全路径。"), scale=10
|
||||
)
|
||||
gr.Markdown(value=i18n("1Aa-文本内容"))
|
||||
|
||||
gr.Markdown(value="1Aa-"+process_name_1a)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
gpu_numbers1a = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True)
|
||||
with gr.Row():
|
||||
bert_pretrained_dir = gr.Textbox(label=i18n("预训练的中文BERT模型路径"),value="GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large",interactive=False,lines=2)
|
||||
bert_pretrained_dir = gr.Textbox(label=i18n("预训练中文BERT模型路径"),value="GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large",interactive=False,lines=2)
|
||||
with gr.Row():
|
||||
button1a_open = gr.Button(i18n("开启文本获取"), variant="primary",visible=True)
|
||||
button1a_close = gr.Button(i18n("终止文本获取进程"), variant="primary",visible=False)
|
||||
button1a_open = gr.Button(value=process_info(process_name_1a, "open"),variant="primary",visible=True)
|
||||
button1a_close = gr.Button(value=process_info(process_name_1a, "close"),variant="primary",visible=False)
|
||||
with gr.Row():
|
||||
info1a=gr.Textbox(label=i18n("文本进程输出信息"))
|
||||
gr.Markdown(value=i18n("1Ab-SSL自监督特征提取"))
|
||||
info1a=gr.Textbox(label=process_info(process_name_1a, "info"))
|
||||
|
||||
gr.Markdown(value="1Ab-"+process_name_1b)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
gpu_numbers1Ba = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True)
|
||||
with gr.Row():
|
||||
cnhubert_base_dir = gr.Textbox(label=i18n("预训练的SSL模型路径"),value="GPT_SoVITS/pretrained_models/chinese-hubert-base",interactive=False,lines=2)
|
||||
cnhubert_base_dir = gr.Textbox(label=i18n("预训练SSL模型路径"),value="GPT_SoVITS/pretrained_models/chinese-hubert-base",interactive=False,lines=2)
|
||||
with gr.Row():
|
||||
button1b_open = gr.Button(i18n("开启SSL提取"), variant="primary",visible=True)
|
||||
button1b_close = gr.Button(i18n("终止SSL提取进程"), variant="primary",visible=False)
|
||||
button1b_open = gr.Button(value=process_info(process_name_1b, "open"),variant="primary",visible=True)
|
||||
button1b_close = gr.Button(value=process_info(process_name_1b, "close"),variant="primary",visible=False)
|
||||
with gr.Row():
|
||||
info1b=gr.Textbox(label=i18n("SSL进程输出信息"))
|
||||
gr.Markdown(value=i18n("1Ac-语义token提取"))
|
||||
info1b=gr.Textbox(label=process_info(process_name_1b, "info"))
|
||||
|
||||
gr.Markdown(value="1Ac-"+process_name_1c)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
gpu_numbers1c = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"),value="%s-%s"%(gpus,gpus),interactive=True)
|
||||
with gr.Row():
|
||||
pretrained_s2G_ = gr.Textbox(label=i18n("预训练的SoVITS-G模型路径"), value=pretrained_sovits_name[int(version[-1])-1], interactive=False,lines=2)
|
||||
pretrained_s2G_ = gr.Textbox(label=i18n("预训练SoVITS-G模型路径"), value=pretrained_sovits_name[int(version[-1])-1], interactive=False,lines=2)
|
||||
with gr.Row():
|
||||
button1c_open = gr.Button(i18n("开启语义token提取"), variant="primary",visible=True)
|
||||
button1c_close = gr.Button(i18n("终止语义token提取进程"), variant="primary",visible=False)
|
||||
button1c_open = gr.Button(value=process_info(process_name_1c, "open"),variant="primary",visible=True)
|
||||
button1c_close = gr.Button(value=process_info(process_name_1c, "close"),variant="primary",visible=False)
|
||||
with gr.Row():
|
||||
info1c=gr.Textbox(label=i18n("语义token提取进程输出信息"))
|
||||
gr.Markdown(value=i18n("1Aabc-训练集格式化一键三连"))
|
||||
info1c=gr.Textbox(label=process_info(process_name_1c, "info"))
|
||||
|
||||
gr.Markdown(value="1Aabc-"+process_name_1abc)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
button1abc_open = gr.Button(i18n("开启一键三连"), variant="primary",visible=True)
|
||||
button1abc_close = gr.Button(i18n("终止一键三连"), variant="primary",visible=False)
|
||||
button1abc_open = gr.Button(value=process_info(process_name_1abc, "open"),variant="primary",visible=True)
|
||||
button1abc_close = gr.Button(value=process_info(process_name_1abc, "close"),variant="primary",visible=False)
|
||||
with gr.Row():
|
||||
info1abc=gr.Textbox(label=i18n("一键三连进程输出信息"))
|
||||
info1abc=gr.Textbox(label=process_info(process_name_1abc, "info"))
|
||||
|
||||
pretrained_s2G.change(sync,[pretrained_s2G],[pretrained_s2G_])
|
||||
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])
|
||||
@ -997,7 +1037,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
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_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])
|
||||
@ -1006,60 +1046,64 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
button1c_close.click(close1c, [], [info1c,button1c_open,button1c_close])
|
||||
button1abc_open.click(open1abc, [inp_text,inp_wav_dir,exp_name,gpu_numbers1a,gpu_numbers1Ba,gpu_numbers1c,bert_pretrained_dir,cnhubert_base_dir,pretrained_s2G], [info1abc,button1abc_open,button1abc_close])
|
||||
button1abc_close.click(close1abc, [], [info1abc,button1abc_open,button1abc_close])
|
||||
with gr.TabItem(i18n("1B-微调训练")):
|
||||
gr.Markdown(value=i18n("1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。"))
|
||||
|
||||
with gr.TabItem("1B-"+i18n("微调训练")):
|
||||
gr.Markdown(value="1Ba-"+i18n("SoVITS 训练: 模型权重文件在 SoVITS_weights/"))
|
||||
with gr.Row():
|
||||
with gr.Column():
|
||||
with gr.Row():
|
||||
batch_size = gr.Slider(minimum=1,maximum=default_max_batch_size,step=1,label=i18n("每张显卡的batch_size"),value=default_batch_size,interactive=True)
|
||||
total_epoch = gr.Slider(minimum=1,maximum=max_sovits_epoch,step=1,label=i18n("总训练轮数total_epoch,不建议太高"),value=default_sovits_epoch,interactive=True)
|
||||
with gr.Row():
|
||||
text_low_lr_rate = gr.Slider(minimum=0.2,maximum=0.6,step=0.05,label=i18n("文本模块学习率权重"),value=0.4,interactive=True if version!="v3"else False)#v3 not need
|
||||
text_low_lr_rate = gr.Slider(minimum=0.2,maximum=0.6,step=0.05,label=i18n("文本模块学习率权重"),value=0.4,visible=True if version!="v3"else False)#v3 not need
|
||||
lora_rank = gr.Radio(label=i18n("LoRA秩"), value="32", choices=['16', '32', '64', '128'],visible=True if version=="v3"else False)#v1v2 not need
|
||||
save_every_epoch = gr.Slider(minimum=1,maximum=max_sovits_save_every_epoch,step=1,label=i18n("保存频率save_every_epoch"),value=default_sovits_save_every_epoch,interactive=True)
|
||||
with gr.Column():
|
||||
with gr.Column():
|
||||
if_save_latest = gr.Checkbox(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), value=True, interactive=True, show_label=True)
|
||||
with gr.Column():
|
||||
with gr.Column():
|
||||
if_save_latest = gr.Checkbox(label=i18n("是否仅保存最新的权重文件以节省硬盘空间"), value=True, interactive=True, show_label=True)
|
||||
if_save_every_weights = gr.Checkbox(label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), value=True, interactive=True, show_label=True)
|
||||
if_grad_ckpt = gr.Checkbox(label="v3是否开启梯度检查点节省显存占用", value=False, interactive=True if version == "v3" else False, show_label=True) # 只有V3s2可以用
|
||||
if_grad_ckpt = gr.Checkbox(label="v3是否开启梯度检查点节省显存占用", value=False, interactive=True if version == "v3" else False, show_label=True,visible=False) # 只有V3s2可以用
|
||||
with gr.Row():
|
||||
gpu_numbers1Ba = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"), value="%s" % (gpus), interactive=True)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
button1Ba_open = gr.Button(i18n("开启SoVITS训练"), variant="primary",visible=True)
|
||||
button1Ba_close = gr.Button(i18n("终止SoVITS训练"), variant="primary",visible=False)
|
||||
button1Ba_open = gr.Button(value=process_info(process_name_sovits, "open"),variant="primary",visible=True)
|
||||
button1Ba_close = gr.Button(value=process_info(process_name_sovits, "close"),variant="primary",visible=False)
|
||||
with gr.Row():
|
||||
info1Ba=gr.Textbox(label=i18n("SoVITS训练进程输出信息"))
|
||||
gr.Markdown(value=i18n("1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。"))
|
||||
info1Ba=gr.Textbox(label=process_info(process_name_sovits, "info"))
|
||||
gr.Markdown(value="1Bb-"+i18n("GPT 训练: 模型权重文件在 GPT_weights/"))
|
||||
with gr.Row():
|
||||
with gr.Column():
|
||||
with gr.Row():
|
||||
batch_size1Bb = gr.Slider(minimum=1,maximum=40,step=1,label=i18n("每张显卡的batch_size"),value=default_batch_size_s1,interactive=True)
|
||||
total_epoch1Bb = gr.Slider(minimum=2,maximum=50,step=1,label=i18n("总训练轮数total_epoch"),value=15,interactive=True)
|
||||
with gr.Row():
|
||||
save_every_epoch1Bb = gr.Slider(minimum=1,maximum=50,step=1,label=i18n("保存频率save_every_epoch"),value=5,interactive=True)
|
||||
if_dpo = gr.Checkbox(label=i18n("是否开启dpo训练选项(实验性)"), value=False, interactive=True, show_label=True)
|
||||
save_every_epoch1Bb = gr.Slider(minimum=1,maximum=50,step=1,label=i18n("保存频率save_every_epoch"),value=5,interactive=True)
|
||||
if_dpo = gr.Checkbox(label=i18n("是否开启DPO训练选项(实验性)"), value=False, interactive=True, show_label=True)
|
||||
with gr.Column():
|
||||
with gr.Column():
|
||||
if_save_latest1Bb = gr.Checkbox(label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"), value=True, interactive=True, show_label=True)
|
||||
if_save_latest1Bb = gr.Checkbox(label=i18n("是否仅保存最新的权重文件以节省硬盘空间"), value=True, interactive=True, show_label=True)
|
||||
if_save_every_weights1Bb = gr.Checkbox(label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), value=True, interactive=True, show_label=True)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
gpu_numbers1Bb = gr.Textbox(label=i18n("GPU卡号以-分割,每个卡号一个进程"), value="%s" % (gpus), interactive=True)
|
||||
with gr.Row():
|
||||
with gr.Row():
|
||||
button1Bb_open = gr.Button(i18n("开启GPT训练"), variant="primary",visible=True)
|
||||
button1Bb_close = gr.Button(i18n("终止GPT训练"), variant="primary",visible=False)
|
||||
button1Bb_open = gr.Button(value=process_info(process_name_gpt, "open"),variant="primary",visible=True)
|
||||
button1Bb_close = gr.Button(value=process_info(process_name_gpt, "close"),variant="primary",visible=False)
|
||||
with gr.Row():
|
||||
info1Bb=gr.Textbox(label=i18n("GPT训练进程输出信息"))
|
||||
button1Ba_open.click(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,if_grad_ckpt], [info1Ba,button1Ba_open,button1Ba_close])
|
||||
info1Bb=gr.Textbox(label=process_info(process_name_gpt, "info"))
|
||||
|
||||
button1Ba_open.click(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,if_grad_ckpt,lora_rank], [info1Ba,button1Ba_open,button1Ba_close])
|
||||
button1Ba_close.click(close1Ba, [], [info1Ba,button1Ba_open,button1Ba_close])
|
||||
button1Bb_open.click(open1Bb, [batch_size1Bb,total_epoch1Bb,exp_name,if_dpo,if_save_latest1Bb,if_save_every_weights1Bb,save_every_epoch1Bb,gpu_numbers1Bb,pretrained_s1], [info1Bb,button1Bb_open,button1Bb_close])
|
||||
button1Bb_close.click(close1Bb, [], [info1Bb,button1Bb_open,button1Bb_close])
|
||||
with gr.TabItem(i18n("1C-推理")):
|
||||
|
||||
with gr.TabItem("1C-"+i18n("推理")):
|
||||
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[0],interactive=True)
|
||||
SoVITS_dropdown = gr.Dropdown(label=i18n("*SoVITS模型列表"), choices=sorted(SoVITS_names,key=custom_sort_key),value=pretrained_sovits_name[0],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[0],interactive=True)
|
||||
with gr.Row():
|
||||
gpu_number_1C=gr.Textbox(label=i18n("GPU卡号,只能填1个整数"), value=gpus, interactive=True)
|
||||
refresh_button = gr.Button(i18n("刷新模型路径"), variant="primary")
|
||||
@ -1068,14 +1112,17 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
||||
with gr.Row():
|
||||
batched_infer_enabled = gr.Checkbox(label=i18n("启用并行推理版本"), value=False, interactive=True, show_label=True)
|
||||
with gr.Row():
|
||||
open_tts = gr.Button(value=i18n("开启TTS推理WebUI"),variant='primary',visible=True)
|
||||
close_tts = gr.Button(value=i18n("关闭TTS推理WebUI"),variant='primary',visible=False)
|
||||
open_tts = gr.Button(value=process_info(process_name_tts, "open"),variant='primary',visible=True)
|
||||
close_tts = gr.Button(value=process_info(process_name_tts, "close"),variant='primary',visible=False)
|
||||
with gr.Row():
|
||||
tts_info = gr.Textbox(label=i18n("TTS推理WebUI进程输出信息"))
|
||||
tts_info = gr.Textbox(label=process_info(process_name_tts, "info"))
|
||||
open_tts.click(change_tts_inference, [bert_pretrained_dir,cnhubert_base_dir,gpu_number_1C,GPT_dropdown,SoVITS_dropdown, batched_infer_enabled], [tts_info,open_tts,close_tts])
|
||||
close_tts.click(change_tts_inference, [bert_pretrained_dir,cnhubert_base_dir,gpu_number_1C,GPT_dropdown,SoVITS_dropdown, batched_infer_enabled], [tts_info,open_tts,close_tts])
|
||||
version_checkbox.change(switch_version,[version_checkbox],[pretrained_s2G,pretrained_s2D,pretrained_s1,GPT_dropdown,SoVITS_dropdown,batch_size,total_epoch,save_every_epoch,text_low_lr_rate, if_grad_ckpt, batched_infer_enabled])
|
||||
|
||||
version_checkbox.change(switch_version,[version_checkbox],[pretrained_s2G,pretrained_s2D,pretrained_s1,GPT_dropdown,SoVITS_dropdown,batch_size,total_epoch,save_every_epoch,text_low_lr_rate, if_grad_ckpt, batched_infer_enabled, lora_rank])
|
||||
|
||||
with gr.TabItem(i18n("2-GPT-SoVITS-变声")):gr.Markdown(value=i18n("施工中,请静候佳音"))
|
||||
|
||||
app.queue().launch(#concurrency_count=511, max_size=1022
|
||||
server_name="0.0.0.0",
|
||||
inbrowser=True,
|
||||
|
Loading…
x
Reference in New Issue
Block a user