An AI dialogue clip is easier to debug when the prompt is a tiny production contract: one speaker, three ordered beats, one quoted line, causal sound, and a stable ending. This tutorial turns that contract into JSON, validates it, and maps it to the current HappyHorse 1.1 form.
Workspace proof: HappyHorse 1.1 dialogue mode, prompt, duration, aspect ratio, visibility, and Generate controls
1. Define the data contract
{
"duration_seconds": 5,
"aspect_ratio": "16:9",
"speaker": "Maya, bakery owner",
"identity_lock": ["face", "green apron", "silver name pin"],
"beats": [
{"start": 0, "end": 1.5, "action": "Maya sets a warm loaf on the counter"},
{"start": 1.5, "end": 3.8, "dialogue": "Fresh at six. Still warm."},
{"start": 3.8, "end": 5, "action": "She smiles and holds the loaf steady"}
],
"audio": ["soft tray contact", "quiet bakery room tone"],
"forbid": ["music", "second speaker", "camera cut", "on-screen text"]
}
The contract is intentionally small. Five seconds cannot support a product demo, two characters, three camera moves, and a paragraph of speech.
2. Validate before prompting
function validateScene(scene) {
const errors = [];
if (!Number.isFinite(scene.duration_seconds)) errors.push("duration required");
if (scene.beats.length !== 3) errors.push("exactly three beats required");
if (scene.beats[0]?.start !== 0) errors.push("timeline must start at 0");
for (let i = 0; i < scene.beats.length; i++) {
const beat = scene.beats[i];
if (!(beat.end > beat.start)) errors.push(`beat ${i + 1} has invalid range`);
if (i && beat.start !== scene.beats[i - 1].end) {
errors.push(`gap or overlap before beat ${i + 1}`);
}
}
const end = scene.beats.at(-1)?.end;
if (end !== scene.duration_seconds) errors.push("timeline must fill duration");
const spoken = scene.beats.filter(b => b.dialogue).length;
if (spoken !== 1) errors.push("use exactly one dialogue beat");
return errors;
}
Fail the build if the validator returns any error. That is cheaper than discovering an impossible timeline after generation.
3. Compile JSON into a prompt
HappyHorse 1.1 dialogue scene, 16:9, five seconds, one continuous medium shot.
0–1.5s: Maya, a bakery owner in a green apron with a silver name pin, sets a warm loaf on the counter.
1.5–3.8s: she looks toward camera and says exactly, “Fresh at six. Still warm.”
3.8–5s: she smiles and holds the loaf steady for a clean ending.
Preserve face, apron, pin, loaf, counter, and light direction. Soft tray contact and quiet bakery room tone only. No music, second speaker, camera cut, captions, or extra text.
Paste the compiled prompt into the HappyHorse 1.1 dialogue workspace. The live page currently selects Text to Video and Dialogue scene, defaults to five seconds and 16:9, exposes Public visibility, and offers Generate. The model supports audio.
4. Treat cost as part of the contract
The current five-second, 720p pricing configuration calculates to 488 credits in the read-only model data. Do not hard-code that number in an app: request or read the live UI estimate before submission. Three welcome credits do not cover this default video setup.
5. Review as a state machine
Check the clip in three passes:
- Silent: identity, prop geometry, camera continuity, final hold.
- Audio only: exact words, no surprise speaker, causal contact sound, steady room tone.
- Combined: mouth motion aligns with the quoted line and audio events match visible actions.
Reject when a beat changes order, two people speak, the line is paraphrased, the camera cuts, or the final pose is unstable.
Troubleshooting
- Dialogue runs long: shorten the line; do not speed the character unnaturally.
- Lip sync drifts: keep one speaker and place the line in one continuous beat.
- Wardrobe changes: repeat the identity lock once, near the end of the prompt.
- Audio invents music: explicitly request room tone and forbid music.
- The model adds captions: add “no on-screen text”; composite approved captions later.
Limits
Generation is nondeterministic even when the JSON is deterministic. The validator proves timeline structure, not output quality. Public is the current default visibility. No paid generation was submitted for this tutorial, and model availability or pricing may change.
When your contract validates, run it in the exact HappyHorse 1.1 generator after checking the live estimate.

Top comments (0)