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") |