denvot-gradio

Форк
0
/
main.py 
146 строк · 5.5 Кб
1
import os
2
import edge_tts as tts
3
from edge_tts import VoicesManager
4
import asyncio, concurrent.futures
5
import gradio as gr
6
from rvc_infer import rvc_convert
7
import config
8
import hashlib
9
from datetime import datetime
10
from langchain.chat_models.gigachat import GigaChat
11
from langchain.schema import HumanMessage, SystemMessage
12

13
def date_to_short_hash():
14
    current_date = datetime.now()
15
    date_str = current_date.strftime("%Y-%m-%d %H:%M:%S")
16
    sha256_hash = hashlib.sha256(date_str.encode()).hexdigest()
17
    short_hash = sha256_hash[:8]
18
    return short_hash
19

20
model = "DenVot.pth"
21
can_speak = True
22
voice_instances = []
23
chat = GigaChat(credentials=config.API_AUTH, verify_ssl_certs=False, model="GigaChat-Pro")
24

25
async def load_voices():
26
    voicesobj = await VoicesManager.create()
27
    global voice_instances
28
    voice_instances = [data["ShortName"] for data in voicesobj.voices]
29

30
async def speech(mess, pitch, voice):
31
    communicate = tts.Communicate(mess, voice)
32
    i = 0
33
    file_name = "test"
34

35
    await communicate.save("input\\" + file_name)
36
    output_path = rvc_convert(model_path=os.getcwd() + "\\models\\" + model,
37
                              input_path=os.getcwd() + "\\input\\" + file_name,
38
                              f0_up_key=pitch)
39
    os.rename("output\\out.wav", "output\\" + date_to_short_hash() + ".wav")
40
    os.remove("input\\" + file_name)
41
    print("DenVot: " + file_name)
42
    global can_speak
43
    can_speak = True
44

45

46
messages = list()
47
messages.append(SystemMessage(content="Ты милый мальчик по имени Денвот, ты любишь отвечать на вопросы! Не перепутай свою роль!"))
48

49
def GigaMessage(request):
50
    global messages
51
    messages.append(HumanMessage(content=request))
52
    response = chat(messages)
53
    messages.pop(1)
54
    return response
55

56
def get_last_file(directory):
57
    files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
58
    if not files:
59
        return None
60

61
    last_file = max(files, key=lambda f: os.path.getctime(os.path.join(directory, f)))
62

63
    return os.path.join(directory, last_file)
64

65
pool = concurrent.futures.ThreadPoolExecutor()
66
pool.submit(asyncio.run, load_voices()).result()
67

68
def makeSpeech(request, pitch, voice):
69
    global can_speak
70
    if can_speak is False: return
71
    can_speak = False
72
    result = pool.submit(asyncio.run, speech(request, pitch, voice)).result()
73
    return get_last_file("output")
74

75
def makeSpeechViaAnswer(question, pitch, voice):
76
    global can_speak
77
    if can_speak is False: return
78
    can_speak = False
79
    requested = GigaMessage(question).content
80
    print(requested)
81
    result = pool.submit(asyncio.run, speech(requested, pitch, voice)).result()
82
    return get_last_file("output")
83

84

85

86
with gr.Blocks() as grad:
87
    with gr.Tab("Озвучка текста"):
88
        with gr.Row():
89
            with gr.Column():
90
                gr.Markdown("""
91
                # Введите текст для озвучки
92
                DenVot с радостью озвучит его!
93
                """)
94
                print(voice_instances)
95
                combobox = gr.Dropdown(voice_instances, label="Голос", info="Список всех доступных голосов", value="ru-RU-DmitryNeural")
96
                request = gr.TextArea(placeholder="Напиши текст для озвучки денвотика!!")
97
                btn = gr.Button()
98
                btn.label = "Запуск"
99
                btn.value = "Запуск"
100
                gr.Markdown("""
101
                    Выберите питч для денвотика!
102
                    """)
103
                slider = gr.Slider()
104
            with gr.Column():
105
                gr.Markdown("""
106
                            # Тут результат
107
                            DenVot же такой классный!!
108
                            """)
109
                out1 = gr.Audio()
110
                clear = gr.ClearButton(out1)
111
                clear.label = "Очистить"
112
                clear.value = "Очистить"
113
    with gr.Tab("Вопросы"):
114
        with gr.Row():
115
            with gr.Column():
116
                gr.Markdown("""
117
                            ### Или же задайте вопрос денвотику
118
                            DenVot с радостью ответит на него!
119
                            """)
120
                question = gr.TextArea(placeholder="Задай свой вопрос денвотику!!")
121
                quiz = gr.Button()
122
                quiz.label = "Задать вопрос"
123
                quiz.value = "Задать вопрос"
124
                gr.Markdown("""
125
                            Выберите питч для денвотика!
126
                            """)
127
                slider2 = gr.Slider()
128
            with gr.Column():
129
                gr.Markdown("""
130
                            # Тут результат
131
                            DenVot же такой классный!!
132
                            """)
133
                out2 = gr.Audio()
134
                clear2 = gr.ClearButton(out2)
135
                clear2.label = "Очистить"
136
                clear2.value = "Очистить"
137
    request.label = "Текст"
138
    slider.maximum = 24
139
    slider.minimum = -24
140
    slider.value = 6
141
    slider.label = "Питч"
142
    question.label = "Вопрос"
143
    btn.click(makeSpeech, inputs=[request, slider, combobox], outputs=out1)
144
    quiz.click(makeSpeechViaAnswer, inputs=[question, slider, combobox], outputs=out2)
145
grad.title = "Голосовой DenVot"
146
grad.launch()
147

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.