File size: 2,618 Bytes
63f1d6d
 
 
 
9d562d5
b8dff41
 
 
65c0339
b8dff41
65c0339
b8dff41
 
 
 
8c1a544
b8dff41
 
 
8c1a544
9f244de
b8dff41
9f244de
b8dff41
65c0339
b8dff41
65c0339
b8dff41
 
 
 
 
 
 
 
 
9f244de
b8dff41
 
9f244de
 
 
b8dff41
65c0339
d645fd7
 
b8dff41
d55a821
9f244de
da1de32
 
 
 
 
 
 
 
 
 
9f244de
da1de32
 
 
 
 
9f244de
da1de32
d645fd7
b8dff41
63f1d6d
65c0339
3608bd6
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
import gradio as gr
import edge_tts
import asyncio
import tempfile
import re
import emoji
# Функция для очистки текста от нежелательных символов и эмодзи
def clean_text(text):
    # Удаление указанных символов
    text = re.sub(r'[*_~><]', '', text)
    # Удаление эмодзи
    text = emoji.replace_emoji(text, replace='')
    return text
# Get all available voices
async def get_voices():
    voices = await edge_tts.list_voices()
    return {f"{v['ShortName']} - {v['Locale']} ({v['Gender']})": v['ShortName'] for v in voices}
# Text-to-speech function
async def text_to_speech(text, voice, rate, pitch):
    if not text.strip():
        return None, gr.Warning("Please enter text to convert.")
    if not voice:
        return None, gr.Warning("Please select a voice.")
    
    # Очистка текста
    text = clean_text(text)
    
    voice_short_name = voice.split(" - ")[0]
    rate_str = f"{rate:+d}%"
    pitch_str = f"{pitch:+d}Hz"
    communicate = edge_tts.Communicate(text, voice_short_name, rate=rate_str, pitch=pitch_str)
    with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
        tmp_path = tmp_file.name
        try:
            await communicate.save(tmp_path)
        except Exception as e:
            return None, gr.Warning(f"An error occurred during text-to-speech conversion: {str(e)}")
    return tmp_path, None
# Gradio interface function
def tts_interface(text, voice, rate, pitch):
    audio, warning = asyncio.run(text_to_speech(text, voice, rate, pitch))
    return audio, warning
# Create Gradio application
async def create_demo():
    voices = await get_voices()
    
    description = """
    """
    
    demo = gr.Interface(
        fn=tts_interface,
        inputs=[
            gr.Textbox(label="Input Text", lines=5),
            gr.Dropdown(choices=[""] + list(voices.keys()), label="Select Voice", value=""),
            gr.Slider(minimum=-50, maximum=50, value=0, label="Speech Rate Adjustment (%)", step=1),
            gr.Slider(minimum=-20, maximum=20, value=0, label="Pitch Adjustment (Hz)", step=1)
        ],
        outputs=[
            gr.Audio(label="Generated Audio", type="filepath"),
            gr.Markdown(label="Warning", visible=False)
        ],
        title="Edge TTS Text-to-Speech",
        description=description,
        article="",
        analytics_enabled=False,
        allow_flagging="manual"
    )
    return demo
# Run the application
if __name__ == "__main__":
    demo = asyncio.run(create_demo())
    demo.launch()