File size: 8,393 Bytes
d964e2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import re

def transform_text(input_text):
    """
    تقوم هذه الدالة بتطبيق مجموعة من القواعد على النص المدخل
    وتعيد النص المصحّح/المعدّل.
    """

    # -------------------------------------
    # 1) إضافة علامة # بعد بعض الكلمات العامية المحددة:
    #    ايش/ويش/ليش/عشان/علشان/لسى/يالله/والله/يلا/يااه/اووه/همن/ثمن
    # -------------------------------------
    pattern_hash = r"\b(ايش|إيش|ويش|ليش|عشان|علشان|لسى|يالله|والله|يلا|يااه|اووه|همن|ثمن)\b"
    input_text = re.sub(pattern_hash, r"\1#", input_text, flags=re.IGNORECASE)

    # -------------------------------------
    # 2) بعض التصحيحات الإملائية والفصيحة:
    # -------------------------------------
    # هذه بدل هاذي
    input_text = re.sub(r"\bهاذي\b", "هذه", input_text)
    # هؤلاء بدل هذول
    input_text = re.sub(r"\bهذول\b", "هؤلاء", input_text)
    # (أنتي|انتي) -> أنت
    input_text = re.sub(r"\b(أنتي|انتي)\b", "أنت", input_text, flags=re.IGNORECASE)
    # معاك -> معك
    input_text = re.sub(r"\bمعاك\b", "معك", input_text)
    # اللي -> الذي (قد تحتاج لسياق أكثر دقة لتحديد (التي) عند التأنيث)
    input_text = re.sub(r"\bاللي\b", "الذي", input_text)

    # -------------------------------------
    # 3) تصحيح بعض الهمزات الشائعة (تأكل، تأخذ)
    # -------------------------------------
    input_text = re.sub(r"\bتاكل\b", "تأكل", input_text)
    input_text = re.sub(r"\bتاخذ\b", "تأخذ", input_text)

    # -------------------------------------
    # 4) إزالة همزة فعل الأمر (مثال مبسط: إذهب -> اذهب)
    # -------------------------------------
    pattern_amr = r"\bإ([ضذصثقفغعهخحجةشسيبلاتنم])(.*?)(\b)"
    input_text = re.sub(pattern_amr, r"ا\1\2", input_text)

    # -------------------------------------
    # 5) تحويل الأسئلة إلى علامة استفهام بدلاً من النقطة
    #    (اعتماداً على كلمات استفهام شائعة)
    # -------------------------------------
    question_words = [
        "كيف", "لماذا", "لمَ", "هل", "متى", "أين", 
        "أيش#", "ايش#", "ويش#", "ليش#", "وش", "ما", "من", 
        "أين", "أيمكن", "أحقًا"
    ]
    for q_word in question_words:
        pattern_q = rf"(\b{q_word}\b)\."
        input_text = re.sub(pattern_q, rf"\1؟", input_text, flags=re.IGNORECASE)

    # -------------------------------------
    # 6) تحويل الرقم 11 إلى "إحدى عشر" (مثال بسيط)
    # -------------------------------------
    # input_text = re.sub(r"\b11\b", "إحدى عشر", input_text)

    # -------------------------------------
    # 7) إزالة النقاط في نهاية الجمل
    # -------------------------------------
    input_text = re.sub(r"\.(\s|$)", r"\1", input_text)

    # -------------------------------------
    # 8) استبدال التردّد أو التمتمة (آآ / آه / آ ...)
    #    بالرمز $ (وفق القاعدة الجديدة)
    # -------------------------------------
    # أمثلة: "آآ" أو "آه" أو "آ" إذا أتت منفردة أو متبوعة بمسافة أو فاصلة...
    # طبعًا يمكنك توسيع النمط بحسب الحاجة.
    pattern_stammer = r"\b(آآ+|آه+|آ)\b"
    input_text = re.sub(pattern_stammer, " $", input_text)

    # إذا هناك حالة مثل "آآالبيت" (بدون مسافة) وتريد استبدال الجزء "آآ" فقط، 
    # قد تلزمك معالجة مختلفة:
    # input_text = re.sub(r"آآ+", "$", input_text)

    # -------------------------------------
    # 9) وضع علامة ~ بعد الكلمات الأعجمية
    #    (مثل كوميدينة -> كوميدينة~) 
    #    وُرد في الأمثلة: كوميدينة، أجبورة...
    # -------------------------------------
    # لتبسيط المثال، نبحث عن كلمات معيّنة فقط.
    foreign_words = ["كوميدينة", "أجبورة"]
    for fw in foreign_words:
        pattern_fw = rf"\b{fw}\b"
        input_text = re.sub(pattern_fw, fw + "~", input_text, flags=re.IGNORECASE)

    # -------------------------------------
    # 10) معالجة الضحك والبكاء البسيط:
    #     إذا وردت عبارة "ضحك بسيط" أو "بكاء خفيف" 
    #     نجعلها بين قوسين مربعين: [ضحك بسيط] أو [بكاء خفيف]
    # -------------------------------------
    input_text = re.sub(r"\bضحك بسيط\b", "[ضحك بسيط]", input_text)
    input_text = re.sub(r"\bبكاء خفيف\b", "[بكاء خفيف]", input_text)

    # -------------------------------------
    # يمكن إضافة/تطوير المزيد من القواعد بنفس الأسلوب...
    # -------------------------------------

    return input_text


