EmoTTS-9nine / app.py
AriaMei
debug
1dc72bd
import gradio as gr
import torch
import commons
import utils
from models import SynthesizerTrn
from text.symbols import symbols
from text import text_to_sequence
import random
import os
import datetime
import numpy as np
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 tts(txt, emotion, index, hps, net_g, random_emotion_root):
"""emotion为参考情感音频路径 或random_sample(随机抽取)"""
stn_tst = get_text(txt, hps)
with torch.no_grad():
x_tst = stn_tst.unsqueeze(0)
x_tst_lengths = torch.LongTensor([stn_tst.size(0)])
sid = torch.LongTensor([index]) ##appoint character
if os.path.exists(f"{emotion}.emo.npy"):
emo = torch.FloatTensor(np.load(f"{emotion}.emo.npy")).unsqueeze(0)
elif emotion == "random_sample":
while True:
rand_wav = random.sample(os.listdir(random_emotion_root), 1)[0]
if os.path.exists(f"{random_emotion_root}/{rand_wav}"):
break
emo = torch.FloatTensor(np.load(f"{random_emotion_root}/{rand_wav}")).unsqueeze(0)
print(f"{random_emotion_root}/{rand_wav}")
else:
print("emotion参数不正确")
audio = \
net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=0.667, noise_scale_w=0.8, length_scale=1, emo=emo)[0][
0, 0].data.float().numpy()
return audio
def random_generate(txt, index, hps, net_g, random_emotion_root):
# count = 0
# path = "./TTSdemo/"
audio = tts(txt, emotion='random_sample', index=index, hps=hps, net_g=net_g,
random_emotion_root=random_emotion_root)
# curr_time = datetime.datetime.now()
# seed = str(curr_time.year) + str(curr_time.month) + str(curr_time.day) \
# + str(curr_time.hour) + str(curr_time.minute) + str(curr_time.second) + '_' + str(num)
# count += 1
return audio
def charaterRoot(name):
global random_emotion_root
if name == '九条都':
random_emotion_root = "./9nineEmo/my"
index = 0
elif name == '新海天':
random_emotion_root = "./9nineEmo/sr"
index = 1
elif name == '结城希亚':
random_emotion_root = "./9nineEmo/na"
index = 2
elif name == '蕾娜':
random_emotion_root = "./9nineEmo/gt"
index = 3
elif name == '索菲':
random_emotion_root = "./9nineEmo/sf"
index = 4
return random_emotion_root, index
def configSelect(config):
global checkPonit, config_file
if config == 'mul':
config_file = "./configs/9nine_multi.json"
checkPonit = "logs/9nineM/G_115600.pth"
elif config == "single":
config_file = "./configs/sora.json"
checkPonit = "logs/sora/G_341200.pth"
return config_file, checkPonit
def runVits(name, config, txt):
config_file, checkPoint = configSelect(config)
random_emotion_root, index = charaterRoot(name=name)
checkPonit = checkPoint
hps = utils.get_hparams_from_file(config_file)
net_g = SynthesizerTrn(
len(symbols),
hps.data.filter_length // 2 + 1,
hps.train.segment_size // hps.data.hop_length,
n_speakers=hps.data.n_speakers,
**hps.model)
_ = net_g.eval()
_ = utils.load_checkpoint(checkPonit, net_g, None)
audio = random_generate(txt=txt, index=index, random_emotion_root=random_emotion_root,
net_g=net_g, hps=hps)
return hps.data.sampling_rate,audio
# app = gr.Blocks()
# with app:
# with gr.Tabs():
# with gr.TabItem("9nine multiple model"):
# character = gr.Radio(['九条都', '新海天', '结城希亚', '蕾娜', '索菲'], label='character',
# info="select character you want")
# model = 'mul'
# text = gr.Textbox(label="input content", lines=4, visible=True)
#
# submit = gr.Button("generate", variant='privite')
# audio = gr.Audio(label="output")
# submit.click(runVits, [character, model, text], audio)
# with gr.TabItem("9nine single model"):
# character = gr.Radio(['九条都'], label='character',
# info="select character you want")
# model = 'single'
# text = gr.Textbox(label="input content", lines=4, visible=True),
#
# submit = gr.Button("generate", variant='privite')
# audio = gr.Audio(label="output")
# submit.click(runVits, [character, model, text], audio)
# app.launch(share=True)
if __name__ == '__main__':
demo = gr.Interface(
fn=runVits,
inputs=[
gr.Radio(['九条都', '新海天', '结城希亚', '蕾娜', '索菲'], label='character',
info="select character you want"),
gr.Radio(['mul'], label='configfile', info="select models(recent multiple model only)"),
gr.Textbox(label="input content", lines=4, visible=True),
], outputs=[
gr.Audio(label='output')
]
)
demo.launch(share=True)