Ispravno korištenje arapskih dijakritika u Amal aplikaciji
Čitanje: 5 minMohammad Shaker

Ispravno korištenje arapskih dijakritika u Amal aplikaciji

Amal aplikacija pravilno obrađuje arapske dijakritike kao što su tashkeel, shadda i hamza za učenje arapskog jezika.

Engineering

Brzi odgovor

Amal aplikacija pravilno obrađuje arapske dijakritike kao što su tashkeel, shadda i hamza za učenje arapskog jezika.

Arapski dijakritici ispravno: Kako Amal rukuje s Tashkeel, Shadda i Hamza

Amal obrađuje punu složenost arapskih dijakritika: 8 tashkeel znakova (fatha, damma, kasra, shadda, sukun, fathatan, dammatan, kasratan), 4 varijante alefa (standardni, madda, hamza iznad, hamza ispod, wasla), 3 varijante hamze (izolirana, na waw, na ya) i Lam-Alef ligature. Aplikacija koristi prepoznavanje govora, prikaz teksta i bodovanje sličnosti koji tretiraju diakritizirani arapski ("كَتَبَ") drugačije od nedijakritiziranog ("كتب") — što je važna razlika koju većina aplikacija za učenje arapskog zanemaruje.

Zašto su dijakritici važni za učenje

Problem dvosmislenosti

Arapski bez dijakritika je nejasan:

  • "كتب" može značiti:
  • "kataba" (on je napisao) — prošlo vrijeme
  • "kutub" (knjige) — množina
  • "kutiba" (bilo je napisano) — pasivni glas

Svi se isto pišu bez dijakritika. Dijakritici uklanjaju nejasnoću.

Tok učenja

  1. Početnik: Uči čitati SA dijakritičkim znakovima (lakše — samoglasnici su označeni)
  2. Srednji nivo: Vježba SA dijakritičkim znakovima dok ne postane automatski
  3. Napredni: Postepeno uklanja dijakritike, čitanje postaje teže
  4. Tečno: Čita tečno BEZ dijakritika (razina izvornog govornika)

Većina aplikacija za učenje arapskog preskače prvi korak — ne uče dijakritike ili ih sklanjaju. To vodi u loše navike. Amalova progresija je naučno ispravna.

Naša implementacija na Unicode nivou

Dijakritički znakovi (ukupno 8)

