import torch import re import gradio as gr from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from peft import PeftModel from threading import Thread from transformers import TextIteratorStreamer device = "cuda" if torch.cuda.is_available() else "cpu" print(f"⏳ جاري التحضير باستخدام: {device}") # 1. دالة التنظيف def selective_normalization(text): if not isinstance(text, str): return text text = re.sub(r'[\u0617-\u061A\u064B-\u0652]', '', text) text = re.sub(r'ـ', '', text) text = re.sub(r'[أإآٱ]', 'ا', text) text = re.sub(r'ؤ', 'و', text) text = re.sub(r'ئ', 'ي', text) text = re.sub(r'\s+', ' ', text).strip() return text # 2. تحميل الموديل الأساسي مرة واحدة print("⏳ جاري تحميل الموديل الأساسي (AraT5)...") base_model_name = "UBC-NLP/AraT5-base" tokenizer = AutoTokenizer.from_pretrained(base_model_name) base_model = AutoModelForSeq2SeqLM.from_pretrained(base_model_name) # مسارات المحولات من Hugging Face path_amman_to_msa = "FarisAlnatsheh/arat5-amman-to-msa-lora" path_msa_to_amman = "FarisAlnatsheh/arat5-msa-to-amman-lora" print("⏳ جاري تركيب المحولات (Adapters) للنموذجين...") try: # تحميل أوزان الاتجاه الأول model = PeftModel.from_pretrained(base_model, path_amman_to_msa, adapter_name="amman2msa") # تحميل أوزان الاتجاه الثاني وتركيبها model.load_adapter(path_msa_to_amman, adapter_name="msa2amman") model = model.to(device) model.eval() print("✅ تم تحميل النموذجين بنجاح ودمجهما!") except Exception as e: print(f"❌ حدث خطأ في تحميل الأوزان، تأكد من مسارات الملفات: {e}") # 3. دالة الترجمة التفاعلية def translate_text(text, direction): clean_text = selective_normalization(text) if direction == "من لهجة عمّان ⬅️ إلى فصحى": input_text = "Amman to MSA: " + clean_text model.set_adapter("amman2msa") else: input_text = "MSA to Amman: " + clean_text model.set_adapter("msa2amman") inputs = tokenizer( input_text, return_tensors="pt", truncation=True, max_length=64 ).to(device) streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) generation_kwargs = dict( **inputs, max_new_tokens=64, num_beams=1, do_sample=True, temperature=0.2, top_k=30, top_p=0.70, repetition_penalty=1.15, streamer=streamer ) thread = Thread(target=model.generate, kwargs=generation_kwargs) thread.start() translated_text = "" for new_text in streamer: translated_text += new_text yield translated_text # 4. واجهة المستخدم (Gradio) custom_css = """ #rtl-radio { direction: rtl; text-align: right; } .rtl-text { direction: rtl !important; } .rtl-textbox { direction: rtl !important; } .rtl-textbox > label > span { right: 45px !important; left: auto !important; } """ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue"), css=custom_css) as demo: gr.Markdown("

محول الجمل بين اللهجات العربية

") with gr.Row(): direction = gr.Radio( choices=["من فصحى ⬅️ إلى لهجة عمّان", "من لهجة عمّان ⬅️ إلى فصحى"], value="من فصحى ⬅️ إلى لهجة عمّان", label="اختر اتجاه الترجمة", elem_id="rtl-radio" ) with gr.Row(): output_text = gr.Textbox( label="الترجمة", lines=5, interactive=False, rtl=True, text_align="right", elem_classes="rtl-textbox" ) input_text = gr.Textbox( label="النص الأصلي", placeholder="اكتب هنا أو اختر مثالاً من الأسفل...", lines=5, rtl=True, text_align="right", elem_classes="rtl-textbox" ) translate_btn = gr.Button("ترجم الآن 🚀", variant="primary") gr.Markdown("

💡 جمل مقترحة للتجربة :

