AI_Qari_Bot / app.py
asad231's picture
Update app.py
315c564 verified
raw
history blame
22.7 kB
# 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()