File size: 4,559 Bytes
e97a206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7179888
 
 
e97a206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import edge_tts
import asyncio
import os
# https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4 - там голоса брать. думаю поймете. ShortName короче
SUPPORTED_VOICES = {
    'DmitryNeural-Руский(муж.)': 'ru-RU-DmitryNeural',
    'SvetlanaNeural-Русский(жен.)': 'ru-RU-SvetlanaNeural',
    'OstapNeural-Украинский(муж.)': 'uk-UA-OstapNeural',
    'PolinaNeural-Украинский(жен.)': 'uk-UA-PolinaNeural'
}

# Смена голоса
def changeVoice(voices):
    example = SUPPORTED_VOICES[voices]
    example_file = os.path.join(os.path.dirname(__file__), "example/"+example+".wav")
    return example_file

# Преобразование текста в речь
async def textToSpeech(text, voices, rate, volume):
    output_file = "output.mp3"
    voices = SUPPORTED_VOICES[voices]
    if (rate >= 0):
        rates = rate = "+" + str(rate) + "%"
    else:
        rates = str(rate) + "%"
    if (volume >= 0):
        volumes = "+" + str(volume) + "%"
    else:
        volumes = str(volume) + "%"
    communicate = edge_tts.Communicate(text,
                                       voices,
                                       rate=rates,
                                       volume=volumes,
                                       proxy=None)
    await communicate.save(output_file)
    audio_file = os.path.join(os.path.dirname(__file__), "output.mp3")
    if (os.path.exists(audio_file)):
        return audio_file
    else:
        raise gr.Error("Преобразование не удалось!")
        return FileNotFoundError


# Сбросить результат конвертации
def clearSpeech():
    output_file = os.path.join(os.path.dirname(__file__), "output.mp3")
    if (os.path.exists(output_file)):
        os.remove(output_file)
    return None, None


with gr.Blocks(css="style.css", title="Преобразование текста в речь") as demo:
    gr.Markdown("""
    # Преобразование текста в речь через Microsoft Edge
    """)
    with gr.Row():
        with gr.Column():
            text = gr.TextArea(label="Текст", elem_classes="text-area")
            btn = gr.Button("Сгенерировать", elem_id="submit-btn")
            gr.Markdown(
                "Original repository: https://github.com/hinaichigo-fox/rus-edge-tts-webui"
            )
        with gr.Column():
            voices = gr.Dropdown(choices=[
                "DmitryNeural-Руский(муж.)", "SvetlanaNeural-Русский(жен.)", "OstapNeural-Украинский(муж.)", "PolinaNeural-Украинский(жен.)"
            ],
                                 value="DmitryNeural-Руский(муж.)",
                                 label="Голос",
                                 info="Пожалуйста, выберите голос",
                                 interactive=True)
            
            example = gr.Audio(label="Пример голоса",
                              value="example/ru-RU-DmitryNeural.wav",
                              interactive=False,
                              elem_classes="example")

            voices.change(fn=changeVoice,inputs=voices,outputs=example)
            rate = gr.Slider(-100,
                             100,
                             step=1,
                             value=0,
                             label="Увеличение / уменьшение скорости речи",
                             info="Скорость речи быстрее / медленнее",
                             interactive=True)
            
            volume = gr.Slider(-100,
                               100,
                               step=1,
                               value=0,
                               label="Увеличение / уменьшение громкости звука",
                               info="Увеличить / уменьшить громкость звука",
                               interactive=True)
            audio = gr.Audio(label="Результат",
                             interactive=False,
                             elem_classes="audio")
            btn.click(fn=textToSpeech,
                      inputs=[text, voices, rate, volume],
                      outputs=[audio])

if __name__ == "__main__":
    demo.launch()