تصحيح التلاوة بالذكاء الاصطناعي من أهمّ ما يسعى مجتمع مطوّري التطبيقات الإسلامية لإتقانه، ولدينا بفضل الله جهودٌ ومصادر مفتوحة رائعة، أبرزها جهود أخينا عبدالله في القرآن المُعلّم (Quran Muaalem)، ومؤخراً جهد أخينا مصطفى في (Quran Lab) بنموذجه المميّز.
لكن الرسالة التي أريد إيصالها في هذا المقال هي بالتحديد:
مهما بلغ نموذجك من القوة، فلن يكفي وحده. أنت تحتاج إلى طبقةٍ فوقه اسمها «المُحرِّك».
فصل الحواس عن الإدراك: لماذا يجب استقلالية محرك تصحيح التلاوة عن نموذج الذكاء الاصطناعي؟
في سياق تطوير تقنيات الذكاء الاصطناعي لخدمة القرآن الكريم، اتجهت أغلب المشاريع، مثل "القرآن المعلم"، إلى بناء منظومة متكاملة يندمج فيها "نموذج التعرف على الصوت" مع "محرك تحليل التلاوة" في كتلة برمجية واحدة. ورغم أن هذا النهج يحقق نتائج أولية سريعة، إلا أنه يقيد مستقبل النظام.
القاعدة الذهبية هنا تتلخص في جملة واحدة: "النموذج يسمع، والمُحرّك يفهم ويقرّر". بناءً على هذه الرؤية، يصبح فصل محرك تصحيح التلاوة ككيان برمجي مستقل، وقائم بذاته (Standalone Engine)، ضرورة حتمية لعدة أسباب جوهرية:
١. مبدأ فصل المهام (Separation of Concerns)
لكل تقنية تخصصها الدقيق؛ فمهمة نموذج الذكاء الاصطناعي (Acoustic Model) هي "الاستماع" والتحويل الصوتي الدقيق لمدخلات المستخدم إلى مقاطع لفظية (Phonemes). أما "محرك التصحيح"، فمهمته هندسية وشرعية تتمثل في معالجة هذه المقاطع، ومطابقتها مع القواعد المعقدة لأحكام التجويد (كالإخفاء، والإدغام، والمدود)، ومن ثم اتخاذ قرار التصحيح. دمج المهمتين في بيئة واحدة يخلق نظاماً معقداً يصعب صيانته أو تطوير كل جزء منه على حدة.
٢. التحرر من قيود النماذج ومواكبة التطور
تتطور نماذج التعرف على الصوت (Speech-to-Text) بوتيرة متسارعة للغاية. عندما يكون محرك التصحيح مستقلاً (Agnostic)، فإنه يمتلك المرونة الكافية لتقبل المدخلات من أي نموذج جديد يظهر في الساحة. هذا يعني أن النظام لن يتقادم بتقادم النموذج الصوتي المستخدم اليوم، بل يمكن استبدال "أذن" النظام (النموذج) متى توفر بديل أحدث وأدق، دون المساس بـ "عقل" النظام (المحرك).
٣. توفير بيئة معيارية للمقارنة والتقييم (Benchmarking)
المحرك المستقل يعمل كمنصة قياس دقيقة. من خلال تمرير نفس البيانات الصوتية إلى نماذج ذكاء اصطناعي مختلفة (Models)، يمكن للمحرك مقارنة المخرجات (Phonemes) الواردة من كل نموذج بشكل آلي ومحايد. هذا يتيح للمطورين والباحثين تقييم أي النماذج هو الأقرب للدقة في التعرف على مخارج الحروف العربية المعقدة، مما يرفع من جودة البحث العلمي والتقني في هذا المجال.
٤. دقة التخصيص وقابلية التوسع
عندما يكون المحرك قائماً بذاته، يمكن التركيز على برمجته للتعامل مع الروايات القرآنية المتعددة (حفص، ورش، قالون... إلخ) كقواعد بيانات منطقية (Logic Layers) قابلة للتوسعة، دون الحاجة لإعادة تدريب النماذج الصوتية بالكامل لكل رواية. النموذج يكتفي بنقل الصوت كما سمعه، والمحرك يطبق فلاتر الرواية المطلوبة ليقرر صحة التلاوة.
وهذا المقال شرحٌ دقيق لما يفعله المحرك الذي اليوم فعلاً.
وهذا فيديو به مثال عن ما وصلنا إليه اليوم...
هذا الفيديو يعرض عدد من الحالات، التي تمكن فيها المحرك من تجاوز اخطاء النموذج. وقدم تجربة معقولة جداً للمستخدم بالتقنيات الحالية.
أولاً: ماذا يُخرج النموذج بالضبط؟
نموذج تصحيح التلاوة (لدينا مثال نموذج Zipformer2-CTC مُدرَّب على القرآن) لا يُخرج كلمات، بل سلسلة من الأصوات المجرّدة (Phonemes) متّصلةً بلا مسافات.
مثلاً «الرحيم» قد تخرج من النموذج هكذا: ررَحِۦۦۦۦم.
ولاحظ أمرين مهمّين هنا:
- النموذج يستخدم رموزاً داخلية خاصة به (مثل
ۦ للياء، ں للنون)، وليست حروفاً عربية عادية.
- يُكرّر الصوت بمقدار طول مدّه — فالمدّ الطويل يخرج تكراراً (
ۦۦۦۦ). هذا التكرار ليس عبثاً، بل هو ما مكّننا لاحقاً من قياس التجويد (طول المدود والغنّة) مباشرةً.
مهمّة النموذج تنتهي هنا: تحويل الصوت إلى فونيم. أمّا القرار — أصحيح أم خطأ، وأين موضعه من السورة — فليس عمله.
ثانياً: لماذا لا يكفي النموذج وحده؟
مهما تحسّن النموذج، تبقى مصادر الخطأ كثيرة وخارجة عن سيطرته:
- جودة مايكروفون الجهاز، واختلافه من هاتف لآخر.
- الضوضاء والأصوات في الخلفية.
- سرعة القارئ (سريع فتتداخل الأصوات، أو بطيء فتتقطّع).
- ابتلاع النموذج للأصوات الخافتة في بدايات الآيات (كهمزة «اهدنا» و«الحمد») — وهي مشكلة متكرّرة قِسناها في تسجيلاتٍ حقيقية.
- تغيّر حركة آخر الكلمة عند وصلها بما بعدها (coarticulation)، فيسمعها النموذج ضمّةً بدل كسرة رغم صحّة القراءة.
- التشابه الصوتي بين حروف (س/ص، ك/ق، ن/م).
النتيجة: لو عرضنا مخرجات النموذج على المستخدم مباشرةً، لاتّهمناه بأخطاء لم يرتكبها. هنا يأتي دور المحرّك.
المبدأ الأساس: لا نسأل «ماذا قال؟» بل «هل قال ما نتوقّعه؟»
هذه نقطة التحوّل الجوهرية. المحرّك لا يحاول التعرّف على كلامٍ مفتوح — وهذا صعبٌ جداً — بل يسأل سؤالاً أسهل بكثير:
بما أننا نعرف السورة والآية، فنحن نعرف الكلمة القادمة بالضبط. فلماذا نقارن الصوت بكل احتمالات اللغة، بينما يكفي أن نقارنه بالكلمة المتوقّعة فقط؟
كل صوتٍ لا يطابق ما نتوقّعه يُعتبر ضجيجاً ويُتجاهَل، ولا يستطيع تحريك المؤشّر مهما كان. هذا المبدأ البسيط هو أساس كل ما يلي.
ما يفعله محرّكنا فعلاً اليوم
١. ثلاث حالات للكلمة، لا اثنتان
معظم الحلول تكتفي بـ «صحيح / خطأ». نحن نستخدم ثلاث حالات، لأن المحرّك غالباً لا يستطيع التفريق بين «القارئ أخطأ» و«النموذج لم يسمع»:
- 🟢 أخضر: سُمعت وطابَقت.
- ⚪ رمادي: لم نتمكّن من التأكّد (لم يصل صوت، أو وصل جزءٌ ضئيل). عدمُ يقين، لا اتّهام.
- 🔴 أحمر: وصل صوتٌ كافٍ وكان مختلفاً بوضوح.
القاعدة عندنا: اتّهام قارئٍ بريء أسوأ من تفويت خطأ. لذلك حين نشكّ، نختار الرمادي لا الأحمر. وقد قِسنا هذا عبر عشرات التسجيلات لقرّاء محترفين: صفر اتّهام باطل.
٢. لا نكتفي باللون، بل نُحدّد نوع الخطأ والصوت المختلف
كل خطأ أحمر يحمل سبباً يفهمه التطبيق: «كلمة مختلفة» / «خطأ حركة (لحن)» / «خطأ شدّة» / «كلمة متجاوَزة». بل ونشير إلى الصوت الذي اختلف بالضبط؛ فبدل «راجِع الكلمة» نقول: الصواب مِ وقرأتَ مُ — بعد تحويل رموز النموذج الداخلية إلى عربية واضحة.
٣. كشف الكلمة المنسيّة — دون ظلم
إذا قفز القارئ عن كلمةٍ كاملة فلم يتركها أي أثرٍ صوتي بين كلمتين مسموعتين، عرفنا أنها نُسيت فحدّدناها. أمّا الكلمة التي نطقها القارئ لكن ابتلعها النموذج، فتترك أثراً جزئياً، فتبقى رمادية لا حمراء. وحرصنا ألّا نطلق هذا الحكم على أوّل كلمة في الآية تحديداً، لأنها الموضع الذي يُسقط فيه النموذج الأصوات الخافتة.
٤. «لا يفقد المستخدم أبداً» (Never-lose)
لو قفز القارئ إلى آيةٍ أخرى (قبل أو بعد)، أو أعاد جزءاً، وتاه المؤشّر المحلي — يبحث المحرّك في كامل النطاق المطلوب عن أفضل موضعٍ يطابق ما سُمع، ويعيد ضبط المؤشّر هناك تلقائياً. اختبرناه بتسجيلاتٍ مقصوصةٍ بترتيبٍ عشوائي، فأعاد الوصل في كل مرة.
٥. الرجوع والتصحيح (Rewind & Redemption)
القرّاء يكرّرون ويعيدون. فحين يعيد القارئ كلمةً سابقة أو يبدأ الآية من جديد، يتعرّف المحرّك على ذلك، ويُرجِع المؤشّر، وتتحوّل الكلمة الحمراء إلى خضراء إن صحّحها. ووضعنا حواجز دقيقة تمنع «رجوعاً وهمياً» بسبب تشابه كلمةٍ قصيرة مع أخرى.
٦. تدرّج في قبول الأصوات، لا قرار ثنائي
الحروف المتقاربة صوتياً تُعطى عقوبةً متدرّجة بدل رفضٍ قاطع، لكنها ليست مجانية تماماً، وإلا انخدع المحرّك بكلمةٍ قصيرة تتنكّر داخل أطول منها.
٧. مستويات صرامة يختارها المستخدم
إيقاف (متابعةٌ صامتة بلا أحمر) · سهل (للأطفال والمبتدئين) · عادي (المعيار الآمن، ويكشف حتى أخطاء الحركة) · صارم (يحاول اكتشاف كل خطأٍ ممكن).
٨. طبقة التجويد (في الوضع الصارم) — تقيس الزمن لا الحروف فقط
التجويد في جوهره مدّة: كم أطلتَ المدّ، كم غنّيتَ. طبقتنا تقرأ توقيتات النموذج لتقيس مدّة كل صوت فعلاً، وتقارنها بالمطلوب:
- تكشف المدود (الطبيعي، المتّصل، المنفصل، اللازم…)، والغنّة، والشدّة.
- والأهم: تتعلّم سرعة القارئ نفسه من حركاته القصيرة، فتُعاير العتبات على إيقاعه — فلا تظلم السريع ولا المتساهل مع البطيء.
- تظهر كتنبيهٍ 🟡 أصفر («مدٌّ قصير: 0.3ث / المطلوب 0.5ث»)، مستقلٍّ عن الأحمر، لأن الحروف صحيحة والمُلاحَظة في المدّ فقط.
٩. معالجة الوقف (في كل المستويات)
عند آخر كلمة في الآية يقف القارئ، فتتحوّل حركة آخرها إلى سكون — فلا نحاسبه على هذه الحركة (فـ «الرحيمِ» تُقرأ وقفاً «الرحيمْ» وهذا صحيح).
١٠. خطّ صوتٍ نظيف يحترم النموذج
أزلنا كاشف الصوت (VAD) تماماً من مسار التتبّع، لأنه كان يقصّ بدايات الكلمات الخافتة. كل مقطعٍ من المايكروفون يصل إلى النموذج كما هو. ولا نُعيد ضبط النموذج أثناء التلاوة المتّصلة (فهو يحتاج ثانيةً من السياق السابق)، بل فقط عند توقّفٍ حقيقيٍّ بين الآيات. كما نتعامل مع البسملة قبل السور فلا نحسبها خطأً في أوّل كلمات السورة.
الخلاصة
كل قاعدةٍ في هذا المحرّك مبنيّة على افتراضٍ واحد: النموذج غير مثالي، وهدفها الأول حماية القارئ من حكمٍ ظالم، مع البقاء دقيقاً وسريعاً.
ولهذا رسالتي للمطوّرين: لا تنتظر النموذج المثالي. طور معنا طبقة المحرّك. منفصلة عن أي نموذج، وهي التي تحوّل «تخمين نموذجٍ» إلى «تجربةٍ عادلة تُعين على تلاوة كتاب الله». نسأل الله الإخلاص والقبول.
نحن مازلنا في البداية، وهذا الجهد والحماس بدء من أخي @Iam-Muslim والحقيقة هو من شجعني، جزاه الله خير. والعمل الذي قمت به، هو مجرد تحويل لعمله على منصة iOS Native Swift، أن شاء الله عندما انتهي سوف ارفع ما قمت به على نفس المستودع الذي يعمل عليه.