SL79/Multilingual-TTS
0
1import tempfile2 3import edge_tts4import gradio as gr5from gradio_client import Client6import pyarabic.araby as araby7 8language_dict = {9 "English": {10 "Jenny": "en-US-JennyNeural",11 "Guy": "en-US-GuyNeural",12 "Ana": "en-US-AnaNeural",13 "Aria": "en-US-AriaNeural",14 "Christopher": "en-US-ChristopherNeural",15 "Eric": "en-US-EricNeural",16 "Michelle": "en-US-MichelleNeural",17 "Roger": "en-US-RogerNeural",18 "Natasha": "en-AU-NatashaNeural",19 "William": "en-AU-WilliamNeural",20 "Clara": "en-CA-ClaraNeural",21 "Liam": "en-CA-LiamNeural",22 "Libby": "en-GB-LibbyNeural",23 "Maisie": "en-GB-MaisieNeural",24 "Ryan": "en-GB-RyanNeural",25 "Sonia": "en-GB-SoniaNeural",26 "Thomas": "en-GB-ThomasNeural",27 "Sam": "en-HK-SamNeural",28 "Yan": "en-HK-YanNeural",29 "Connor": "en-IE-ConnorNeural",30 "Emily": "en-IE-EmilyNeural",31 "Neerja": "en-IN-NeerjaNeural",32 "Prabhat": "en-IN-PrabhatNeural",33 "Asilia": "en-KE-AsiliaNeural",34 "Chilemba": "en-KE-ChilembaNeural",35 "Abeo": "en-NG-AbeoNeural",36 "Ezinne": "en-NG-EzinneNeural",37 "Mitchell": "en-NZ-MitchellNeural",38 "James": "en-PH-JamesNeural",39 "Rosa": "en-PH-RosaNeural",40 "Luna": "en-SG-LunaNeural",41 "Wayne": "en-SG-WayneNeural",42 "Elimu": "en-TZ-ElimuNeural",43 "Imani": "en-TZ-ImaniNeural",44 "Leah": "en-ZA-LeahNeural",45 "Luke": "en-ZA-LukeNeural"46 },47 "Spanish": {48 "Elena": "es-AR-ElenaNeural",49 "Tomas": "es-AR-TomasNeural",50 "Marcelo": "es-BO-MarceloNeural",51 "Sofia": "es-BO-SofiaNeural",52 "Gonzalo": "es-CO-GonzaloNeural",53 "Salome": "es-CO-SalomeNeural",54 "Juan": "es-CR-JuanNeural",55 "Maria": "es-CR-MariaNeural",56 "Belkys": "es-CU-BelkysNeural",57 "Emilio": "es-DO-EmilioNeural",58 "Ramona": "es-DO-RamonaNeural",59 "Andrea": "es-EC-AndreaNeural",60 "Luis": "es-EC-LuisNeural",61 "Alvaro": "es-ES-AlvaroNeural",62 "Elvira": "es-ES-ElviraNeural",63 "Teresa": "es-GQ-TeresaNeural",64 "Andres": "es-GT-AndresNeural",65 "Marta": "es-GT-MartaNeural",66 "Carlos": "es-HN-CarlosNeural",67 "Karla": "es-HN-KarlaNeural",68 "Federico": "es-NI-FedericoNeural",69 "Yolanda": "es-NI-YolandaNeural",70 "Margarita": "es-PA-MargaritaNeural",71 "Roberto": "es-PA-RobertoNeural",72 "Alex": "es-PE-AlexNeural",73 "Camila": "es-PE-CamilaNeural",74 "Karina": "es-PR-KarinaNeural",75 "Victor": "es-PR-VictorNeural",76 "Mario": "es-PY-MarioNeural",77 "Tania": "es-PY-TaniaNeural",78 "Lorena": "es-SV-LorenaNeural",79 "Rodrigo": "es-SV-RodrigoNeural",80 "Alonso": "es-US-AlonsoNeural",81 "Paloma": "es-US-PalomaNeural",82 "Mateo": "es-UY-MateoNeural",83 "Valentina": "es-UY-ValentinaNeural",84 "Paola": "es-VE-PaolaNeural",85 "Sebastian": "es-VE-SebastianNeural"86 },87 "Arabic": {88 "Hamed": "ar-SA-HamedNeural",89 "Zariyah": "ar-SA-ZariyahNeural",90 "Fatima": "ar-AE-FatimaNeural",91 "Hamdan": "ar-AE-HamdanNeural",92 "Ali": "ar-BH-AliNeural",93 "Laila": "ar-BH-LailaNeural",94 "Ismael": "ar-DZ-IsmaelNeural",95 "Salma": "ar-EG-SalmaNeural",96 "Shakir": "ar-EG-ShakirNeural",97 "Bassel": "ar-IQ-BasselNeural",98 "Rana": "ar-IQ-RanaNeural",99 "Sana": "ar-JO-SanaNeural",100 "Taim": "ar-JO-TaimNeural",101 "Fahed": "ar-KW-FahedNeural",102 "Noura": "ar-KW-NouraNeural",103 "Layla": "ar-LB-LaylaNeural",104 "Rami": "ar-LB-RamiNeural",105 "Iman": "ar-LY-ImanNeural",106 "Omar": "ar-LY-OmarNeural",107 "Jamal": "ar-MA-JamalNeural",108 "Mouna": "ar-MA-MounaNeural",109 "Abdullah": "ar-OM-AbdullahNeural",110 "Aysha": "ar-OM-AyshaNeural",111 "Amal": "ar-QA-AmalNeural",112 "Moaz": "ar-QA-MoazNeural",113 "Amany": "ar-SY-AmanyNeural",114 "Laith": "ar-SY-LaithNeural",115 "Hedi": "ar-TN-HediNeural",116 "Reem": "ar-TN-ReemNeural",117 "Maryam": "ar-YE-MaryamNeural",118 "Saleh": "ar-YE-SalehNeural"119 },120 "Korean": {121 "Sun-Hi": "ko-KR-SunHiNeural",122 "InJoon": "ko-KR-InJoonNeural"123 },124 "Thai": {125 "Premwadee": "th-TH-PremwadeeNeural",126 "Niwat": "th-TH-NiwatNeural"127 },128 "Vietnamese": {129 "HoaiMy": "vi-VN-HoaiMyNeural",130 "NamMinh": "vi-VN-NamMinhNeural"131 },132 "Japanese": {133 "Nanami": "ja-JP-NanamiNeural",134 "Keita": "ja-JP-KeitaNeural"135 },136 "French": {137 "Denise": "fr-FR-DeniseNeural",138 "Eloise": "fr-FR-EloiseNeural",139 "Henri": "fr-FR-HenriNeural",140 "Sylvie": "fr-CA-SylvieNeural",141 "Antoine": "fr-CA-AntoineNeural",142 "Jean": "fr-CA-JeanNeural",143 "Ariane": "fr-CH-ArianeNeural",144 "Fabrice": "fr-CH-FabriceNeural",145 "Charline": "fr-BE-CharlineNeural",146 "Gerard": "fr-BE-GerardNeural"147 },148 "Portuguese": {149 "Francisca": "pt-BR-FranciscaNeural",150 "Antonio": "pt-BR-AntonioNeural",151 "Duarte": "pt-PT-DuarteNeural",152 "Raquel": "pt-PT-RaquelNeural"153 },154 "Indonesian": {155 "Ardi": "id-ID-ArdiNeural",156 "Gadis": "id-ID-GadisNeural"157 },158 "Hebrew": {159 "Avri": "he-IL-AvriNeural",160 "Hila": "he-IL-HilaNeural"161 },162 "Italian": {163 "Isabella": "it-IT-IsabellaNeural",164 "Diego": "it-IT-DiegoNeural",165 "Elsa": "it-IT-ElsaNeural"166 },167 "Dutch": {168 "Colette": "nl-NL-ColetteNeural",169 "Fenna": "nl-NL-FennaNeural",170 "Maarten": "nl-NL-MaartenNeural",171 "Arnaud": "nl-BE-ArnaudNeural",172 "Dena": "nl-BE-DenaNeural"173 },174 "Malay": {175 "Osman": "ms-MY-OsmanNeural",176 "Yasmin": "ms-MY-YasminNeural"177 },178 "Norwegian": {179 "Pernille": "nb-NO-PernilleNeural",180 "Finn": "nb-NO-FinnNeural"181 },182 "Swedish": {183 "Sofie": "sv-SE-SofieNeural",184 "Mattias": "sv-SE-MattiasNeural"185 },186 "Greek": {187 "Athina": "el-GR-AthinaNeural",188 "Nestoras": "el-GR-NestorasNeural"189 },190 "German": {191 "Katja": "de-DE-KatjaNeural",192 "Amala": "de-DE-AmalaNeural",193 "Conrad": "de-DE-ConradNeural",194 "Killian": "de-DE-KillianNeural",195 "Ingrid": "de-AT-IngridNeural",196 "Jonas": "de-AT-JonasNeural",197 "Jan": "de-CH-JanNeural",198 "Leni": "de-CH-LeniNeural"199 },200 "Afrikaans": {201 "Adri": "af-ZA-AdriNeural",202 "Willem": "af-ZA-WillemNeural"203 },204 "Amharic": {205 "Ameha": "am-ET-AmehaNeural",206 "Mekdes": "am-ET-MekdesNeural"207 },208 "Azerbaijani": {209 "Babek": "az-AZ-BabekNeural",210 "Banu": "az-AZ-BanuNeural"211 },212 "Bulgarian": {213 "Borislav": "bg-BG-BorislavNeural",214 "Kalina": "bg-BG-KalinaNeural"215 },216 "Bengali": {217 "Nabanita": "bn-BD-NabanitaNeural",218 "Pradeep": "bn-BD-PradeepNeural",219 "Bashkar": "bn-IN-BashkarNeural",220 "Tanishaa": "bn-IN-TanishaaNeural"221 },222 "Bosnian": {223 "Goran": "bs-BA-GoranNeural",224 "Vesna": "bs-BA-VesnaNeural"225 },226 "Catalan": {227 "Joana": "ca-ES-JoanaNeural",228 "Enric": "ca-ES-EnricNeural"229 },230 "Czech": {231 "Antonin": "cs-CZ-AntoninNeural",232 "Vlasta": "cs-CZ-VlastaNeural"233 },234 "Welsh": {235 "Aled": "cy-GB-AledNeural",236 "Nia": "cy-GB-NiaNeural"237 },238 "Danish": {239 "Christel": "da-DK-ChristelNeural",240 "Jeppe": "da-DK-JeppeNeural"241 },242 "Estonian": {243 "Anu": "et-EE-AnuNeural",244 "Kert": "et-EE-KertNeural"245 },246 "Persian": {247 "Dilara": "fa-IR-DilaraNeural",248 "Farid": "fa-IR-FaridNeural"249 },250 "Finnish": {251 "Harri": "fi-FI-HarriNeural",252 "Noora": "fi-FI-NooraNeural"253 },254 "Irish": {255 "Colm": "ga-IE-ColmNeural",256 "Orla": "ga-IE-OrlaNeural"257 },258 "Galician": {259 "Roi": "gl-ES-RoiNeural",260 "Sabela": "gl-ES-SabelaNeural"261 },262 "Gujarati": {263 "Dhwani": "gu-IN-DhwaniNeural",264 "Niranjan": "gu-IN-NiranjanNeural"265 },266 "Hindi": {267 "Madhur": "hi-IN-MadhurNeural",268 "Swara": "hi-IN-SwaraNeural"269 },270 "Croatian": {271 "Gabrijela": "hr-HR-GabrijelaNeural",272 "Srecko": "hr-HR-SreckoNeural"273 },274 "Hungarian": {275 "Noemi": "hu-HU-NoemiNeural",276 "Tamas": "hu-HU-TamasNeural"277 },278 "Icelandic": {279 "Gudrun": "is-IS-GudrunNeural",280 "Gunnar": "is-IS-GunnarNeural"281 },282 "Javanese": {283 "Dimas": "jv-ID-DimasNeural",284 "Siti": "jv-ID-SitiNeural"285 },286 "Georgian": {287 "Eka": "ka-GE-EkaNeural",288 "Giorgi": "ka-GE-GiorgiNeural"289 },290 "Kazakh": {291 "Aigul": "kk-KZ-AigulNeural",292 "Daulet": "kk-KZ-DauletNeural"293 },294 "Khmer": {295 "Piseth": "km-KH-PisethNeural",296 "Sreymom": "km-KH-SreymomNeural"297 },298 "Kannada": {299 "Gagan": "kn-IN-GaganNeural",300 "Sapna": "kn-IN-SapnaNeural"301 },302 "Lao": {303 "Chanthavong": "lo-LA-ChanthavongNeural",304 "Keomany": "lo-LA-KeomanyNeural"305 },306 "Lithuanian": {307 "Leonas": "lt-LT-LeonasNeural",308 "Ona": "lt-LT-OnaNeural"309 },310 "Latvian": {311 "Everita": "lv-LV-EveritaNeural",312 "Nils": "lv-LV-NilsNeural"313 },314 "Macedonian": {315 "Aleksandar": "mk-MK-AleksandarNeural",316 "Marija": "mk-MK-MarijaNeural"317 },318 "Malayalam": {319 "Midhun": "ml-IN-MidhunNeural",320 "Sobhana": "ml-IN-SobhanaNeural"321 },322 "Mongolian": {323 "Bataa": "mn-MN-BataaNeural",324 "Yesui": "mn-MN-YesuiNeural"325 },326 "Marathi": {327 "Aarohi": "mr-IN-AarohiNeural",328 "Manohar": "mr-IN-ManoharNeural"329 },330 "Maltese": {331 "Grace": "mt-MT-GraceNeural",332 "Joseph": "mt-MT-JosephNeural"333 },334 "Burmese": {335 "Nilar": "my-MM-NilarNeural",336 "Thiha": "my-MM-ThihaNeural"337 },338 "Nepali": {339 "Hemkala": "ne-NP-HemkalaNeural",340 "Sagar": "ne-NP-SagarNeural"341 },342 "Polish": {343 "Marek": "pl-PL-MarekNeural",344 "Zofia": "pl-PL-ZofiaNeural"345 },346 "Pashto": {347 "Gul Nawaz": "ps-AF-GulNawazNeural",348 "Latifa": "ps-AF-LatifaNeural"349 },350 "Romanian": {351 "Alina": "ro-RO-AlinaNeural",352 "Emil": "ro-RO-EmilNeural"353 },354 "Russian": {355 "Svetlana": "ru-RU-SvetlanaNeural",356 "Dmitry": "ru-RU-DmitryNeural"357 },358 "Sinhala": {359 "Sameera": "si-LK-SameeraNeural",360 "Thilini": "si-LK-ThiliniNeural"361 },362 "Slovak": {363 "Lukas": "sk-SK-LukasNeural",364 "Viktoria": "sk-SK-ViktoriaNeural"365 },366 "Slovenian": {367 "Petra": "sl-SI-PetraNeural",368 "Rok": "sl-SI-RokNeural"369 },370 "Somali": {371 "Muuse": "so-SO-MuuseNeural",372 "Ubax": "so-SO-UbaxNeural"373 },374 "Albanian": {375 "Anila": "sq-AL-AnilaNeural",376 "Ilir": "sq-AL-IlirNeural"377 },378 "Serbian": {379 "Nicholas": "sr-RS-NicholasNeural",380 "Sophie": "sr-RS-SophieNeural"381 },382 "Sundanese": {383 "Jajang": "su-ID-JajangNeural",384 "Tuti": "su-ID-TutiNeural"385 },386 "Swahili": {387 "Rafiki": "sw-KE-RafikiNeural",388 "Zuri": "sw-KE-ZuriNeural",389 "Daudi": "sw-TZ-DaudiNeural",390 "Rehema": "sw-TZ-RehemaNeural"391 },392 "Tamil": {393 "Pallavi": "ta-IN-PallaviNeural",394 "Valluvar": "ta-IN-ValluvarNeural",395 "Kumar": "ta-LK-KumarNeural",396 "Saranya": "ta-LK-SaranyaNeural",397 "Kani": "ta-MY-KaniNeural",398 "Surya": "ta-MY-SuryaNeural",399 "Anbu": "ta-SG-AnbuNeural"400 },401 "Telugu": {402 "Mohan": "te-IN-MohanNeural",403 "Shruti": "te-IN-ShrutiNeural"404 },405 "Turkish": {406 "Ahmet": "tr-TR-AhmetNeural",407 "Emel": "tr-TR-EmelNeural"408 },409 "Ukrainian": {410 "Ostap": "uk-UA-OstapNeural",411 "Polina": "uk-UA-PolinaNeural"412 },413 "Urdu": {414 "Gul": "ur-IN-GulNeural",415 "Salman": "ur-IN-SalmanNeural",416 "Asad": "ur-PK-AsadNeural",417 "Uzma": "ur-PK-UzmaNeural"418 },419 "Uzbek": {420 "Madina": "uz-UZ-MadinaNeural",421 "Sardor": "uz-UZ-SardorNeural"422 },423 "Mandarin": {424 "Xiaoxiao": "zh-CN-XiaoxiaoNeural",425 "Yunyang": "zh-CN-YunyangNeural",426 "Yunxi": "zh-CN-YunxiNeural",427 "Xiaoyi": "zh-CN-XiaoyiNeural",428 "Yunjian": "zh-CN-YunjianNeural",429 "Yunxia": "zh-CN-YunxiaNeural",430 "Xiaobei": "zh-CN-liaoning-XiaobeiNeural",431 "Xiaoni": "zh-CN-shaanxi-XiaoniNeural",432 "HiuMaan": "zh-HK-HiuMaanNeural",433 "HiuGaai": "zh-HK-HiuGaaiNeural",434 "WanLung": "zh-HK-WanLungNeural",435 "HsiaoChen": "zh-TW-HsiaoChenNeural",436 "HsiaoYu": "zh-TW-HsiaoYuNeural",437 "YunJhe": "zh-TW-YunJheNeural"438 },439 "Zulu": {440 "Thando": "zu-ZA-ThandoNeural",441 "Themba": "zu-ZA-ThembaNeural"442 }443}444 445client = Client("MohamedRashad/arabic-auto-tashkeel")446 447async def text_to_speech_edge(text, language_code, speaker, tashkeel_checkbox=False):448 449 # Remove diacritics from Arabic text then add tashkeel450 if language_code == "Arabic" and tashkeel_checkbox:451 text = client.predict(452 input_text=araby.strip_diacritics(text),453 api_name="/infer_shakkala"454 )455 456 # Get the voice for the selected language and speaker457 voice = language_dict[language_code][speaker]458 communicate = edge_tts.Communicate(text, voice)459 with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:460 tmp_path = tmp_file.name461 await communicate.save(tmp_path)462 463 return text, tmp_path464 465 466def get_speakers(language):467 print(language)468 speakers = list(language_dict[language].keys())469 return gr.Dropdown(choices=speakers, value=speakers[0], interactive=True), gr.Checkbox(visible=language == "Arabic", interactive=True)470 471 472default_language = None473default_speaker = None474with gr.Blocks(title="Multilingual TTS") as demo:475 gr.HTML("<center><h1>Multilingual TTS (Edge TTS)</h1></center>")476 gr.HTML(f"<h2 style='color:Tomato;'> {len(language_dict)} languages supported</h3>")477 gr.HTML(f"<p> {', '.join(language_dict.keys())} </h3>")478 gr.Markdown("**Note:** A special feature is added for Arabic language only.")479 with gr.Row():480 with gr.Column():481 input_text = gr.Textbox(lines=5, label="Input Text", placeholder="Enter text to convert to speech")482 language = gr.Dropdown(483 choices=list(language_dict.keys()), value=default_language, label="Languages", interactive=True484 )485 speaker = gr.Dropdown(choices=[], value=default_speaker, label="Speakers", interactive=False)486 tashkeel_checkbox = gr.Checkbox(label="Tashkeel", value=False, visible=False, interactive=False)487 run_btn = gr.Button(value="Generate Audio", variant="primary")488 489 with gr.Column():490 output_text = gr.Textbox(label="Output Text")491 output_audio = gr.Audio(type="filepath", label="Audio Output")492 493 language.change(get_speakers, inputs=[language], outputs=[speaker, tashkeel_checkbox])494 run_btn.click(text_to_speech_edge, inputs=[input_text, language, speaker, tashkeel_checkbox], outputs=[output_text, output_audio])495 496if __name__ == "__main__":497 demo.queue().launch(share=True)498 