Hypernatural

WorkflowBy HypernaturalVersion 4, Oct 29, 2026

recipe-slide-deck-presenter

Make a presenter video from a slide deck (PDF): write the narration, cast and voice it, lip-sync one locked presenter still to the whole voice track, then build motion-graphics slides around the talking head (full frame, window or corner bubble) that change and build on the spoken words. For explainers, training modules, course videos and title slides with an AI avatar presenter.

SKILL.md

Slide deck to presenter video

The person brings a slide deck (PDF), the brand (fonts, colours, logos), a presenter (a character sheet or an approved still) and voice guidance. You deliver a 1080p video of the presenter speaking the narration beside slides whose headlines, lists and graphics land on the words, in the layout agreed in AGENTS.md (core skill).

The presenter's footage is made once, as one continuous lip-synced take of the whole track, and composited into every slide layout (a full-frame shot, a window, a circle bubble). Never render a presenter per layout.

Steps

  1. Write the script (guide-make-a-script-from-source, llm-convert-written-script): the narration as script.json, one section per slide. Ask the person first whether they already have the script (speaker notes, a voiceover draft, a brief with the words). There is no single answer, so say plainly which case you are in:

    • They have it: convert it as written; the gate below is a quick confirmation.
    • Only the deck: you write the narration per slide, so the person must read it through before anything is voiced. Show them every line on a review page and ask whether they want to read and approve it; tell them it will be voiced exactly as approved.

    Gate: the person approves the script word for word; every later word change costs a re-voice and a re-render of that stretch.

    Straight after, before casting: the first slide's layout in two or three looks (where the slide sits, the presenter as window, cutout or bubble, how its points build), cued on word times estimated from its section, with a grey silhouette for the presenter, live on a review page (guide-add-titles-and-motion-graphics, step 1). Gate: the look. It costs nothing and is the first thing the person sees move; the presenter, the lip sync and the other slides all come after.

  2. Cast and perform the voice (guide-cast-a-voice, guide-voice-a-script, elevenlabs-tts-v4): pcm_48000, loudness normalized on the finished track, and any word the voice misreads spelled out ("H-R", not "HR" or "H.R."). Transcribe the final track (elevenlabs-speech-to-text) for word and pause times (python-read-word-timings). No gate on the track: the person heard the voice when they picked it, so a track that passes the transcript check goes straight on.

  3. Make the presenter still (guide-edit-a-frame-before-animating, nano-banana-restage-for-new-aspect): a 3:4 portrait, three-quarter body, the bottom edge at mid-thigh below the hands, an even margin of plain backdrop either side wide enough for open arms. Recompose an approved 16:9 still on nano banana Pro at 3:4, 2K, then fit it to 768×1024. Remove any badge or pin now (nano-banana-remove-small-object with python-crop-and-paste-back): every chunk is pinned to this exact still, so changing it later re-renders all of them. Gate: lock the still.

  4. Lip-sync the still to the whole track (guide-lipsync-video, h3-max-lipsync-a-still). First check the person has seen a slide layout move (step 1). If not, show it now, cued to the track's word times, with the still in it: it is free and takes minutes, and the lip sync is neither.

    • Cut the track into chunks of 5–14 s at the longest pause in range, preferring a pause after . ? !: at each cut the presenter returns to the pinned pose, which reads as a breath between sentences and as a hitch mid-sentence.
    • Render every chunk with the same still as first and last frame, at 768P, the chunk's words in the prompt. Direct gestures as a beat per chunk tied to its words (hands up on a key point, back to the sides between points), and ban finger counting outright, even on "First / Second / Finally".
    • Start every chunk at once (wait: false) and check each as it lands (tasks(wait: true, calls: [...], until: "any")), so a re-roll starts while the rest still render. Check every chunk before assembling: first frame and the frame at the chunk's length ≥ 0.99 against the still (python-check-pinned-frames); the mouth moving (motion in a mouth crop around 5–8, against about 1 for a silent face); sync over time with hn4a-lipsync-check. A chunk whose hand is still dropping at the cut (match < 0.95) gets a new seed.
    • A chunk whose lips drift late: re-sync its mouth with veed-v2-resync-existing-take. Never re-roll it; the drift is the same on every seed.
    • Assemble on one frame grid for the whole track (chunk n is frames round(start·fps) to round(end·fps)), with a 5-frame dissolve over the outgoing chunk's tail at each seam, and the track under it. Check the assembled video's sync against the track once more. Gate: the assembled talking head, unmuted, with the lip-sync plot and its flagged spans.
  5. Build the slides (guide-add-titles-and-motion-graphics, hn4a-compositor-motion-graphics) in the look picked in step 1: one JSON layer spec per layout, laid out against a still of the source slide, the track as the audio. Cue every entrance about 0.1 s before its word from the word times. Show the presenter as a full-frame window or a circle bubble cropped from the portrait clip; for a cutout over the slide, matte it properly (birefnet-matte). Gate: the specs as live candidates on a review page; then stills at each cue and transition; then the render, its frame count checked (ffprobe-inspect-media) and its start listened to.

  6. Deliver (core skill).

