---
name: reels
description: Route vertical Reels, Shorts and TikTok with the person's recurring AI character talking to camera — voice, emotion, lip-synced or prompt-spoken video, room sound — on a low-cost H3 route or the Seedance 2.5 quality route.
---
# Vertical Reels with a recurring AI character

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.

Work for the person's own character: their photo or look sheet, their saved voice, their line. Slots used by every reels guide: {character} · {photo} · {look sheet} · {voice} · {line} · {place} · {mood}.

## Two routes — offer both with their current quotes

| Route | Model | When |
|---|---|---|
| Low cost | MiniMax H3 Max Turbo or H3 Max, 480P (768P for a sharper take) | drafts, many takes, a tight budget |
| Quality | Seedance 2.5 (`seedance-2-5`): the look sheet in `referenceGenerationIds` (@Image1…), the line in `referenceAudioUrls` (@Audio1…), `sound: true` for its own synced sound | the final cut, when the look matters |

Seedance 2.5 does this job noticeably better: closer timing, finer detail and its own synced sound. Quote both with `estimate_generation_cost` before any paid video and let the person choose. Seedance takes minutes, not seconds. Seedance voices @Audio1 again with its own synthesis: in a Russian test (2026-10-14) it slurred words ("Зрирна" for "Зёрна"). Check the words with `transcribe_media`; where they must be exact, keep the H3 Max Reference to Video route, where the lips follow the given voice.

## Entry level — the quick route first

Make everything first on the cheap route, and spend more only on the take the person likes:

1. **Start frame**: `generate_image` with `gpt-image-25-flare`, `width: 1152`, `height: 2048`, `quality: "low"`, the look sheet in `referenceGenerationIds`. The start frame fixes place, outfit and light.
2. **Clip**: `generate_video` with `minimax-h3-max-turbo`, `firstFrameUrl` = that frame's generationId, the line written in the prompt (Turbo speaks it), `duration` ≈ words ÷ 2.5 rounded up (8–10 s for one line), `resolution: "480P"`, `promptExpansion: "disabled"`. End the prompt with "No subtitles, no captions, no text on screen." and check a frame: Turbo sometimes burns captions.
3. **The character's voice**: change the voice in the finished clip (`reels-lipsync-turbo`, step 3). Do not voice the line with text-to-speech first on this route.

After a result the person likes: re-shoot on Seedance 2.5 at 720p/1080p, or enhance the take (`upscale-video-final`).

## References first — offer them in the first reply

Before any work, offer to look at references together ("Show me references" / "I have my own" / "Skip"; skip it if the person already sent references or a clear look):

- vidIQ: `vidiq_research` with `tool: "instagram_tiktok_outlier_search"`, `input: {query: "<the topic or line> talking to camera", audienceQuery: "<their audience>", embeddingType: "format"` (or `"hook"`)`, resultsPerPlatform: 3}`. Each vidIQ call is paid by the person (its description names the price; the same question within 12 hours is free): one call per question.
- The FlashBoards gallery (`show_reference_gallery` or `search_references`) for the place and the light of the shot.
- Show at most three picks, one line each (the hook of the first three seconds and why it works). The pick sets the hook, the framing and the place.

## Classify

| The job | Go to |
|---|---|
| Pick or make the character's voice | `reels-voice` |
| Clone a voice from a recording, keep it, reuse it | `reels-voice-clone` |
| An emotional delivery (whisper, laugh, sigh, pauses) | `reels-emotion-tags` |
| The character talks to camera like a real creator, lips on a given line | `reels-talking-head` (H3 Max Reference to Video) |
| The exact start frame matters, or cheaper and faster | `reels-lipsync-turbo` (Turbo speaks the line from the prompt; the voice is changed after) |
| It sounds too clean, "AI" | `reels-room-sound` |
| The finished video: will it work before posting | `viral-score` |
| Ready to post: versions per platform, the platform checks, the AI label and a caption | `viral-publish` |

## Rules for the whole series

1. **One voice for the series.** Choose it once (a saved voice from `list_audio_voices`) and voice every line with it.
2. **Prompts are blind**: never describe the reference images — "exactly the outfit and hairstyle of Image 1", not the garments in words. The expression of a reference frame (gaze, brows, mouth) may be named.
3. **H3 does not add ambience on request.** Room tone, street and reverb are mixed after (`reels-room-sound`).
4. **Never mention a phone in the frame** ("filmed on a phone on the desk" draws the phone). Say "shot with a phone's front camera; the phone itself is never seen".
5. **Sound effects.** Room tone, ambience and effects can come from ElevenLabs Sound Effects (`generate_audio` with `model: "elevenlabs-sound-effects-v2"`, `loop: true` for a bed) or from the video model (Seedance generates synced effects). Generated effects come out louder than voices: keep them about 13 dB under the speech.
6. Check every voice line with `transcribe_media` (the words, and that no tag was read aloud) and every clip with `describe_media` before publishing.

## 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/formats-and-exhibition/ai-reels-and-shorts/skills/reels.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `reels-voice`, `reels-voice-clone`, `reels-emotion-tags`, `reels-talking-head`, `reels-lipsync-turbo`, `reels-room-sound`. Source experiments and demo materials are historical; use the person's own approved media.
