Text_To_Voice / app.py
hamza2923's picture
Update app.py
96e98f6 verified
import gradio as gr
import edge_tts
import asyncio
from typing import Dict
async def generate_speech(text: str, voice: str) -> str:
"""Generate speech from text using the specified voice"""
try:
communicate = edge_tts.Communicate(text, voice)
output_file = "output.mp3"
await communicate.save(output_file)
return output_file
except Exception as e:
print(f"Error: {e}")
return None
# List of voices
VOICES: Dict[str, str] = {
# Afrikaans
"Willem (Male, ZA)": "af-ZA-WillemNeural",
"Adri (Female, ZA)": "af-ZA-AdriNeural",
# Amharic
"Ameha (Male, ET)": "am-ET-AmehaNeural",
"Mekdes (Female, ET)": "am-ET-MekdesNeural",
# Arabic
"Hamdan (Male, AE)": "ar-AE-HamdanNeural",
"Ali (Male, BH)": "ar-BH-AliNeural",
"Ismael (Male, DZ)": "ar-DZ-IsmaelNeural",
"Shakir (Male, EG)": "ar-EG-ShakirNeural",
"Bassel (Male, IQ)": "ar-IQ-BasselNeural",
"Taim (Male, JO)": "ar-JO-TaimNeural",
"Fahed (Male, KW)": "ar-KW-FahedNeural",
"Rami (Male, LB)": "ar-LB-RamiNeural",
"Omar (Male, LY)": "ar-LY-OmarNeural",
"Jamal (Male, MA)": "ar-MA-JamalNeural",
"Abdullah (Male, OM)": "ar-OM-AbdullahNeural",
"Moaz (Male, QA)": "ar-QA-MoazNeural",
"Hamed (Male, SA)": "ar-SA-HamedNeural",
"Laith (Male, SY)": "ar-SY-LaithNeural",
"Hedi (Male, TN)": "ar-TN-HediNeural",
"Saleh (Male, YE)": "ar-YE-SalehNeural",
"Fatima (Female, AE)": "ar-AE-FatimaNeural",
"Laila (Female, BH)": "ar-BH-LailaNeural",
"Amina (Female, DZ)": "ar-DZ-AminaNeural",
"Salma (Female, EG)": "ar-EG-SalmaNeural",
"Rana (Female, IQ)": "ar-IQ-RanaNeural",
"Sana (Female, JO)": "ar-JO-SanaNeural",
"Noura (Female, KW)": "ar-KW-NouraNeural",
"Layla (Female, LB)": "ar-LB-LaylaNeural",
"Iman (Female, LY)": "ar-LY-ImanNeural",
"Mouna (Female, MA)": "ar-MA-MounaNeural",
"Aysha (Female, OM)": "ar-OM-AyshaNeural",
"Amal (Female, QA)": "ar-QA-AmalNeural",
"Zariyah (Female, SA)": "ar-SA-ZariyahNeural",
"Amany (Female, SY)": "ar-SY-AmanyNeural",
"Reem (Female, TN)": "ar-TN-ReemNeural",
"Maryam (Female, YE)": "ar-YE-MaryamNeural",
# Azerbaijani
"Babek (Male, AZ)": "az-AZ-BabekNeural",
"Banu (Female, AZ)": "az-AZ-BanuNeural",
# Bulgarian
"Borislav (Male, BG)": "bg-BG-BorislavNeural",
"Kalina (Female, BG)": "bg-BG-KalinaNeural",
# Bengali
"Pradeep (Male, BD)": "bn-BD-PradeepNeural",
"Bashkar (Male, IN)": "bn-IN-BashkarNeural",
"Nabanita (Female, BD)": "bn-BD-NabanitaNeural",
"Tanishaa (Female, IN)": "bn-IN-TanishaaNeural",
# Bosnian
"Goran (Male, BA)": "bs-BA-GoranNeural",
"Vesna (Female, BA)": "bs-BA-VesnaNeural",
# Catalan
"Enric (Male, ES)": "ca-ES-EnricNeural",
"Joana (Female, ES)": "ca-ES-JoanaNeural",
# Czech
"Antonin (Male, CZ)": "cs-CZ-AntoninNeural",
"Vlasta (Female, CZ)": "cs-CZ-VlastaNeural",
# Welsh
"Aled (Male, GB)": "cy-GB-AledNeural",
"Nia (Female, GB)": "cy-GB-NiaNeural",
# Danish
"Jeppe (Male, DK)": "da-DK-JeppeNeural",
"Christel (Female, DK)": "da-DK-ChristelNeural",
# German
"Jonas (Male, AT)": "de-AT-JonasNeural",
"Jan (Male, CH)": "de-CH-JanNeural",
"Conrad (Male, DE)": "de-DE-ConradNeural",
"Florian (Male, DE)": "de-DE-FlorianMultilingualNeural",
"Killian (Male, DE)": "de-DE-KillianNeural",
"Ingrid (Female, AT)": "de-AT-IngridNeural",
"Leni (Female, CH)": "de-CH-LeniNeural",
"Amala (Female, DE)": "de-DE-AmalaNeural",
"Katja (Female, DE)": "de-DE-KatjaNeural",
"Seraphina (Female, DE)": "de-DE-SeraphinaMultilingualNeural",
# Modern Greek
"Nestoras (Male, GR)": "el-GR-NestorasNeural",
"Athina (Female, GR)": "el-GR-AthinaNeural",
# English
"William (Male, AU)": "en-AU-WilliamNeural",
"Liam (Male, CA)": "en-CA-LiamNeural",
"Ryan (Male, GB)": "en-GB-RyanNeural",
"Thomas (Male, GB)": "en-GB-ThomasNeural",
"Sam (Male, HK)": "en-HK-SamNeural",
"Connor (Male, IE)": "en-IE-ConnorNeural",
"Prabhat (Male, IN)": "en-IN-PrabhatNeural",
"Chilemba (Male, KE)": "en-KE-ChilembaNeural",
"Abeo (Male, NG)": "en-NG-AbeoNeural",
"Mitchell (Male, NZ)": "en-NZ-MitchellNeural",
"James (Male, PH)": "en-PH-JamesNeural",
"Wayne (Male, SG)": "en-SG-WayneNeural",
"Elimu (Male, TZ)": "en-TZ-ElimuNeural",
"Andrew (Male, US)": "en-US-AndrewNeural",
"Andrew Multilingual (Male, US)": "en-US-AndrewMultilingualNeural",
"Brian (Male, US)": "en-US-BrianNeural",
"Brian Multilingual (Male, US)": "en-US-BrianMultilingualNeural",
"Christopher (Male, US)": "en-US-ChristopherNeural",
"Eric (Male, US)": "en-US-EricNeural",
"Guy (Male, US)": "en-US-GuyNeural",
"Roger (Male, US)": "en-US-RogerNeural",
"Steffan (Male, US)": "en-US-SteffanNeural",
"Luke (Male, ZA)": "en-ZA-LukeNeural",
"Natasha (Female, AU)": "en-AU-NatashaNeural",
"Clara (Female, CA)": "en-CA-ClaraNeural",
"Libby (Female, GB)": "en-GB-LibbyNeural",
"Maisie (Female, GB)": "en-GB-MaisieNeural",
"Sonia (Female, GB)": "en-GB-SoniaNeural",
"Yan (Female, HK)": "en-HK-YanNeural",
"Emily (Female, IE)": "en-IE-EmilyNeural",
"Neerja (Female, IN)": "en-IN-NeerjaNeural",
"Neerja Expressive (Female, IN)": "en-IN-NeerjaExpressiveNeural",
"Asilia (Female, KE)": "en-KE-AsiliaNeural",
"Ezinne (Female, NG)": "en-NG-EzinneNeural",
"Molly (Female, NZ)": "en-NZ-MollyNeural",
"Rosa (Female, PH)": "en-PH-RosaNeural",
"Luna (Female, SG)": "en-SG-LunaNeural",
"Imani (Female, TZ)": "en-TZ-ImaniNeural",
"Ana (Female, US)": "en-US-AnaNeural",
"Aria (Female, US)": "en-US-AriaNeural",
"Ava (Female, US)": "en-US-AvaNeural",
"Ava Multilingual (Female, US)": "en-US-AvaMultilingualNeural",
"Emma (Female, US)": "en-US-EmmaNeural",
"Emma Multilingual (Female, US)": "en-US-EmmaMultilingualNeural",
"Jenny (Female, US)": "en-US-JennyNeural",
"Michelle (Female, US)": "en-US-MichelleNeural",
"Leah (Female, ZA)": "en-ZA-LeahNeural",
# Spanish
"Tomas (Male, AR)": "es-AR-TomasNeural",
"Marcelo (Male, BO)": "es-BO-MarceloNeural",
"Lorenzo (Male, CL)": "es-CL-LorenzoNeural",
"Gonzalo (Male, CO)": "es-CO-GonzaloNeural",
"Juan (Male, CR)": "es-CR-JuanNeural",
"Manuel (Male, CU)": "es-CU-ManuelNeural",
"Emilio (Male, DO)": "es-DO-EmilioNeural",
"Luis (Male, EC)": "es-EC-LuisNeural",
"Alvaro (Male, ES)": "es-ES-AlvaroNeural",
"Javier (Male, GQ)": "es-GQ-JavierNeural",
"Andres (Male, GT)": "es-GT-AndresNeural",
"Carlos (Male, HN)": "es-HN-CarlosNeural",
"Jorge (Male, MX)": "es-MX-JorgeNeural",
"Federico (Male, NI)": "es-NI-FedericoNeural",
"Roberto (Male, PA)": "es-PA-RobertoNeural",
"Alex (Male, PE)": "es-PE-AlexNeural",
"Victor (Male, PR)": "es-PR-VictorNeural",
"Mario (Male, PY)": "es-PY-MarioNeural",
"Rodrigo (Male, SV)": "es-SV-RodrigoNeural",
"Alonso (Male, US)": "es-US-AlonsoNeural",
"Mateo (Male, UY)": "es-UY-MateoNeural",
"Sebastian (Male, VE)": "es-VE-SebastianNeural",
"Elena (Female, AR)": "es-AR-ElenaNeural",
"Sofia (Female, BO)": "es-BO-SofiaNeural",
"Catalina (Female, CL)": "es-CL-CatalinaNeural",
"Salome (Female, CO)": "es-CO-SalomeNeural",
"Maria (Female, CR)": "es-CR-MariaNeural",
"Belkys (Female, CU)": "es-CU-BelkysNeural",
"Ramona (Female, DO)": "es-DO-RamonaNeural",
"Andrea (Female, EC)": "es-EC-AndreaNeural",
"Elvira (Female, ES)": "es-ES-ElviraNeural",
"Ximena (Female, ES)": "es-ES-XimenaNeural",
"Teresa (Female, GQ)": "es-GQ-TeresaNeural",
"Marta (Female, GT)": "es-GT-MartaNeural",
"Karla (Female, HN)": "es-HN-KarlaNeural",
"Dalia (Female, MX)": "es-MX-DaliaNeural",
"Yolanda (Female, NI)": "es-NI-YolandaNeural",
"Margarita (Female, PA)": "es-PA-MargaritaNeural",
"Camila (Female, PE)": "es-PE-CamilaNeural",
"Karina (Female, PR)": "es-PR-KarinaNeural",
"Tania (Female, PY)": "es-PY-TaniaNeural",
"Lorena (Female, SV)": "es-SV-LorenaNeural",
"Paloma (Female, US)": "es-US-PalomaNeural",
"Valentina (Female, UY)": "es-UY-ValentinaNeural",
"Paola (Female, VE)": "es-VE-PaolaNeural",
# Estonian
"Kert (Male, EE)": "et-EE-KertNeural",
"Anu (Female, EE)": "et-EE-AnuNeural",
# Persian
"Farid (Male, IR)": "fa-IR-FaridNeural",
"Dilara (Female, IR)": "fa-IR-DilaraNeural",
# Finnish
"Harri (Male, FI)": "fi-FI-HarriNeural",
"Noora (Female, FI)": "fi-FI-NooraNeural",
# Filipino
"Angelo (Male, PH)": "fil-PH-AngeloNeural",
"Blessica (Female, PH)": "fil-PH-BlessicaNeural",
# French
"Gerard (Male, BE)": "fr-BE-GerardNeural",
"Antoine (Male, CA)": "fr-CA-AntoineNeural",
"Jean (Male, CA)": "fr-CA-JeanNeural",
"Thierry (Male, CA)": "fr-CA-ThierryNeural",
"Fabrice (Male, CH)": "fr-CH-FabriceNeural",
"Henri (Male, FR)": "fr-FR-HenriNeural",
"Remy (Male, FR)": "fr-FR-RemyMultilingualNeural",
"Charline (Female, BE)": "fr-BE-CharlineNeural",
"Sylvie (Female, CA)": "fr-CA-SylvieNeural",
"Ariane (Female, CH)": "fr-CH-ArianeNeural",
"Denise (Female, FR)": "fr-FR-DeniseNeural",
"Eloise (Female, FR)": "fr-FR-EloiseNeural",
"Vivienne (Female, FR)": "fr-FR-VivienneMultilingualNeural",
# Irish
"Colm (Male, IE)": "ga-IE-ColmNeural",
"Orla (Female, IE)": "ga-IE-OrlaNeural",
# Galician
"Roi (Male, ES)": "gl-ES-RoiNeural",
"Sabela (Female, ES)": "gl-ES-SabelaNeural",
# Gujarati
"Niranjan (Male, IN)": "gu-IN-NiranjanNeural",
"Dhwani (Female, IN)": "gu-IN-DhwaniNeural",
# Hebrew
"Avri (Male, IL)": "he-IL-AvriNeural",
"Hila (Female, IL)": "he-IL-HilaNeural",
# Hindi
"Madhur (Male, IN)": "hi-IN-MadhurNeural",
"Swara (Female, IN)": "hi-IN-SwaraNeural",
# Croatian
"Srecko (Male, HR)": "hr-HR-SreckoNeural",
"Gabrijela (Female, HR)": "hr-HR-GabrijelaNeural",
# Hungarian
"Tamas (Male, HU)": "hu-HU-TamasNeural",
"Noemi (Female, HU)": "hu-HU-NoemiNeural",
# Indonesian
"Ardi (Male, ID)": "id-ID-ArdiNeural",
"Gadis (Female, ID)": "id-ID-GadisNeural",
# Icelandic
"Gunnar (Male, IS)": "is-IS-GunnarNeural",
"Gudrun (Female, IS)": "is-IS-GudrunNeural",
# Italian
"Diego (Male, IT)": "it-IT-DiegoNeural",
"Giuseppe (Male, IT)": "it-IT-GiuseppeMult RichterNeural",
"Elsa (Female, IT)": "it-IT-ElsaNeural",
"Isabella (Female, IT)": "it-IT-IsabellaNeural",
# Inuktitut
"Taqqiq Cans (Male, CA)": "iu-Cans-CA-TaqqiqNeural",
"Taqqiq Latn (Male, CA)": "iu-Latn-CA-TaqqiqNeural",
"Siqiniq Cans (Female, CA)": "iu-Cans-CA-SiqiniqNeural",
"Siqiniq Latn (Female, CA)": "iu-Latn-CA-SiqiniqNeural",
# Japanese
"Keita (Male, JP)": "ja-JP-KeitaNeural",
"Nanami (Female, JP)": "ja-JP-NanamiNeural",
# Javanese
"Dimas (Male, ID)": "jv-ID-DimasNeural",
"Siti (Female, ID)": "jv-ID-SitiNeural",
# Georgian
"Giorgi (Male, GE)": "ka-GE-GiorgiNeural",
"Eka (Female, GE)": "ka-GE-EkaNeural",
# Kazakh
"Daulet (Male, KZ)": "kk-KZ-DauletNeural",
"Aigul (Female, KZ)": "kk-KZ-AigulNeural",
# Khmer
"Piseth (Male, KH)": "km-KH-PisethNeural",
"Sreymom (Female, KH)": "km-KH-SreymomNeural",
# Kannada
"Gagan (Male, IN)": "kn-IN-GaganNeural",
"Sapna (Female, IN)": "kn-IN-SapnaNeural",
# Korean
"Hyunsu (Male, KR)": "ko-KR-HyunsuMultilingualNeural",
"InJoon (Male, KR)": "ko-KR-InJoonNeural",
"SunHi (Female, KR)": "ko-KR-SunHiNeural",
# Lao
"Chanthavong (Male, LA)": "lo-LA-ChanthavongNeural",
"Keomany (Female, LA)": "lo-LA-KeomanyNeural",
# Lithuanian
"Leonas (Male, LT)": "lt-LT-LeonasNeural",
"Ona (Female, LT)": "lt-LT-OnaNeural",
# Latvian
"Nils (Male, LV)": "lv-LV-NilsNeural",
"Everita (Female, LV)": "lv-LV-EveritaNeural",
# Macedonian
"Aleksandar (Male, MK)": "mk-MK-AleksandarNeural",
"Marija (Female, MK)": "mk-MK-MarijaNeural",
# Malayalam
"Midhun (Male, IN)": "ml-IN-MidhunNeural",
"Sobhana (Female, IN)": "ml-IN-SobhanaNeural",
# Mongolian
"Bataa (Male, MN)": "mn-MN-BataaNeural",
"Yesui (Female, MN)": "mn-MN-YesuiNeural",
# Marathi
"Manohar (Male, IN)": "mr-IN-ManoharNeural",
"Aarohi (Female, IN)": "mr-IN-AarohiNeural",
# Malay
"Osman (Male, MY)": "ms-MY-OsmanNeural",
"Yasmin (Female, MY)": "ms-MY-YasminNeural",
# Maltese
"Joseph (Male, MT)": "mt-MT-JosephNeural",
"Grace (Female, MT)": "mt-MT-GraceNeural",
# Burmese
"Thiha (Male, MM)": "my-MM-ThihaNeural",
"Nilar (Female, MM)": "my-MM-NilarNeural",
# Norwegian Bokmål
"Finn (Male, NO)": "nb-NO-FinnNeural",
"Pernille (Female, NO)": "nb-NO-PernilleNeural",
# Nepali
"Sagar (Male, NP)": "ne-NP-SagarNeural",
"Hemkala (Female, NP)": "ne-NP-HemkalaNeural",
# Dutch
"Arnaud (Male, BE)": "nl-BE-ArnaudNeural",
"Maarten (Male, NL)": "nl-NL-MaartenNeural",
"Dena (Female, BE)": "nl-BE-DenaNeural",
"Colette (Female, NL)": "nl-NL-ColetteNeural",
"Fenna (Female, NL)": "nl-NL-FennaNeural",
# Polish
"Marek (Male, PL)": "pl-PL-MarekNeural",
"Zofia (Female, PL)": "pl-PL-ZofiaNeural",
# Pushto
"GulNawaz (Male, AF)": "ps-AF-GulNawazNeural",
"Latifa (Female, AF)": "ps-AF-LatifaNeural",
# Portuguese
"Antonio (Male, BR)": "pt-BR-AntonioNeural",
"Duarte (Male, PT)": "pt-PT-DuarteNeural",
"Francisca (Female, BR)": "pt-BR-FranciscaNeural",
"Thalita (Female, BR)": "pt-BR-ThalitaMultilingualNeural",
"Raquel (Female, PT)": "pt-PT-RaquelNeural",
# Romanian
"Emil (Male, RO)": "ro-RO-EmilNeural",
"Alina (Female, RO)": "ro-RO-AlinaNeural",
# Russian
"Dmitry (Male, RU)": "ru-RU-DmitryNeural",
"Svetlana (Female, RU)": "ru-RU-SvetlanaNeural",
# Sinhala
"Sameera (Male, LK)": "si-LK-SameeraNeural",
"Thilini (Female, LK)": "si-LK-ThiliniNeural",
# Slovak
"Lukas (Male, SK)": "sk-SK-LukasNeural",
"Viktoria (Female, SK)": "sk-SK-ViktoriaNeural",
# Slovenian
"Rok (Male, SI)": "sl-SI-RokNeural",
"Petra (Female, SI)": "sl-SI-PetraNeural",
# Somali
"Muuse (Male, SO)": "so-SO-MuuseNeural",
"Ubax (Female, SO)": "so-SO-UbaxNeural",
# Albanian
"Ilir (Male, AL)": "sq-AL-IlirNeural",
"Anila (Female, AL)": "sq-AL-AnilaNeural",
# Serbian
"Nicholas (Male, RS)": "sr-RS-NicholasNeural",
"Sophie (Female, RS)": "sr-RS-SophieNeural",
# Sundanese
"Jajang (Male, ID)": "su-ID-JajangNeural",
"Tuti (Female, ID)": "su-ID-TutiNeural",
# Swedish
"Mattias (Male, SE)": "sv-SE-MattiasNeural",
"Sofie (Female, SE)": "sv-SE-SofieNeural",
# Swahili
"Rafiki (Male, KE)": "sw-KE-RafikiNeural",
"Daudi (Male, TZ)": "sw-TZ-DaudiNeural",
"Zuri (Female, KE)": "sw-KE-ZuriNeural",
"Rehema (Female, TZ)": "sw-TZ-RehemaNeural",
# Tamil
"Valluvar (Male, IN)": "ta-IN-ValluvarNeural",
"Kumar (Male, LK)": "ta-LK-KumarNeural",
"Surya (Male, MY)": "ta-MY-SuryaNeural",
"Anbu (Male, SG)": "ta-SG-AnbuNeural",
"Pallavi (Female, IN)": "ta-IN-PallaviNeural",
"Saranya (Female, LK)": "ta-LK-SaranyaNeural",
"Kani (Female, MY)": "ta-MY-KaniNeural",
"Venba (Female, SG)": "ta-SG-VenbaNeural",
# Telugu
"Mohan (Male, IN)": "te-IN-MohanNeural",
"Shruti (Female, IN)": "te-IN-ShrutiNeural",
# Thai
"Niwat (Male, TH)": "th-TH-NiwatNeural",
"Premwadee (Female, TH)": "th-TH-PremwadeeNeural",
# Turkish
"Ahmet (Male, TR)": "tr-TR-AhmetNeural",
"Emel (Female, TR)": "tr-TR-EmelNeural",
# Ukrainian
"Ostap (Male, UA)": "uk-UA-OstapNeural",
"Polina (Female, UA)": "uk-UA-PolinaNeural",
# Urdu
"Salman (Male, IN)": "ur-IN-SalmanNeural",
"Asad (Male, PK)": "ur-PK-AsadNeural",
"Gul (Female, IN)": "ur-IN-GulNeural",
"Uzma (Female, PK)": "ur-PK-UzmaNeural",
# Uzbek
"Sardor (Male, UZ)": "uz-UZ-SardorNeural",
"Madina (Female, UZ)": "uz-UZ-MadinaNeural",
# Vietnamese
"NamMinh (Male, VN)": "vi-VN-NamMinhNeural",
"HoaiMy (Female, VN)": "vi-VN-HoaiMyNeural",
# Chinese
"Yunjian (Male, CN)": "zh-CN-YunjianNeural",
"Yunxi (Male, CN)": "zh-CN-YunxiNeural",
"Yunxia (Male, CN)": "zh-CN-YunxiaNeural",
"Yunyang (Male, CN)": "zh-CN-YunyangNeural",
"WanLung (Male, HK)": "zh-HK-WanLungNeural",
"YunJhe (Male, TW)": "zh-TW-YunJheNeural",
"Xiaoxiao (Female, CN)": "zh-CN-XiaoxiaoNeural",
"Xiaoyi (Female, CN)": "zh-CN-XiaoyiNeural",
"Xiaobei (Female, Liaoning, CN)": "zh-CN-liaoning-XiaobeiNeural",
"Xiaoni (Female, Shaanxi, CN)": "zh-CN-shaanxi-XiaoniNeural",
"HiuGaai (Female, HK)": "zh-HK-HiuGaaiNeural",
"HiuMaan (Female, HK)": "zh-HK-HiuMaanNeural",
"HsiaoChen (Female, TW)": "zh-TW-HsiaoChenNeural",
"HsiaoYu (Female, TW)": "zh-TW-HsiaoYuNeural",
# Zulu
"Themba (Male, ZA)": "zu-ZA-ThembaNeural",
"Thando (Female, ZA)": "zu-ZA-ThandoNeural",
}
def text_to_speech(text: str, voice: str) -> str:
"""Wrapper function to run async code and return audio file"""
if not text or not voice:
return None
return asyncio.run(generate_speech(text, VOICES.get(voice, VOICES["Jenny (Female, US)"])))
with gr.Blocks(title="Text-to-Speech", theme="soft") as demo:
gr.Markdown("## Text-to-Speech Converter")
text_input = gr.Textbox(
label="Enter your text",
placeholder="Type or paste your text here...",
lines=5,
max_lines=10
)
voice_dropdown = gr.Dropdown(
choices=list(VOICES.keys()),
label="Select Voice",
value="Jenny (Female, US)"
)
generate_btn = gr.Button("Generate Speech", variant="primary")
audio_output = gr.Audio(label="Listen to Speech", autoplay=True)
generate_btn.click(
fn=text_to_speech,
inputs=[text_input, voice_dropdown],
outputs=audio_output
)
if __name__ == "__main__":
demo.launch(share=True) # Set share=True for public link (remove for local only)