Dev.to AI 🤖 Ai 👁 0 📖 5 min read

One narrative beat per clip: a JSON brief and a tiny validator for Vidu Q3 prompts

Short AI video clips fail most often for a reason that has nothing to do with the model: the prompt describes a mood, not a moment. "A cosy kitchen, a teapot, morning vibes" gives the model nothing to build a beginning,

One narrative beat per clip: a JSON brief and a tiny validator for Vidu Q3 prompts

Short AI video clips fail most often for a reason that has nothing to do with the model: the prompt describes a mood, not a moment. "A cosy kitchen, a teapot, morning vibes" gives the model nothing to build a beginning, a middle and an end from.

The Vidu Q3 page on viduai.co has a compact piece of advice that fixes this: build a short scene around one narrative beat, and define the opening, the main action and the final moment in one focused prompt. This post encodes that advice as a JSON brief, together with the clip settings the page lists, and validates it with a few lines of Python.

The Vidu Q3 page

What the page specifies

From the Q3 page:

  • Inputs: text-to-video, a first frame with an optional last frame, or multi-image references (up to nine).
  • Clips: 4–15 seconds at 480p or 720p.
  • Audio: optional. When enabled, include dialogue, footsteps, wind or another sound tied to the scene. You can also switch audio off and use the clip with your own music, narration and subtitles in the final edit.
  • Camera and pacing: describe how the viewer approaches the subject, such as a wide establishing shot, a gentle push-in or a tracking view. A clear opening, main action and ending help the clip read as a complete moment.

The brief as JSON

A product-reveal example with all three parts of the beat, a camera line and a sound line:

{"seconds": 6, "resolution": "720p", "audio": true,
 "opening": "A closed cardboard box on a kitchen counter in soft morning light",
 "action": "Two hands open the lid and lift out a green ceramic teapot",
 "ending": "The teapot is placed on the counter, steam-free, label facing the camera",
 "camera": "slow push-in from a medium shot to a close-up",
 "sound": "cardboard rustling, a soft clink as the teapot touches the counter",
 "references": ["teapot_front.jpg"]}

Opening, action, ending

Each field answers one question. The opening says what we see first. The action is the one thing that happens. The ending is where the clip lands. Writing them as separate fields makes it obvious when one is missing.

The validator

import json, sys

DURATIONS = range(4, 16)          # 4-15 s clips, as listed on the Vidu Q3 page
RESOLUTIONS = {"480p", "720p"}
MAX_REFS = 9                      # "organize up to nine references"

def build(b):
    errs = []
    for part in ("opening", "action", "ending"):
        if not b.get(part): errs.append(f"missing {part}")
    if b["seconds"] not in DURATIONS: errs.append(f"{b['seconds']}s outside 4-15 s")
    if b["resolution"] not in RESOLUTIONS: errs.append(f"resolution {b['resolution']}")
    if len(b.get("references", [])) > MAX_REFS: errs.append(f"{len(b['references'])} references > {MAX_REFS}")
    if b.get("audio") and not b.get("sound"): errs.append("audio on but no sound described")
    if not b.get("audio") and b.get("sound"): errs.append("sound described but audio off")
    prompt = ". ".join(b[k] for k in ("opening", "action", "ending") if b.get(k)) + f". Camera: {b['camera']}."
    if b.get("audio") and b.get("sound"): prompt += f" Sound: {b['sound']}."
    return prompt, errs

if __name__ == "__main__":
    for path in sys.argv[1:]:
        b = json.load(open(path))
        p, errs = build(b)
        print(f"== {path}: {b['seconds']}s {b['resolution']} audio={'on' if b.get('audio') else 'off'}")
        print("   " + p)
        print("   " + ("OK" if not errs else "FIX: " + "; ".join(errs)))

The rules are deliberately few. The three beat fields must exist, the duration and resolution must be ones the page lists, and the reference count must stay within nine. The audio rules come straight from the page's advice: if audio is on, describe sound tied to the action; if you plan to add your own soundtrack, switch it off rather than describing sounds that will be replaced.

Output

== reveal.json: 6s 720p audio=on
   A closed cardboard box on a kitchen counter in soft morning light. Two hands open the lid and lift out a green ceramic teapot. The teapot is placed on the counter, steam-free, label facing the camera. Camera: slow push-in from a medium shot to a close-up. Sound: cardboard rustling, a soft clink as the teapot touches the counter.
   OK
== reveal_draft.json: 20s 720p audio=on
   A cardboard box on a kitchen counter. The teapot on the counter. Camera: orbit.
   FIX: missing action; 20s outside 4-15 s; audio on but no sound described

The draft fails three ways, and each failure matches a common real mistake. "20 seconds" usually means the idea is two beats, not one; split it into two clips. A missing action means the prompt only describes two still states. And audio on without a sound line leaves the model to invent ambience you did not ask for.

What the validator flagged

Choosing settings for a first pass

The validator accepts any duration from 4 to 15 seconds, but the beat itself suggests a length. An unboxing like the teapot example needs time for hands to open a lid and place an object: six seconds is plenty. A reaction shot, a glance or a smile, can be four. Starting short keeps the clip focused on its one beat and makes it cheaper to iterate.

For the first pass, 480p is often enough to judge whether the action reads correctly. Move to 720p once the beat works.

From one beat to a sequence

The page describes developing separate shots from the same creative direction and arranging them with your own editing tools. With JSON briefs, a sequence is just a list of files: 01-reveal.json, 02-pour.json, 03-cup.json. Each one is validated on its own, and each one stays a single beat. Keeping the same reference images across them helps the product look the same from clip to clip, although you still need to review every clip.

Why validate a prompt at all?

It can seem like overkill to run a script over a four-sentence prompt. The value shows up when several people write briefs, or when you write twenty of them for a campaign. A reviewer can read the JSON and see at a glance whether every clip has an action and an ending, without opening the workspace or spending anything on generation. And when a clip turns out badly, the brief tells you exactly what was asked for, which makes it much easier to decide whether the problem was the brief or the result.

The JSON also makes small experiments clean. To test whether a tracking view works better than a push-in, copy the file, change only the camera field, and you have two briefs that differ in exactly one way.

What to check after generation

  • Does the clip start at the opening and land on the ending?
  • Is the action visible and in the right order?
  • Does the camera do what the camera line says?
  • If audio is on, are the sounds tied to what you see?

Review checklist

Summary

  • One clip, one beat: opening, main action, final moment.
  • Encode the page's settings: 4–15 s, 480p or 720p, up to nine references.
  • Audio on means describing sound tied to the action; otherwise switch it off.
  • Long ideas become several validated briefs, not one long prompt.
📰 Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.