def reformat_transcript(lines):
    """
    تأخذ قائمة الأسطر بالصيغة القديمة:
       00:02:15 المسجل
       السلام عليكم...
       00:02:17 المشارك
       وعليكم السلام...
    وتعيدها بالشكل المطلوب:
       , (المسجل) [00:02:15] السلام عليكم...
       , (المشارك) [00:02:17] وعليكم السلام...
    """
    output_lines = []
    i = 0
    while i < len(lines):
        line = lines[i].strip()
        
        # نحاول التقاط التوقيت + الاسم في بداية السطر
        # صيغة التوقيت: HH:MM:SS (ساعتان، دقيقتان، ثانيتان)
        # بعده فراغ + اسم (قد يكون "المسجل"/"المشارك"/غيرهما)
        match = re.match(r'^(\d{2}:\d{2}:\d{2})\s+(.+)$', line)
        if match:
            # إذا نجحت المطابقة؛ نستخرج التوقيت والاسم
            time_code = match.group(1)
            speaker = match.group(2).strip()

            # نقرأ السطر التالي لافتراض أنه نص الحديث
            text_line = ""
            if i+1 < len(lines):
                text_line = lines[i+1].rstrip("\n")
            else:
                text_line = ""

            # يمكن هنا تطبيق أي تصحيحات على "text_line" لو أردت:
            text_line = transform_text(text_line)

            # نصنع السطر بالصيغة المطلوبة:
            # , (المتكلم) [التوقيت] الكلام...
            formatted = f", ({speaker}) [{time_code}] {text_line}"
            output_lines.append(formatted)

            i += 2  # تخطّى سطر الاسم والتوقيت + سطر النص
        else:
            # إذا لم يتطابق السطر مع صيغة "توقيت + اسم" 
            # فقد يكون سطرًا فارغًا أو خارج التنسيق المطلوب
            # بإمكانك إما تجاهله أو إضافته كما هو
            i += 1

    return output_lines


import gradio as gr
import re

def pipeline(raw_text):
    """
    تأخذ النصّ المُدخل (كاملًا)، تفصّله سطرًا سطرًا، 
    ثم تعيد تنسيقه بالنمط المطلوب. تعيد الناتج كسلسلة نصية.
    """
    # نحصل على الأسطر
    lines = raw_text.splitlines()
    # نُعيد التنسيق
    reformatted_lines = reformat_transcript(lines)
    # نجمعها في نص واحد للعرض
    final_text = "\n".join(reformatted_lines)
    return final_text

demo = gr.Interface(
    fn=pipeline, 
    inputs=gr.Textbox(lines=10, placeholder="ألصق النص هنا..." , label="النص المفرغ"), 
    outputs=gr.Textbox(lines=10 , label="النص المعالج"), 
    title="تنسيق النص المفرغ وفق القواعد المطلوبة",
)

##########################################################
# 5) تشغيل الواجهة
##########################################################
if __name__ == "__main__":
    demo.launch()