ScreenPilot

مرجع الـ storyboard

صيغة storyboard.json: segments وholds وzooms وcaptions وhighlights وnarration وcards وoverlays وmusic وextends وtheme وحجم الخرج، مع مثال كامل.

الـ storyboard ملف JSON يصف المونتاج. يكتبه لك تطبيق الذكاء الاصطناعي، لكن يمكنك قراءته وتعديله وتصييره بنفسك. الأمر screenpilot schema (أو الأداة storyboard_schema) يطبع JSON Schema المعتمد. وتشرح هذه الصفحة كل حقل.

القواعد الثلاث#

  • الأزمنة بثواني المصدر. تُحسب من بداية التسجيل الخام، لا من الفيديو المصيَّر. القص وتغيير السرعة لا يحرّكانها. الأمر screenpilot check والأداة check_output وحدهما يستخدمان ثواني الخرج.
  • المواضع مُطبَّعة بين 0 و1. تُقاس x من الحافة اليسرى للتسجيل وy من حافته العليا. اقرأها من لقطة باستخدام frames --grid.
  • المسارات نسبية إلى ملف الـ storyboard. ينطبق هذا على source وevents وextends وmusic.src وoverlays[].src.

كل الحقول اختيارية عدا source. نفّذ screenpilot validate storyboard.json بعد كل تعديل. يعرض أخطاء الـ schema والتحذيرات: segments متداخلة، أو عناصر بعد نهاية المصدر، أو views تذكر شاشة غير معروفة، أو callout بلا x وy. ويقدّم أيضًا نصائح أسلوب: انظر تحذيرات الأسلوب.

حقول المستوى الأعلى#

الحقلالافتراضيمعناه
version1إصدار الصيغة. دائمًا 1.
extendsلا شيءstoryboard أساسي تأخذ منه المظهر. انظر مشاركة المظهر بـ extends.
sourceمطلوبمسار التسجيل الخام.
eventsلا شيءملف events.jsonl الناتج عن record. يفعّل تموّجات النقر.
keepSourceAudiofalseإبقاء صوت التسجيل. عندها يمكن للـ segments ضبط volume أو mute.
output1920x1080 بمعدل 30 إطارًاالحجم ومعدل الإطارات. انظر الخرج والصوت.
themeالقيم الافتراضيةالمظهر. انظر القالب.
voiceالقيم الافتراضيةصوت التعليق. انظر الخرج والصوت.
segments[]الأجزاء المحتفَظ بها من المصدر.
holds[]لقطات مجمّدة.
zooms[]تقريبات الكاميرا.
screens, views[]تسجيلات الشاشات المتعددة. انظر الشاشات والزوايا.
captions[]نص على الشاشة.
highlights[]مربعات حول أجزاء من الشاشة.
narration[]أسطر التعليق الصوتي.
intro, outroلا شيءبطاقات العنوان قبل الفيديو وبعده.
cards[]بطاقات فصول في منتصف الفيديو. انظر بطاقات الفصول.
overlays[]صور وفيديو وشعارات فوق الإطار. انظر الـ overlays.
musicلا شيءموسيقى خلفية، ويمكن خفضها تحت الصوت.

Segments#

الحقل segments يسرد الأجزاء المحتفَظ بها من المصدر بالترتيب. كل ما بين segment وأخرى يُقصّ. القائمة الفارغة تُبقي الفيديو كله. ويجب ألا تتداخل الـ segments.

الحقلالافتراضيالمعنى
inمطلوبالبداية بثواني المصدر.
outمطلوبالنهاية. يجب أن تكون أكبر من in.
speed1سرعة التشغيل من 0.25 إلى 16. استخدم 4 إلى 8 لتسريع التحميل والانتظار.
volume1مستوى صوت المصدر في هذا الـ segment، من 0 إلى 4. يحتاج إلى keepSourceAudio.
mutefalseيُسكت صوت المصدر في هذا الـ segment. مثل volume بقيمة 0.

إذا وقع سطر تعليق صوتي داخل منطقة مقصوصة، يُحذف مع تحذير. وvolume وmute لهما أثر فقط عندما يبقى صوت المصدر: بدون keepSourceAudio: true وتسجيل فيه صوت، ينبّهك التصيير إلى أنهما بلا أثر.

