File size: 6,548 Bytes
d964e2a
49e0fea
d964e2a
49e0fea
 
 
d964e2a
 
 
 
 
 
49e0fea
d964e2a
 
 
 
 
 
 
 
 
 
49e0fea
d964e2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49e0fea
d964e2a
 
49e0fea
d964e2a
 
 
49e0fea
d964e2a
 
 
 
 
49e0fea
d964e2a
 
 
 
 
49e0fea
 
 
d964e2a
 
 
49e0fea
 
 
 
 
 
 
 
 
 
 
 
 
d964e2a
49e0fea
d964e2a
 
 
 
 
49e0fea
 
 
 
 
 
 
 
 
 
 
 
 
d964e2a
 
49e0fea
d964e2a
 
 
49e0fea
d964e2a
 
49e0fea
 
d964e2a
 
49e0fea
 
d964e2a
49e0fea
d964e2a
 
 
 
49e0fea
 
 
d964e2a
 
 
 
 
 
 
 
 
 
49e0fea
 
 
d964e2a
 
49e0fea
d964e2a
49e0fea
 
d964e2a
 
 
49e0fea
d964e2a
 
49e0fea
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
import re
import gradio as gr

##########################################################
# 1) دالّة التصحيح اللغوي/الإملائي (كما في سؤالك السابق)
##########################################################
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) إزالة النقاط في نهاية الجمل
    input_text = re.sub(r"\.(\s|$)", r"\1", input_text)

    # 7) استبدال التردّد أو التمتمة (آآ / آه / آ ...) بالرمز $
    pattern_stammer = r"\b(آآ+|آه+|آ)\b"
    input_text = re.sub(pattern_stammer, " $", input_text)

    # 8) وضع علامة ~ بعد الكلمات الأعجمية (إن وجدت)
    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)

    # 9) معالجة الضحك والبكاء البسيط
    input_text = re.sub(r"\bضحك بسيط\b", "[ضحك بسيط]", input_text)
    input_text = re.sub(r"\bبكاء خفيف\b", "[بكاء خفيف]", input_text)

    return input_text

##########################################################
# 2) دالّة إعادة التنسيق للإدخال بالشكل الجديد
##########################################################

def reformat_transcript(lines):
    """
    نتوقع الشكل:
      [المتحدث 1] (0:00 - 0:02)
      السلام عليكم.

      [المتحدث 2] (0:02 - 0:05)
      وعليكم السلام...

      [المتحدث 1] (0:06 - 0:08)
      الله يبقى شخبارا...
    ونريد تحويله إلى:
      , (المتحدث 1) [0:00 - 0:02] السلام عليكم.
      , (المتحدث 2) [0:02 - 0:05] وعليكم السلام...
      , (المتحدث 1) [0:06 - 0:08] الله يبقى شخبارا...
    """

    output_lines = []
    i = 0
    while i < len(lines):
        line = lines[i].strip()

        # نحاول التقاط الصيغة: [المتحدث X] (0:00 - 0:02)
        # تعبير نمطي مثل:
        #   ^\[(.*?)\]\s*\((.*?)\)$
        # حيث:
        #   group(1) -> "المتحدث 1"
        #   group(2) -> "0:00 - 0:02"
        pattern = r'^\[(.*?)\]\s*\((.*?)\)$'
        match = re.match(pattern, line)
        if match:
            speaker = match.group(1)  # "المتحدث 1"
            time_range = match.group(2)  # "0:00 - 0:02"
            
            # السطر التالي متوقع أن يكون النص
            text_line = ""
            if i+1 < len(lines):
                text_line = lines[i+1].rstrip("\n").strip()
            else:
                text_line = ""

            # نطبّق التصحيح اللغوي على النص
            text_line = transform_text(text_line)

            # الصيغة المطلوبة: , (المتحدث 1) [0:00 - 0:02] النص
            formatted = f", ({speaker}) [{time_range}] {text_line}"
            output_lines.append(formatted)

            # تجاوز سطرين: سطر المربع + سطر النص
            i += 2
        else:
            # إذا لم يطابق، نتجاهل هذا السطر أو نحتفظ به (هنا نتجاهله)
            i += 1

    return output_lines

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

##########################################################
# 4) إنشاء واجهة Gradio
##########################################################
demo = gr.Interface(
    fn=pipeline, 
    inputs=gr.Textbox(lines=10, placeholder="ألصق النص هنا..." , label="النص المفرغ (الصيغة الجديدة)"), 
    outputs=gr.Textbox(lines=10 , label="النص المعالج"), 
    title="تنسيق النص المفرغ وفق الصيغة الجديدة",
    description="ألصق النص بالصيغ: [المتحدث X] (0:00 - 0:02) في سطر، والسطر التالي هو محتواه."
)

##########################################################
# 5) تشغيل الواجهة مع رابط عام (إذا أمكن)
##########################################################
if __name__ == "__main__":
    demo.launch(share=True)