File size: 6,113 Bytes
9daa37d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3efe616
4011fcb
9daa37d
 
 
 
 
 
 
 
 
 
 
 
 
 
79fddf7
9daa37d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79fddf7
9daa37d
 
 
3008ff2
3efe616
 
3008ff2
3efe616
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9daa37d
3efe616
9daa37d
3efe616
 
 
 
9daa37d
3efe616
9daa37d
3efe616
 
9daa37d
3efe616
9daa37d
 
 
 
 
 
 
 
 
 
3efe616
4011fcb
9daa37d
 
3ad53be
 
9daa37d
 
 
 
 
 
 
 
3ad53be
7c2766f
 
 
9daa37d
 
 
 
 
4cd9e8f
3efe616
 
289f620
9daa37d
 
 
 
 
 
3efe616
9daa37d
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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_1415000.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=1)
            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()