--
ملخص المقال:
يستعرض هذا المقال التجربة الهندسية والمساهمة البرمجية التي قدمناها في حزمة ReciteQuran (عبر Pull Request #5)، وهي الحزمة مفتوحة المصدر المخصصة لتتبع التسميع القرآني ومحاذاة الكلمات لحظياً على أجهزة المستخدمين (On-Device) في بيئة Flutter. نسلط الضوء على التحسينات الخوارزمية والمعمارية المضافة: كشف إسقاط الكلمات (Best-Drop LCS)، ومطابقة فواصل الآيات لمختلف الروايات (QiraatAyahMapper)، وترشيد حجم الحزمة عبر التحميل عند الطلب (On-Demand Assets)، بعد التحقق منها واختبارها ميدانياً في النسخة التجريبية (Alpha) لتطبيق تثبيت (Tathbeet).
1. ما هي حزمة ReciteQuran؟ ولماذا تهم المطور القرآني؟
تعد حزمة ReciteQuran (المطورة بلغة Dart لبيئة Flutter) إحدى الإضافات النوعية في منظومة البرمجيات الإسلامية مفتوحة المصدر؛ إذ تهدف إلى توفير محرك تسميع صوتي تفاعلي يعمل بالكامل على معالج الهاتف المحمول دون إرسال أي صوت لخوادم خارجية، معتمداً على ثلاث ركائز تقنية:
- التعرف الصوتي المدمج: تشغيل نماذج تحويل الصوت إلى فونيمات (Phonemes) عبر مكتبة
sherpa-onnx.
- محاذاة الكلمات اللحظية: تتبع تقدم القارئ كلمة بكلمة باستخدام خوارزمية مطابقة المسار الزمني الديناميكي (Dynamic Time Warping - DTW).
- التحقق من التجويد القطعي: فحص أحكام النون الساكنة والتنوين والمدود بقواعد برمجية حتمية (Deterministic Rules).
ومع القيمة الكبيرة التي تقدمها الحزمة، واجهتنا تحديات عملية عند استخدامها في بيئة إنتاجية حقيقية، تمثلت في: ارتباك المحرك عند نسيان القارئ لبعض الكلمات (السقطات)، واقتصار الحزمة على مذهب العد الكوفي (رواية حفص)، وتضخم حجم الأصول المحزومة داخل المكتبة.
دفعتنا هذه النقاط إلى دراسة كود الحزمة وتقديم مساهمة برمجية متكاملة تعالج هذه الجوانب جذرياً.
2. شكر وتقدير لأصحاب المشاريع والمبادرات (Acknowledgements)
إن أي تطوير في الحوسبة القرآنية هو امتداد لجهود مخلصة قدمها باحثون ومطورون سخروا معارفهم لخدمة كتاب الله، ونخص بالذكر والتقدير:
- مشروع QuranLab (الأخ @Quran Lab / QuranLab):
على تدريب وتوفير النموذج الصوتي العصبي العربي Zipformer (بنسخة Int8 المكممة)، الذي أتاح التعرف الصوتي بدقة وسرعة فائقة على معالجات الهواتف دون الحاجة لعتاد حوسبي فائق.
- مشروع ومنصة قرآن بيديا (Quranpedia):
لإتاحة التوثيق المرجعي المفتوح لمطابقة الآيات (qiraat-ayah-map) بين مختلف الروايات ومذاهب العد، وهو ما مكننا من بناء تحويل دقيق ومنضبط شرعياً. @عبيد
- مشروع وحزمة ReciteQuran ( @Iam-Muslim ):
لتأسيس هذه الحزمة الرائدة وهندسة بنيتها التحتية الأولى التي ربطت بين الذكاء الاصطناعي الصوتي ومحاذاة النصوص في بيئة Flutter.
- أبحاث الدكتور عمر أبو حفص (مشروع سراج / tasmee3-muaalem-findings):
على أبحاثه الرائدة حول معايير المقارئ الذكية وتحديده لخوارزمية Best-Drop LCS كمعيار ذهبي لرصد إسقاط الكلمات.
3. التحسينات البرمجية والمعمارية المقدمة في الحزمة (PR #5)
تمحورت مساهمتنا البرمجية في Pull Request #5 حول أربعة محاور تقنية رئيسية:
المحور الأول: خوارزمية كشف السقطات بدقة (Best-Drop LCS Locator)
- المعضلة: في خوارزمية DTW، عندما يسقط القارئ كلمة أو نصف آية سهواً، تحاول الخوارزمية قسراً توزيع الفونيمات المنطوقة على كامل الآية الأصلية، مما يسبب إزاحة في مؤشر التتبع ووسم الكلمات اللاحقة المنطوقة بدقة بأنها غير صحيحة.
- المعالجة: قمنا ببناء فئة مستقلة
LcsOmissionDetector تطبق خوارزمية أطول تسلسل جزئي مشترك (Longest Common Subsequence - LCS) عبر البرمجة الديناميكية:
- استخدام ذاكرة محصورة بسطرين (Two-row sliding buffer) لتفادي استنزاف الذاكرة العشوائية على الهاتف.
- تعقيد زمني منضبط $O(N)$ لحساب مسار النقص ومقارنته بالحد الأدنى للكلمات المنطوقة.
- تحديد رقم الفهرس الدقيق للكلمة المسقطة (0-based dropped index) في كائن
OmissionResult، مما يتيح لواجهة المستخدم تنبيه الحافظ للسقط دون إفساد محاذاة بقية الآية.
المحور الثاني: دعم تعدد الروايات ومطابقة فواصل الآيات (QiraatAyahMapper)
- المعضلة: تفترض معظم التطبيقات أن ترقيم الآيات وفواصلها يتبع دائماً رواية حفص (كاعتبار البسملة آية مستقلة في الفاتحة)، بينما تختلف فواصل الآيات وبدايات السور في روايات أخرى كورش وقالون.
- المعالجة البرمجية:
- أنشأنا وحدة
QiraatAyahMapper بالاعتماد على بيانات Quranpedia لمطابقة فواصل الآيات بين الروايات المختلفة ومصحف حفص (العد الكوفي) عبر استعلام ثنائي الاتجاه بزمن ثابت $O(1)$.
- يتيح هذا التحويل تتبع الكلمات بسلاسة وعرض التفاسير والترجمات المتوافقة دون أي إزاحة في أرقام الآيات، مع الحفاظ على التوافق الرجعي عبر واجهة
WarshHafsMapper.
- الأمانة العلمية والتجويدية: قصرنا التحقق من أحكام التجويد الحتمية على رواية حفص مؤقتاً؛ لكون النموذج الصوتي الحالي مدرباً على أحكامها، مع وضع تنبيه علمي يؤكد أن البرمجيات وسيلة معينة وليست بديلاً عن التلقي والمشافهة.
المحور الثالث: ترشيد حجم الحزمة ومعمارية التحميل عند الطلب (On-Demand Assets)
- المعضلة: كانت الحزمة تدرج مسبقاً ملفات تحويل الروايات الضخمة بصيغة JSON داخل مجلد الـ
assets/، مما أضاف حمولة تقارب 3.6 ميجابايت لحجم الحزمة، فضلاً عن الحاجة لتحميل النموذج العصبي الصوتي (~68 ميجابايت).
- المعالجة:
- تجريد ملف
pubspec.yaml من ملفات تحويل الآيات الثابتة، والاحتفاظ فقط بملف الفهارس العام riwayat.json (بحجم 2.3 كيلوبايت).
- تطوير فئتي
AyahMappingDownloader و ModelDownloader اللتين تتوليان تنزيل ملفات الرواية والنموذج عند حاجة المستخدم إليها وتخزينها محلياً في مسار التطبيق، مع دعمهما لإظهار نسبة التقدم والإلغاء وتفادي انقطاع الاتصال.
- دعم المسارات المخصصة عبر معاملي
assetOverrideDir في المحرك الصوتي و phonemeFilePath في خدمة البيانات، لتمكين أي تطبيق من تخزين الأصول في أي دليل مناسب له.
- نقل ملفات الـ JSON إلى مجلد
test/fixtures/ لتشغيل الاختبارات الآلية دون تصديرها كأصول للمستخدم النهائي.
المحور الرابع: توسيع مصفوفة الاختبارات الآلية (Zero Test Breakage)
- صممنا اختبارات وحدوية شاملة تغطي كافة الوحدات الجديدة (خوارزمية السقطات، مطابقة فواصل الروايات، التنزيل عند الطلب، وتوافق المسارات).
- النتيجة: اجتياز 34 اختباراً آلياً بنسبة نجاح 100% (
flutter test)، مع خلو تام من أي تنبيهات تحليلية (flutter analyze - No issues found).
4. الفحص الميداني في النسخة التجريبية لتطبيق تثبيت (Tathbeet Alpha)
لضمان خروج هذه التحسينات من حيز الكود النظري إلى الجاهزية الإنتاجية، تم اعتماد الحزمة بعد هذه التعديلات ومطابقتها داخل النسخة التجريبية (Alpha) من تطبيق تثبيت (Tathbeet):
- الاستقرار تحت ضغط المعالجة: تم اختبار المحرك على هواتف بمواصفات متعددة أثناء التسميع المستمر، وأثبت المحرك كفاءة عالية في التتبع اللحظي دون ارتفاع في درجة حرارة المعالج أو استنزاف الذاكرة.
- المرونة مع الروايات المختلفة: تم التحقق عملياً من التسميع بروايات حفص، وورش، وقالون، والتأكد من مطابقة فواصل الآيات وسلامة الانتقال التلقائي بين الآيات أثناء القراءة.
- خفة التثبيت وسرعة البدء: بفضل معمارية التحميل عند الطلب، انخفض الحجم المبدئي للتطبيق بشكل ملحوظ، وأصبح بإمكان المستخدم بدء التسميع الفوري بروايته المفضلة وتنزيل مواردها في ثوانٍ معدودة.
5. خاتمة ودعوة للمجتمع التقني
إن البرمجيات القرآنية المفتوحة بحاجة ماسة لتبادل الخبرات وتكامل الأدوات بدلاً من إعادة اختراع العجلة. نأمل أن تفتح هذه التحسينات في حزمة ReciteQuran آفاقاً جديدة للمطورين لبناء تطبيقات ومقارئ قرآنية ذكية، خفيفة، ومتعددة الروايات.
ندعو جميع المطورين المهتمين للاطلاع على المساهمة، ومراجعتها، وتجربتها في مشاريعهم:
🔗 رابط المساهمة على GitHub:
👉 ReciteQuran Pull Request #5
كتب لنشره على منصة itqan.dev — ربيع الأول 1448هـ / سبتمبر 2026م