") with gr.Column(visible=True) as msa_examples_col: with gr.Row(): btn1 = gr.Button("كيف حالك يا صديقي ؟ يا رجل كان الامتحان صعبا جدا!", size="sm", elem_classes="rtl-text") btn2 = gr.Button("الجو في عمان اليوم رائع جداً ومناسب للتنزه.", size="sm", elem_classes="rtl-text") btn3 = gr.Button("أريد حجز طاولة في المطعم الكبير في وسط البلد.", size="sm", elem_classes="rtl-text") btn7 = gr.Button("متى ستبدأ المحاضرة الأولى اليوم؟", size="sm", elem_classes="rtl-text") with gr.Row(): btn8 = gr.Button("لم أفهم أي شيء من شرح الأستاذ اليوم.", size="sm", elem_classes="rtl-text") btn9 = gr.Button("لماذا الإنترنت بطيء جداً اليوم؟", size="sm", elem_classes="rtl-text") btn10 = gr.Button("قم بالركوب في هذه السيارة.", size="sm", elem_classes="rtl-text") btn11 = gr.Button("أطلب منك أن تسرع في الصعود إلى السيارة الآن وإلا سوف نتأخر عن موعد العشاء.", size="sm", elem_classes="rtl-text") btn1.click(lambda: "كيف حالك يا صديقي ؟ يا رجل كان الامتحان صعبا جدا!", None, input_text) btn2.click(lambda: "الجو في عمان اليوم رائع جداً ومناسب للتنزه.", None, input_text) btn3.click(lambda: "أريد حجز طاولة في المطعم الكبير في وسط البلد.", None, input_text) btn7.click(lambda: "متى ستبدأ المحاضرة الأولى اليوم؟", None, input_text) btn8.click(lambda: "لم أفهم أي شيء من شرح الأستاذ اليوم.", None, input_text) btn9.click(lambda: "لماذا الإنترنت بطيء جداً اليوم؟", None, input_text) btn10.click(lambda: "قم بالركوب في هذه السيارة.", None, input_text) btn11.click(lambda: "أطلب منك أن تسرع في الصعود إلى السيارة الآن وإلا سوف نتأخر عن موعد العشاء.", None, input_text) with gr.Column(visible=False) as amm_examples_col: with gr.Row(): btn4 = gr.Button("لو سمحت, وين بقدر ألاقي محمد؟ بدي اياه باشي مهم.", size="sm", elem_classes="rtl-text") btn5 = gr.Button("قديش حق هالقطعة؟ لازم اشتريها علشان شكلها حلو.", size="sm", elem_classes="rtl-text") btn6 = gr.Button("يزم، هاد الامتحان كان كثير صعب!", size="sm", elem_classes="rtl-text") btn12 = gr.Button("اركب بهالسيارة بسرعة.", size="sm", elem_classes="rtl-text") with gr.Row(): btn13 = gr.Button("ما فهمتش ولا اشي من شرح الأستاذ اليوم.", size="sm", elem_classes="rtl-text") btn14 = gr.Button("الجو اليوم حلو شو رايك بعد ما نخلص اكل نروح نشتري اواعي العيد من وسط البلد.", size="sm", elem_classes="rtl-text") btn15 = gr.Button("كيفك يا زلمة؟ شو اخبارك؟ من زمان ما شفناك.", size="sm", elem_classes="rtl-text") btn4.click(lambda: "لو سمحت, وين بقدر ألاقي محمد؟ بدي اياه باشي مهم.", None, input_text) btn5.click(lambda: "قديش حق هالقطعة؟ لازم اشتريها علشان شكلها حلو.", None, input_text) btn6.click(lambda: "يزم، هاد الامتحان كان كثير صعب!", None, input_text) btn12.click(lambda: "اركب بهالسيارة بسرعة.", None, input_text) btn13.click(lambda: "ما فهمتش ولا اشي من شرح الأستاذ اليوم.", None, input_text) btn14.click(lambda: "الجو اليوم حلو شو رايك بعد ما نخلص اكل نروح نشتري اواعي العيد من وسط البلد.", None, input_text) btn15.click(lambda: "كيفك يا زلمة؟ شو اخبارك؟ من زمان ما شفناك.", None, input_text) def toggle_ui(dir_val): if dir_val == "من فصحى ⬅️ إلى لهجة عمّان": return gr.update(visible=True), gr.update(visible=False), "", "" else: return gr.update(visible=False), gr.update(visible=True), "", "" direction.change( fn=toggle_ui, inputs=direction, outputs=[msa_examples_col, amm_examples_col, input_text, output_text] ) translate_btn.click(fn=translate_text, inputs=[input_text, direction], outputs=output_text) if __name__ == "__main__": demo.launch()