import time import matplotlib.pyplot as plt import IPython.display as ipd import re import os import json import math import torch from torch import nn from torch.nn import functional as F from torch.utils.data import DataLoader import gradio as gr import commons import utils from data_utils import TextAudioLoader, TextAudioCollate, TextAudioSpeakerLoader, TextAudioSpeakerCollate from models import SynthesizerTrn from text.symbols import symbols from text import text_to_sequence import unicodedata from scipy.io.wavfile import write import openai def get_text(text, hps): text_norm = text_to_sequence(text, hps.data.text_cleaners) if hps.data.add_blank: text_norm = commons.intersperse(text_norm, 0) text_norm = torch.LongTensor(text_norm) return text_norm def get_label(text, label): if f'[{label}]' in text: return True, text.replace(f'[{label}]', '') else: return False, text def selection(speaker): if speaker == "高咲侑(误)": spk = 0 return spk elif speaker == "歩夢": spk = 1 return spk elif speaker == "かすみ": spk = 2 return spk elif speaker == "しずく": spk = 3 return spk elif speaker == "果林": spk = 4 return spk elif speaker == "愛": spk = 5 return spk elif speaker == "彼方": spk = 6 return spk elif speaker == "せつ菜": spk = 7 return spk elif speaker == "エマ": spk = 8 return spk elif speaker == "璃奈": spk = 9 return spk elif speaker == "栞子": spk = 10 return spk elif speaker == "ランジュ": spk = 11 return spk elif speaker == "ミア": spk = 12 return spk elif speaker == "三色绘恋1": spk = 13 return spk elif speaker == "三色绘恋2": spk = 15 return spk elif speaker == "派蒙": spk = 16 return spk def friend_chat(text,key,call_name,tts_input3): call_name = call_name openai.api_key = key identity = tts_input3 start_sequence = '\n'+str(call_name)+':' restart_sequence = "\nYou: " all_text = identity + restart_sequence if 1 == 1: prompt0 = text #当期prompt if text == 'quit': return prompt0 prompt = identity + prompt0 + start_sequence response = openai.Completion.create( model="text-davinci-003", prompt=prompt, temperature=0.5, max_tokens=1000, top_p=1.0, frequency_penalty=0.5, presence_penalty=0.0, stop=["\nYou:"] ) return response['choices'][0]['text'].strip() def is_japanese(string): for ch in string: if ord(ch) > 0x3040 and ord(ch) < 0x30FF: return True return False def sle(language,text,tts_input2,call_name,tts_input3): if language == "中文": tts_input1 = "[ZH]" + text.replace('\n','。').replace(' ',',') + "[ZH]" return tts_input1 if language == "对话": text = friend_chat(text,tts_input2,call_name,tts_input3).replace('\n','。').replace(' ',',') text = f"[JA]{text}[JA]" if is_japanese(text) else f"[ZH]{text}[ZH]" return text elif language == "日文": tts_input1 = "[JA]" + text.replace('\n','。').replace(' ',',') + "[JA]" return tts_input1 def infer(language,text,tts_input2,tts_input3,speaker_id,n_scale= 0.667,n_scale_w = 0.8, l_scale = 1 ): speaker_name = speaker_id speaker_id = int(selection(speaker_id)) stn_tst = get_text(sle(language,text,tts_input2,speaker_name,tts_input3), hps_ms) with torch.no_grad(): x_tst = stn_tst.unsqueeze(0).to(dev) x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).to(dev) sid = torch.LongTensor([speaker_id]).to(dev) t1 = time.time() audio = net_g_ms.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=n_scale, noise_scale_w=n_scale_w, length_scale=l_scale)[0][0,0].data.cpu().float().numpy() t2 = time.time() spending_time = "推理时间:"+str(t2-t1)+"s" print(spending_time) return (hps_ms.data.sampling_rate, audio) lan = ["中文","日文","对话"] idols = ["高咲侑(误)","歩夢","かすみ","しずく","果林","愛","彼方","せつ菜","璃奈","栞子","エマ","ランジュ","ミア","三色绘恋1","三色绘恋2","派蒙"] dev = torch.device("cpu") hps_ms = utils.get_hparams_from_file("config.json") net_g_ms = SynthesizerTrn( len(symbols), hps_ms.data.filter_length // 2 + 1, hps_ms.train.segment_size // hps_ms.data.hop_length, n_speakers=hps_ms.data.n_speakers, **hps_ms.model).to(dev) _ = net_g_ms.eval() _ = utils.load_checkpoint("G_20000.pth", net_g_ms, None) app = gr.Blocks() with app: with gr.Tabs(): with gr.TabItem("Basic"): tts_input1 = gr.TextArea(label="输入你的文本,支持vits版在另一个仓库", value="一次審査、二次審査、それぞれの欄に記入をお願いします。") tts_input2 = gr.TextArea(label="如需使用openai,输入你的openai-key", value="官网") tts_input3 = gr.TextArea(label="写上你给她的设定", value="恶魔系学妹。") language = gr.Dropdown(label="选择合成方式",choices=lan, value="对话", interactive=True) para_input1 = gr.Slider(minimum= 0.01,maximum=1.0,label="更改噪声比例", value=0.667) para_input2 = gr.Slider(minimum= 0.01,maximum=1.0,label="更改噪声偏差", value=0.8) para_input3 = gr.Slider(minimum= 0.1,maximum=10,label="更改时间比例", value=0.6) tts_submit = gr.Button("Generate", variant="primary") speaker1 = gr.Dropdown(label="选择说话人",choices=idols, value="かすみ", interactive=True) tts_output2 = gr.Audio(label="Output") tts_submit.click(infer, [language,tts_input1,tts_input2,tts_input3,speaker1,para_input1,para_input2,para_input3], [tts_output2]) #app.launch(share=True) app.launch()