import os import json import tempfile import requests import gradio as gr import whisper import torch from gtts import gTTS from pathlib import Path # تهيئة النماذج DEVICE = "cuda" if torch.cuda.is_available() else "cpu" whisper_model = whisper.load_model("base") # مفتاح API لـ Gemini GEMINI_API_KEY = "AIzaSyDrHCW4FxrDt6amCTQvYPTdh2NE06p9YlQ" GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent" # قاموس للغات المدعومة SUPPORTED_LANGUAGES = { "ar": "العربية", "en": "English", "fr": "Français", "es": "Español" } # قاموس لأنواع الأصوات VOICE_TYPES = { "رجل": {"speed": 0.9, "pitch": 0.8}, "امرأة": {"speed": 1.0, "pitch": 1.2}, "طفل": {"speed": 1.1, "pitch": 1.5} } def transcribe_audio(audio_file, source_lang): """تحويل الصوت إلى نص باستخدام Whisper""" try: result = whisper_model.transcribe(audio_file, language=source_lang) return result["text"] except Exception as e: return f"خطأ في التحويل: {str(e)}" def translate_text(text, source_lang, target_lang): """ترجمة النص باستخدام Gemini API""" if source_lang == target_lang: return text try: prompt = f"Translate the following text from {SUPPORTED_LANGUAGES[source_lang]} to {SUPPORTED_LANGUAGES[target_lang]}. Only provide the translation without any additional text or explanation:\n\n{text}" payload = { "contents": [{ "parts": [{ "text": prompt }] }] } url = f"{GEMINI_API_URL}?key={GEMINI_API_KEY}" response = requests.post( url, headers={"Content-Type": "application/json"}, json=payload ) if response.status_code == 200: result = response.json() translated_text = result['candidates'][0]['content']['parts'][0]['text'] return translated_text else: return f"خطأ في الترجمة: {response.status_code} - {response.text}" except Exception as e: return f"خطأ في الترجمة: {str(e)}" def text_to_speech(text, language, voice_type): """تحويل النص إلى صوت""" try: # إنشاء مجلد مؤقت للملفات الصوتية إذا لم يكن موجوداً temp_dir = Path("temp_audio") temp_dir.mkdir(exist_ok=True) # إنشاء ملف صوتي مؤقت temp_file = temp_dir / f"output_{voice_type}_{language}.mp3" # تحويل النص إلى صوت مع تطبيق إعدادات نوع الصوت voice_settings = VOICE_TYPES[voice_type] tts = gTTS(text=text, lang=language, slow=False) tts.save(str(temp_file)) return str(temp_file) except Exception as e: return f"خطأ في تحويل النص إلى صوت: {str(e)}" # إنشاء واجهة Gradio with gr.Blocks(title="معالج الصوت والترجمة", theme=gr.themes.Soft()) as demo: gr.Markdown("# معالج الصوت والترجمة متعدد اللغات") with gr.Tab("تحويل الصوت إلى نص"): with gr.Row(): audio_input = gr.Audio(type="filepath", label="الملف الصوتي") source_lang = gr.Dropdown( choices=list(SUPPORTED_LANGUAGES.keys()), value="ar", label="لغة الملف الصوتي" ) transcribe_btn = gr.Button("تحويل إلى نص") transcribed_text = gr.Textbox(label="النص المستخرج", lines=5) transcribe_btn.click( fn=transcribe_audio, inputs=[audio_input, source_lang], outputs=transcribed_text ) with gr.Tab("ترجمة النص"): with gr.Row(): input_text = gr.Textbox(label="النص المراد ترجمته", lines=5) translated_text = gr.Textbox(label="النص المترجم", lines=5) with gr.Row(): trans_source_lang = gr.Dropdown( choices=list(SUPPORTED_LANGUAGES.keys()), value="ar", label="اللغة المصدر" ) trans_target_lang = gr.Dropdown( choices=list(SUPPORTED_LANGUAGES.keys()), value="en", label="اللغة الهدف" ) translate_btn = gr.Button("ترجمة") translate_btn.click( fn=translate_text, inputs=[input_text, trans_source_lang, trans_target_lang], outputs=translated_text ) with gr.Tab("تحويل النص إلى صوت"): with gr.Row(): tts_text = gr.Textbox(label="النص المراد تحويله إلى صوت", lines=5) tts_output = gr.Audio(label="الصوت الناتج") with gr.Row(): tts_lang = gr.Dropdown( choices=list(SUPPORTED_LANGUAGES.keys()), value="ar", label="لغة النص" ) voice_type = gr.Radio( choices=list(VOICE_TYPES.keys()), value="رجل", label="نوع الصوت" ) tts_btn = gr.Button("تحويل إلى صوت") tts_btn.click( fn=text_to_speech, inputs=[tts_text, tts_lang, voice_type], outputs=tts_output ) # تشغيل التطبيق if __name__ == "__main__": demo.launch()