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
- Početnik: Uči čitati SA dijakritičkim znakovima (lakše — samoglasnici su označeni)
- Srednji nivo: Vježba SA dijakritičkim znakovima dok ne postane automatski
- Napredni: Postepeno uklanja dijakritike, čitanje postaje teže
- 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.