Holds#

الـ holds تجمّد الفيديو عند إطار واحد، لتعطي caption أو سطرًا صوتيًا وقتًا كافيًا.

الحقلالمعنى
atزمن المصدر الذي يُجمَّد عنده.
durمدة التجميد بالثواني.

نادرًا ما تحتاج إلى كتابة holds. إذا كان سطر التعليق أطول من مكانه، يضيف التصيير تجميدًا تلقائيًا كي لا تتداخل الأسطر. وتظهر هذه في النتيجة باسم autoHolds.

Zooms#

الحقلالافتراضيالمعنى
atمطلوبزمن المصدر الذي يكتمل عنده التقريب.
durمطلوبمدة البقاء مقرَّبًا بالثواني.
x, yمطلوبنقطة التركيز بين 0 و1.
scale1.8معامل التقريب من 1 إلى 4.

Captions#

الحقلالافتراضيالمعنى
atمطلوبزمن المصدر الذي يظهر عنده الـ caption.
dur3الثواني على الشاشة.
textمطلوبالنص. استخدم \n لسطر ثانٍ، مثلًا في caption بلغتين.
positionbottombottom أو top أو center.
stylepillpill أو title أو callout.
x, yلا شيءنقطة الإشارة في callout، بين 0 و1.
motionافتراضي القالبكيف يدخل هذا الـ caption ويخرج. انظر الحركة.

أنماط الـ caption#

  • pill: مربع يشبه الترجمة. استخدمه لمعظم الـ captions.
  • title: نص كبير للحظة تشبه بداية فصل.
  • callout: فقاعة تشير إلى x وy. أعطِ القيمتين دائمًا. بدونهما تشير الفقاعة إلى المنتصف ويحذّرك validate.

Highlights#

الـ highlight يرسم مربعًا حول جزء من الشاشة.

الحقلالافتراضيالمعنى
atمطلوبزمن المصدر الذي يظهر عنده.
dur2الثواني على الشاشة.
x, yمطلوبالزاوية العليا اليسرى بين 0 و1.
w, hمطلوبالعرض والارتفاع بين 0 و1.
labelلا شيءنص اختياري على المربع.

Narration#

يقرأ كل سطر صوتُ الـ storyboard ويُمزج في الفيديو. الافتراضي صوت Edge؛ انظر الأصوات للنماذج المحلية ولبرامجك الخاصة. التعليق الصوتي لا يتداخل أبدًا: إذا تجاوز سطر مكانه، يتجمد الفيديو ليفسح له.

الحقلالافتراضيالمعنى
atمطلوبزمن المصدر الذي يبدأ عنده السطر.
textمطلوبما يقوله الصوت.
voicevoice.nameصوت لهذا السطر وحده، مثل ar-EG-ShakirNeural. يستبدل voice.name ويُبقي voice.provider، فيجب أن يكون صوتًا من المزوّد نفسه. استخدمه للمزج بين لغتين.
captionvoice.subtitlesإظهار هذا السطر كترجمة أيضًا (true) أو عدم إظهاره (false).

اعرض الأصوات بالأمر screenpilot voices --lang ar-EG. أمثلة: ar-EG-SalmaNeural وar-EG-ShakirNeural وen-US-AndrewNeural وen-US-AriaNeural.

Intro وoutro#

الحقلان intro وoutro بطاقتا عنوان قبل الفيديو وبعده. لهما الحقول نفسها.

الحقلالافتراضيالمعنى
titleمطلوبالنص الرئيسي.
subtitleلا شيءالسطر الثاني.
dur3الثواني على الشاشة.

بطاقات الفصول#

الحقل cards بطاقات عنوان في منتصف الفيديو، لبداية فصل جديد. كل بطاقة تجمّد الصورة عند at وتعرض بطاقة كاملة بظهور واختفاء تدريجيين، ثم يكمل الفيديو من الإطار نفسه.

الحقلالافتراضيالمعنى
atمطلوبزمن المصدر الذي يتجمد عنده الفيديو وتظهر البطاقة.
dur2.5الثواني التي تبقى فيها البطاقة. يبقى الفيديو مجمّدًا خلالها.
titleمطلوبالنص الرئيسي.
subtitleلا شيءالسطر الثاني.

