File size: 2,809 Bytes
2bbabc3
 
 
 
 
 
 
 
 
 
 
 
 
ce98cc8
2bbabc3
 
 
ce98cc8
f88a8c0
ce98cc8
7481e8e
ce98cc8
 
 
 
 
 
 
 
2bbabc3
 
 
 
 
 
 
 
51e442c
ce98cc8
51e442c
2bbabc3
 
51e442c
ce98cc8
51e442c
2bbabc3
 
 
7481e8e
ce98cc8
7481e8e
ce98cc8
7481e8e
ce98cc8
2bbabc3
ce98cc8
 
 
2bbabc3
ce98cc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51e442c
ce98cc8
51e442c
 
ce98cc8
2bbabc3
 
 
 
 
ce98cc8
 
2bbabc3
 
 
 
 
 
ce98cc8
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
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):
    # Handle Tigrinya as Amharic with different label
    if language == "Tigrinya":
        language = "Amharic"
    
    try:
        voice = language_dict[language][speaker]
    except KeyError:
        error_msg = (f"αˆ΅αˆ…α‰°α‰΅: α‹΅αˆα… '{speaker}' αŠ αˆα‰°αŒˆαŠ˜αˆα’"
                    if language == "Amharic" 
                    else f"Error: Voice '{speaker}' not found")
        raise gr.Error(error_msg)

    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 = ("αˆ΅αˆ…α‰°α‰΅: αŒŠα‹œ αŠ αˆα‰‹αˆα’ αŠ₯α‰£αŠ­α‹Ž αŠ₯αŠ•α‹°αŒˆαŠ“ α‹­αˆžαŠ­αˆ©α’"
                    if language == "Amharic"
                    else "Error: Timeout. Please try again.")
        raise gr.Error(error_msg)
    except Exception as e:
        error_msg = (f"αˆ΅αˆ…α‰°α‰΅: {str(e)}"
                    if language == "Amharic"
                    else f"Error: {str(e)}")
        raise gr.Error(error_msg)

def update_speakers(language):
    if language == "Tigrinya":
        speakers = list(language_dict["Amharic"].keys())
    else:
        speakers = list(language_dict.get(language, []))
    
    return gr.Dropdown(choices=speakers, value=speakers[0] if speakers else None)

with gr.Blocks(title="SelamGPT TTS") as demo:
    gr.Markdown("## Amharic, English & Tigrinya Text-to-Speech")
    
    with gr.Row():
        language = gr.Dropdown(
            choices=["Amharic", "English", "Tigrinya"],
            value="Amharic",
            label="Language"
        )
        speaker = gr.Dropdown(
            label="Speaker",
            allow_custom_value=False
        )
        input_text = gr.Textbox(label="Input Text")
    
    generate_btn = gr.Button("Generate Audio")
    output_audio = gr.Audio(label="Output")
    
    # API endpoints
    demo.load(
        fn=lambda: gr.Dropdown(choices=language_dict["Amharic"].keys()),
        outputs=speaker
    )
    
    language.change(
        update_speakers,
        inputs=language,
        outputs=speaker
    )
    
    generate_btn.click(
        text_to_speech_edge,
        inputs=[input_text, language, speaker],
        outputs=output_audio
    )

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