// lib/src/utils/arabic_extension.dart
class ArabicExtension {
  static const Map<String, String> tashkeelMarks = {
    'FATHA': '\u064E',      // َ (samoglasnik 'a')
    'DAMMA': '\u064F',      // ُ (samoglasnik 'u')
    'KASRA': '\u0650',      // ِ (samoglasnik 'i')
    'SUKUN': '\u0652',      // ْ (nema samoglasnika)
    'SHADDA': '\u0651',     // ّ (duplirano slovo)
    'FATHATAN': '\u064B',   // ً (tanvin 'an')
    'DAMMATAN': '\u064C',   // ٌ (tanvin 'un')
    'KASRATAN': '\u064D',   // ٍ (tanvin 'in')
  };

static const Map<String, String> alefVariants = { 'ALEF_STANDARD': 'ا', // ا 'ALEF_WITH_MADDA': 'آ', // آ (produženi alef) 'ALEF_WITH_HAMZA_ABOVE': 'أ', // أ 'ALEF_WITH_HAMZA_BELOW': 'إ', // إ 'ALEF_WASLA': 'ٰ', // ٰ (spojni alef) };

static const Map<String, String> hamzaVariants = { 'HAMZA_ISOLATED': 'ء', // samostalna hamza 'HAMZA_ON_WAW': 'ؤ', // hamza na waw (و + hamza) 'HAMZA_ON_YEH': 'ئ', // hamza na yeh (ي + hamza) }; }

Kur'anski dijakritici i Uthmanski znaci zastoja

Za Thurayya podržavamo specifične kur'anske znakove:

static const Map<String, String> quranicMarks = {
  'STOP_FULL': 'ۖ',         // puni znak zastoja (‖)
  'STOP_HALF': 'ۗ',         // polu znak zastoja
  'STOP_QUA': 'ۙ',          // Qua znak zastoja
  'STOP_NECESSARY': 'ۚ',     // neophodan znak zastoja
  'TAJWEED_ELONGATION': '۝', // znak produženja
};

Prepoznavanje govora s obzirom na dijakritike

Usklađivanje konteksta sa dijakriticima

Kada dijete uči "كَتَبَ" (on je napisao, prošlo vrijeme), program usmjerava prepoznavanje govora prema toj točnoj vokalizaciji:

# src/services/stt_client.py
def recognize_with_diacritical_context(audio_bytes, expected_text):
    # expected_text = "كَتَبَ" (sa dijakriticima)
# Kreiraj pomoć konteksta govora
speech_context = {
    'phrases': [expected_text],
    'boost': 20.0  # Veliko pojačanje za očekivani tekst
}

# Pošalji Google Cloud STT
response = google_stt_client.recognize(
    audio=audio_bytes,
    language_code='ar-SA',
    speech_contexts=[speech_context]
)

# Rezultat: Google STT je usmjeren na "kataba" izgovor
return response

Bodovanje sličnosti koje uzima u obzir dijakritike

def compare_pronunciations(expected, actual):
    """
    expected: "كَتَبَ" (sa dijakriticima)
    actual: "كتب" (pokušaj djeteta, moguće bez dijakritika)
    """
# Ukloni dijakritike za grubu usporedbu
expected_base = strip_diacritics(expected)  # "كتب"
actual_base = strip_diacritics(actual)      # "كتب"

# Osnovna sličnost (ignorirajući dijakritike)
base_similarity = string_similarity(expected_base, actual_base)  # 1.0 (savršeno)

# Bonus za dijakritike (ako pokušaj djeteta ima dijakritike)
diacritic_bonus = 0.0
if has_diacritics(actual):
    diacritic_accuracy = diacritics_match_ratio(expected, actual)
    diacritic_bonus = diacritic_accuracy * 0.15  # Do +15% za ispravne dijakritike

# Konačni rezultat
final_score = min(base_similarity + diacritic_bonus, 1.0)

return {
    'base_score': base_similarity,
    'diacritic_bonus': diacritic_bonus,
    'final_score': final_score,
    'feedback': 'Odlično! Izgovor je savršen. Sljedeće, vježbaj dijakritičke znakove.'
}

To znači:

  • Dijete kaže "كتب" (bez dijakritika) → 85-90% bodova (ispravna osnova, nedostaju dijakritici)
  • Dijete kaže "كَتَبَ" (potpuno diakritizirano) → 98%+ bodova (savršeno)

Progres je jasan: prvo savladati osnovni izgovor, potom dodati dijakritičke nijanse.

Izazovi prikaza teksta s desna na lijevo

Upravljanje smjerom teksta

// lib/src/screens/lesson_screen.dart
Column(
  children: [
    Directionality(
      textDirection: TextDirection.rtl,  // Za arapski tekst
      child: Text(
        'كَتَبَ',
        textAlign: TextAlign.right,      // Poravnanje desno za RTL
        style: TextStyle(
          fontFamily: 'IBMPlexSansArabic',
          fontSize: 36,
          height: 1.8,  // Veća visina linije zbog dijakritika
        ),
      ),
    ),
    // Upute na engleskom ispod
    Directionality(
      textDirection: TextDirection.ltr,  // Za engleski
      child: Text(
        'Izgovori: "on je napisao"',
        textAlign: TextAlign.left,       // Lijevo poravnat za LTR
      ),
    ),
  ],
)

Oblikovanje spojenih slova

Arapska slova mijenjaju oblik ovisno o poziciji:

  • Izolirano: "ك" (Kaf)
  • Početno: "كَـــ" (Kaf na početku riječi)
  • Medijalno: "ـــكَـــ" (Kaf u sredini)
  • Završno: "ـــكَ" (Kaf na kraju)

Font IBMPlexSansArabic automatski oblikuje, ali treba pravilne Unicode nizove:

// Ispravno: koristi Unicode znakove za spajanje
String word = 'ك' + '\u0640' + 'ت' + '\u0640' + 'ب';  // Kashida (znak za produženje)

// Neispravno: direktna konkatenacija String word = 'ك' + 'ت' + 'ب'; // Možda se ne oblikuje pravilno na svim uređajima

Mešavina teksta s različitim smjerovima pisanja

Kada se engleski i arapski pojavljuju zajedno:

RichText(
  textDirection: TextDirection.rtl,  // Ukupno RTL
  text: TextSpan(
    children: [
      TextSpan(text: 'means ', style: englishStyle),  // LTR
      TextSpan(text: 'كتاب', style: arabicStyle),    // RTL
      TextSpan(text: ' (book)', style: englishStyle), // LTR
    ],
  ),
)

Rezultat: "means كتاب (book)" prikazan s ispravnim dvostrukim smjerom.

Često postavljana pitanja (FAQ)

P: Zašto forsirati dijakritike kod početnika? Ne otežava li to učenje?
O: Isprva da. Ali učenje s dijakriticima jača asocijacije između slova i zvuka. Istraživanja pokazuju da to vodi bržem savladavanju tečnosti. Nakon što osoba savlada čitanje s dijakriticima, prelazak na čitanje bez njih je prirodan progres.

P: Šta ako tastatura mog deteta ne podržava dijakritike?
O: Aplikacija nikada ne traži od djece da pišu dijakritike. Prepoznavanje i izgovor se baziraju na govoru. Samo odrasli (nastavnici, kreatori sadržaja) unose dijakritike, i koriste specifilane arapske tastature.

P: Da li Amal podržava nestandardne dijakritičke kombinacije?
O: Podržavamo sve Unicode standardizirane kombinacije. Rijetke ili prilagođene kombinacije možda se neće ispravno prikazati, ali standardni kur'anski i moderni arapski su potpuno podržani.

Povezani članci