H3 Max: dialogue shot from a still and a voice track
Give it the shot's still, a reference picture or two per person on screen, and the
shot's piece of the recorded dialogue; get a clip that opens on the still with the
people in it speaking the lines. Next to seedance-2-5-dialogue it acts bigger (stands,
exits, gestures with more presence), lip-syncs better, especially close up, and holds
identity best. It also takes liberties: it pushes in by default, on long lines it can
cut to new angles, and it sometimes duplicates a person. It is the only model that
pins an end frame with audio attached. For a scene, render both models per shot and
pick (guide-lipsync-video); the picks split about evenly, with H3 taking the
transitions and most to-camera close-ups.
Inputs
- The still, matched to its script shot by what it shows, never by file name.
- The cast: only the people physically in frame. A face on a TV or a video call gets no picture: with a person's sheet attached for her TV thumbnail, H3 Max morphed the presenter in the room into her.
- Reference pictures: single views from each sheet
(
python-split-character-sheet). At most 9 in all; every subject keeps its first, the rest are dealt round-robin. Each 256 to 2,048 px a side, aspect 0.4 to 2.5, or fal rejects the request: pad, never crop. - The audio: the shot's window of the track as mono WAV, cut at pauses
(
ffmpeg-cut-audio-window), 2 to 15 s. Pad a window under 2 s with silence to 3 s; never widen it. A shot over 15 s is split at a pause into sub-shots (18a,18b): shots longer than about 15 s aren't advisable on any video model. - An end frame (optional): for an exit or transition, the next shot's still. Plan
silence into the track after the last line for the action first (a walk-out needed
2.4 s;
python-assemble-dialogue-track), so the window holds it. - One seed for the whole job, so a one-line change is a true A/B.
Run it
Call describe("fal/minimax/h3-max/reference-to-video") before the first run in a job.
run("fal/minimax/h3-max/reference-to-video", {
"image_url": "<job>/stills/shot18.jpg",
"end_image_url": "<job>/stills/shot19.jpg",
"prompt": "<H3 prompt, see below>",
"reference_image_urls": ["<job>/refs/dana_1.jpg", "<job>/refs/dana_2.jpg"],
"reference_audio_urls": ["<job>/audio/shot18.wav"],
"duration": 7.4,
"resolution": "768P",
"prompt_expansion_mode": "disabled",
"seed": 1234
}, into="<job>/runs/run04", unit="shot18_h3", tag="shot18")
duration: the audio's length in seconds (a float). Clips come back 0.3 to 0.6 s longer than asked.resolution:768Pfor runs,1080Pwhen final; uppercase P.reference_image_urlsin the order of the prompt's<Picture N>labels.prompt_expansion_mode: "disabled"is required; "balanced" adds a soundtrack.target_audio_urlis a different mode (image-to-video lip sync,h3-max-lipsync-a-still); don't send it here.
Prompt
Load h3-prompt-format first and use the reference-to-video shape: subject
definitions, (Sn) speakers before <d> blocks, and the Audio 1 sentence appended to
the summary (its references/dialogue.md is this mode worked through). Write the
direction with these clauses:
- Camera: "Static shot: the camera stays locked on the opening framing for the whole clip, with no zoom, push-in, pull-back, pan or cut." It won't stop a cut on a long line, but without it one take jumped to two copies of the presenter on a sofa outside a house. The push-in is H3's default, not something the prompt caused.
- Positions at every line in a two-hander: "the woman on the RIGHT", "the man on the LEFT". Names alone swapped lines between people.
- Screens as a fixed state ("switched off, solid black"; "a paused still"; nothing on it plays or speaks). Wording that implies playback makes H3 animate the screen, and an unreferenced screen woke up with an invented man on it.
- Action time-cued to the transcript.
- Voiceover: "Nobody on screen speaks: every mouth in frame stays closed." H3 obeys when faces are small, and opens the mouth anyway when a face fills the frame; give those shots to Seedance.
- End frame: "The clip ends exactly on the provided last frame: by the final moment the picture has become that frame."
- Never name a removed accessory, even to forbid it ("no pin or badge" grew a pin by 1 s); describe the clean state, and edit it out of the reference pictures too, or H3 puts it back.
The Audio 1 binding inside this format has been smoke-tested, not run over a whole
scene: watch whether long two-handers keep each voice on the right face.
What you get
An MP4 at 24 fps that opens on the still, with H3's own performance of the lines: it re-voices the reference audio and the mouth follows its version, not the track. The words come back verbatim; the timing drifts.
Tips and traps
- Keep the clip's own audio. Never lay the original track under it; cut each pick in with its own sound.
- Duplicates and cuts on long lines don't go away with more "no cuts" wording; take the Seedance render of that shot, or another take.
- To-camera talking heads: keep gestures minimal unless asked, and ban finger counting outright ("never counts on her fingers or holds up a number of fingers, even on first, second, finally"): asked for fingers on "First / Second / Finally", H3 held up three on a line with no third item.
- A prop clause invites the prop. A rule added to every shot of a cartoon scene ("there is exactly one ball; it rolls only along the grass") made all four takes of a shot whose still had no ball roll one in from the frame edge. Where a prop is absent, say so: "There is NO ball anywhere in this shot" (0 of 4 after).
- Repeated lines. H3 sometimes fills the clip's tail by saying the last line again (2 of 24 clips in a cartoon scene). Transcribe every clip and check its words against the shot's lines before cutting it in.
- Cartoon characters open on the still every time (0.994–0.997) and keep the drawn style from the first frame plus the sheet views; Seedance opened 0.95–0.98 on the same shots, once 0.60.
Check it
- First frames after every run: still, frame 0 and last frame side by side, with
frame_alignment(python-check-pinned-frames); under 0.95 is not opening on the still. With an end frame, check the last frame against it too. - Every 0.75 s of every clip by eye for duplicated people, a cut, a screen that woke up, or an accessory that came back.
- Lip sync over time:
hn4a-lipsync-check. - Review unmuted, beside the Seedance take of the same shot.


