|
|
@ -324,26 +324,28 @@ def get_first(text):
|
|
|
|
return text
|
|
|
|
return text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_cleaned_text_fianl(text,language):
|
|
|
|
def get_cleaned_text_final(text,language):
|
|
|
|
if language in {"en","all_zh","all_ja"}:
|
|
|
|
if language in {"en","all_zh","all_ja"}:
|
|
|
|
phones, word2ph, norm_text = clean_text_inf(text, language)
|
|
|
|
phones, word2ph, norm_text = clean_text_inf(text, language)
|
|
|
|
elif language in {"zh", "ja","auto"}:
|
|
|
|
elif language in {"zh", "ja","auto"}:
|
|
|
|
phones, word2ph, norm_text = nonen_clean_text_inf(text, language)
|
|
|
|
phones, word2ph, norm_text = nonen_clean_text_inf(text, language)
|
|
|
|
return phones, word2ph, norm_text
|
|
|
|
return phones, word2ph, norm_text
|
|
|
|
|
|
|
|
|
|
|
|
def get_bert_final(phones, word2ph, norm_text,language,device):
|
|
|
|
def get_bert_final(phones, word2ph, text,language,device):
|
|
|
|
if text_language == "en":
|
|
|
|
if language == "en":
|
|
|
|
bert = get_bert_inf(phones, word2ph, norm_text, text_language)
|
|
|
|
bert = get_bert_inf(phones, word2ph, text, language)
|
|
|
|
elif text_language in {"zh", "ja","auto"}:
|
|
|
|
elif language in {"zh", "ja","auto"}:
|
|
|
|
bert = nonen_get_bert_inf(text, text_language)
|
|
|
|
bert = nonen_get_bert_inf(text, language)
|
|
|
|
elif text_language == "all_zh":
|
|
|
|
elif language == "all_zh":
|
|
|
|
bert = get_bert_feature(norm_text, word2ph).to(device)
|
|
|
|
bert = get_bert_feature(text, word2ph).to(device)
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
bert = torch.zeros((1024, len(phones))).to(device)
|
|
|
|
bert = torch.zeros((1024, len(phones))).to(device)
|
|
|
|
return bert
|
|
|
|
return bert
|
|
|
|
|
|
|
|
|
|
|
|
def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language, how_to_cut=i18n("不切")):
|
|
|
|
def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language, how_to_cut=i18n("不切")):
|
|
|
|
t0 = ttime()
|
|
|
|
t0 = ttime()
|
|
|
|
|
|
|
|
prompt_language = dict_language[prompt_language]
|
|
|
|
|
|
|
|
text_language = dict_language[text_language]
|
|
|
|
prompt_text = prompt_text.strip("\n")
|
|
|
|
prompt_text = prompt_text.strip("\n")
|
|
|
|
if (prompt_text[-1] not in splits): prompt_text += "。" if prompt_language != "en" else "."
|
|
|
|
if (prompt_text[-1] not in splits): prompt_text += "。" if prompt_language != "en" else "."
|
|
|
|
text = text.strip("\n")
|
|
|
|
text = text.strip("\n")
|
|
|
@ -375,10 +377,8 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
|
|
|
codes = vq_model.extract_latent(ssl_content)
|
|
|
|
codes = vq_model.extract_latent(ssl_content)
|
|
|
|
prompt_semantic = codes[0, 0]
|
|
|
|
prompt_semantic = codes[0, 0]
|
|
|
|
t1 = ttime()
|
|
|
|
t1 = ttime()
|
|
|
|
prompt_language = dict_language[prompt_language]
|
|
|
|
|
|
|
|
text_language = dict_language[text_language]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
phones1, word2ph1, norm_text1=get_cleaned_text_fianl(prompt_text, prompt_language)
|
|
|
|
phones1, word2ph1, norm_text1=get_cleaned_text_final(prompt_text, prompt_language)
|
|
|
|
|
|
|
|
|
|
|
|
if (how_to_cut == i18n("凑四句一切")):
|
|
|
|
if (how_to_cut == i18n("凑四句一切")):
|
|
|
|
text = cut1(text)
|
|
|
|
text = cut1(text)
|
|
|
@ -402,9 +402,8 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
if (text[-1] not in splits): text += "。" if text_language != "en" else "."
|
|
|
|
if (text[-1] not in splits): text += "。" if text_language != "en" else "."
|
|
|
|
print(i18n("实际输入的目标文本(每句):"), text)
|
|
|
|
print(i18n("实际输入的目标文本(每句):"), text)
|
|
|
|
phones2, word2ph2, norm_text2 = get_cleaned_text_fianl(text, text_language)
|
|
|
|
phones2, word2ph2, norm_text2 = get_cleaned_text_final(text, text_language)
|
|
|
|
bert2 = get_bert_final(phones2, word2ph2, norm_text2, text_language, device).to(dtype)
|
|
|
|
bert2 = get_bert_final(phones2, word2ph2, norm_text2, text_language, device).to(dtype)
|
|
|
|
|
|
|
|
|
|
|
|
bert = torch.cat([bert1, bert2], 1)
|
|
|
|
bert = torch.cat([bert1, bert2], 1)
|
|
|
|
|
|
|
|
|
|
|
|
all_phoneme_ids = torch.LongTensor(phones1 + phones2).to(device).unsqueeze(0)
|
|
|
|
all_phoneme_ids = torch.LongTensor(phones1 + phones2).to(device).unsqueeze(0)
|
|
|
@ -583,7 +582,7 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
|
|
|
|
inp_ref = gr.Audio(label=i18n("请上传3~10秒内参考音频,超过会报错!"), type="filepath")
|
|
|
|
inp_ref = gr.Audio(label=i18n("请上传3~10秒内参考音频,超过会报错!"), type="filepath")
|
|
|
|
prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="")
|
|
|
|
prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="")
|
|
|
|
prompt_language = gr.Dropdown(
|
|
|
|
prompt_language = gr.Dropdown(
|
|
|
|
label=i18n("参考音频的语种"), choices=[i18n("中文"), i18n("英文"), i18n("日文")], value=i18n("中文")
|
|
|
|
label=i18n("参考音频的语种"), choices=[i18n("中文"), i18n("英文"), i18n("日文"), i18n("中英混合"), i18n("日英混合"), i18n("多语种混合")], value=i18n("中文")
|
|
|
|
)
|
|
|
|
)
|
|
|
|
gr.Markdown(value=i18n("*请填写需要合成的目标文本。中英混合选中文,日英混合选日文,中日混合暂不支持,非目标语言文本自动遗弃。"))
|
|
|
|
gr.Markdown(value=i18n("*请填写需要合成的目标文本。中英混合选中文,日英混合选日文,中日混合暂不支持,非目标语言文本自动遗弃。"))
|
|
|
|
with gr.Row():
|
|
|
|
with gr.Row():
|
|
|
|