Tanda Baca Arab: Cara Amal Mengelola Tashkeel, Shadda, dan Hamza
Baca 5 mntMohammad Shaker

Tanda Baca Arab: Cara Amal Mengelola Tashkeel, Shadda, dan Hamza

Amal mengelola semua tanda diakritik Arab, termasuk tashkeel, variasi alef, hamza, dan ligatur Lam-Alef untuk belajar bahasa Arab yang tepat.

Engineering

Jawaban Singkat

Amal mengelola semua tanda diakritik Arab, termasuk tashkeel, variasi alef, hamza, dan ligatur Lam-Alef untuk belajar bahasa Arab yang tepat.

Bagaimana Amal Mengelola Tanda Diakritik Arab: Tashkeel, Shadda, dan Hamza

Amal mengelola seluruh kompleksitas tanda diakritik Arab: 8 tanda tashkeel (fatha, damma, kasra, shadda, sukun, fathatan, dammatan, kasratan), 4 variasi alef (standar, madda, hamza di atas, hamza di bawah, wasla), 3 variasi hamza (terpisah, pada waw, pada ya), dan ligatur Lam-Alef. Pengakuan suara, rendering teks, dan penilaian kemiripan dalam aplikasi ini memperlakukan Arab dengan diakritik ("كَتَبَ") berbeda dari tanpa diakritik ("كتب") — perbedaan penting yang sering diabaikan oleh aplikasi pembelajaran bahasa Arab lainnya.

Mengapa Tanda Diakritik Penting untuk Pembelajaran

Masalah Ambiguitas

Arab tanpa diakritik bisa membingungkan:
- "كتب" dapat berarti:
- "kataba" (dia menulis) — waktu lampau
- "kutub" (buku-buku) — bentuk jamak
- "kutiba" (itu ditulis) — kalimat pasif

Semua dieja sama tanpa diakritik. Tanda diakritik menghilangkan ambiguitas tersebut.

Progres Pembelajaran

  1. Pemula: Belajar membaca DENGAN diakritik (mudah — vokal terlihat)
  2. Menengah: Latihan DENGAN diakritik hingga otomatis
  3. Lanjutan: Secara bertahap hilangkan diakritik, membaca jadi lebih menantang
  4. Fasih: Membaca tanpa diakritik dengan lancar (selevel penutur asli)

Kebanyakan aplikasi pembelajaran Arab melewati langkah pertama — mereka tidak mengajarkan diakritik atau menghapusnya. Ini mengajarkan kebiasaan buruk. Progres Amal sesuai dengan metode ilmiah.

Implementasi Tingkat Unicode

Tanda Diakritik (8 total)

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

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

