saudi-tts-demo / app.py
AhmedEladl's picture
Update app.py
5103a8a verified
import gradio as gr
import os
import torch
import torchaudio
import tempfile
import subprocess
import sys
from pathlib import Path
# Install dependencies
def install_dependencies():
"""Install required packages"""
try:
# Clone the model repository
if not os.path.exists('saudi-tts'):
subprocess.run(['git', 'clone', 'https://huggingface.co/AhmedEladl/saudi-tts'], check=True)
# Install TTS and other dependencies
subprocess.run([sys.executable, '-m', 'pip', 'install', 'git+https://github.com/coqui-ai/TTS'], check=True)
subprocess.run([sys.executable, '-m', 'pip', 'install', 'transformers==4.37.1'], check=True)
subprocess.run([sys.executable, '-m', 'pip', 'install', 'deepspeed'], check=True)
return True
except Exception as e:
print(f"Error installing dependencies: {e}")
return False
# Global variables for model
model = None
gpt_cond_latent = None
speaker_embedding = None
def load_model():
"""Load the XTTS model"""
global model, gpt_cond_latent, speaker_embedding
try:
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
# Define paths
CONFIG_FILE_PATH = 'saudi-tts/config.json'
VOCAB_FILE_PATH = 'saudi-tts/vocab.json'
MODEL_PATH = 'saudi-tts/'
SPEAKER_AUDIO_PATH = 'saudi-tts/speaker.wav'
print("Loading model configuration...")
config = XttsConfig()
config.load_json(CONFIG_FILE_PATH)
print("Initializing model...")
model = Xtts.init_from_config(config)
print("Loading model checkpoint...")
model.load_checkpoint(
config,
checkpoint_dir=MODEL_PATH,
use_deepspeed=False, # Set to False for CPU or change based on your setup
vocab_path=VOCAB_FILE_PATH
)
# Move to GPU if available
if torch.cuda.is_available():
model.cuda()
print("Model moved to GPU")
else:
print("Using CPU")
print("Computing speaker latents...")
gpt_cond_latent, speaker_embedding = model.get_conditioning_latents(
audio_path=[SPEAKER_AUDIO_PATH]
)
print("Model loaded successfully!")
return True
except Exception as e:
print(f"Error loading model: {e}")
return False
def generate_speech(text, temperature=0.75):
"""Generate speech from Arabic text"""
global model, gpt_cond_latent, speaker_embedding
if model is None:
return None, "Model not loaded. Please wait for initialization."
if not text.strip():
return None, "Please enter some text to convert to speech."
try:
print(f"Generating speech for: {text}")
# Generate speech
out = model.inference(
text,
"ar", # Arabic language code
gpt_cond_latent,
speaker_embedding,
temperature=temperature,
)
# Save to temporary file
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_file:
temp_path = tmp_file.name
# Convert output to tensor and save
audio_tensor = torch.tensor(out["wav"]).unsqueeze(0)
torchaudio.save(temp_path, audio_tensor, 24000)
return temp_path, "Speech generated successfully!"
except Exception as e:
error_msg = f"Error generating speech: {str(e)}"
print(error_msg)
return None, error_msg
# Initialize the app
def initialize_app():
"""Initialize the application"""
print("Installing dependencies...")
if not install_dependencies():
return False
print("Loading model...")
if not load_model():
return False
return True
# Create Gradio interface
def create_interface():
"""Create the Gradio interface"""
with gr.Blocks(title="Saudi Arabic TTS", theme=gr.themes.Soft()) as interface:
gr.Markdown(
"""
# 🎙️ Saudi Arabic Text-to-Speech
Convert Arabic text to speech using the Saudi TTS model. This model is specifically trained for Saudi Arabic dialect.
**Usage Instructions:**
1. Enter your Arabic text in the text box below
2. Adjust the temperature (0.1-1.0) to control speech variation
3. Click "Generate Speech" to create audio
4. Play or download the generated audio file
"""
)
with gr.Row():
with gr.Column(scale=2):
text_input = gr.Textbox(
label="Arabic Text",
placeholder="أدخل النص العربي هنا...",
lines=5,
rtl=True # Right-to-left for Arabic
)
temperature_slider = gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.75,
step=0.05,
label="Temperature (Speech Variation)",
info="Higher values = more variation, Lower values = more consistent"
)
generate_btn = gr.Button("🎵 Generate Speech", variant="primary", size="lg")
with gr.Column(scale=1):
audio_output = gr.Audio(
label="Generated Speech",
type="filepath",
interactive=False
)
status_output = gr.Textbox(
label="Status",
interactive=False,
lines=2
)
# Examples
gr.Markdown("### 📝 Example Texts:")
examples = [
["السلام عليكم ودى أوريكم أول نموذج اصطناعى مفتوح المصدر يتكلم باللهجة السعودية."],
# ["أهلاً وسهلاً بكم في المملكة العربية السعودية و نتمنى لكم كل خير."],
["كيف حالكم؟ إن شاء الله تكونوا بخير و بصحة و بسلامة إن شاء الله."],
["السلام عليكم، أبغى أعرّفكم على أول نموذج تحويل نص لصوت مخصّص للهجة النجدية، تقدرون تستخدمونه في التطبيقات التعليمية وخدمات الدعم الصوتي."],
["أهلاً وسهلاً بكم في منصتنا المفتوحة؛ هدفنا توفير أدوات تساعد المطورين والباحثين على بناء تطبيقات ناطقة بالعربية واللهجات المحلية بسهولة وبجودة احترافية."],
["يا جماعة تخيلوا جهاز يوصف لكم الرحلة بالتفصيل بصوت طبيعي — من مواعيد الحجز، إلى اقتراحات الأماكن والمطاعم، وكلها باللهجة اللي تختارونها."],
["مرحباً، أرسلنا لكم المستندات المطلوبة مع الشرح المفصل، وإذا احتجتم أي توضيحات أو نسخ بديلة أنا جاهز أتابع معكم."],
["لو حابين تجربون النموذج بنفسكم، ارفعوا ملف نصي بسيط واضغطوا توليد؛ بيطلع لكم كلامٍ طبيعي قابل للتعديل في النبرة والسرعة والفواصل."],
["أنا قضيت سنوات أجمع تسجيلات باللهجة السعودية علشان أدرب النموذج، والنتيجة الحالية صوت طبيعي جداً وقابل للتخصيص بحسب السيناريو."],
["نشكر كل من ساهم في المشروع; تعاونكم فرق كثير وصار عندنا نموذج مفتوح نقدر نشاركه مع المجتمع البحثي والتطبيقي."],
["هل ممكن تعطوني خطوات دمج النموذج في واجهة ويب بسيطة باستعمال FastAPI وتشغيله عبر ملف صوتي؟ أحتاج مثال عملي يشتغل على سيرفر صغير."],
["إذا مهتمين بإصدار تجاري أو دعم تقني، نقدر نتكلم عن رخصة الاستخدام، خدمات التخصيص، وخطط الصيانة والدعم الفني."],
["لو عندك نص طويل لسيناريو بودكاست أو إعلان، النموذج يقرأه بصوت طبيعي مع تحكم في الانفعالات، الفواصل، والطبقة الصوتية."],
["أحب أشارككم موقف طريف: يوم كنت أسجّل عينات لللهجة قابلت ناس طيبين وساعدوني، والصوت الناتج خلى الجميع يضحك من شدة الشبه."],
["في حال حابين ديمو مباشر قدام فريقكم، أقدر أجهز ملف تجريبي ونشغله ونشرح إعدادات النبرة والسرعة خطوة بخطوة."],
["أخيراً، أي ملاحظات عن نطق كلمات معيّنة أو جودة المقاطع ترسلولنا علشان نطوّر النموذج في الإصدارات القادمة."]
]
gr.Examples(
examples=examples,
inputs=[text_input],
label="Click on any example to try it:"
)
# Event handlers
generate_btn.click(
fn=generate_speech,
inputs=[text_input, temperature_slider],
outputs=[audio_output, status_output],
show_progress=True
)
return interface
# Main execution
if __name__ == "__main__":
print("Initializing Saudi Arabic TTS App...")
# Initialize app (install dependencies and load model)
if initialize_app():
print("✅ App initialized successfully!")
# Create and launch interface
interface = create_interface()
interface.launch(
server_name="0.0.0.0", # Allow external access
server_port=7860, # Default Gradio port
share=False, # Set to True if you want a public link
debug=True,
# show_error=True
)
else:
print("❌ Failed to initialize app. Please check the logs above.")