Spaces:
Running
Running
| 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) |