البطاقة التي يقع at الخاص بها في منطقة مقصوصة تُحذف، ويحذّرك validate. وتستخدم البطاقات المظهر نفسه الخاص بـ intro وoutro (theme.motion.cards وـ CSS الخاص بـ .card).

Overlays#

الحقل overlays يضع صورة أو فيديو فوق إطار الخرج: شعارًا، أو علامة مائية، أو مقطعًا صغيرًا داخل الصورة. وعلى خلاف zooms وhighlights، الموضع هنا كسر من إطار الخرج لا من التسجيل، فيبقى الشعار في الزاوية نفسها مهما تحركت الكاميرا.

الحقلالافتراضيالمعنى
srcمطلوبصورة أو فيديو، نسبي إلى الـ storyboard.
x, yمطلوبالحافة اليسرى والعليا، بين 0 و1 من إطار الخرج.
w, hمطلوبالعرض والارتفاع، بين 0 و1 من إطار الخرج. يجب أن يكونا أكبر من 0.
atلا شيءزمن المصدر الذي يظهر عنده.
durلا شيءالثواني التي يبقى فيها. مع at بلا dur يبقى حتى النهاية. ومن دون at وdur يظهر طوال الفيديو.
fitcontainالقيمة contain تُظهر الصورة كاملة داخل المربع. وcover تملأ المربع وتقصّ الزائد.
opacity1من 0 إلى 1.
radiusلا شيءنصف قطر الزوايا بالبكسل.
shadowلا شيءيرسم ظلًّا تحته.
motionfadeالدخول والخروج. انظر الحركة. القيم words وlines وwipe تعود إلى fade.
mutetrueللفيديو: القيمة false تشغّل صوته أيضًا.
loopfalseللفيديو: يعيده حتى ينتهي الـ overlay.
"overlays": [
  { "src": "assets/logo.png", "x": 0.88, "y": 0.04, "w": 0.08, "h": 0.08, "opacity": 0.8 },
  { "src": "assets/webcam.mp4", "at": 5, "dur": 12, "x": 0.72, "y": 0.66, "w": 0.24, "h": 0.28, "fit": "cover", "radius": 16, "shadow": true }
]

Music#

الحقلالافتراضيالمعنى
srcمطلوبمسار ملف صوتي نسبي إلى الـ storyboard.
volume0.12من 0 إلى 1. اجعله منخفضًا كي لا يغطي الصوت.
duckلا شيءيخفض الموسيقى أثناء الكلام. انظر أدناه.

الـ ducking يجعل الموسيقى أهدأ تحت كل سطر تعليق ثم يعيدها بعده. أعطِ duck أيًّا من الحقول التالية، أو كائنًا فارغًا {} للقيم الافتراضية:

الحقلالافتراضيالمعنى
amount0.6مقدار انخفاض الموسيقى، من 0 إلى 1. القيمة 0.6 تعني انخفاضًا بنسبة 60%.
attack0.2الثواني التي تستغرقها الموسيقى لتنخفض، وتنتهي حين يبدأ السطر. من 0 إلى 5.
release0.5الثواني التي تستغرقها الموسيقى لتعود بعد السطر. من 0 إلى 5.

مشاركة المظهر بـ extends#

الحقل extends يشير إلى storyboard أساسي، نسبيًا إلى هذا الملف. استخدمه حين تريد أن تتشابه عدة فيديوهات في المظهر والصوت: يمتد كل منها من الأساس نفسه ويضيف تسجيله الخاص. وبه يأخذ مقطع الميزة مظهر العرض الذي ينضم إليه داخل sequence.

  • تُورَّث خمسة حقول: theme وvoice وoutput وmusic وkeepSourceAudio. أما الباقي (source وsegments وzooms وcaptions وnarration وintro وoutro وغيرها) فلا يُورَّث أبدًا.
  • الابن يتغلب. الكائنات تُدمج مفتاحًا مفتاحًا، فالابن الذي يضبط theme.accent فقط يحتفظ بباقي حقول القالب من الأساس. أما المصفوفات فتُستبدل ولا تُدمج، مثل theme.fonts.
  • السلاسل تعمل. يمكن للأساس أن يمتد من storyboard آخر. والدورة (cycle) خطأ يذكر السلسلة.
  • المسارات تبقى صحيحة. يُعاد كتابة music.src القادم من الأساس ليشير إلى الملف نفسه انطلاقًا من مجلد الابن.
{
  "extends": "../demo.json",
  "source": "rec.mp4",
  "narration": [{ "at": 1, "text": "Invoices can now repeat on a schedule." }]
}

