فيديو ترويجي مصري
يقوم ببناء فيديو ترويجي عمودي بطول ~60-70 ثانية بالكامل على الجهاز المحلي:
script.json ──► voice-over (Gemini TTS, مجاني) ──► مقاطع لكل سطر ──► خط زمني
screenshots ──► promo.html (تحريك seek(t)) ──► إطارات Puppeteer ──► ffmpeg
synth.cjs (إيقاع أصلي + مؤثرات) ──► مكس مع ضغط جانبي ──► loudnorm −14 LUFS ──► MP4 + نسخة واتساب
كل مشهد يستمر بنفس طول السطر المنطوق، لذا تغيير كلمة أو الصوت يعيد ضبط توقيت الفيديو بالكامل تلقائياً.
المثال المُجرّب (نظام طلب مطعم: اتصال هاتفي مزدحم → ألم واتساب → كشف → قائمة → سلة → طاولات QR → تتبع الطلب → لوحة التحكم → إحصائيات → العلامة التجارية + دعوة للتحرك) هو القالب الافتراضي. أعد استخدام هيكله لمنتجات أخرى بتغيير المشاهد، وليس المحرك.
ما تحتاجه
- Node 18+، ffmpeg/ffprobe في PATH، Google Chrome (أو عيّن
CHROME_PATH). - في مجلد build:
npm i puppeteer-core qrcode msedge-tts@2(على قرص C كامل وجّهnpm_config_cacheوTEMPإلى قرص آخر). - مفتاح مجاني من Google AI Studio للصوت (aistudio.google.com/apikey). المستخدم يلصقه بنفسه في
VIDEO/.envكـGEMINI_API_KEY=…— أنشئ الملف بالمفتاح فارغاً ولا تطلب منه لصقه في الشات أو طباعته. أول استدعاء قد يقول أن Generative Language API معطل للمشروع: أعطهم رابط الكونسول من الخطأ ليضغطوا Enable، ثم أعد المحاولة بعد دقيقة.
هيكل المجلدات
أنشئ VIDEO/ داخل مشروع المستخدم (مثلاً marketing/video-<brand>/):
VIDEO/.env GEMINI_API_KEY= (يملؤه المستخدم)
VIDEO/script.json نسخة من assets/script.example.json، معدّلة
VIDEO/build/ scripts/* + assets/template/* من هذه المهارة
VIDEO/build/img/ لقطات شاشة + شعارات يستخدمها promo.html
VIDEO/vo/ s01.wav … s10.wav (مقاطع الصوت)
VIDEO/out/ ريندرات، sheet.jpg، timeline.json
سير العمل
1. الإيجاز (اسأل فقط عما لا يمكنك إيجاده)
المنتج وماذا يفعل، الجمهور (من يشتري)، اسم العلامة التجارية وكيف ينطق، لوحة الألوان + الشعار (ابحث في كود المستخدم: tailwind config، icon.svg، مكون Logo)، الدعوة للتحرك (CTA)، معلومات الاتصال إن وجدت. التنسيق الافتراضي: 9:16، 60-70 ثانية، لهجة مصرية، صوت ذكر نشيط.
2. السيناريو → script.json
عشرة أسطر، مشهد لكل سطر. الهيكل الذي نجح:
- خطف (0-4 ث): سؤال مؤلم يعرفه المشاهد ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
- الألم: الطريقة السيئة الحالية، وتنتهي بالخسارة.
- الكشف: "طب تخيّل…" + المنتج (هنا ينزل الإيقاع). 4–9. ميزة واحدة لكل مشهد، كل منها مع لقطة شاشة حقيقية.
- العلامة التجارية + الدعوة للتحرك: من يقدمه، دعوة للاشتراك/الاتصال.
voice هو ما يقرأه TTS: اكتبه بالطريقة التي ينطقها بها المصري (عامية، "…" للأنفاس، "؟" لنبرة السؤال، الأرقام ككلمات "أربعة وعشرين"، "QR" كـ "كيو آر"). subtitles هو ما يراه المشاهدون (أرقام "٢٤"، "QR"، العلامة التجارية بحروف لاتينية). headlines هي عناوين حركية من 2-5 كلمات للمشاهد 1-9؛ لف الكلمة المميزة بـ *…*.
لا تختلق إحصائيات، نسب مئوية، أسعار، جوائز أو شهادات — لا يستطيع المشاهدون والعميل التحقق منها، وتخلق مخاطرة قانونية. الفوائد المذكورة بوضوح تبيع بشكل جيد كافٍ.
أسماء العلامات التجارية التي تحتوي على V/P/G: العربية لا تحتوي على V، لذا "نوفيكس" تُقرأ "NOFIX". اكتبها بحرف ڤ ("نوڤيكس") أو باللاتينية ("NOVIX") في voice، ثم تحقق باستخدام check-v.cjs (الخطوة 4).
3. لقطات الشاشة (منتج حقيقي، بحجم الهاتف)
استخدم puppeteer بحجم 390×844، deviceScaleFactor 3 (→ 1170×2532) واحفظ في build/img/. القالب يتوقع: phone-home.png, phone-sweets.png, phone-restaurant.png, phone-options.png, phone-cart.png, tracking.png, dashboard-cancel.jpg, dashboard-stats.jpg, dashboard-products.jpg — أعد تسمية/استبدال حسب المنتج (انظر references/template.md).
- إعادة تسمية / عرض توضيحي عام: حقن سكربت مع
evaluateOnNewDocument+MutationObserverيعيد كتابة اسم العلامة التجارية القديم، يستبدلsrcالشعار، يخفي أرقام الهواتف ويستبدل صور العلامة التجارية، ثم تحقق منinnerTextللتأكد من عدم وجود بقايا. - صفحات مسجلة الدخول (لوحات التحكم): استخدم نافذة المتصفح المضمنة حيث المستخدم مسجل الدخول بالفعل (لا تكتب كلمة المرور الخاصة به أبداً)، قلد إطار عرض 375×812، طبق نفس تبديلات DOM باستخدام
javascript_tool، والتقط لقطة الشاشة هناك (تحفظ ملفاً يمكنك نسخه). قد يعيد الإطار تعيين حجمه في منتصف المهمة — أعد تطبيق إطار العرض المحمول قبل كل لقطة. - بيانات عملاء حقيقية: أخفِ الأسماء/أرقام الهواتف على الشاشة قبل الالتقاط. إذا كنت بحاجة إلى حالات واقعية (طلب جديد، طلب إلغاء)، أنشئ سجلات تجريبية موضحة بوضوح، التقط، ثم احذف هذه السجلات فقط وأكد حذفها.
4. التعليق الصوتي
أصوات مصرية طبيعية مجانية تأتي من Gemini TTS (scripts/vo-gemini.cjs):
gemini-3.8-flash-ttsيحتوي على 92 صوتاً مصرياً أصلياً (ar-eg-*، مثلاًar-eg-concierge-1شاب/مشرق،ar-eg-commercial-11صوت إعلان،ar-eg-storyteller-3غير رسمي). الطبقة المجانية: 10 طلبات فقط في اليوم لهذا النموذج.gemini-3.1-flash-tts-previewله حصة مجانية منفصلة ولكن فقط أصوات عامة (Puckذكر مرح — اختيار المستخدم،Orusذكر حازم، …) تُوجّه إلى المصرية بنص الأسلوب.- الأوامر (تشغيل من
VIDEO/build):node vo-gemini.cjs voices→ عرض أصواتar-EG.node vo-gemini.cjs sample <voice> [voice…]→ سطر الخطف لكل صوت فيvo/samples/(طلب واحد لكل صوت). حولها إلى mp3 وأرسلها ليختار المستخدم بالأذن — لا يمكنك الاستماع.node vo-gemini.cjs all <voice>→ طلب واحد للسيناريو كله، يُقسّم إلى 10 مقاطع عند الوقفات (رخيص على الحصة ويبدو وكأنه لقطة واحدة مستمرة). النسخ القديمة تُنسخ احتياطياً.node vo-gemini.cjs line <voice> <n>→ إعادة تسجيل سطر واحد.- استخدم
GEMINI_TTS_MODEL=gemini-3.1-flash-tts-previewللتبديل بين النماذج.
- أنفق العينات بحكمة (5 أصوات = 5 طلبات). إذا نفدت حصة 3.8، اعرض: انتظر حتى إعادة التعيين (~منتصف الليل بتوقيت المحيط الهادئ)، أو سجل اليوم باستخدام 3.1. لا تقترح حسابات Google إضافية للحصول على حصة أكثر — شروط استخدام API من Google تمنع تجاوز الحدود وقد يؤدي إلى تعليق الحسابين.
- البدائل:
vo-edge.cjs(Microsoftar-EG-ShakirNeural، غير محدود، بدون مفتاح — المستخدمون وجدوه روبوتياً/غير مصري)، أو يسجل المستخدم الأسطر على هاتفه وتقوم بقص/تطبيعها إلىvo/sNN.wav. ElevenLabs ممتاز لكنه مدفوع.
تحقق من كل تسجيل — لا يمكنك سماعه:
node transcribe.cjs [s05 s06…]ينسخ كل مقطع بنموذج نص Gemini. كل نَسخ يجب أن يساوي سطر السيناريو الخاص به. إذا كانت كلمات من السطر التالي في نهاية المقطع، يكون القص متأخراً: ابحث عن وقفات باستخدامffmpeg -af silencedetect=noise=-38dB:d=0.1وانقل الذيل إلى المقطع التالي (انظر محاذير-ss). أصلح من النسخ الأصلية فيvo/take/.node check-v.cjs s10يسأل عما إذا كان حرف العلامة التجارية /v/ أم /f/ (مرتين لكل مقطع). قم بتضمين التسجيل الخاطئ المعروف كعنصر تحكم لتتأكد من أن الفحص يعمل.
5. تخصيص القالب
القالب يحتاج أيضاً إلى img/qr.png (اصنعه باستخدام node -e "require('qrcode').toFile('img/qr.png','<رابط الموقع أو العلامة التجارية>',{errorCorrectionLevel:'H',margin:1,width:680})" — يمكن للمشاهدين مسحه ضوئياً، لذا وجّهه إلى شيء حقيقي أو إلى نص عادي)، img/rest-logo.svg (شعار نشاط العرض التجاري) وأيقونة العلامة التجارية (img/novix-icon.svg في المثال).
assets/template/promo.html مصمم بأسلوب NOVIX (كحلي #0B1020، تدرج أزرق→بنفسجي). أعد التصميم بتعديل متغيرات :root، خلفية المرحلة وألوان التوهج، تدرج .hl، الشيبس/الحلقات/حبة الترجمة، بطاقة QR، والمشهد الأخير (الشعار، الاسم، الشعار النصي، CTA، سطر الميزات). references/template.md يوضح أين يقع كل جزء وكيف ترتبط المشاهد.
6. الفحص، المعاينة، التصدير
من VIDEO/build:
node build.cjs --check— يشغل كل ~2000 إطار بدون لقطات شاشة؛ يكتشف أخطاء JavaScript في ثوانٍ بدلاً من انتظار ريندر مدته 5 دقائق.node build.cjs --preview 3→out/sheet.jpg. انظر إليها (اقرأ الصورة): التفاف العناوين، أشياء خارج الإطار، التباين (مثلاً نص برتقالي على بطاقة برتقالية)، بقايا العلامة التجارية القديمة.node build.cjs(شغّل في الخلفية، ~5 دقائق لـ 66 ثانية). يبلغ عن طول الفيديو مقابل الصوت (يجب أن يتطابق) ومستوى الصوت (≈ -14 LUFS).- أرسل نسخة الواتساب باستخدام SendUserFile (الملف الكامل عادة > 30 ميغابايت ويظهر فقط على سطح المكتب)، أخبر المستخدم أين يوجد كلا الملفين، وقل صراحة أنك تحققت بالنسخ/الإطارات لكن لم تتمكن من الاستماع.
7. الموسيقى
synth.cjs يؤلف إيقاع تراب شرق أوسطي أصلي بسرعة 98 نبضة في الدقيقة (دربوكة، 808، قيادة على آلة العود المقطوفة في مقام حجاز د) مع هبوط الإيقاع على مشهد الكشف، بالإضافة إلى مؤثرات صوتية لنغمة الانشغال / صوت الاندفاع / رنة / صفير / فرقعة. المكتبات المرخصة (مثل موصلات Epidemic Sound) قد تسمح فقط بالمعاينات، وليس التحميل — المعاينات غير مرخصة للإعلانات، لذا لا تستخدمها.
التسليم
- النهائي:
out/<name>-9x16.mp4(1080×1920، 30 إطاراً في الثانية، H.264، AAC، -14 LUFS) وout/<name>-9x16-whatsapp.mp4. - اذكر أي شيء مؤقت (رقم هاتف مفقود على بطاقة النهاية، إلخ) واعرض الخطوة التالية المنطقية (إضافة معلومات الاتصال، نسخة أفقية، تضمين في موقعهم).
- إذا كانت لقطات الشاشة قد نُشرت علناً (مطلوب فقط لأدوات الفيديو السحابية)، أخبر المستخدم بمكانها واعرض إزالتها.
اقرأ references/gotchas.md قبل تشغيل أي شيء — يسرد كل فشل تم تحقيقه أثناء بناء هذا والحل.