import gradio as gr from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan import torch import numpy as np from scipy.io.wavfile import write import librosa # تحميل النماذج والمُعالج processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts") model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts") vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan") LANGUAGES = {"English": "en", "French": "fr", "Spanish": "es"} def generate_speaker_embedding(speaker_type): """توليد تعبيرات الصوت بناءً على نوع الصوت (ذكر أو أنثى).""" base_embedding = torch.randn(1, 512) if speaker_type == "Female": return base_embedding * 0.8 return base_embedding * 1.2 def adjust_speed(audio, speed): """تعديل سرعة الصوت باستخدام مكتبة librosa.""" return librosa.effects.time_stretch(audio, speed) def text_to_speech(text, language, speaker_type, speed): """تحويل النص إلى صوت.""" try: # توليد تعبيرات الصوت بناءً على نوع المتحدث speaker_embeddings = generate_speaker_embedding(speaker_type) # معالجة النص inputs = processor(text=text, return_tensors="pt") # توليد الصوت with torch.no_grad(): # تحسين إدارة الموارد generated_speech = model.generate_speech( inputs["input_ids"], speaker_embeddings, vocoder=vocoder ).cpu().numpy() # ضبط سرعة الصوت adjusted_speech = adjust_speed(generated_speech, speed) # حفظ الصوت كملف WAV output_file = "output.wav" write(output_file, 24000, (adjusted_speech * 32767).astype(np.int16)) return output_file except Exception as e: print(f"Error: {e}") return None # إنشاء واجهة Gradio def create_interface(): with gr.Blocks() as demo: gr.Markdown("# 🎙️ Multilingual Text-to-Speech") with gr.Row(): with gr.Column(): text_input = gr.Textbox(label="Enter Text", placeholder="Type your text here...", lines=5) language = gr.Dropdown(choices=list(LANGUAGES.keys()), value="English", label="Language") speaker = gr.Radio(choices=["Male", "Female"], value="Male", label="Speaker Gender") speed = gr.Slider(minimum=0.5, maximum=2.0, value=1.0, step=0.1, label="Speech Speed") submit_btn = gr.Button("Generate Speech") with gr.Column(): audio_output = gr.Audio(label="Generated Speech", type="filepath") submit_btn.click( fn=text_to_speech, inputs=[text_input, language, speaker, speed], outputs=audio_output ) gr.Markdown(""" ### Features: - Multilingual support (English, French, Spanish) - Male and Female voice options - Adjustable speech speed - High-quality, natural-sounding voices """) return demo # تشغيل التطبيق demo = create_interface() demo.launch(server_name="0.0.0.0")