الشاشات والزوايا#

في تسجيل لعدة شاشات، يحدد screens موضع كل شاشة داخل التسجيل، ويحدد views الجزء الذي تعرضه الكاميرا ابتداءً من كل زمن. الأمر init --suggest يملأ الاثنين لك.

العنصرالحقول
screens[]name (اسم الشاشة، مثل eDP-1) وx وy وw وh (بين 0 و1 من المصدر؛ يجب أن تكون w أكبر من 0)
views[]at، ثم واحد فقط من screen (قيمة screens[].name أو "all") أو rect (x وy وw وh، أي منطقة)؛ واختياريًا label وtransition (pan افتراضيًا، أو cut)

الخرج والصوت#

الكائنالحقول والقيم الافتراضية
outputwidth 1920 وheight 1080 وfps 30 (من 1 إلى 120)
voiceprovider edge (أو local أو command)، name en-US-AndrewNeural، rate +0% (مثل +10% أو -5%)، subtitles true (إظهار أسطر التعليق كترجمة)، gap 0.3 (أقل صمت بين الأسطر؛ يتجمد الفيديو ليفسح له)، volume 1 (من 0 إلى 4)
voice.providerمعنى voice.name
edge (افتراضي)صوت Edge، مثل ar-EG-SalmaNeural. يحتاج إلى الإنترنت.
localنموذج على هذا الجهاز: voicetut أو voicetut:<Voice> مثل voicetut:Sarah أو namaa. الحقل rate يتحول إلى معامل سرعة في voicetut؛ أما namaa فيتجاهله.
commandمفتاح صوت عرّفته في voices.json.

الحقل voice الخاص بسطر التعليق يعمل داخل المزوّد نفسه. فمثلًا مع "provider": "local" يمكن لسطر أن يستخدم namaa ولآخر أن يستخدم voicetut:Sarah. الإعداد والحدود والأمثلة في الأصوات.

اختر حجم الخرج بحسب مكان العرض: 1920x1080 ليوتيوب أو README أو الشرائح؛ 1080x1920 لـ Reels وTikTok وShorts؛ 1080x1080 للخلاصات.

القالب (theme)#

يحدد القالب مظهر الفيديو كله. لا يوجد نمط ثابت: اختره بحسب الجمهور، وخذ الألوان والخطوط من المنتج الذي تعرضه.

الحقلالافتراضيالمعنى
backgroundتدرّج من النيلي إلى الأزرقأي خلفية CSS: لون أو تدرّج أو صورة.
padding0.05المسافة حول التسجيل، كنسبة من عرض الخرج (من 0 إلى 0.2).
radius16استدارة زوايا التسجيل، من 0 إلى 60.
shadowtrueظل تحت التسجيل.
accent#facc15اللون المميِّز.
fontInter وCairo وsystem-uiعائلة الخط في CSS.
captionColor#ffffffلون نص الـ caption.
captionBackgroundداكن شبه شفافلون مربع الـ caption.
clickRipplestrueيرسم تموّجًا عند كل نقرة مسجَّلة. يحتاج إلى events.
fonts[]خطوط Google إضافية للتحميل، بصيغة css2 مثل "Tajawal:wght@400;700" أو "Space Grotesk:wght@500;700". ثم استخدمها في font أو css.
cssفارغCSS خاص بك، يُطبَّق بعد الأنماط المدمجة.
motion{}حركة النص الافتراضية: captions (الـ captions والترجمات) وcards (intro وoutro).

CSS مخصص#

