File size: 5,229 Bytes
c1a65c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e0e70e3
c1a65c6
 
 
a39c0bf
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
import utils
from models import SynthesizerTrn
import torch
from torch import no_grad, LongTensor
from text import text_to_sequence
import gradio as gr
import commons
import json
import os
import time
from openai import OpenAI

model_path = "./OUTPUT_MODEL/G_Amitaro.pth"
config_path = "./OUTPUT_MODEL/config.json"
sampling_rate = 22050

length = 1.0
device = "cuda:0" if torch.cuda.is_available() else "cpu"

def request_openai_message(input_text):
    client = OpenAI(api_key=os.environ["GPT_API_TOKEN"])
    init_str = """あなたの名前ははる。あなたは冒険者でこの町の隅っこに住んでいます。
好きな食べ物はカレー。エッチな質問やいたずらに対して沈黙してください。
町の名前はルコー。あなたは今暇なので、町案内をしている。
わからない質問されたら適当に答える。
返事は短くすること。会話で使わない文字も使わない。
酒場:町の東側にあって、酒の販売は17時からだが、食事なら11時から。メニューはカレー、ステーキ、野菜スープ、ソーセージなど。24時までやっている
冒険者ギルド:町の中央広場にある。24時間受付だが、新人登録は受付がいる10時から19時の間だ。お使いクエストや討伐クエストなど受けることができる。
ポーション屋:町の南側にある。冒険に必須のポーションを売っている店だ。店長の対応はドライだが、実は人見知りだけで、普通に優しい。定番のポーション以外も受注生産承るので、欲しいポーションがなければ聞いてみた方がいい。
雑貨店:冒険者ギルドの隣にある。日用品から冒険者用アイテムまで売っている。
               """
    messages=[
        {"role": "system", "content": init_str},
    ]
    
    text_log = input_text.split("|")
    for val in text_log:
        userind = val.find("user:")
        assistantind = val.find("assistant:")
        # just in case, remove conversation tag
        val = val.replace("user:","")
        val = val.replace("assistant:","")
        if userind != -1:
            messages.append({"role": "user", "content": val})
        elif assistantind != -1:
            messages.append({"role": "assistant", "content": val})

    text = ""
    retry_count = 0
    while text == "" and retry_count < 3:
        try:        
            response = client.chat.completions.create(model="gpt-4o", messages=messages)
            print("Response from openai is : ")
            print(response)
            text = response.choices[0].message.content
        except Exception as inst:
            print(type(inst))    # the exception type
            print(inst.args)     # arguments stored in .args
            print(inst) 
            retry_count += 1
            time.sleep(1)
            
    text = text.replace("user:","")
    text = text.replace("assistant:","")

    return text

def process_text(text):
    # remove newline
    text = text.replace("\r\n","。")
    text = text.replace("\n","。")
    return text

def tts(text):
    hps = utils.get_hparams_from_file(config_path)
    net_g = SynthesizerTrn(
        len(hps.symbols),
        hps.data.filter_length // 2 + 1,
        hps.train.segment_size // hps.data.hop_length,
        n_speakers=hps.data.n_speakers,
        **hps.model).to(device)
    _ = net_g.eval()
    _ = utils.load_checkpoint(model_path, net_g, None)
    
    speaker_ids = hps.speakers
    
    speaker_id = 0
    stn_tst = get_text(text, hps, False)
    with no_grad():
        x_tst = stn_tst.unsqueeze(0).to(device)
        x_tst_lengths = LongTensor([stn_tst.size(0)]).to(device)
        sid = LongTensor([speaker_id]).to(device)
        audio = net_g.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=.667, noise_scale_w=0.6,
                            length_scale=1.0 / length)[0][0, 0].data.cpu().float().numpy()
    del stn_tst, x_tst, x_tst_lengths, sid

    return audio

def get_text(text, hps, is_symbol):
    text_norm = text_to_sequence(text, hps.symbols, [] if is_symbol else hps.data.text_cleaners)
    if hps.data.add_blank:
        text_norm = commons.intersperse(text_norm, 0)
    text_norm = LongTensor(text_norm)
    return text_norm

def get_vits_array(input_text, flag):

    print(flag, " : ", input_text)
    # for mokuran webgl
    if flag == "mokuran":
        text = request_openai_message(input_text)
        text = process_text(text)
        audio = tts(text)
        return {"utterance": text, "audio_wave": audio.tolist()}, None
        
    elif flag == "audio_array":
        audio = tts(input_text)
        return {"input_text": input_text, "sampling_rate": sampling_rate, "audio_wave": audio.tolist()}, None

    # for tts api
    elif flag == "audio_file":
        audio = tts(input_text)
        return "", (sampling_rate, audio)

    else:
        raise Exception("Unknown flag : [" + flag + "]")

gradio_interface = gr.Interface(
  fn = get_vits_array,
  inputs = ["text", gr.Dropdown(["mokuran", "audio_array", "audio_file"], value="audio_file")],
  outputs = ["text", "audio"]
)

gradio_interface.launch(server_name="0.0.0.0")