static const Map<String, String> hamzaVariants = { 'HAMZA_ISOLATED': 'ء', // Hamza berdiri sendiri 'HAMZA_ON_WAW': 'ؤ', // Hamza pada waw (و + hamza) 'HAMZA_ON_YEH': 'ئ', // Hamza pada ya (ي + hamza) }; }

Tanda Al-Qur'an dan Hentian Uthmani

Pada Thurayya, kami dukung tanda khusus Al-Qur'an:

static const Map<String, String> quranicMarks = {
  'STOP_FULL': 'ۖ',         // Titik berhenti penuh (‖)
  'STOP_HALF': 'ۗ',         // Titik berhenti setengah
  'STOP_QUA': 'ۙ',          // Titik berhenti qua
  'STOP_NECESSARY': 'ۚ',     // Titik berhenti wajib
  'TAJWEED_ELONGATION': '۝', // Penanda pemanjangan tajweed
};

Pengakuan Suara yang Memperhatikan Diakritik

Penyesuaian Konteks dengan Diakritik

Saat anak belajar "كَتَبَ" (dia menulis, waktu lampau), sistem pengakuan suara diarahkan pada pelafalan persis ini:

# src/services/stt_client.py
def recognize_with_diacritical_context(audio_bytes, expected_text):
    # expected_text = "كَتَبَ" (dengan diakritik)
# Buat hint konteks ucapan
speech_context = {
    'phrases': [expected_text],
    'boost': 20.0  # Dorongan tinggi untuk teks ini
}

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

# Hasil: Google STT lebih condong mengenali pelafalan "kataba"
return response

Penilaian Kemiripan dengan Diakritik

def compare_pronunciations(expected, actual):
    """
    expected: "كَتَبَ" (dengan diakritik)
    actual: "كتب" (usaha anak, mungkin tanpa diakritik)
    """
    
    # Hilangkan diakritik untuk perbandingan kasar
    expected_base = strip_diacritics(expected)  # "كتب"
    actual_base = strip_diacritics(actual)      # "كتب"
    
    # Kemiripan dasar (abaikan diakritik)
    base_similarity = string_similarity(expected_base, actual_base)  # 1.0 (sempurna)
    
    # Bonus diakritik (jika anak mencoba menggunakan diakritik)
    diacritic_bonus = 0.0
    if has_diacritics(actual):
        diacritic_accuracy = diacritics_match_ratio(expected, actual)
        diacritic_bonus = diacritic_accuracy * 0.15  # Hingga +15% untuk diakritik benar
    
    # Skor akhir
    final_score = min(base_similarity + diacritic_bonus, 1.0)
    
    return {
        'base_score': base_similarity,
        'diacritic_bonus': diacritic_bonus,
        'final_score': final_score,
        'feedback': 'Bagus! Pelafalan sudah sempurna. Selanjutnya, latih tanda diakritik.'
    }

Artinya:
- Anak mengucapkan "كتب" (tanpa diakritik) → nilai 85-90% (dasar benar, diakritik hilang)
- Anak mengucapkan "كَتَبَ" (penuh dengan diakritik) → nilai 98% ke atas (sempurna)
- Progres jelas: kuasai dasar dulu, lalu tambahkan ketelitian diakritik

Tantangan Rendering dari Kanan ke Kiri (RTL)

Pengaturan Arah Teks

// lib/src/screens/lesson_screen.dart
Column(
  children: [
    Directionality(
      textDirection: TextDirection.rtl,  // Untuk teks Arab
      child: Text(
        'كَتَبَ',
        textAlign: TextAlign.right,      // Rata kanan untuk RTL
        style: TextStyle(
          fontFamily: 'IBMPlexSansArabic',
          fontSize: 36,
          height: 1.8,  // Baris lebih tinggi untuk diakritik
        ),
      ),
    ),
    // Instruksi bahasa Inggris di bawah
    Directionality(
      textDirection: TextDirection.ltr,  // Untuk Bahasa Inggris
      child: Text(
        'Pronounce: "he wrote"',
        textAlign: TextAlign.left,       // Rata kiri untuk LTR
      ),
    ),
  ],
)

Pembentukan Huruf Sambung

Huruf Arab berubah bentuk tergantung posisi:
- Terisolasi: "ك" (Kaf)
- Awal kata: "كَـــ" (Kaf di awal)
- Tengah kata: "ـــكَـــ" (Kaf di tengah)
- Akhir kata: "ـــكَ" (Kaf di akhir)

Font IBMPlexSansArabic otomatis mengatur bentuk huruf, namun diperlukan urutan karakter Unicode yang benar:

// Benar: Menggunakan karakter penghubung Unicode
String word = 'ك' + '\u0640' + 'ت' + '\u0640' + 'ب';  // Kashida (karakter perpanjangan)

// Salah: Penggabungan langsung
String word = 'ك' + 'ت' + 'ب';  // Bisa tidak terbentuk dengan benar di semua perangkat

Campuran Teks Bidirectional

Saat bahasa Inggris dan Arab muncul bersama:

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

Hasil: "means كتاب (book)" tampil dengan alur bidirectional yang benar.

FAQ

T: Kenapa harus memaksa penggunaan diakritik pada pemula? Bukankah jadi lebih sulit?
J: Awalnya memang lebih sulit. Tapi belajar dengan diakritik memperkuat asosiasi huruf-suara. Penelitian menunjukkan penggunaan diakritik mempercepat kefasihan. Setelah mahir dengan diakritik, membaca tanpa diakritik jadi langkah alami berikutnya.

T: Bagaimana jika keyboard anak saya tidak mendukung mengetik diakritik?
J: Aplikasi tidak meminta anak mengetik diakritik. Pengakuan dan pelafalan berbasis suara. Hanya orang dewasa (guru, pembuat konten) yang perlu memasukkan diakritik, menggunakan keyboard Arab khusus.

T: Apakah Amal mendukung kombinasi diakritik non-standar?
J: Kami mendukung semua kombinasi standar Unicode. Kombinasi langka atau khusus mungkin tidak tampil sempurna, tapi Al-Qur'an standar dan Arab modern didukung penuh.

Artikel Terkait