File size: 20,631 Bytes
4f4e064 f536a8a b97cadb 4f4e064 f536a8a 4f4e064 f536a8a 4f4e064 b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb 725d97d b97cadb f536a8a 725d97d f536a8a b97cadb f536a8a 725d97d b97cadb 725d97d b97cadb 725d97d f536a8a b97cadb 725d97d f536a8a 725d97d 4f4e064 f536a8a 4f4e064 f536a8a 725d97d b97cadb 725d97d f536a8a b97cadb f536a8a b97cadb f536a8a b97cadb 725d97d 4f4e064 0615894 4f4e064 f536a8a 4f4e064 f536a8a |
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 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 |
import gradio as gr
import torch
from transformers import pipeline
import re
# Global variable to store the model
pipe = None
def load_model():
"""Load the Atlas-Chat model"""
global pipe
if pipe is None:
print("🏔️ Loading Atlas-Chat-2B model...")
pipe = pipeline(
"text-generation",
model="MBZUAI-Paris/Atlas-Chat-2B",
model_kwargs={"torch_dtype": torch.bfloat16},
device="cuda" if torch.cuda.is_available() else "cpu"
)
print("✅ Model loaded successfully!")
return pipe
def detect_arabizi(text):
"""
Detect if input text is written in Arabizi (Latin script with numbers)
Returns True if Arabizi is detected
"""
if not text or len(text.strip()) < 2:
return False
# Check for Arabic script - if present, it's NOT Arabizi
arabic_pattern = r'[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]'
if re.search(arabic_pattern, text):
return False
# Arabizi indicators - numbers used as letters
arabizi_numbers = ['2', '3', '7', '9', '5', '6', '8']
has_arabizi_numbers = any(num in text for num in arabizi_numbers)
# Common Arabizi words and patterns
arabizi_patterns = [
'wach', 'wash', 'ach', 'achno', 'chno', 'shno', 'shkoun', 'chkoun',
'kif', 'kifash', 'ki', 'kayf', 'kien', 'kima',
'feen', 'fin', 'fen', 'fain', 'mnin',
'imta', 'meta', 'waqt', 'mata', 'emta',
'hna', 'ahna', 'ana', 'nta', 'nti', 'ntuma', 'ntouma',
'howa', 'hiya', 'huma', 'houma', 'hoa', 'hia',
'had', 'hadchi', 'hada', 'hadi', 'hadou', 'hadouk',
'bghit', 'bghiti', 'bgha', 'bghina', 'bghitiou',
'galt', 'galti', 'gal', 'galet', 'galou',
'rah', 'raha', 'rahi', 'rahom', 'rahin',
'kan', 'kanu', 'kana', 'kanet', 'kano',
'ghadi', 'ghad', 'gha', 'ghadia', 'ghadiyin',
'daba', 'dak', 'dakchi', 'dik', 'dok',
'bzf', 'bzzaf', 'bezzaf', 'bzaaaaf',
'chway', 'chwiya', 'shwiya', 'chwia',
'khoya', 'khuya', 'akhi', 'kho',
'khti', 'khtiya', 'ukhti', 'kht',
'mama', 'baba', 'lwaldin', 'lwalidin',
'salam', 'salamu aleikum', 'slm',
'yallah', 'yalla', 'hya', 'aji',
'mabghitsh', 'mabghach', 'makansh', 'machi',
'walakin', 'walaken', 'ama', 'mais'
]
text_lower = text.lower()
has_arabizi_words = any(pattern in text_lower for pattern in arabizi_patterns)
# Decision logic
if has_arabizi_numbers and has_arabizi_words:
return True
if has_arabizi_numbers and len([c for c in text if c.isalpha()]) > len(text) * 0.6:
return True
if has_arabizi_words and len([c for c in text if c.isalpha()]) > len(text) * 0.7:
return True
return False
def arabizi_to_arabic(text):
"""
Convert Arabizi text to Arabic script
COMPLETE HARD-CODED MAPPINGS
"""
if not text:
return text
# COMPREHENSIVE WORD MAPPINGS (Arabizi → Arabic)
word_mappings = {
# Pronouns
'ana': 'أنا', 'nta': 'نتا', 'nti': 'نتي', 'howa': 'هوا', 'hiya': 'هيا',
'hoa': 'هوا', 'hia': 'هيا', 'hna': 'حنا', 'ahna': 'أحنا',
'ntuma': 'نتوما', 'ntouma': 'نتوما', 'huma': 'هوما', 'houma': 'هوما',
# Question words
'shkoun': 'شكون', 'chkoun': 'شكون', 'skoun': 'شكون',
'achno': 'أشنو', 'chno': 'شنو', 'shno': 'شنو', 'ach': 'أش',
'wach': 'واش', 'wash': 'واش', 'ouach': 'واش',
'kifash': 'كيفاش', 'kif': 'كيف', 'ki': 'كي', 'kayf': 'كيف',
'feen': 'فين', 'fin': 'فين', 'fen': 'فين', 'fain': 'فين', 'mnin': 'منين',
'imta': 'إمتا', 'meta': 'متا', 'mata': 'متا', 'emta': 'إمتا',
'3lach': 'علاش', 'alach': 'علاش', '3la ach': 'علاش',
# Common verbs
'bghit': 'بغيت', 'bghiti': 'بغيتي', 'bgha': 'بغا', 'bghina': 'بغينا',
'kan': 'كان', 'kana': 'كانا', 'kanet': 'كانت', 'kanu': 'كانو',
'galt': 'قلت', 'galti': 'قلتي', 'gal': 'قال', 'galet': 'قالت',
'galou': 'قالو', 'galina': 'قلنا',
'rah': 'راح', 'raha': 'راها', 'rahi': 'راهي', 'rahom': 'راهم',
'ghadi': 'غادي', 'ghad': 'غاد', 'gha': 'غا', 'ghadia': 'غادية',
'dir': 'دير', 'dert': 'درت', 'derat': 'درات', 'derna': 'درنا',
'ja': 'جا', 'jat': 'جات', 'jina': 'جينا', 'jaou': 'جاو',
'mcha': 'مشا', 'mchat': 'مشات', 'mchina': 'مشينا', 'mchaou': 'مشاو',
'khrj': 'خرج', 'khrja': 'خرجا', 'khrjat': 'خرجات', 'khrjna': 'خرجنا',
'dkhl': 'دخل', 'dkhla': 'دخلا', 'dkhlat': 'دخلات', 'dkhlna': 'دخلنا',
# Demonstratives
'had': 'هاد', 'hada': 'هادا', 'hadi': 'هادي', 'hadou': 'هادو',
'hadouk': 'هادوك', 'hadchi': 'هادشي', 'hadak': 'هاداك',
'dak': 'داك', 'dik': 'ديك', 'dok': 'دوك', 'dakchi': 'داكشي',
# Prepositions
'fi': 'في', 'f': 'ف', 'men': 'من', 'mn': 'من', 'l': 'ل', 'li': 'لي',
'bla': 'بلا', 'b': 'ب', 'bi': 'بي', 'bih': 'بيه', 'biha': 'بيها',
'mea': 'معا', 'maak': 'معاك', 'maaki': 'معاكي', 'maana': 'معانا',
'maahom': 'معاهم', 'maaha': 'معاها',
# Numbers
'wahed': 'واحد', 'joj': 'جوج', 'tlata': 'تلاتا', 'rebaa': 'ربعا',
'khamsa': 'خمسا', 'setta': 'ستا', 'sebaa': 'سبعا', 'tmanya': 'تمنيا',
'tesaa': 'تسعا', 'ashra': 'عشرا',
# Time expressions
'daba': 'دابا', 'tawa': 'توا', 'ghda': 'غدا', 'lbareeh': 'البارح',
'nhar': 'نهار', 'lila': 'ليلا', 'sbah': 'صباح', 'aachia': 'عشيا',
# Family
'mama': 'ماما', 'baba': 'بابا', 'khoya': 'خويا', 'khti': 'ختي',
'khuya': 'خويا', 'khtiya': 'ختيا', 'akhi': 'أخي', 'ukhti': 'أختي',
'jad': 'جد', 'jada': 'جدا', 'amo': 'عمو', 'ama': 'عما',
'khal': 'خال', 'khala': 'خالا',
# Adjectives
'zwin': 'زوين', 'zwina': 'زوينا', 'qbih': 'قبيح', 'qbiha': 'قبيحا',
'kbir': 'كبير', 'kbira': 'كبيرا', 'sghir': 'صغير', 'sghira': 'صغيرا',
'tqil': 'تقيل', 'tqila': 'تقيلا', 'khfif': 'خفيف', 'khfifa': 'خفيفا',
'sahel': 'ساهل', 'sahla': 'ساهلا', 'saab': 'صعب', 'saba': 'صعبا',
# Quantities
'bzf': 'بزاف', 'bzzaf': 'بزاف', 'bezzaf': 'بزاف', 'ktir': 'كتير',
'chway': 'شوياة', 'chwiya': 'شوياة', 'shwiya': 'شوياة', 'chwia': 'شوياة',
'kolchi': 'كولشي', 'kol': 'كول', 'ga': 'غاع', 'gaa': 'غاع',
'hta': 'حتا', 'walo': 'والو', 'walou': 'والو',
# Negations
'ma': 'ما', 'machi': 'ماشي', 'mabghitsh': 'مابغيتش', 'makainch': 'ماكاينش',
'makansh': 'ماكانش', 'maghatch': 'ماغاتش', 'mabaghish': 'مابغيش',
# Conjunctions
'walakin': 'والاكين', 'walaken': 'والاكين', 'mais': 'ولكن',
'ama': 'أما', 'ida': 'إذا', 'ila': 'إلا', 'hta': 'حتا',
'ou': 'أو', 'o': 'أو', 'aw': 'أو', 'wla': 'ولا',
# Expressions
'salam': 'سلام', 'yallah': 'يالاه', 'yalla': 'يالا', 'hya': 'هيا',
'aji': 'أجي', 'sir': 'سير', 'siri': 'سيري', 'ajou': 'أجو',
'mabrook': 'مبروك', 'baraka': 'باركا', 'besaha': 'بصحا',
'allah': 'الله', 'rabi': 'ربي', 'llah': 'الله',
'inchallah': 'إن شاء الله', 'machallah': 'ما شاء الله',
'hamdulillah': 'الحمد لله', 'alhamdulillah': 'الحمد لله',
'la hawla': 'لا حول', 'astghfirullah': 'أستغفر الله',
# Countries and places
'lmaghrib': 'المغرب', 'maghrib': 'مغرب', 'casa': 'كازا',
'rbat': 'الرباط', 'fas': 'فاس', 'mknas': 'مكناس',
'tanja': 'طنجا', 'agadir': 'أكادير', 'marrakech': 'مراكش',
# Common nouns
'dar': 'دار', 'bit': 'بيت', 'tomo': 'طوموبيل', 'karhouba': 'كرهوبا',
'makla': 'ماكلا', 'atay': 'أتاي', 'khobz': 'خوبز', 'lma': 'الما',
'tajin': 'طاجين', 'tajine': 'طاجين', 'couscous': 'كوسكوس',
'msemen': 'مسمن', 'rghaif': 'رغايف', 'harira': 'حريرا',
'khodra': 'خضرا', 'fawakeh': 'فواكه', 'lahem': 'لحم',
'djaj': 'دجاج', 'hout': 'حوت', 'lben': 'اللبن',
'skar': 'سكر', 'melh': 'ملح', 'zit': 'زيت', 'zebda': 'زبدا',
# Verbs (additional)
'chreb': 'شرب', 'chrba': 'شربا', 'chrebat': 'شربات', 'chrebna': 'شربنا',
'kla': 'كلا', 'klat': 'كلات', 'klina': 'كلينا', 'klaw': 'كلاو',
'nees': 'نعس', 'neesat': 'نعسات', 'neesna': 'نعسنا', 'neasou': 'نعسو',
'faq': 'فاق', 'faqat': 'فاقات', 'faqna': 'فقنا', 'faqou': 'فاقو',
'tlab': 'طلب', 'tlbat': 'طلبات', 'tlabna': 'طلبنا', 'tlabou': 'طلبو',
'khdam': 'خدم', 'khdmat': 'خدمات', 'khdamna': 'خدمنا', 'khdamou': 'خدمو',
'qra': 'قرا', 'qrat': 'قرات', 'qrina': 'قرينا', 'qraw': 'قراو',
'kteb': 'كتب', 'ktbat': 'كتبات', 'ktebna': 'كتبنا', 'ktbou': 'كتبو',
'chaf': 'شاف', 'chafat': 'شافات', 'chfna': 'شفنا', 'chafou': 'شافو',
'sma': 'سمع', 'smat': 'سمعات', 'smana': 'سمعنا', 'smaou': 'سمعو'
}
# CHARACTER MAPPINGS (Arabizi numbers/letters → Arabic)
char_mappings = {
'2': 'ء', '3': 'ع', '5': 'خ', '6': 'ط', '7': 'ح', '8': 'غ', '9': 'ق',
'a': 'ا', 'b': 'ب', 't': 'ت', 'th': 'ث', 'j': 'ج', 'd': 'د',
'r': 'ر', 'z': 'ز', 's': 'س', 'sh': 'ش', 'f': 'ف', 'k': 'ك',
'l': 'ل', 'm': 'م', 'n': 'ن', 'h': 'ه', 'w': 'و', 'y': 'ي',
'aa': 'آ', 'ee': 'ي', 'oo': 'و', 'ou': 'و', 'ai': 'ي', 'ay': 'ي'
}
# DIGRAPH MAPPINGS (two-letter combinations first)
digraph_mappings = {
'kh': 'خ', 'gh': 'غ', 'ch': 'ش', 'th': 'ث', 'dh': 'ذ',
'sh': 'ش', 'ts': 'ص', 'dz': 'ض', 'ss': 'ص', 'tt': 'ط',
'zz': 'ظ', 'aa': 'آ', 'ee': 'ي', 'ii': 'ي', 'oo': 'و',
'uu': 'و', 'ou': 'و', 'ai': 'ي', 'ay': 'ي', 'ey': 'ي'
}
# Convert text
result = text.lower()
# Step 1: Apply word mappings (most specific first)
for arabizi_word, arabic_word in word_mappings.items():
# Use word boundaries to avoid partial matches
pattern = r'\b' + re.escape(arabizi_word) + r'\b'
result = re.sub(pattern, arabic_word, result, flags=re.IGNORECASE)
# Step 2: Apply digraph mappings
for digraph, arabic_char in digraph_mappings.items():
result = result.replace(digraph, arabic_char)
# Step 3: Apply single character mappings
for char, arabic_char in char_mappings.items():
if len(char) == 1: # Only single chars in this step
result = result.replace(char, arabic_char)
return result
def arabic_to_arabizi(text):
"""
Convert Arabic script to Arabizi
COMPLETE HARD-CODED MAPPINGS
"""
if not text:
return text
# COMPREHENSIVE WORD MAPPINGS (Arabic → Arabizi)
word_mappings = {
# Pronouns
'أنا': 'ana', 'نتا': 'nta', 'نتي': 'nti', 'هوا': 'howa', 'هيا': 'hiya',
'حنا': 'hna', 'أحنا': 'ahna', 'نتوما': 'ntuma', 'هوما': 'huma',
# Question words
'شكون': 'shkoun', 'أشنو': 'achno', 'شنو': 'chno', 'أش': 'ach',
'واش': 'wach', 'كيفاش': 'kifash', 'كيف': 'kif', 'فين': 'feen',
'منين': 'mnin', 'إمتا': 'imta', 'متا': 'meta', 'علاش': '3lach',
# Common verbs
'بغيت': 'bghit', 'بغيتي': 'bghiti', 'بغا': 'bgha', 'بغينا': 'bghina',
'كان': 'kan', 'كانا': 'kana', 'كانت': 'kanet', 'كانو': 'kanu',
'قلت': 'galt', 'قلتي': 'galti', 'قال': 'gal', 'قالت': 'galet',
'قالو': 'galou', 'قلنا': 'galina',
'راح': 'rah', 'راها': 'raha', 'راهي': 'rahi', 'راهم': 'rahom',
'غادي': 'ghadi', 'غاد': 'ghad', 'غا': 'gha', 'غادية': 'ghadia',
'دير': 'dir', 'درت': 'dert', 'درات': 'derat', 'درنا': 'derna',
'جا': 'ja', 'جات': 'jat', 'جينا': 'jina', 'جاو': 'jaou',
'مشا': 'mcha', 'مشات': 'mchat', 'مشينا': 'mchina', 'مشاو': 'mchaou',
# Demonstratives
'هاد': 'had', 'هادا': 'hada', 'هادي': 'hadi', 'هادو': 'hadou',
'هادوك': 'hadouk', 'هادشي': 'hadchi', 'هاداك': 'hadak',
'داك': 'dak', 'ديك': 'dik', 'دوك': 'dok', 'داكشي': 'dakchi',
# Numbers
'واحد': 'wahed', 'جوج': 'joj', 'تلاتا': 'tlata', 'ربعا': 'rebaa',
'خمسا': 'khamsa', 'ستا': 'setta', 'سبعا': 'sebaa', 'تمنيا': 'tmanya',
'تسعا': 'tesaa', 'عشرا': 'ashra',
# Time
'دابا': 'daba', 'توا': 'tawa', 'غدا': 'ghda', 'البارح': 'lbareeh',
'نهار': 'nhar', 'ليلا': 'lila', 'صباح': 'sbah', 'عشيا': 'aachia',
# Family
'ماما': 'mama', 'بابا': 'baba', 'خويا': 'khoya', 'ختي': 'khti',
'ختيا': 'khtiya', 'أخي': 'akhi', 'أختي': 'ukhti',
'جد': 'jad', 'جدا': 'jada', 'عمو': 'amo', 'عما': 'ama',
# Adjectives
'زوين': 'zwin', 'زوينا': 'zwina', 'قبيح': 'qbih', 'قبيحا': 'qbiha',
'كبير': 'kbir', 'كبيرا': 'kbira', 'صغير': 'sghir', 'صغيرا': 'sghira',
'تقيل': 'tqil', 'تقيلا': 'tqila', 'خفيف': 'khfif', 'خفيفا': 'khfifa',
# Quantities
'بزاف': 'bzzaf', 'كتير': 'ktir', 'شوياة': 'chwiya', 'كولشي': 'kolchi',
'كول': 'kol', 'غاع': 'gaa', 'حتا': 'hta', 'والو': 'walo',
# Negations
'ما': 'ma', 'ماشي': 'machi', 'مابغيتش': 'mabghitsh', 'ماكاينش': 'makainch',
'ماكانش': 'makansh', 'ماغاتش': 'maghatch', 'مابغيش': 'mabaghish',
# Expressions
'سلام': 'salam', 'يالاه': 'yallah', 'يالا': 'yalla', 'هيا': 'hya',
'أجي': 'aji', 'سير': 'sir', 'سيري': 'siri', 'أجو': 'ajou',
'مبروك': 'mabrook', 'باركا': 'baraka', 'بصحا': 'besaha',
'الله': 'allah', 'ربي': 'rabi', 'إن شاء الله': 'inchallah',
'ما شاء الله': 'machallah', 'الحمد لله': 'hamdulillah',
# Places
'المغرب': 'lmaghrib', 'مغرب': 'maghrib', 'كازا': 'casa',
'الرباط': 'rbat', 'فاس': 'fas', 'مكناس': 'mknas',
'طنجا': 'tanja', 'أكادير': 'agadir', 'مراكش': 'marrakech',
# Food and drinks
'طاجين': 'tajine', 'كوسكوس': 'couscous', 'مسمن': 'msemen',
'رغايف': 'rghaif', 'حريرا': 'harira', 'أتاي': 'atay',
'خوبز': 'khobz', 'الما': 'lma', 'لحم': 'lahem', 'دجاج': 'djaj',
# Common nouns
'دار': 'dar', 'بيت': 'bit', 'طوموبيل': 'tomo', 'كرهوبا': 'karhouba',
'ماكلا': 'makla', 'خضرا': 'khodra', 'فواكه': 'fawakeh',
'حوت': 'hout', 'اللبن': 'lben', 'سكر': 'skar', 'ملح': 'melh'
}
# CHARACTER MAPPINGS (Arabic → Arabizi)
char_mappings = {
'ا': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'j', 'ح': '7',
'خ': 'kh', 'د': 'd', 'ذ': 'dh', 'ر': 'r', 'ز': 'z', 'س': 's',
'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': '6', 'ظ': 'z', 'ع': '3',
'غ': 'gh', 'ف': 'f', 'ق': '9', 'ك': 'k', 'ل': 'l', 'م': 'm',
'ن': 'n', 'ه': 'h', 'و': 'w', 'ي': 'y', 'ء': '2',
'آ': 'aa', 'أ': 'a', 'إ': 'i', 'ئ': '2', 'ؤ': 'w2', 'ة': 'a',
'ى': 'a', 'ً': 'an', 'ٌ': 'on', 'ٍ': 'in', 'َ': 'a', 'ُ': 'o', 'ِ': 'i'
}
# Convert text
result = text
# Step 1: Apply word mappings (most specific first)
for arabic_word, arabizi_word in word_mappings.items():
# Use word boundaries to avoid partial matches
pattern = r'\b' + re.escape(arabic_word) + r'\b'
result = re.sub(pattern, arabizi_word, result)
# Step 2: Apply character mappings
for arabic_char, arabizi_char in char_mappings.items():
result = result.replace(arabic_char, arabizi_char)
return result
def chat_with_atlas(message, history):
"""Generate response from Atlas-Chat model with Arabizi conversion"""
if not message.strip():
return "مرحبا! أهلا وسهلا. Please enter a message! / Ahlan wa sahlan!"
try:
# Load model if not already loaded
model = load_model()
# Detect if input is Arabizi
is_arabizi_input = detect_arabizi(message)
# Prepare input for the model
if is_arabizi_input:
# Convert Arabizi to Arabic for the model
arabic_input = arabizi_to_arabic(message)
print(f"🔄 Converted Arabizi '{message}' → Arabic '{arabic_input}'")
model_input = arabic_input
else:
# Use original input (Arabic or English)
model_input = message
# Generate response using Arabic input
messages = [{"role": "user", "content": model_input}]
outputs = model(
messages,
max_new_tokens=256,
temperature=0.1,
do_sample=True,
pad_token_id=model.tokenizer.eos_token_id
)
# Extract the response
response = outputs[0]["generated_text"][-1]["content"].strip()
# Convert response back to Arabizi if input was Arabizi
if is_arabizi_input:
arabizi_response = arabic_to_arabizi(response)
print(f"🔄 Converted response '{response}' → Arabizi '{arabizi_response}'")
return arabizi_response
else:
# Return original response for Arabic/English
return response
except Exception as e:
# Return error in appropriate language
if detect_arabizi(message):
return f"sorry, kan chi mochkil: {str(e)}. 3awd jar'b!"
else:
return f"عذراً، واجهت خطأ: {str(e)}. جرب مرة أخرى! / Sorry, error occurred: {str(e)}. Try again!"
# Create the Gradio interface
demo = gr.ChatInterface(
fn=chat_with_atlas,
title="🏔️ Atlas-Chat: Moroccan Arabic AI Assistant",
description="""
**مرحبا بك في أطلس شات!** Welcome to Atlas-Chat! 🇲🇦
**🧠 Smart Language Detection & Conversion:**
- **Arabic Script (العربية)** → AI responds in Arabic
- **Arabizi (3arabi bi 7oruf latin)** → AI responds in Arabizi
- **English** → AI responds in English
**✨ Full Arabizi Support:** Type "shkoun nta?" and get "ana atlas-chat..."
**جرب هذه الأسئلة / Try these questions:**
""",
examples=[
"شكون لي صنعك؟",
"shkoun li sna3ek?",
"اشنو هو الطاجين؟",
"achno howa tajine?",
"شنو كيتسمى المنتخب المغربي؟",
"chno kaytsma lmontakhab lmaghribi?",
"What is Morocco famous for?",
"Tell me about Casablanca",
"كيفاش نقدر نتعلم الدارجة؟",
"kifash n9der nt3elem darija?",
"wach kayn atay f lmaghrib?",
"3lach lmaghrib zwien bzzaf?",
"kifash nsali tajine?",
"chno homa l2aklat lmaghribiya?"
],
cache_examples=False
)
# Launch the app
if __name__ == "__main__":
demo.launch() |