Multi-style music video
Give it a song, a photo of each person who appears, and the lyrics; get a finished 16:9 music video where each scene has its own look, the cast stays recognizable across every look, the singer lip-syncs the key lines, and the captions change style with the scenes. Proven on a 2-minute song with four looks, two cast members and 26 shots.
The gates
Four approvals, in this order. Never skip one: the person judges each on what they can see.
- Shot list (text, on a review page): one row per shot with its time on the song, its style, the action, BAKED words (words drawn into the scene) and LIP (lip-sync).
- Stills: two takes per shot.
- Rough cut on the song. Show every shot cut to its slot with the music before you ask anyone to judge animation. Clips judged one by one, silent, make no sense to the person: they asked for the cut with music the moment the clip review opened.
- Captioned cut.
Expect the person to cut whole scenes at gate 3 (an intro that doesn't land is common). Build the cut so dropping shots and trimming the song's head is a re-concat, not a re-render.
1. Timing from the song
- Transcribe the song locally with word timings (
whisper-cli, or faster-whisper on a 16 kHz mono WAV). Lyrics transcribe badly; align the real lyrics to the transcript tokens (sequence-match on lowercase words, interpolate the gaps) to get a time per word.python-time-lyricsdoes this, andpython-map-song-barsgives the bar grid when the cut should land on the music (recipe-animated-music-video). - Caption what is sung, not the written lyric sheet: singers change words.
- Slot each shot to a lyric line or half line, about 3.5 to 6.5 s. Instrumental gaps get a transition shot.
2. Cast sheets, one per person per style
nano banana Pro edit, aspect_ratio 1:1, 2K, one call per person per style, the
person's photo as the only image. Ask for a 2x2 grid of four equal square panels: front
close-up, profile close-up, full body front, full body back, one figure per panel, a
fixed outfit spelled out, "No text, no labels". Split with python-split-character-sheet
and give models _1 (front close-up) and _3 (full body front) for most shots.
Style lines that worked (use descriptions, never a film or studio name):
- Photoreal: "photorealistic, high-end editorial studio photograph, soft key light"; shots: "Photorealistic cinematic film still, 35mm, shallow depth of field".
- Comic-book animation: "hand-inked comic-book animation look with bold black ink outlines, Ben-Day halftone dot shading, slightly offset CMYK color misregistration, graphic hot magenta, cyan and yellow accent lighting, painterly street-art energy".
- 3D animation: "polished stylized 3D animated feature-film character, appealing slightly stylized proportions, large expressive eyes, soft subsurface skin, warm cinematic lighting".
- Paper collage: "handmade analog collage, figure cut out of printed photographs with a visible white paper border, torn and scissor-cut edges, separate paper pieces for limbs like a paper puppet, halftone print grain, small drop shadows where layers overlap".
Traps:
- Comic style shifts skin tone. Strong magenta and yellow lighting changed a cast member's skin tone on 2 of 7 comic renders. State each person's skin tone plainly ("skin tone exactly as in the photo, not darker or lighter") and keep the colored light to the rim ("magenta and cyan rim light only on the edges"). Check every comic render for it.
- Extra panels. A photoreal sheet came back with six figures. "EXACTLY FOUR panels, exactly one figure per panel" fixed it on the next take.
- A two-person shot in comic style can lose the second person's identity (facial hair gone, age off). Spell out each person's defining features in the shot prompt, not only in the references.
3. Stills
nano banana Pro edit, 16:9, 2K, num_images: 2, only the people in the shot: their _1
and _3 views from the shot's style. Prompt: "Image 1 is , front close-up. Image 2
is , full body, front." then the scene, then "Take each person's identity from their
reference images (face, features, skin tone, glasses, hair color, texture and volume,
beard) so they are clearly recognizable, and their outfit as shown, rendered in this
frame's style. Do not copy the reference backgrounds." then the style line, then "16:9.
No captions, subtitles, logos or watermarks."
- For a shot with no cast in it, pass one view from that style with "Image 1 shows the art style to match; do not include this character."
- Baked words: put them in quotes and add "The only readable words in the frame are "X", spelled exactly." Signs, chalkboards, marquees, newspaper headlines and neon all came back correctly on 2 of 2 takes this way. Background browser windows and blimps invent text unless you say "plain, no words".
- People who are apart in the story: put them in separate places (a split screen of two rooms, a video call on each laptop), not side by side in one frame. Edit the picked still into a split screen rather than staging it again.
- Conform picks to 1920x1080 (centre crop, Lanczos) before animating.
4. Animation
- Stylized scenes (comic, 3D, collage): H3 Max image-to-video at 768P. Its smoothed, painted look is no problem in these styles. Write "paper cut-out collage animation with stop-motion feel" or "2D comic-book animation with stepped, punchy frame rate" as the style.
- Photoreal scenes without singing: Kling v3 Pro,
generate_audio: false. - Lip-sync lines: H3 Max image-to-video with
target_audio_urlset to the line's window of the song, at least 2 s, and the exact lyric in a<d>block ("sings these words aloud, her mouth moving in clean sync with the audio on every word"). No vocal stem? The full mix works passably; isolate the vocal first if you can, then check sync by eye. - Render each shot a little longer than its slot (H3 runs 0.05 to 0.7 s long; Kling's floor is 3 s), then trim to the slot frame-exact.
- Two people floating or drifting toward each other can end looking romantic. For people who aren't a couple, give them a beat that keeps space ("a big friendly high-five, then both turn to camera and shrug, keeping a little space between them the whole time").
5. Rough cut on the song
Trim every take to its slot on one frame grid (frames = round(end·fps) − round(start·fps)), concat, and lay the song under it. Two cheap shots that need no model:
- Style flicker for an instrumental gap: the singer's front close-up from each style sheet, swapped every 0.25 s over a blurred copy of itself.
- Finale split: one take per style of the cast waving, in a 2x2
xstack. Play each forward then reversed to fill a long outro without slow motion.
6. Kinetic captions per style
Composite the captions with hn4a-compositor over the rough cut; never bake lyrics into
renders. One style per scene look:
| Look | Type | Treatment |
|---|---|---|
| Photoreal | Anton, uppercase | white with black stroke, newest word yellow, rise in |
| Comic | Bangers | yellow fill, 4 px black stroke, magenta/cyan offset shadows, each word tilted a few degrees, pop in |
| 3D | Fredoka 700 | white with a deep purple stroke and drop shadow, newest word lifts and turns amber, pop in |
| Collage | Bungee base, words in alternating Bungee / Abril Fatface / Permanent Marker / Rubik Mono One | each word a coloured paper tile, rotated, with a hard shadow (ransom note), zoom in |
- Word-by-word build without the line jumping: show each chunk (up to six words, or up
to a comma) as one layer per word, every layer holding the whole chunk with unrevealed
words set to
visibility:hidden. The layout stays put while words appear. - Punch words (the hook word of a line) slam in at 300+ px centre screen for about 1 s, with an overshoot on scale and rotation.
- Score-style pop-ups ("+500 PTS") in the scene's comic font sell a game or contest beat.
- Lines must not overlap: end each line at least 0.25 s before the next line's first word, or the next caption's entrance lands on the last one.
- A bottom gradient (transparent to 45% black) keeps captions readable on bright frames.
- End title: the song title as ransom-note tiles over the finale split, one row per word
(use stacked divs; a
<br>does nothing inside a flex row).
Cost, as run
About 1,200 credits for a 2-minute, 26-shot video: cast sheets 80 (8 sheets plus 2 redos), stills about 430 (2 takes a shot), animation about 700 (mostly H3 Max 768P, four Kling shots, one retake). Captions and editing are free (local).


