denvot-gradio
/
main.py
146 строк · 5.5 Кб
1import os
2import edge_tts as tts
3from edge_tts import VoicesManager
4import asyncio, concurrent.futures
5import gradio as gr
6from rvc_infer import rvc_convert
7import config
8import hashlib
9from datetime import datetime
10from langchain.chat_models.gigachat import GigaChat
11from langchain.schema import HumanMessage, SystemMessage
12
13def date_to_short_hash():
14current_date = datetime.now()
15date_str = current_date.strftime("%Y-%m-%d %H:%M:%S")
16sha256_hash = hashlib.sha256(date_str.encode()).hexdigest()
17short_hash = sha256_hash[:8]
18return short_hash
19
20model = "DenVot.pth"
21can_speak = True
22voice_instances = []
23chat = GigaChat(credentials=config.API_AUTH, verify_ssl_certs=False, model="GigaChat-Pro")
24
25async def load_voices():
26voicesobj = await VoicesManager.create()
27global voice_instances
28voice_instances = [data["ShortName"] for data in voicesobj.voices]
29
30async def speech(mess, pitch, voice):
31communicate = tts.Communicate(mess, voice)
32i = 0
33file_name = "test"
34
35await communicate.save("input\\" + file_name)
36output_path = rvc_convert(model_path=os.getcwd() + "\\models\\" + model,
37input_path=os.getcwd() + "\\input\\" + file_name,
38f0_up_key=pitch)
39os.rename("output\\out.wav", "output\\" + date_to_short_hash() + ".wav")
40os.remove("input\\" + file_name)
41print("DenVot: " + file_name)
42global can_speak
43can_speak = True
44
45
46messages = list()
47messages.append(SystemMessage(content="Ты милый мальчик по имени Денвот, ты любишь отвечать на вопросы! Не перепутай свою роль!"))
48
49def GigaMessage(request):
50global messages
51messages.append(HumanMessage(content=request))
52response = chat(messages)
53messages.pop(1)
54return response
55
56def get_last_file(directory):
57files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
58if not files:
59return None
60
61last_file = max(files, key=lambda f: os.path.getctime(os.path.join(directory, f)))
62
63return os.path.join(directory, last_file)
64
65pool = concurrent.futures.ThreadPoolExecutor()
66pool.submit(asyncio.run, load_voices()).result()
67
68def makeSpeech(request, pitch, voice):
69global can_speak
70if can_speak is False: return
71can_speak = False
72result = pool.submit(asyncio.run, speech(request, pitch, voice)).result()
73return get_last_file("output")
74
75def makeSpeechViaAnswer(question, pitch, voice):
76global can_speak
77if can_speak is False: return
78can_speak = False
79requested = GigaMessage(question).content
80print(requested)
81result = pool.submit(asyncio.run, speech(requested, pitch, voice)).result()
82return get_last_file("output")
83
84
85
86with gr.Blocks() as grad:
87with gr.Tab("Озвучка текста"):
88with gr.Row():
89with gr.Column():
90gr.Markdown("""
91# Введите текст для озвучки
92DenVot с радостью озвучит его!
93""")
94print(voice_instances)
95combobox = gr.Dropdown(voice_instances, label="Голос", info="Список всех доступных голосов", value="ru-RU-DmitryNeural")
96request = gr.TextArea(placeholder="Напиши текст для озвучки денвотика!!")
97btn = gr.Button()
98btn.label = "Запуск"
99btn.value = "Запуск"
100gr.Markdown("""
101Выберите питч для денвотика!
102""")
103slider = gr.Slider()
104with gr.Column():
105gr.Markdown("""
106# Тут результат
107DenVot же такой классный!!
108""")
109out1 = gr.Audio()
110clear = gr.ClearButton(out1)
111clear.label = "Очистить"
112clear.value = "Очистить"
113with gr.Tab("Вопросы"):
114with gr.Row():
115with gr.Column():
116gr.Markdown("""
117### Или же задайте вопрос денвотику
118DenVot с радостью ответит на него!
119""")
120question = gr.TextArea(placeholder="Задай свой вопрос денвотику!!")
121quiz = gr.Button()
122quiz.label = "Задать вопрос"
123quiz.value = "Задать вопрос"
124gr.Markdown("""
125Выберите питч для денвотика!
126""")
127slider2 = gr.Slider()
128with gr.Column():
129gr.Markdown("""
130# Тут результат
131DenVot же такой классный!!
132""")
133out2 = gr.Audio()
134clear2 = gr.ClearButton(out2)
135clear2.label = "Очистить"
136clear2.value = "Очистить"
137request.label = "Текст"
138slider.maximum = 24
139slider.minimum = -24
140slider.value = 6
141slider.label = "Питч"
142question.label = "Вопрос"
143btn.click(makeSpeech, inputs=[request, slider, combobox], outputs=out1)
144quiz.click(makeSpeechViaAnswer, inputs=[question, slider, combobox], outputs=out2)
145grad.title = "Голосовой DenVot"
146grad.launch()
147