مفتاح الغابة السحري
The film
Storyboard
Scene 1
1 shot · 6sShot 1 · wide · 6s
في صباح مشمس عند كوخ العائلة، تساعد ليان جدها في ترتيب الأعشاب. يفتح الجد صندوقاً خشبياً قديماً ويكشف لها مفتاحاً نحاسياً غريباً، فتنتقل من الملل إلى الفضول.
- ليان: ما هذا المفتاح يا جدي؟
- الجد ناصر: مفتاح لم يجد بابه بعد.
Scene 2
1 shot · 10sShot 2 · over-shoulder · 10s
داخل الكوخ، يفرد الجد خريطة قديمة على الطاولة ويشرح أن المفتاح يفتح باباً في قلب الغابة. يحذر ليان من أن الطريق لا يظهر إلا لمن يبحث بصدق، فتشعر بثقل المهمة لكنها تقرر الذهاب.
- الجد ناصر: الباب ينتظر في قلب الغابة.
- ليان: وسأجده قبل أن تغيب الشمس.
Scene 3
1 shot · 6sShot 3 · high-angle · 6s
تدخل ليان الغابة وتتبع العلامات حتى تصل إلى مفترق غامض. تتشابه الممرات وتغطي الجذور العلامة الأخيرة، فتدور حول نفسها وتدرك أن السر ليس في السرعة بل في الانتباه.
- ليان: أي طريق يخفي الباب؟
Scene 4
1 shot · 8sShot 4 · close-up · 8s
تجلس ليان بهدوء وتراقب الضوء والظلال. تلاحظ أن شعاع الشمس يرسم شكلاً يشبه المفتاح على جذع شجرة، فتزيح الطحلب وتكتشف تجويفاً حجرياً يقود إلى الدائرة القديمة.
Scene 5
1 shot · 8sShot 5 · insert · 8s
تضع ليان المفتاح في التجويف، فتتحرك الحجارة وتظهر دائرة حجرية وباب مخفي بين جذور الشجرة. يفتح الباب على ضوء ذهبي، وتنتقل ليان من الخوف إلى الدهشة والشجاعة.
Scene 6
1 shot · 6sShot 6 · medium · 6s
خلف الباب، تجد ليان فسحة صغيرة نابضة بالحياة، فيها شجرة فتية مضيئة ونسيم يعيد الخضرة إلى الأرض. تفهم أن المفتاح ليس كنزاً شخصياً، بل أمانة تعيد التوازن إلى الغابة.
- ليان: لم يكن الباب لي وحدي.
Scene 7
1 shot · 8s- Not rendered yet
Shot 7 · reaction · 8s
عند الغروب تعود ليان إلى الكوخ. يخرج الجد ناصر لملاقاتها، يلاحظ الضوء الأخضر بين الأشجار، ثم تسلمه المفتاح. لا تسرد كل شيء؛ يكفي أن يرى في وجهها أنها نجحت وفهمت الأمانة.
- الجد ناصر: هل وجدتِ الباب؟
- ليان: وجدت ما كان يحرسه.
Scene 8
1 shot · 6s- Not rendered yet
Shot 8 · insert · 6s
في الليل، يعيد الجد المفتاح إلى الصندوق، لكن ليان تضع الخريطة فوقه وتضيف علامة صغيرة تشير إلى الدائرة الحجرية. يغلقان الصندوق معاً، وقد أصبحت المغامرة معرفة ستنتقل بحذر لا سراً أنانياً.
The story
Original input — click to expand
“# ============================================================ # 🎬 مفتاح الغابة السحري # Video Assembly Script # ============================================================ from moviepy import ( VideoFileClip, AudioFileClip, CompositeAudioClip, concatenate_videoclips ) from pathlib import Path # ------------------------------------------------------------ # إعدادات المشروع # ------------------------------------------------------------ PROJECT_NAME = "مفتاح_الغابة_السحري" VIDEO_DIR = Path("video_scenes") AUDIO_DIR = Path("audio") OUTPUT_DIR = Path("output") OUTPUT_DIR.mkdir(exist_ok=True) FINAL_VIDEO = OUTPUT_DIR / f"{PROJECT_NAME}.mp4" # ------------------------------------------------------------ # ترتيب المشاهد # ------------------------------------------------------------ SCENES = [ { "name": "scene_01", "video": VIDEO_DIR / "scene_01.mp4", "voice": AUDIO_DIR / "scene_01_voice.mp3", "music": AUDIO_DIR / "scene_01_music.mp3", }, { "name": "scene_02", "video": VIDEO_DIR / "scene_02.mp4", "voice": AUDIO_DIR / "scene_02_voice.mp3", "music": AUDIO_DIR / "scene_02_music.mp3", }, { "name": "scene_03", "video": VIDEO_DIR / "scene_03.mp4", "voice": AUDIO_DIR / "scene_03_voice.mp3", "music": AUDIO_DIR / "scene_03_music.mp3", }, { "name": "scene_04", "video": VIDEO_DIR / "scene_04.mp4", "voice": AUDIO_DIR / "scene_04_voice.mp3", "music": AUDIO_DIR / "scene_04_music.mp3", }, { "name": "scene_05", "video": VIDEO_DIR / "scene_05.mp4", "voice": AUDIO_DIR / "scene_05_voice.mp3", "music": AUDIO_DIR / "scene_05_music.mp3", }, { "name": "scene_06", "video": VIDEO_DIR / "scene_06.mp4", "voice": AUDIO_DIR / "scene_06_voice.mp3", "music": AUDIO_DIR / "scene_06_music.mp3", }, { "name": "scene_07", "video": VIDEO_DIR / "scene_07.mp4", "voice": AUDIO_DIR / "scene_07_voice.mp3", "music": AUDIO_DIR / "scene_07_music.mp3", }, { "name": "scene_08", "video": VIDEO_DIR / "scene_08.mp4", "voice": AUDIO_DIR / "scene_08_voice.mp3", "music": AUDIO_DIR / "scene_08_music.mp3", }, { "name": "scene_09", "video": VIDEO_DIR / "scene_09.mp4", "voice": AUDIO_DIR / "scene_09_voice.mp3", "music": AUDIO_DIR / "scene_09_music.mp3", }, ] # ------------------------------------------------------------ # التحقق من الملفات # ------------------------------------------------------------ def check_files(): for scene in SCENES: if not scene["video"].exists(): raise FileNotFoundError( f"ملف الفيديو غير موجود: {scene['video']}" ) if not scene["voice"].exists(): print( f"⚠️ لا يوجد تعليق صوتي للمشهد: {scene['name']}" ) if not scene["music"].exists(): print( f"⚠️ لا توجد موسيقى للمشهد: {scene['name']}" ) # ------------------------------------------------------------ # إضافة الصوت إلى المشهد # ------------------------------------------------------------ def add_audio_to_scene(scene): video = VideoFileClip(str(scene["video"])) audio_tracks = [] # التعليق الصوتي if scene["voice"].exists(): voice = AudioFileClip(str(scene["voice"])) audio_tracks.append(voice) # الموسيقى if scene["music"].exists(): music = AudioFileClip(str(scene["music"])) # خفض صوت الموسيقى حتى لا تغطي الحوار music = music.with_volume_scaled(0.20) # قص الموسيقى لتناسب طول الفيديو music = music.with_duration( min(music.duration, video.duration) ) audio_tracks.append(music) # دمج جميع المسارات الصوتية if audio_tracks: final_audio = CompositeAudioClip(audio_tracks) video = video.with_audio(final_audio) return video # ------------------------------------------------------------ # معالجة جميع المشاهد # ------------------------------------------------------------ def build_movie(): check_files() clips = [] print("\n🎬 بدء إنشاء الفيلم...\n") for index, scene in enumerate(SCENES, start=1): print( f"🎞️ معالجة المشهد {index}/{len(SCENES)}: " f"{scene['name']}" ) clip = add_audio_to_scene(scene) clips.append(clip) # -------------------------------------------------------- # دمج المشاهد # -------------------------------------------------------- print("\n🔗 دمج جميع المشاهد...") final_movie = concatenate_videoclips( clips, method="compose" ) # -------------------------------------------------------- # تصدير الفيديو النهائي # -------------------------------------------------------- print("\n💾 تصد”
Make a film like this
Write a paragraph — TaleScene turns it into a voiced cinematic (live action) film with the same faces in every shot.
