# Remake Video Visuals

> Rebuild an existing video's visual track while preserving its narration, music, audio timing, and intended message. Use when Codex needs to replace footage with generated or supplied storyboard images, derive scenes from subtitles or narration, align subtitles to speech, format projection-readable captions, create alternate visual versions, assemble a new MP4, or package storyboard and sync-review assets. Typical triggers include “replace this video's visuals,” “keep the original audio,” “fix late subtitles,” “make the subtitles larger,” and “make another visual version of this film.”

- Skill: `haodao-culture/remake-video-visuals` (Agent Skill, multi-file: 13 files)
- Install (CLI): `npx skillmds@latest add haodao-culture/remake-video-visuals`
- Raw SKILL.md: https://api.skillmd.com/api/skills/haodao-culture/remake-video-visuals/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: haodao-culture (https://skillmd.com/u/haodao-culture)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/haodao-culture/remake-video-visuals

---


# 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 `standard` at 1080p (56px body), `projection-large` for classroom projection (72px body), or `projection-xlarge` when maximum readability is requested (88px body). Scale presets with output height.
- Keep subtitles at `bottom` by default. Use `center` only 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

1. Inspect the source.
   - Run `scripts/probe_video.py SOURCE --output analysis.json`.
   - Confirm duration, dimensions, frame rate, audio codec, sample rate, and channel count.
2. 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.py` and 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.md` when aligning, reflowing, or enlarging subtitles.
   - Split scenes at semantic or emotional turns, not uniform intervals.
3. 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.md` when designing or generating the frames.
4. 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.
5. Create the project manifest.
   - Read `references/manifest-schema.md` and write `project.json` with absolute source, image, subtitle, and output paths.
   - Ensure scenes are ordered, contiguous, and cover the source duration.
   - Add `color_grade` only when the storyboard needs deterministic brightness, saturation, gamma, contrast, or warmth adjustments.
   - Set `subtitles.preset` to `projection-large` for course-room projection, or `projection-xlarge` when the user asks for larger text. Set `vertical_position`, `max_lines`, `max_width_ratio`, and `auto_wrap` explicitly when layout constraints matter.
6. Assemble the video.
   - Run `scripts/check_subtitles.py` before 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 `--force` only after intentionally choosing to replace one.
7. Validate before delivery.
   - Run `scripts/validate_video.py SOURCE OUTPUT --decode`.
   - Run `scripts/create_sync_previews.py` after 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.

## 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.json` manifest;
- optional prompt document;
- validation result.

Use descriptive, versioned filenames. Do not overwrite an approved render unless the user requests replacement.

## Script requirements

- Require `ffmpeg` and `ffprobe` for 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-cli` plus 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.font` when rendering Chinese, Japanese, or Korean text.

