Mahiruoshi's picture
Update app.py
d50814d
raw
history blame
5.92 kB
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: "
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(text,tts_input2,tts_input3,language, speaker_id,n_scale= 0.667,n_scale_w = 0.8, l_scale = 1):
speaker_name = speaker_id
speaker_id = int(selection(speaker_id))
text = sle(language,text,tts_input2,speaker_name,tts_input3)
response = text.replace("[ZH]","").replace("[JA]","")
stn_tst = get_text(text, 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 response,(hps_ms.data.sampling_rate, audio)
lan = ["中文","日文","对话"]
idols = ["高咲侑(误)","歩夢","かすみ","しずく","果林","愛","彼方","せつ菜","璃奈","栞子","エマ","ランジュ","ミア","派蒙"]
dev = torch.device("cuda:0" if torch.cuda.is_available() else "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_1415000.pth", net_g_ms, None)
inputs = [gr.TextArea(label="输入你的文本,支持vits版在另一个仓库", value="一次審査、二次審査、それぞれの欄に記入をお願いします。"),
gr.TextArea(label="如需使用openai,输入你的openai-key,合成方式选择对话", value="官网"),
gr.TextArea(label="写上你给她的设定", value=""),
gr.Dropdown(label="选择合成方式",choices=lan, value="日文", interactive=True),
gr.Dropdown(label="选择说话人",choices=idols, value="かすみ", interactive=True),
gr.Slider(minimum= 0.01,maximum=1.0,label="更改噪声比例", value=0.127),
gr.Slider(minimum= 0.01,maximum=1.0,label="更改噪声偏差", value=0.8),
gr.Slider(minimum= 0.1,maximum=10,label="更改时间比例", value=1)]
outputs=[ gr.Textbox(label="回复"),gr.Audio(type="numpy", label="Output audio")]
iface = gr.Interface(
fn=infer,
inputs=inputs,
outputs=outputs,
title="轻量化vits",
description="虹团12人模型",
)
iface.launch()