Spaces:
Sleeping
Sleeping
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() |