File size: 2,400 Bytes
63f1d6d
 
 
 
 
 
 
6e4e2fe
63f1d6d
 
 
 
 
8529fe9
63f1d6d
8529fe9
63f1d6d
6e4e2fe
63f1d6d
 
 
6e4e2fe
63f1d6d
6e4e2fe
63f1d6d
 
 
6e4e2fe
63f1d6d
 
8529fe9
 
 
6e4e2fe
 
 
 
 
d81bde6
63f1d6d
 
6e4e2fe
d81bde6
63f1d6d
 
 
 
 
 
 
 
 
 
6e4e2fe
63f1d6d
6e4e2fe
d81bde6
63f1d6d
4f5115c
63f1d6d
 
 
8529fe9
 
6e4e2fe
 
8529fe9
 
63f1d6d
8529fe9
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
import gradio as gr
import edge_tts
import asyncio
import tempfile
import os

async def get_voices():
    # Obtiene la lista de voces disponibles
    voices = await edge_tts.list_voices()
    return {f"{v['ShortName']} - {v['Locale']} ({v['Gender']})": v['ShortName'] for v in voices}

async def text_to_speech(text, voice, rate, pitch):
    if not text.strip():
        return None, "Please enter text to convert."
    if not voice:
        return None, "Please select a voice."
    
    # Corregida la identación y extracción del nombre
    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
        await communicate.save(tmp_path)
    
    return tmp_path, None

async def tts_interface(text, voice, rate, pitch):
    audio, warning = await text_to_speech(text, voice, rate, pitch)
    if warning:
        # Lanzar la advertencia y devolver None para el audio
        gr.Warning(warning)
        return None, warning
    # Devolver el audio y limpiar el campo de Markdown
    return audio, ""

async def create_demo():
    voices = await get_voices()
    description = "Convert text to speech using Edge TTS. Adjust speech rate and pitch."
    
    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="Status") # Cambiado para recibir el mensaje de texto/error
        ],
        title="Free-TTS Unlimited",
        description=description,
        analytics_enabled=False,
        api_name=None
    )
    return demo

async def main():
    demo = await create_demo()
    # Gradio 5: queue ya no requiere obligatoriamente default_concurrency_limit
    demo.queue()
    demo.launch(show_api=False)

if __name__ == "__main__":
    asyncio.run(main())