Remake Video Visuals
Reconstruct the visual layer of an existing video without disturbing its audio-led timing. Keep creative decisions flexible; make timing, subtitle rendering, assembly, and validation deterministic.
Default decisions
- Preserve the source audio unless the user explicitly requests audio changes.
- Use the source duration as the master duration.
- Prefer static 16:9 frames and clean cuts for stability. Add motion only when requested and preview it before final rendering.
- Keep generated images free of embedded text; render titles and subtitles separately.
- Render white subtitles with a dark outline and no background box. Use
standardat 1080p (56px body),projection-largefor classroom projection (72px body), orprojection-xlargewhen maximum readability is requested (88px body). Scale presets with output height. - Keep subtitles at
bottomby default. Usecenteronly when the user explicitly requests centered captions or when the visual design treats subtitles as the primary focal layer. - Preserve approved subtitle wording. Reflow lines or align timing without replacing the text with speech-recognition output.
- Apply requested color grading to each unique scene image once before video encoding. Keep subtitles outside the grade so white text stays neutral.
- Preserve user-provided files and write outputs to a separate project folder.
Workflow
- Inspect the source.
- Run
scripts/probe_video.py SOURCE --output analysis.json. - Confirm duration, dimensions, frame rate, audio codec, sample rate, and channel count.
- Run
- Establish the text timeline.
- Reuse an existing SRT when available.
- If no transcript exists, obtain one with an available transcription tool; do not invent narration.
- Verify cue timing against the source narration at the opening, middle, and ending. Do not assume an existing SRT is synchronized.
- When cues lag or lead the narration, run
scripts/align_subtitles.pyand review its JSON report. Keep text fixed, use speech recognition only for timestamps, and default to a 0.25-second lead-in. - Read
references/subtitle-workflow.mdwhen aligning, reflowing, or enlarging subtitles. - Split scenes at semantic or emotional turns, not uniform intervals.
- Create the storyboard.
- Write scene purpose, start/end time, visual metaphor, composition, mood, and image prompt.
- Maintain continuity in recurring subjects, palette, lighting, period, and camera language.
- Read
references/storyboard-guidelines.mdwhen designing or generating the frames.
- Prepare review assets.
- Generate or collect one image per scene.
- Create a contact sheet with
scripts/create_contact_sheet.py. - When the user wants iteration, obtain approval before rendering the full video. When they explicitly request end-to-end production, continue without an extra checkpoint.
- Create the project manifest.
- Read
references/manifest-schema.mdand writeproject.jsonwith absolute source, image, subtitle, and output paths. - Ensure scenes are ordered, contiguous, and cover the source duration.
- Add
color_gradeonly when the storyboard needs deterministic brightness, saturation, gamma, contrast, or warmth adjustments. - Set
subtitles.presettoprojection-largefor course-room projection, orprojection-xlargewhen the user asks for larger text. Setvertical_position,max_lines,max_width_ratio, andauto_wrapexplicitly when layout constraints matter.
- Read
- Assemble the video.
- Run
scripts/check_subtitles.pybefore assembly. Treat overlaps, invalid ranges, and layout overflow as errors; save the layout report and reflowed SRT when changes occur. - Run
scripts/assemble_video.py project.json. - The script pre-grades unique scene images, scales/crops frames, preserves AAC audio by stream copy, and renders subtitle layers without requiring FFmpeg libass.
- It renders to a same-filesystem staging directory, fully decodes the staged MP4, and atomically moves it to the final path. Existing outputs are protected; pass
--forceonly after intentionally choosing to replace one.
- Run
- Validate before delivery.
- Run
scripts/validate_video.py SOURCE OUTPUT --decode. - Run
scripts/create_sync_previews.pyafter the first synchronized render. Review the opening, ending, low-confidence cues, and cues with the largest timing shifts before accepting the full render. - Inspect representative frames: opening title, normal subtitle, every scene transition, and final frame.
- Confirm sync, duration, resolution, audio presence, subtitle safe area, and absence of black boxes or unintended bars.
- Run
Deliverables
Return the final MP4 plus the reusable production package:
- scene images;
- SRT subtitle file;
- subtitle alignment and layout reports;
- short synchronization review clips;
- storyboard/contact sheet;
project.jsonmanifest;- optional prompt document;
- validation result.
Use descriptive, versioned filenames. Do not overwrite an approved render unless the user requests replacement.
Script requirements
- Require
ffmpegandffprobefor analysis, assembly, and validation. - Require Pillow only for subtitle layers and contact sheets. Prefer an existing bundled Python runtime; if Pillow is unavailable, report the missing dependency rather than silently dropping subtitles.
- Use
whisper-cliplus a multilingual Whisper.cpp model for automatic narration alignment. Do not bundle large model files in the skill; reuse a local model or obtain approval before downloading one. - Pass a CJK-capable font with
subtitles.fontwhen rendering Chinese, Japanese, or Korean text.