File size: 3,253 Bytes
2bbabc3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import tempfile
import edge_tts
import gradio as gr
import asyncio

language_dict = {
    "Amharic": {
        "Ameha": "am-ET-AmehaNeural",
        "Mekdes": "am-ET-MekdesNeural"
    },
    "English": {
        "Ryan": "en-GB-RyanNeural",
        "Clara": "en-CA-ClaraNeural"
    }
}

async def text_to_speech_edge(text, language, speaker):
    voice = language_dict[language][speaker]
    
    try:
        communicate = edge_tts.Communicate(text, voice)
        
        with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
            tmp_path = tmp_file.name
            await asyncio.wait_for(communicate.save(tmp_path), timeout=30)
            
        return tmp_path
        
    except asyncio.TimeoutError:
        error_msg = "αˆ΅αˆ…α‰°α‰΅: αŒŠα‹œ αŠ αˆα‰‹αˆα’ αŠ₯α‰£αŠ­α‹Ž αŠ₯αŠ•α‹°αŒˆαŠ“ α‹­αˆžαŠ­αˆ©α’ (Timeout)" if language == "Amharic" else "Error: Timeout. Please try again."
        raise gr.Error(error_msg)
    except Exception as e:
        error_msg = f"αˆ΅αˆ…α‰°α‰΅: α‹΅αˆα… መፍጠር αŠ αˆα‰°α‰»αˆˆαˆα’\nError: {str(e)}" if language == "Amharic" else f"Error: Failed to generate audio.\nDetails: {str(e)}"
        raise gr.Error(error_msg)

def update_speakers(language):
    speakers = list(language_dict[language].keys())
    return gr.Dropdown(choices=speakers, value=speakers[0])

with gr.Blocks(title="Amharic & English TTS") as demo:
    gr.HTML("""
    <style>
        h1 { 
            color: #2E86C1; 
            text-align: center;
            background: linear-gradient(45deg, #FF007F, #2E86C1);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .gradio-button { 
            background: linear-gradient(45deg, #FF007F, #2E86C1) !important; 
            color: white !important; 
        }
        .gradio-textbox, .gradio-dropdown { 
            border-color: #2E86C1 !important; 
        }
    </style>
    <center><h1>Amharic & English Text-to-Speech</h1></center>
    """)

    with gr.Row():
        with gr.Column():
            language = gr.Dropdown(
                choices=["Amharic", "English"],
                value="Amharic",
                label="Select Language / α‰‹αŠ•α‰‹ α‹­αˆαˆ¨αŒ‘"
            )
            input_text = gr.Textbox(
                lines=5, 
                label="Enter Text / αŒ½αˆ‘α α‹«αˆ΅αŒˆα‰‘",
                placeholder="Type your text here... / αŒ½αˆ‘αα‹ŽαŠ• α‹­αŒ»α‰..."
            )
            speaker = gr.Dropdown(
                choices=["Ameha", "Mekdes"],
                value="Ameha",
                label="Select Speaker / αŠ αˆ­α‰²αˆ΅α‰΅ α‹­αˆαˆ¨αŒ‘"
            )
            run_btn = gr.Button(value="Generate Audio / α‹΅αˆα… ፍጠር", variant="primary")

        with gr.Column():
            output_audio = gr.Audio(
                type="filepath",
                label="Generated Audio / α‹¨α‰°αˆαŒ αˆ¨ α‹΅αˆα…"
            )

    language.change(
        update_speakers,
        inputs=language,
        outputs=speaker
    )

    run_btn.click(
        text_to_speech_edge,
        inputs=[input_text, language, speaker],
        outputs=output_audio
    )

if __name__ == "__main__":
    demo.launch(server_port=7860, share=False)