Revisions: the chunk is the unit of change

Map every note to chunks and fix each chunk end to end; never patch audio or video by hand. Words wrong or changed: re-voice only that chunk, match the old chunk's level, pad 0.25 s each side and check its words by transcription; re-render the chunk; re-assemble, which moves everything after it. Then point the slides at the new track, shift every cue after the changed chunk by its length change, and re-render only the spans that changed.

Choices this recipe makes

  • Portrait 3:4 at 768P. H3 Max prices per second by tier whatever the shape, and the canvas follows the still. 3:4 768P puts 157 px of face against 167 px for 16:9 1080P, at half the price ($0.052/s against $0.104/s at the promo rate, $0.08 against $0.16 at list). 3:4 1080P (×1.31 face) is the upgrade if a layout shows the presenter large.
  • 3:4, not 9:16: open-arm gestures reach about ±35% of the frame height from the centre line, and 9:16 clips them.
  • H3 Max is the route end to end. There is no separate draft pass: the still is approved before any render, and every chunk is pinned to it.
  • Lip sync from a still plus audio, not ref2vid: one presenter, a long script, both ends pinned so the chunks join.

Dead ends

  • No words in the lip-sync prompt: the prompt writer wrote "lips remain completely closed" and H3 rendered a silent face (mouth motion 1.1; with the words, 5.5–7.8).
  • Trimming each chunk with -t: each rounded up by part of a frame, and the picture drifted 313 ms behind the audio over 17 chunks. On one grid the worst is half a frame.
  • Hard cuts at the seams: renders run 0.05–0.7 s long and differ by about 1% zoom, so a hard cut pops (seam steps 1–5 against a median of 0.18). The dissolve brought them to ≤ 1.75.
  • Three fingers on "Finally": H3 held up three fingers on a line with no third item.
  • A colour-keyed cutout of the presenter: it ate skin and hair edges.
  • A full-frame edit to remove a badge: the frame came back nudged everywhere.

Worked example

The Globex title-slides job: Presenter Dana, a 163 s track, 17 chunks.

  • All 17 first frames matched the still at 0.999; the framing held at ≥ 0.984 with ≤ 1.5% zoom. Three chunks drifted 3.3–5.5% slow (08, 10, 13), in sync at the start and 200–500 ms late by the end; the person had spotted two of them, and the check caught the third. The check took about 111 s for the whole track. A VEED re-sync brought chunk 08 back to −4 to −127 ms, inside the band.
  • Slide slide_b: 55.8 s at 30 fps (1674 frames). A title over the presenter, then the heading "What to watch for." with three illustrated points building at 22.9, 32.7 and 43.0 s while the presenter shrinks to a corner bubble. The title fades out at 20.4 s as the bubble fades in from 19.9 s: the 0.5 s overlap reads as one move. Rendered in 48 s with 8 workers. A 10 s revision re-renders in about 15 s plus a 0.4 s splice, against about 2.5 min for the whole thing.
  • Composited into the panel and window layouts, the 3:4 768P footage was approved as is.

Go make something cool.

Install the app, open your agent, describe the video. That's the whole onboarding.

Sticker HypernaturalSticker BannerSticker TVBoy