---
name: animate-storyboard-turbo
description: Animate a film scene up to 15 s cheaply on H3 Max Turbo — the scene's frames (actor replaced) as one 3×3 storyboard first image, the character sheet as the last image, both far off the timeline, the scene's sound laid under; trim the one-frame flashes.
---
# Storyboard, sheet and audio on Turbo

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.

> **Quality route:** Seedance 2.5 (`seedance-2-5`) with the same pictures as @Image1… and the audio as @Audio1 does this job much better; the method below is the low-cost route — quote both.

Turbo has no reference slots — only a first frame, an end frame and a target audio. So the frames (actor already replaced with the person's {character}) go in as **one storyboard** (first image), the person's **{character sheet}** as the last image, and the scene's sound under the clip. On Turbo that audio is only a soundtrack: the lips do not follow it; lips to a line → `animate-audio-ref`.

## Steps

1. **Frames**: up to nine frames of the scene in shot order (3 for a long first shot, 2 for a shot with a turn, 1 for the rest), 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. Replace the actor in each (`character-replace`); frames with nobody in them stay as they are.
2. **The board**: `arrange_images` with the nine frames, `columns: 3`, cells at the film's aspect (for example 640 × 272 for 2.35:1, a 1920 × 816 board), `background: "black"`.
3. **The end image**: `pad_image` the sheet onto a black canvas of the board's size.
4. **Sound**: the scene's audio cut to 15 s (`cut_audio_span` on the person's audio; the corpus has no sound). No audio from the person → ask for it, or offer the Seedance quality route, which makes its own sound; never generate a clip only to take its sound. A clip the person gives you for its sound is their audio (`extract_video_audio`).
5. **Video**: `generate_video` with `minimax-h3-max-turbo`, `firstFrameUrl: <board>`, `endFrameUrl: <padded sheet>`, `targetAudioUrl: <the audio>`, `duration: 15` (also for a shorter scene: cut the part you need afterwards), `resolution: "768P"`, `promptExpansion: "disabled"`, and the prompt below.
6. **Trim and check**: `detect_video_cuts` finds the shots and where the board and the sheet show; `trim_video` from the first cut after the board to the last cut before the sheet, `snapToFrames: true`. Check the first and the last second (`extract_video_frame`, `describe_media` "Is any storyboard grid or character sheet visible?") before you call it clean; compare with the film shot by shot (`describe_media` with a `sourceRange` per shot).

## The keyframes block (fill the slots; renumber frames to your board)

```json
"keyframes": {
 "first_frame": "the given first image stands far away on the timeline, at -00:10 — ten seconds before the video starts, off screen. It is a storyboard on black: nine frames of this scene in three rows of three, numbered 1 to 9 in reading order; frames 1, 2, 3 are shot 1 (its beginning, middle and end), frame 4 is shot 2, frame 5 is shot 3, frames 6 and 7 are shot 4 (beginning and end), frames 8 and 9 are shot 5. It is only a reference and never appears on screen; the video starts directly inside shot 1.",
 "last_frame": "the given last image stands far away on the timeline, at +01:40 — a hundred seconds after the video ends, off screen. It is {character}'s character sheet on black, the face in close-up on the left and the full body on the right: only the reference for {character}'s face, hair and clothes. It never appears on screen; the video ends inside shot 5.",
 "rules": [
  "Each shot looks exactly like its storyboard frames, enlarged to the full screen: the same framing, camera angle, set, colour and {the scene's light}; add nothing and remove nothing.",
  "It is always one single full-screen live-action shot at a time; the screen is never split into a grid and no still picture is ever shown."
 ]
}
```

The rest of the prompt is the scene JSON of `animate-film-scene-refs`, with every "Image N" replaced by "storyboard frame K" and no `cut_at` on shot 1.

## What to expect

- The board and the sheet show at the ends: often for one frame, but a 10 s take (2026-10-14) held the board 1.6 s and dissolved into the sheet from 9.3 s, cutting the last action. Keep 15 s and trim at the measured cuts. As frozen shots instead, the board held 0.38 s, the sheet 1.8 s, and shot 1 was lost.
- Cuts land early (about 1–2 s before the asked times), like on H3 Max; the order holds.
- A Turbo clip takes a video enhancement well (`upscale-video-final`).

## Never

- Keyframes as frozen shots ("the board is on screen only for the first 0.4 seconds").
- Prompt expansion on a scripted scene (`animate-prompt-enhance`).
- A demo character's sheet as the last image.

## 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-storyboard-turbo.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `animate`, `animate-film-scene-refs`, `character-replace`, `upscale-video-final`. Source experiments and demo materials are historical; use the person's own approved media.
