Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
import whisper | |
from transformers import MarianMTModel, MarianTokenizer | |
import torch | |
from TTS.api import TTS | |
# تهيئة النماذج | |
DEVICE = "cuda" if torch.cuda.is_available() else "cpu" | |
whisper_model = whisper.load_model("base") | |
# قاموس للغات المدعومة | |
SUPPORTED_LANGUAGES = { | |
"ar": "العربية", | |
"en": "English", | |
"fr": "Français", | |
"es": "Español" | |
} | |
# قاموس لنماذج الترجمة | |
TRANSLATION_MODELS = { | |
"ar-en": "Helsinki-NLP/opus-mt-ar-en", | |
"en-ar": "Helsinki-NLP/opus-mt-en-ar", | |
"fr-en": "Helsinki-NLP/opus-mt-fr-en", | |
"en-fr": "Helsinki-NLP/opus-mt-en-fr", | |
"es-en": "Helsinki-NLP/opus-mt-es-en", | |
"en-es": "Helsinki-NLP/opus-mt-en-es" | |
} | |
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): | |
"""ترجمة النص بين اللغات""" | |
if source_lang == target_lang: | |
return text | |
model_key = f"{source_lang}-en" if source_lang != "en" else f"en-{target_lang}" | |
try: | |
model_name = TRANSLATION_MODELS[model_key] | |
model = MarianMTModel.from_pretrained(model_name) | |
tokenizer = MarianTokenizer.from_pretrained(model_name) | |
inputs = tokenizer(text, return_tensors="pt", padding=True) | |
translated = model.generate(**inputs) | |
result = tokenizer.decode(translated[0], skip_special_tokens=True) | |
# إذا كانت اللغة المصدر ليست الإنجليزية والهدف ليس الإنجليزية | |
if source_lang != "en" and target_lang != "en": | |
# ترجمة إضافية من الإنجليزية إلى اللغة الهدف | |
model_name = TRANSLATION_MODELS[f"en-{target_lang}"] | |
model = MarianMTModel.from_pretrained(model_name) | |
tokenizer = MarianTokenizer.from_pretrained(model_name) | |
inputs = tokenizer(result, return_tensors="pt", padding=True) | |
translated = model.generate(**inputs) | |
result = tokenizer.decode(translated[0], skip_special_tokens=True) | |
return result | |
except Exception as e: | |
return f"خطأ في الترجمة: {str(e)}" | |
def text_to_speech(text, target_lang, gender, style): | |
"""تحويل النص إلى صوت""" | |
try: | |
# اختيار النموذج المناسب بناءً على اللغة والجنس | |
tts = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts", progress_bar=False) | |
# تعيين معرف المتحدث والنمط | |
speaker_id = "female" if gender == "أنثى" else "male" | |
speed = 1.0 if style == "عادي" else 1.3 if style == "سريع" else 0.8 | |
output_path = "output.wav" | |
tts.tts_to_file(text=text, speaker=speaker_id, speed=speed, file_path=output_path) | |
return output_path | |
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="لغة النص") | |
tts_gender = gr.Radio(choices=["ذكر", "أنثى"], | |
value="ذكر", | |
label="جنس المتحدث") | |
tts_style = gr.Radio(choices=["سريع", "عادي", "تعليق صوتي"], | |
value="عادي", | |
label="نمط الإلقاء") | |
tts_btn = gr.Button("تحويل إلى صوت") | |
tts_btn.click( | |
fn=text_to_speech, | |
inputs=[tts_text, tts_lang, tts_gender, tts_style], | |
outputs=tts_output | |
) | |
# تشغيل التطبيق | |
demo.launch() |