---
name: avatar-long-speech
description: Make a talking clip longer than one model call — the voice cut at pauses into pieces of up to 14 s, a silent 2 s stub from the person's picture on H3 Max Turbo, one H3 Max Turbo Extend step per piece with output continuation, assembled with free trims and joins and the stub cut off.
---
# Long speech: stub and Extend chain

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 `avatar` for the shared rules. Inputs are the person's own: {picture} (the first frame) and {speech} voiced with their {voice}.

## Steps

1. **Pieces** — `transcribe_media` on {speech} with `model: "scribe_v2"`, then `plan_audio_timeline({transcriptId, chunkMaxSeconds: 14})`: its `speechChunks` end in pauses, are even and 2–14 s long, each with its words. Cut every chunk with `cut_audio_span({requestId, source, startSeconds, endSeconds})`; the result (`audio-finish-…`) goes straight into `reference_audio_urls`. If the plan warns that the speech cannot be split, shorten the speech or raise `chunkMaxSeconds` (at most 15). A voice-over that runs long is fitted with `fit_audio_duration`.
2. **Stub** — `generate_video` with `minimax-h3-max-turbo`, `firstFrameUrl: <picture>`, `duration: 5` (the model's minimum), `resolution: "480P"` (or `"768P"`), `promptExpansion: "disabled"`, the stub prompt below. Keep only its first 2 s: `trim_video` with `endSeconds: 2`.
3. **One Extend step per piece** — `estimate_skill_model`, then `run_skill_model` with model `minimax-h3-max-turbo-extend` and inputs:
   - `video_url`: the clip so far (the trimmed stub first, later the last join: a `video-finish-…` id or a `generationId`)
   - `prompt`: the piece prompt below, with this piece's words
   - `reference_audio_urls: [<the piece>]`
   - `duration`: the piece plus 0.2 s (1–15)
   - `resolution`: the same as the stub
   - **`output: "continuation"`**, `enable_prompt_expansion: false`
4. **Assemble** — the returned clip starts with a 1.625 s repeat of the source's end: `trim_video` with `source: {generationId}`, `startSeconds: 1.625`, `snapToFrames: true` (39 frames at 24 fps, the sound cut at the same frame). Join the clip so far and the trimmed piece with `concat_videos`; that join is the next step's `video_url`.
5. **Cut the stub** — at the end `trim_video` the whole clip from just before the stub's end (`startSeconds: 1.9`, or up to 0.6 s earlier if the speech starts there). The result starts with the speech.

Every Extend step is a separate quoted, paid attempt with its own `generationAttemptId`. Trims and joins are free.

**Always `continuation`, never `extended`.** `extended` returns the whole clip re-generated at every step, so the picture softens step after step; with `continuation` every piece is kept as it came out and the clip is assembled from the pieces. Same price, same time.

## Stub prompt

```text
One continuous take from the given first image. The <man/woman/person> stays still and silent, looking straight into the lens, lips closed, one soft natural blink. The camera holds still. Everything stays exactly as in the first image. Quiet room tone only, no voice, no music.
```

## Piece prompt (standing or sitting talking head)

```text
The same <man/woman/person> <starts/keeps> talking straight into the camera, casual and alive, like recording a story for <their> followers. Audio 1 is <their> voice: <they> say(s) exactly these words, <their> lips exactly in sync with Audio 1: "<the piece's words>" <acting beats tied to words>. The framing is slightly crooked and wobbles a little, like a handheld phone. <Their> face, hair and clothes, the place and the light stay exactly as in the video. One continuous shot, no cuts, no music, no text on screen.
```

- `<acting beats tied to words>`: one beat per word or pause of the piece — "A small breath and a <mood> smile before '<first word>'. On '<word>' <they> lean(s) in closer to the lens… <They> laugh(s) after '<word>'… On '<question>' <they> raise(s) <their> eyebrows and pause(s), waiting."
- "starts" for piece 1, "keeps" for the rest. The words go without the `[tags]` of the voice.

## What was measured

| | Result |
|---|---|
| Speech in the clip | the words of the input file are kept closely |
| Laughs, sighs, pauses | re-timed; the clip drifts 1–3 s a minute |
| Stub frames | the model may put its own noise there — always cut |
| `continuation` vs `extended` (same stub, voice, prompts) | `continuation` is sharper in every quarter of the clip |
| Along a chain | the face still softens by about a third from the first to the last quarter in both modes: for long talks cut to a fresh stub (another angle) every 25–50 s (`avatar-podcast`) |

## Limits

- Audio per piece 2–15 s; the source clip at most 60 s (about a minute of speech per chain).
- The lips follow the clip's own sound — publish the clip's audio, not the original track.

## Check

`transcribe_media` the finished clip against the script; `describe_media` with a `sourceRange` around a join: "Is it the same face and place? Do the lips move with the speech?" Listen to every join.

## 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-talking-avatar/skills/avatar-long-speech.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `avatar`, `reels-voice`, `avatar-podcast`, `avatar-walk-talk`. Source experiments and demo materials are historical; use the person's own approved media.