العناصر التي يمكنك تنسيقها بـ theme.css:

  • #root: الإطار كله وخلفيته.
  • #frame: الصندوق الذي يحمل التسجيل.
  • .card و.card-inner و.card h1 و.card p: بطاقتا intro وoutro.
  • .text: الـ captions. أنواعها .text.pill و.text.subtitle و.text.title. المربع المرئي هو .text.<style> > span، و.text .ln سطر واحد من caption متعدد الأسطر.
  • .pos-bottom و.pos-top و.pos-center: مواضع الـ caption.
  • .hl و.hl span: الـ highlights.
  • .callout span: فقاعات callout.
  • .ripple: تموّجات النقر.

الحركة (motion)#

تتحكم الحركة في كيفية دخول النص وخروجه. اضبط الافتراضي في theme.motion.captions وtheme.motion.cards، وتجاوزه بـ motion على caption واحد. كل الحقول اختيارية.

الحقلالمعنى
inنمط الدخول.
outنمط الخروج. words وlines يخرجان مثل fade.
durationالثواني لكل دخول، من 0 إلى 3. الافتراضي 0.3.
easeأي ease من GSAP، مثل "power3.out" أو "back.out(1.7)" أو "expo.out" أو "elastic.out(1,0.5)".
staggerالثواني بين الكلمات أو الأسطر في words وlines، من 0 إلى 1. الافتراضي 0.08.

الأنماط: none وfade وrise وdrop وslide-left وslide-right وpop وzoom وblur وwipe وwords وlines. النمط wipe يكشف النص باتجاه القراءة. وwords يُظهر كلمة كلمة، وlines سطرًا سطرًا؛ وكلاهما يعمل مع أي كتابة، ومنها العربية.

الشروحات الهادئة تناسبها fade وrise. مقاطع التواصل الاجتماعي النشطة يناسبها pop أو words مع ease مرتد. والعناوين يناسبها wipe أو words.

مثال كامل#

يحتفظ هذا الـ storyboard بتسجيل واحد، ويسرّع مقطع تحميل، ويقرّب على نقرتين، ويضيف ثلاثة captions وhighlight، وينطق ثلاثة أسطر (الأخير بالعربية). المسارات نسبية إلى ملف الـ storyboard. ينجح في screenpilot validate؛ والتحذير الذي يظهر عند غياب الملفات هو فقط أن فيديو المصدر غير موجود.

{
  "version": 1,
  "source": "sessions/2026-10-27_14-02/video.mkv",
  "events": "sessions/2026-10-27_14-02/events.jsonl",
  "output": { "width": 1920, "height": 1080, "fps": 30 },
  "voice": { "name": "en-US-AndrewNeural", "rate": "+0%", "subtitles": false, "gap": 0.3 },
  "theme": {
    "background": "linear-gradient(135deg, #0f172a 0%, #1d4ed8 100%)",
    "padding": 0.05,
    "radius": 16,
    "accent": "#facc15",
    "font": "'Space Grotesk', 'Cairo', sans-serif",
    "fonts": ["Space Grotesk:wght@500;700"],
    "css": ".text.pill > span { letter-spacing: 0.01em; }",
    "motion": {
      "captions": { "in": "rise", "out": "fade", "duration": 0.35, "ease": "power3.out" },
      "cards": { "in": "words", "stagger": 0.08 }
    }
  },
  "intro": { "title": "Acme Invoices", "subtitle": "Send an invoice in 20 seconds", "dur": 3 },
  "outro": { "title": "Try it today", "subtitle": "acme.example", "dur": 3 },
  "segments": [
    { "in": 0, "out": 6, "speed": 1 },
    { "in": 6, "out": 19, "speed": 6 },
    { "in": 19, "out": 41, "speed": 1 }
  ],
  "holds": [{ "at": 30.5, "dur": 1.5 }],
  "zooms": [
    { "at": 2.5, "dur": 3, "x": 0.18, "y": 0.22, "scale": 2 },
    { "at": 24, "dur": 4, "x": 0.82, "y": 0.9, "scale": 1.8 }
  ],
  "captions": [
    { "at": 1, "dur": 3, "text": "Start from the dashboard", "position": "bottom", "style": "pill" },
    { "at": 22, "dur": 3, "text": "One click to send", "style": "callout", "x": 0.82, "y": 0.9 },
    { "at": 36, "dur": 3, "text": "Done", "position": "center", "style": "title", "motion": { "in": "pop", "ease": "back.out(1.7)" } }
  ],
  "highlights": [{ "at": 31, "dur": 2.5, "x": 0.3, "y": 0.4, "w": 0.3, "h": 0.12, "label": "Total" }],
  "narration": [
    { "at": 1, "text": "We start on the dashboard." },
    { "at": 22, "text": "One click and the invoice is sent." },
    { "at": 36, "text": "هذا كل شيء.", "voice": "ar-EG-SalmaNeural", "caption": true }
  ],
  "music": { "src": "assets/bgm.mp3", "volume": 0.12 }
}
يفعّل سطر التعليق الأخير ترجمته بنفسه عبر caption: true، بينما voice.subtitles معطّل للأسطر الأخرى. النقرة عند الثانية 24 تأخذ zoom وcallout؛ أما الـ highlight فعند لحظة أخرى، فلا تحمل نقرة واحدة كل المؤثرات.

