# import gradio as gr # import requests # from TTS.api import TTS # import os # # ✅ Load TTS model (Make sure model is downloaded or install TTS first) # tts = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts") # # ✅ Get Ayah from AlQuran API # def get_quran_ayat(surah_num, ayat_num): # try: # url = f"https://api.alquran.cloud/v1/ayah/{surah_num}:{ayat_num}/editions/quran-simple,en.asad" # response = requests.get(url) # response.raise_for_status() # data = response.json() # if "data" in data and len(data["data"]) >= 2: # arabic_text = data["data"][0]["text"] # translation = data["data"][1]["text"] # return arabic_text, translation # else: # return "❌ Ayah not found.", "❌ Translation not found." # except Exception as e: # return f"❌ API Error: {e}", "" # # ✅ Gradio main function # def qari_bot(surah, ayah): # arabic_text, translation = get_quran_ayat(surah, ayah) # # Return early if error # if "❌" in arabic_text: # return arabic_text, translation, None # # Generate audio and save to file # output_path = "ayat.wav" # try: # tts.tts_to_file( # text=arabic_text, # file_path=output_path, # language="ar" # ) # return arabic_text, translation, output_path # except Exception as e: # return arabic_text, translation, f"❌ TTS Error: {e}" # # ✅ Gradio Interface # interface = gr.Interface( # fn=qari_bot, # inputs=[ # gr.Number(label="Surah Number", value=1), # gr.Number(label="Ayah Number", value=1) # ], # outputs=[ # gr.Textbox(label="📜 Arabic Ayah"), # gr.Textbox(label="🌐 Translation (English)"), # gr.Audio(label="🔊 Listen to Ayah") # ], # title="📖 AI Qari Bot", # description="Enter Surah & Ayah number to hear the Quran Ayah with AI voice and English translation. Example: Surah 1, Ayah 1 = Al-Fatiha" # ) # interface.launch() # import gradio as gr # import requests # from TTS.api import TTS # # 🔁 Map Surah names to numbers # surah_map = { # "Al-Fatiha": 1, # "Al-Baqarah": 2, # "Aal-i-Imran": 3, # "An-Nisa": 4, # "Al-Ma'idah": 5, # "Al-An'am": 6, # "Al-A'raf": 7, # "Al-Anfal": 8, # "At-Tawbah": 9, # "Yunus": 10, # # ➕ Add more if needed... # } # # ✅ Load multilingual TTS model # tts = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts") # # 📖 Fetch full Surah (Arabic + English) # def fetch_surah(surah_name): # surah_num = surah_map.get(surah_name) # if not surah_num: # return "Invalid Surah name.", "", None # try: # url = f"https://api.alquran.cloud/v1/surah/{surah_num}/editions/quran-simple,en.asad" # response = requests.get(url) # response.raise_for_status() # data = response.json() # if 'data' in data and len(data['data']) == 2: # arabic_ayahs = data['data'][0]['ayahs'] # english_ayahs = data['data'][1]['ayahs'] # arabic_text = "\n".join([a['text'] for a in arabic_ayahs]) # english_text = "\n".join([e['text'] for e in english_ayahs]) # # Generate audio # audio_path = "surah.wav" # tts.tts_to_file(text=arabic_text, file_path=audio_path, language="ar") # return arabic_text, english_text, audio_path # else: # return "❌ Surah not found.", "", None # except Exception as e: # return f"❌ API Error: {e}", "", None # # 🎛️ Gradio UI # interface = gr.Interface( # fn=fetch_surah, # inputs=gr.Dropdown(choices=list(surah_map.keys()), label="Select Surah"), # outputs=[ # gr.Textbox(label="📜 Arabic Ayahs"), # gr.Textbox(label="🌐 English Translation"), # gr.Audio(label="🔊 Arabic Voice Recitation") # ], # title="📖 AI Qari Bot", # description="Select a Surah name to listen to Arabic AI recitation with English translation." # ) # interface.launch() # import gradio as gr # import requests # from TTS.api import TTS # # 🔁 Surah name mapping # surah_map = { # "Al-Fatiha": 1, # "Al-Baqarah": 2, # "Aal-i-Imran": 3, # "An-Nisa": 4, # "Al-Ma'idah": 5, # "Al-An'am": 6, # "Al-A'raf": 7, # "Al-Anfal": 8, # "At-Tawbah": 9, # "Yunus": 10, # # Add more if needed # } # # ✅ Load TTS model with speaker # tts = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts") # available_speakers = tts.speakers # default_speaker = available_speakers[0] # Pick the first available speaker # # 📖 Fetch Surah # def fetch_surah(surah_name): # surah_num = surah_map.get(surah_name) # if not surah_num: # return "❌ Invalid Surah name.", "", None # try: # url = f"https://api.alquran.cloud/v1/surah/{surah_num}/editions/quran-simple,en.asad" # response = requests.get(url) # response.raise_for_status() # data = response.json() # if 'data' in data and len(data['data']) == 2: # arabic_ayahs = data['data'][0]['ayahs'] # english_ayahs = data['data'][1]['ayahs'] # arabic_text = "\n".join([a['text'] for a in arabic_ayahs]) # english_text = "\n".join([e['text'] for e in english_ayahs]) # # 🔊 Generate voice # audio_path = "surah.wav" # tts.tts_to_file( # text=arabic_text, # speaker=default_speaker, # language="ar", # file_path=audio_path # ) # return arabic_text, english_text, audio_path # else: # return "❌ Surah not found.", "", None # except Exception as e: # return f"❌ API Error: {e}", "", None # # 🎛️ Gradio UI # interface = gr.Interface( # fn=fetch_surah, # inputs=gr.Dropdown(choices=list(surah_map.keys()), label="Select Surah"), # outputs=[ # gr.Textbox(label="📜 Arabic Ayahs"), # gr.Textbox(label="🌐 English Translation"), # gr.Audio(label="🔊 Arabic Voice Recitation") # ], # title="📖 AI Qari Bot", # description=f"Select a Surah to hear AI recitation. Model speaker used: {default_speaker}" # ) # interface.launch() # import gradio as gr # import requests # from TTS.api import TTS # # 📚 Surah names and numbers (partial shown, full in full code) # surah_info = { # "Al-Fatiha": (1, 7), # "Al-Baqarah": (2, 286), # "Aal-i-Imran": (3, 200), # "An-Nisa": (4, 176), # "Al-Ma'idah": (5, 120), # "Al-An'am": (6, 165), # "Al-A'raf": (7, 206), # "Al-Anfal": (8, 75), # "At-Tawbah": (9, 129), # "Yunus": (10, 109), # # ➕ Add all 114 surahs with total ayats here # } # # ✅ Load TTS model # tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2") # speaker = "random" # or "en_0", "ar_0" # # 🎧 Main Function # def ai_quran(surah_name, ayat_num, mode): # surah_num, total_ayats = surah_info.get(surah_name, (None, None)) # if not surah_num: # return "Invalid Surah", "", None # if mode == "Full Surah": # url = f"https://api.alquran.cloud/v1/surah/{surah_num}/editions/quran-simple,en.asad" # else: # Single Ayah # if ayat_num < 1 or ayat_num > total_ayats: # return "❌ Invalid Ayat number", "", None # url = f"https://api.alquran.cloud/v1/ayah/{surah_num}:{ayat_num}/editions/quran-simple,en.asad" # try: # res = requests.get(url) # res.raise_for_status() # data = res.json() # if mode == "Full Surah": # arabic_ayahs = data['data'][0]['ayahs'] # english_ayahs = data['data'][1]['ayahs'] # arabic_text = "\n".join([a['text'] for a in arabic_ayahs]) # english_text = "\n".join([e['text'] for e in english_ayahs]) # else: # arabic_text = data['data'][0]['text'] # english_text = data['data'][1]['text'] # # 🔊 Generate TTS # audio_path = "ayat.wav" # tts.tts_to_file( # text=arabic_text, # speaker=speaker, # language="ar", # file_path=audio_path # ) # return arabic_text, english_text, audio_path # except Exception as e: # return f"API Error: {e}", "", None # # 🧠 Mode Selector # def update_ayat_field(mode, surah): # if mode == "Full Surah": # return gr.update(visible=False) # return gr.update(visible=True, maximum=surah_info[surah][1]) # # 🎛️ Gradio Interface # with gr.Blocks(title="📖 AI Quran Reciter") as demo: # gr.Markdown("### 📖 AI Quran Reciter with Voice | XTTSv2 Arabic TTS") # with gr.Row(): # mode = gr.Radio(["Full Surah", "Single Ayat"], value="Full Surah", label="Mode") # surah = gr.Dropdown(choices=list(surah_info.keys()), label="Select Surah", value="Al-Fatiha") # ayat = gr.Number(label="Ayat Number", visible=False) # run = gr.Button("📥 Recite") # arabic = gr.Textbox(label="📜 Arabic Text") # english = gr.Textbox(label="🌐 English Translation") # audio = gr.Audio(label="🔊 Listen") # # Event handlers # mode.change(update_ayat_field, inputs=[mode, surah], outputs=ayat) # surah.change(update_ayat_field, inputs=[mode, surah], outputs=ayat) # run.click(fn=ai_quran, inputs=[surah, ayat, mode], outputs=[arabic, english, audio]) # demo.launch() # import os # import gradio as gr # import requests # from TTS.api import TTS # # ✅ Accept Coqui TTS license # os.environ["COQUI_TOS_AGREED"] = "1" # # 🔁 Surah info: name -> (number, total ayats) # surah_info = { # "Al-Fatiha": (1, 7), # "Al-Baqarah": (2, 286), # "Aal-i-Imran": (3, 200), # "An-Nisa": (4, 176), # "Al-Ma'idah": (5, 120), # "Al-An'am": (6, 165), # "Al-A'raf": (7, 206), # "Al-Anfal": (8, 75), # "At-Tawbah": (9, 129), # "Yunus": (10, 109), # "Hud": (11, 123), # "Yusuf": (12, 111), # "Ar-Ra'd": (13, 43), # "Ibrahim": (14, 52), # "Al-Hijr": (15, 99), # "An-Nahl": (16, 128), # "Al-Isra": (17, 111), # "Al-Kahf": (18, 110), # "Maryam": (19, 98), # "Taha": (20, 135), # # 👉 Add remaining up to Surah 114 # "An-Nas": (114, 6), # } # # ✅ Load TTS with Arabic + speaker support # tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2") # speaker = "random" # or use "en_0", "ar_0" etc. # # 📖 Main function # def ai_quran(surah_name, ayat_num, mode): # surah_num, total_ayats = surah_info.get(surah_name, (None, None)) # if not surah_num: # return "Invalid Surah", "", None # if mode == "Full Surah": # url = f"https://api.alquran.cloud/v1/surah/{surah_num}/editions/quran-simple,en.asad" # else: # Single Ayah # if not ayat_num or ayat_num < 1 or ayat_num > total_ayats: # return f"❌ Ayat number must be between 1 and {total_ayats}", "", None # url = f"https://api.alquran.cloud/v1/ayah/{surah_num}:{ayat_num}/editions/quran-simple,en.asad" # try: # res = requests.get(url) # res.raise_for_status() # data = res.json() # if mode == "Full Surah": # arabic_ayahs = data['data'][0]['ayahs'] # english_ayahs = data['data'][1]['ayahs'] # arabic_text = "\n".join([a['text'] for a in arabic_ayahs]) # english_text = "\n".join([e['text'] for e in english_ayahs]) # else: # arabic_text = data['data'][0]['text'] # english_text = data['data'][1]['text'] # # 🔊 Generate TTS # audio_path = "ayat.wav" # tts.tts_to_file( # text=arabic_text, # speaker=speaker, # language="ar", # file_path=audio_path # ) # return arabic_text, english_text, audio_path # except Exception as e: # return f"API Error: {e}", "", None # # 🧠 Ayat field visibility toggle # def toggle_ayat(mode, surah): # if mode == "Full Surah": # return gr.update(visible=False) # return gr.update(visible=True, maximum=surah_info[surah][1]) # # 🎛️ Gradio UI # with gr.Blocks(title="📖 AI Quran Reciter") as demo: # gr.Markdown("## 📖 AI Quran Reciter with Arabic Voice | XTTSv2 Model") # with gr.Row(): # mode = gr.Radio(["Full Surah", "Single Ayat"], label="Mode", value="Full Surah") # surah = gr.Dropdown(choices=list(surah_info.keys()), label="Surah", value="Al-Fatiha") # ayat = gr.Number(label="Ayat Number", visible=False) # recite_btn = gr.Button("📥 Recite") # arabic = gr.Textbox(label="📜 Arabic Text") # english = gr.Textbox(label="🌐 English Translation") # audio = gr.Audio(label="🔊 Listen") # # Event hooks # mode.change(toggle_ayat, inputs=[mode, surah], outputs=ayat) # surah.change(toggle_ayat, inputs=[mode, surah], outputs=ayat) # recite_btn.click(ai_quran, inputs=[surah, ayat, mode], outputs=[arabic, english, audio]) # demo.launch() # import os # import gradio as gr # import requests # from TTS.api import TTS # # ✅ Accept Coqui license for Hugging Face Space # os.environ["COQUI_TOS_AGREED"] = "1" # # ✅ Fix PyTorch 2.6 checkpoint loading issue # import torch # from torch.serialization import add_safe_globals # from TTS.tts.configs.xtts_config import XttsConfig # add_safe_globals([XttsConfig]) # # ✅ Load multilingual XTTSv2 model (speaker supported) # tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2") # speaker_wav = None # Optional: path to your own .wav voice file # # Surah list with Ayah counts (can be extended) # surah_info = { # "Al-Fatiha": (1, 7), # "Al-Baqarah": (2, 286), # "Aal-i-Imran": (3, 200), # "An-Nisa": (4, 176), # "Al-Ma'idah": (5, 120), # "Al-An'am": (6, 165), # "Al-A'raf": (7, 206), # "Al-Anfal": (8, 75), # "At-Tawbah": (9, 129), # "Yunus": (10, 109), # "Hud": (11, 123), # "Yusuf": (12, 111), # "Ar-Ra'd": (13, 43), # "Ibrahim": (14, 52), # "Al-Hijr": (15, 99), # "An-Nahl": (16, 128), # "Al-Isra": (17, 111), # "Al-Kahf": (18, 110), # "Maryam": (19, 98), # "Taha": (20, 135), # "Al-Anbiya": (21, 112), # "Al-Hajj": (22, 78), # "Al-Mu'minun": (23, 118), # "An-Nur": (24, 64), # "Al-Furqan": (25, 77), # "Ash-Shu'ara": (26, 227), # "An-Naml": (27, 93), # "Al-Qasas": (28, 88), # "Al-Ankabut": (29, 69), # "Ar-Rum": (30, 60), # "Luqman": (31, 34), # "As-Sajda": (32, 30), # "Al-Ahzab": (33, 73), # "Saba": (34, 54), # "Fatir": (35, 45), # "Ya-Sin": (36, 83), # "As-Saffat": (37, 182), # "Sad": (38, 88), # "Az-Zumar": (39, 75), # "Ghafir": (40, 85), # "Fussilat": (41, 54), # "Ash-Shura": (42, 53), # "Az-Zukhruf": (43, 89), # "Ad-Dukhan": (44, 59), # "Al-Jathiya": (45, 37), # "Al-Ahqaf": (46, 35), # "Muhammad": (47, 38), # "Al-Fath": (48, 29), # "Al-Hujurat": (49, 18), # "Qaf": (50, 45), # "Adh-Dhariyat": (51, 60), # "At-Tur": (52, 49), # "An-Najm": (53, 62), # "Al-Qamar": (54, 55), # "Ar-Rahman": (55, 78), # "Al-Waqia": (56, 96), # "Al-Hadid": (57, 29), # "Al-Mujadila": (58, 22), # "Al-Hashr": (59, 24), # "Al-Mumtahina": (60, 13), # "As-Saff": (61, 14), # "Al-Jumu'a": (62, 11), # "Al-Munafiqun": (63, 11), # "At-Taghabun": (64, 18), # "At-Talaq": (65, 12), # "At-Tahrim": (66, 12), # "Al-Mulk": (67, 30), # "Al-Qalam": (68, 52), # "Al-Haqqa": (69, 52), # "Al-Ma'arij": (70, 44), # "Nuh": (71, 28), # "Al-Jinn": (72, 28), # "Al-Muzzammil": (73, 20), # "Al-Muddaththir": (74, 56), # "Al-Qiyamah": (75, 40), # "Al-Insan": (76, 31), # "Al-Mursalat": (77, 50), # "An-Naba": (78, 40), # "An-Nazi'at": (79, 46), # "Abasa": (80, 42), # "At-Takwir": (81, 29), # "Al-Infitar": (82, 19), # "Al-Mutaffifin": (83, 36), # "Al-Inshiqaq": (84, 25), # "Al-Buruj": (85, 22), # "At-Tariq": (86, 17), # "Al-A'la": (87, 19), # "Al-Ghashiyah": (88, 26), # "Al-Fajr": (89, 30), # "Al-Balad": (90, 20), # "Ash-Shams": (91, 15), # "Al-Layl": (92, 21), # "Ad-Duha": (93, 11), # "Ash-Sharh": (94, 8), # "At-Tin": (95, 8), # "Al-Alaq": (96, 19), # "Al-Qadr": (97, 5), # "Al-Bayyina": (98, 8), # "Az-Zalzalah": (99, 8), # "Al-Adiyat": (100, 11), # "Al-Qari'a": (101, 11), # "At-Takathur": (102, 8), # "Al-Asr": (103, 3), # "Al-Humazah": (104, 9), # "Al-Fil": (105, 5), # "Quraysh": (106, 4), # "Al-Ma'un": (107, 7), # "Al-Kawthar": (108, 3), # "Al-Kafirun": (109, 6), # "An-Nasr": (110, 3), # "Al-Masad": (111, 5), # "Al-Ikhlas": (112, 4), # "Al-Falaq": (113, 5), # "An-Nas": (114, 6) # } # def recite_quran(surah_name, ayah_number, mode): # surah_num, total_ayahs = surah_info[surah_name] # if mode == "Full Surah": # url = f"https://api.alquran.cloud/v1/surah/{surah_num}/editions/quran-simple,en.asad" # else: # if not (1 <= ayah_number <= total_ayahs): # return f"Ayat must be between 1 and {total_ayahs}", "", None # url = f"https://api.alquran.cloud/v1/ayah/{surah_num}:{ayah_number}/editions/quran-simple,en.asad" # try: # res = requests.get(url) # res.raise_for_status() # data = res.json() # if mode == "Full Surah": # arabic = "\n".join([a['text'] for a in data['data'][0]['ayahs']]) # english = "\n".join([a['text'] for a in data['data'][1]['ayahs']]) # else: # arabic = data['data'][0]['text'] # english = data['data'][1]['text'] # audio_path = "output.wav" # tts.tts_to_file( # text=arabic, # speaker_wav=speaker_wav, # language="ar", # file_path=audio_path # ) # return arabic, english, audio_path # except Exception as e: # return f"❌ Error: {e}", "", None # def toggle_ayah_visibility(mode, surah): # if mode == "Full Surah": # return gr.update(visible=False) # return gr.update(visible=True, maximum=surah_info[surah][1]) # # Gradio Interface # with gr.Blocks(title="📖 Quran AI Reader (with Speaker)") as demo: # gr.Markdown("## 🕌 AI Quran Reciter using XTTSv2 (Arabic Voice with Speaker)") # with gr.Row(): # mode = gr.Radio(["Full Surah", "Single Ayat"], label="Mode", value="Full Surah") # surah = gr.Dropdown(choices=list(surah_info.keys()), label="Surah", value="Al-Fatiha") # ayah = gr.Number(label="Ayat Number", visible=False) # recite_btn = gr.Button("🎧 Recite") # arabic_box = gr.Textbox(label="📜 Arabic Text") # english_box = gr.Textbox(label="🌐 English Translation") # audio_output = gr.Audio(label="🔊 Listen") # mode.change(toggle_ayah_visibility, inputs=[mode, surah], outputs=ayah) # surah.change(toggle_ayah_visibility, inputs=[mode, surah], outputs=ayah) # recite_btn.click(recite_quran, inputs=[surah, ayah, mode], outputs=[arabic_box, english_box, audio_output]) # demo.launch() # app.py # app.py # import gradio as gr # import requests # import torch # from TTS.api import TTS # ✅ This is the correct class # import TTS.tts.configs.xtts_config # import TTS.tts.models.xtts # # ✅ Required for PyTorch 2.6+ for XTTS models # torch.serialization.add_safe_globals([ # TTS.tts.configs.xtts_config.XttsConfig, # TTS.tts.models.xtts.XttsAudioConfig # ]) # # ✅ Load XTTS v2 Model (Arabic + Speaker Cloning Support) # tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2") # # ✅ Fetch Full Surah in Arabic & English # def get_surah_text(surah_name): # try: # url = f"https://api.alquran.cloud/v1/surah/{surah_name}/editions/quran-simple,en.asad" # response = requests.get(url) # response.raise_for_status() # data = response.json() # if 'data' in data and len(data['data']) == 2: # arabic = "\n".join([a['text'] for a in data['data'][0]['ayahs']]) # translation = "\n".join([t['text'] for t in data['data'][1]['ayahs']]) # return arabic, translation # return "Surah not found.", "Translation not found." # except Exception as e: # return f"API Error: {e}", "" # # ✅ Gradio Inference Function # def qari_bot(surah_name, speaker_audio): # arabic_text, translation = get_surah_text(surah_name) # if "Error" in arabic_text or "not found" in arabic_text: # return arabic_text, translation, None # # ✅ Generate TTS with optional speaker audio # tts.tts_to_file( # text=arabic_text, # speaker_wav=speaker_audio if speaker_audio else None, # language="ar", # file_path="output.wav" # ) # return arabic_text, translation, "output.wav" # # ✅ Gradio Interface # interface = gr.Interface( # fn=qari_bot, # inputs=[ # gr.Textbox(label="Surah Name (e.g., Al-Fatiha, An-Nas)", placeholder="Enter Surah name"), # gr.Audio(label="Upload Speaker Audio (Optional)", type="filepath") # ], # outputs=[ # gr.Textbox(label="📜 Arabic Text"), # gr.Textbox(label="🌐 English Translation"), # gr.Audio(label="🔊 Quran Recitation") # ], # title="🕌 AI Qari Bot", # description="Enter a Surah name to hear full Arabic recitation with optional speaker voice." # ) # interface.launch() import gradio as gr import torch from TTS.api import TTS # ✅ Correct import # ✅ XTTS config safe for PyTorch 2.6 import TTS.tts.configs.xtts_config import TTS.tts.models.xtts torch.serialization.add_safe_globals([ TTS.tts.configs.xtts_config.XttsConfig, TTS.tts.models.xtts.XttsAudioConfig ]) # ✅ Load XTTS v2 model tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2") # ✅ Simple example function def generate_voice(text): tts.tts_to_file( text=text, file_path="voice.wav", language="en" # change to "ar" for Arabic ) return "voice.wav" # ✅ Gradio interface gr.Interface( fn=generate_voice, inputs=gr.Textbox(label="Enter text to speak"), outputs=gr.Audio(label="Generated Audio"), title="AI Voice (XTTS v2)", description="Enter text and get AI voice using XTTS v2 model" ).launch()