🎬🔴 إصلاح فشل دبلجة الحلقة الطويلة (ساعة و40د) — الجذر = amix العملاق (نُفّذ + مُختبَر E2E حيّاً 2026-10-02)
الشكوى (د. وائل): دبلجة حلقة كونان (1:48:13) علّقت >30 دقيقة ثم فشلت بسطر خامffmpeg ... anullsrc ... amix ظهر في واجهة Entertainment Hub.
🔴 الجذر القاطع (مُثبَت بالدليل): translate_dub.py build_dub() كان يبني أمر ffmpeg واحداً عملاقاً فيه amix=inputs=N حيث N = عدد المقاطع (الحلقة = 1322 segment، مجلد dub_kr84hf1a بنى 715-736 مقطع mp3) + N مدخل -i + N فلتر adelay في filter_complex طوله 28KB حرف. amix يفتح كل الـ715 ملفاً معاً ويخلطها في ذاكرة واحدة → انفجار RAM على صندوق 15GB → تعليق >30د ثم OOM/timeout → السطر الخام تسرّب للواجهة كرسالة الفشل. (التشكيل/TTS/الترجمة كلها نجحت — الفشل في التجميع النهائي فقط.)
✅ الإصلاح (دمج هرمي مُدفّع بنوافذ زمنية — مُختبَر E2E على نفس 715 مقطع): استبدال amix الأحادي بـ: (Pass 1) دفعات ≤50 مقطع، كل دفعة تُرندر نسبةً لنافذتها الزمنية فقط (أزمنة نسبية لـ w0، WAV صغير ~19MB بدل 286MB كامل الطول) → (Pass 2) overlay الـ15 intermediate على base صامت واحد، كل واحد مُزاح بـ adelay=w0 → MP3 نهائي. ذاكرة ثابتة ضئيلة + مهلة لكل خطوة (300s/دفعة) + never-stop (دفعة تفشل تُتخطّى).
الدليل القاطع (قبل/بعد على 715 مقطع حقيقي): القديم amix=715 → علّق >2.5 دقيقة بلا نتيجة (RAM تنفجر). الجديد → نجح في 51.8 ثانية (15 دفعة × ~1.5s + Pass2)، المدة النهائية 6500s بالضبط (التوقيت دقيق)، MP3 50MB سليم، RAM مستقرة. WAV النافذة 19MB بدل 286MB (15× أصغر).
التطبيق: الكود المُصلح في translate_dub.py (يخدم الأزرار الثلاثة: ترجمة/دبلجة بصمة/دبلجة موحّد). أُعيد تشغيل خدمة entertainment-hub (PID جديد 665182، :8899=200) لتحميل الإصلاح. النسخة الاحتياطية: translate_dub.py.bak.concatfix_20261002_021437.
الدرس (منع التكرار): أي دمج ffmpeg لعدد كبير من المدخلات (>~60) يجب أن يكون هرمياً مُدفّعاً لا أمراً واحداً عملاقاً — amix/concat مع مئات/آلاف المدخلات = انفجار ذاكرة مؤكّد. القاعدة الاستباقية: احسب عدد المقاطع المتوقّع قبل بناء أي filter_complex، وادفّعه إن تجاوز العتبة.🎬🔴 الجذر الحقيقي لـ«صوت إنجليزي في الدبلجة» + الخلفية العالية — حفر وعلاج جذري (2026-10-02، أمر د. وائل: اعرف أين الخلل وعالجه جذرياً حتى لا يتكرر)
الشكوى: بعد إصلاح التعليق، د. وائل سمع: (1) أحد الأصوات المُدبلجة يتكلم إنجليزي لا عربي (2) الخلفية الأصلية عالية تعمل تشويش. 🔴 الجذر القاطع (مُثبَت بفحص segs حيّ — 386/1322 مقطع «ar» بلا أحرف عربية):translate_dub.py كان فيه ثلاث نقاط fallback للنص الأصلي تجعل المقطع يُنطق إنجليزياً عند فشل الترجمة:
1. _mt_groq/_mt_gemini: أي سطر لا يُطابق ترقيم رد الـLLM → lines.get(i+1, texts[i]) = النص الأصلي.
2. translate_segments._do: فشل المزوّدين → or chunk = الأصلي كله.
3. s["ar"] = out[k] or s["text"] (السطر القاتل) → fallback أخير للنص الأصلي.
ثم _dub_tts(s.get("ar", s["text"])) ينطق النص الإنجليزي/الياباني بصوت عربي = الصوت الإنجليزي الذي سمعه د. وائل.
✅ العلاج الجذري (منهج استباقي، منع التكرار مطلقاً — مُختبَر منطقياً 6/6 + صفر إنجليزي):
1. دالة _is_arabic() (كشف أحرف عربية \u0600-\u06FF) + _AR_RE/_LATIN_RE.
2. Pass 2 إعادة ترجمة: أي مقطع بقي غير عربي (فيه كلمات لاتينية) → retry فردي عبر Gemini-Pro→Groq (ThreadPool).
3. Finalize Arabic-only: s["ar"] = v if _is_arabic(v) else "" — الفاشل يصير فارغاً (لا نص أصلي أبداً).
4. حارس TTS صريح: _one يتخطّى أي مقطع ar فارغ/غير عربي تماماً → مستحيل أن يُنطق إنجليزي (يُصمت المقطع بدل نطق الأصلي). الترقيم الياباني (。) أيضاً يُتخطّى.
الخلفية العالية: خُفّض صوت الفيديو الأصلي في الواجهة من 0.18 → 0.05 (شبه مكتوم، موضعان في index.html: البدء + حدث play). + loudnorm (EBU R128, I=-16) على كل مقطع في _fit_clip → كل المتحدّثين بنفس المستوى.
🔴 السبب الجوهري لعدم اختفاء المشكلة بعد الإصلاح الأول: د. وائل كان يسمع cache قديم (dub.mp3 بُني 01:59 قبل الإصلاحات) — الإصلاحات لا تنطبق على ملف مخزّن. الحل: حذف cache الحلقة كاملاً (dub+vtt+meta+segs) ليُعاد بناؤه نظيفاً. قاعدة دائمة: أي إصلاح في منطق الدبلجة/الترجمة يتطلب حذف cache الحلقات المتأثرة.
الدرس الحاكم (منع التكرار): ❌ ممنوع fallback للنص الأصلي في أي مسار ترجمة→TTS (يُنطق إنجليزياً). القاعدة: الترجمة الفاشلة = صمت (تخطّي)، لا نطق الأصلي أبداً. التحقق بـ _is_arabic إلزامي قبل أي TTS. النسخ الاحتياطية: translate_dub.py.bak.arabiconly_ + index.html.bak.dubquality_. الخدمة أُعيد تشغيلها (PID 669002، 02:47).<!--AUTO_DAILY_START-->
🤖 موجز آلي (محدّث 23:00 الكويت — يكتبه daily_note_gen.sh)
- حالة النظام: لوحة صحة النظام — 🟡 WARN
- التكلفة التراكمية: $40221.52
- أبرز التغييرات اليوم (git):
- (لا commits جوهرية مسجّلة اليوم بعد)