تحذيرات الأسلوب#

الأمر validate (والأداة storyboard_validate) يحذّر أيضًا حين يخالف الـ storyboard إرشادات الأسلوب أدناه. هذه تحذيرات فقط: لا تمنع التصيير أبدًا. وتذكر كل رسالة العنصر، مثل captions[2].

التحذيرالحد
تعليق صوتي طويلأكثر من 12 كلمة في السطر.
تعليق صوتي سريعأكثر من 3 كلمات في الثانية تقريبًا قبل السطر التالي. سيجمّد التصيير الفيديو ليتسع له.
caption طويلأكثر من 6 كلمات.
captions متداخلةcaptionان في الموضع نفسه في الوقت نفسه. الـ callouts مستثناة من هذا الفحص.
zooms متداخلةzoomان في الوقت نفسه.
مقياس zoomخارج المدى 1.4 إلى 2.5.
تأثيرات مكدّسةzoom وhighlight وcallout على النقطة نفسها خلال ثانية واحدة.
سرعة segmentفوق 8x. اقصصه بدلًا من ذلك.
طول الفيديوخرج أطول من 90 ثانية أو أقصر من 15 ثانية.
بطاقات في مناطق مقصوصةبطاقة فصل يقع at الخاص بها في جزء مقصوص.

إرشادات الأسلوب#

  • التعليق الصوتي: جملة واحدة، أقل من 12 كلمة تقريبًا، وفكرة واحدة. قل ما يراه المشاهد أو لماذا يهم، لا أي زر يُضغط. اجعل الأسطر قصيرة: السطر الطويل يجمّد الفيديو.
  • الـ zooms: قرّب على ما سيُنقر عليه. ابدأ التقريب قبل النقرة بنحو نصف ثانية، وأبقِه من 2 إلى 4 ثوانٍ، واستخدم scale بين 1.6 و2.2. خذ x وy من لقطة --grid. ارجع إلى المشهد الكامل بين التقريبات، ولا تقرّب عندما تهم الشاشة كلها.
  • الـ captions: من 2 إلى 6 كلمات، وفكرة واحدة لكل caption. استخدم callout فقط للإشارة إلى عنصر صغير واحد، وtitle للحظات الشبيهة ببدايات الفصول، وpill لما عدا ذلك. لا تكرر في caption ما يقوله التعليق.
  • وقت الخمول: اقصصه أو سرّعه من 4 إلى 8 مرات. التحميل والانتظار والأخطاء لا مكان لها بالسرعة العادية.
  • الإيقاع: ابدأ سطر التعليق مع الحدث الذي يصفه، واترك نحو 0.3 ثانية بين الأسطر. استهدف من 30 إلى 90 ثانية في المجموع.
  • لا تكدّس المؤثرات: zoom وhighlight وcallout على نقرة واحدة كثير. اختر ما يشير أفضل.
  • الـ captions بلغتين: استخدم caption واحدًا بسطرين ("English\nعربي"). تجنّب حرف الواو وحده بين كلمات لاتينية؛ استخدم فاصلة عربية بدلًا منه.
اعمل على مراحل. اكتب segments والتعليق الصوتي أولًا، وصيّر مسودة بـ -q draft، وراجعها بـ check، ثم أضف zooms وcaptions. غيّر نوعًا واحدًا من الأشياء في كل مرة.