---
name: animate-film-scene-refs
description: Remake a film scene up to 15 s with the person's character in every shot — H3 Max Reference to Video with the character sheet as Image 1, up to eight frames of the scene (actor replaced) and the scene's audio, a shot-by-shot JSON prompt; Seedance 2.5 as the quality route.
---
# A film scene from frames and its sound

FlashBoards user skill, version 1.2.3 (2026-10-13).

On the board, read these guides with `list_skills` and `get_skill` when the assistant exposes them; otherwise use the hosted index through an available read-only retrieval tool. Use that runtime’s actual model discovery, current page context and guarded board actions for execution. Keep native readiness, approval and cost gates; do not claim a guide was read when retrieval is unavailable.

Read related guides with `get_skill({skillId:"<id>"})` or the [hosted index](https://pub-78da82d51ed14147ac554d38094b0c0b.r2.dev/user-skills/1.2.3/index.html). Reading a guide does not start or authorize a paid generation.

Read `animate` for the shared rules. {film} · {scene} up to 15 s → one generation with the person's {character} in every shot. Longer than 15 s → `animate-scene-pairs`. The same scene cheaper → `animate-storyboard-turbo`.

> **Quality route:** Seedance 2.5 (`seedance-2-5`) with the same pictures as @Image1… and the audio as @Audio1 (or `sound: true` for its own) does this job much better; quote both.

## Limits of the request

`minimax-h3-max-reference-to-video`: up to 9 images, 3 audio and 3 video (12 files together); audio and video 2–15 s each, 15 s together; `duration` 5–15 whole seconds; `resolution` 480P / 768P / 1080P; `aspectRatio` adaptive · 21:9 · 16:9 · 4:3 · 1:1 · 3:4 · 9:16. In the prompt they are Image 1…9, Audio 1…3, Video 1…3. Prompt expansion is always off on this model.

## Steps

1. **Cut the scene into shots** and spend the 9 image slots: Image 1 = the {character sheet}; 8 frames — 3 for a long first shot (beginning / middle / end), 2 for a shot with a turn, 1 for the rest. Frames come from the person's own clip or from `search_movie_frames` (each frame names its scene and timecode). The corpus cannot list one scene's frames: a film browse (`filmId`) is shuffled, about 1,500 frames a film, text search covers every film and `mode: "similar"` leaves the film out. Several shots of one scene come from the person's own clip of it (`trim_video`, then `extract_video_frame` per shot); from the corpus alone expect one or two frames of a scene.
2. **Replace the actor in every frame that shows the actor** (`character-replace`, mode 1, at the film's aspect, for example `1920 × 816`). A frame with nobody in it stays untouched. Blind prompt; saying that nothing of the actor's costume stays keeps even a small figure seen from behind:
   ```
   Picture 2 is a frame from a film. Shoot it again exactly the same — the same camera, framing, set, light, pose, head turn, gaze and expression — but the person in it is {character} from picture 1: their face, hair and clothes exactly as in picture 1. Nothing of the clothes, headwear or gear of the person in picture 2 stays. Seen from behind, it is clearly {character}. Change nothing else.
   ```
   **Prepare every image reference before H3**, including the sheet and untouched corpus frames: accepted reference ratios are 1:1, 4:3, 3:4, 16:9, 9:16, 5:2 and 2:5. A wide film frame reaches 5:2 by a small `crop_image` of its height, keeping the whole width: 1920 × 800 → `y: 0.02`, `height: 0.96`; 1920 × 816 → `y: 0.0294`, `height: 0.9412` (both 1920 × 768). Do not pad it with black: in a 21:9 take (2026-10-14) H3 copied the bars into the video. Pad (`pad_image`, `scale: "none"`) only when a crop would cut into the person, and say the bars may show. `crop_image` and `pad_image` take an untouched corpus frame directly as `{previewHandle}`. Poll each returned image `generationId` with `get_generation` and use those IDs in the H3 quote and request; never pass an unsupported shape to H3 or invent a paid preparation step. Output `aspectRatio` can remain the film's aspect.
3. **Audio 1**: the scene's sound for the same window, 2–15 s — the person's own audio (`cut_audio_span`); the corpus has no sound. No audio from the person → ask for it, or offer the Seedance quality route with `sound: true`; never generate a clip only to take its sound. A clip the person gives you for its sound is their audio (`extract_video_audio`).
4. **Write the JSON prompt**: `output` ({film} and year, "N shots with hard cuts at the given times, 15 seconds"), a `references` block, `rules`, `characters` (the role of the sheet; wardrobe and face taken from Image 1, no looks spelled out), one entry per shot (`images`, `camera`, `action` with "Exactly one person is in the frame in this shot: {character}", `cut_at`), `sound`. Never describe the original actor. The references block (renumber to your shots):
   ```json
   "references": {
    "Image 1": "only the look of {character}: their face, hair and clothes. It is a reference, it never appears on screen as a shot.",
    "Image 2, Image 3, Image 4": "shot 1, in this order: its beginning, middle and end",
    "Image 5": "shot 2",
    "Image 6": "shot 3",
    "Image 7, Image 8": "shot 4, its beginning and end",
    "Image 9": "shot 5",
    "Audio 1": "the soundtrack of the whole video from the first frame to the last: {what is heard}. Every {on-screen sound action} lands on a beat of Audio 1."
   }
   ```
5. **Request**: `generate_video` with `duration: 15`, `resolution: "768P"`, `aspectRatio` = the film's (for example `"21:9"`), the sheet and the replaced frames in `referenceGenerationIds` (use `referencePreviewHandles` only for untouched frames already in an accepted reference shape; otherwise use the prepared owned image IDs), the audio in `referenceAudioUrls`. Quote first with `estimate_generation_cost`: the price rises with the references.
6. **Check**: `detect_video_cuts` for the cut times; `describe_media` with a `sourceRange` per shot — the shots in order, the character in each, the sheet never on screen.

## What to expect

- **Cuts land early** (0.5–2 s before the asked times); the last shot gets the rest. The order holds, the timing does not.
- **Audio 1 is played back**, not re-created, as a rule; still check it. In one take (2026-10-14) the voice came back shifted with a repeated word. Compare `transcribe_media` of the result with the audio you gave; if it moved, lay the given audio back with `replace_video_audio`.

## Never

- A film frame with the real actor as a reference — the actor's face, hair and shirt come back. H3 does not refuse, it copies.
- The sheet as Image 1 without "only the look … never appears on screen" — the video opens on the sheet.
- Replacing a frame with nobody in it — it invents the character where the film had no one.
- A demo character's sheet, replace prompt or scene prompt for a person's job.

## Execute through MCP or on the board

Use the person's FlashBoards account; never ask for a personal provider key or run the source's local scripts. Discover `get_account`, `list_generation_models` and the tools of this client first: a published guide does not prove a feature is deployed.

**Headless, no open board.** Quote with `estimate_generation_cost` (skill models: `estimate_skill_model`), then run `generate_image`, `generate_video`, `generate_audio` or `run_skill_model` with one stable `generationAttemptId` per logical attempt. Pass `maxCostUsd` only when the current operation and selected model support it; otherwise use the quoted cost and the person's explicit approval with the supported controls. Never silently ignore an unsupported spending cap; make one `get_generation` check after `retryAfterSeconds`. Pass the person's own results by `generationId`: images in `referenceGenerationIds`, `firstFrameUrl` and `endFrameUrl`, audio in `referenceAudioUrls` or `targetAudioUrl`, videos in `referenceVideoGenerationIds`. They are read on the server; signed result links do not work as public URLs. Every `generationId` a tool returns stays valid: a later read of the same result gives a different string, and both work. Film frames and gallery pictures go in by `previewHandle`: `referencePreviewHandles` of the generation tools, a `{previewHandle}` source of `arrange_images`, `crop_image` and `pad_image`, and `describe_media`. New files come from `show_media_upload_picker` as receipts. The person's character comes in as its sheet, by `generationId` or as an upload; there is no search by name. If the person names a character without the sheet, ask for it or make one with `character-sheet`; do not scan recent results for it. Free server steps: `trim_video`, `concat_videos`, `conform_video`, `replace_video_audio`, `extract_video_frame`, `extract_video_audio`, `detect_video_cuts`, `crop_image`, `pad_image`, `arrange_images`, `cut_audio_span`, `concat_audio_tracks`, `mix_audio_tracks`, `fit_audio_duration`, `add_audio_reverb`. Check every result with `describe_media` (a question about an image; `model`, `mode` and `sourceRange` only for a video) and `transcribe_media` for speech. Both checks are paid: `describe_media` costs a fraction of a cent for an image and about 2–4 ¢ for a short video (more for a long one), `transcribe_media` under 1 ¢ a minute — count the checks you plan in the price you name before the first paid step. `describe_media` is not reliable about sound: it misses effects mixed under music and can hear voices or instruments that are not there. Check speech with `transcribe_media` and ask the person to listen for effects and music. Never repay an uncertain submission; reuse an attempt ID only for the identical request. Make each new `requestId` or `generationAttemptId` unique, for example the task, the date and a short random suffix: an ID used before, even in another chat, replays that earlier request or answers `REQUEST_ID_CONFLICT`.

**On the board.** Inspect with `list_board_sessions` and `get_board_snapshot` and carry the same `sessionId` and a fresh `activeBoardId` as `expectedBoardId`. Native cards: `execute_board_action` (`listNativeModels`, `setModel`), `prepare_board_generation` with ordered board items or owned outputs, then one `generate_on_board` within the authorized budget. Board media tools: `list_media_tools` → `start_media_tool` → `get_media_tool_run`. Put headless results on a board with `add_media_to_board`.

Keep mandatory safety settings and the live limits of each model. Prices, timings, endpoints and "free retry" claims in the sources are historical, not FlashBoards contracts. If a step this guide needs is not available or is refused (a tool error, `audio_not_configured`, a missing model or input), keep the finished assets, tell the person which step is blocked and why, and ask how to go on. A single generation that ends `failed` is not a blocked step: submit it once more with a new `generationAttemptId` (reworded if it may have hit the content checker), and stop to ask only if it fails again. A failed attempt is not always refunded, so the retry may be paid again and `maxCostUsd` caps each request on its own: count both against the budget the person approved. Never swap in another route on your own: no image model redrawing a layout or a frame, no `describe_media` in place of the frames it should check, no clip generated only to take its sound, no picture drawn where the guide takes a film frame.

## Source and related guides

- [Original Learn guide](https://flashboards-h01.vercel.app/learn/acting/animate-ai-character/skills/animate-film-scene-refs.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `animate`, `animate-storyboard-turbo`, `animate-scene-pairs`, `character-replace`, `filmscene`. Source experiments and demo materials are historical; use the person's own approved media.
