DEV Community

Cover image for I Built the Entire Pre-Production Kit for a Vertical Drama in One Evening — From One Terminal
张洲诚(Zack.ZHANG)
张洲诚(Zack.ZHANG)

Posted on

I Built the Entire Pre-Production Kit for a Vertical Drama in One Evening — From One Terminal

The gig

A friend's three-person studio landed an 80-episode vertical drama (the ReelShort/DramaBox format: 60-second episodes, cliffhanger every minute). The producer wanted a pre-production package for episodes 1-3 in a week: scripts, character look references, shot lists, a narration sample.

Their workflow was three browser tabs playing relay — chatbot for scripts, image site for character looks, another tool for storyboards — with copy-paste as the integration layer. Episode 4 needs the character bible from episode 1, which lives... somewhere in a chat scroll.

The reframe: pre-production is asset production, and assets are files. Alibaba Cloud Model Studio's CLI (bl) runs text, image, and speech models from one terminal, so the whole kit became one folder. Show and tell below.

One logline, one terminal, every pre-production asset as a file

Setup

npm install -g bailian-cli
bl auth login --api-key sk-xxxx
mkdir -p drama/ep1-3/{script,roles,casting,storyboard,art,audio}
Enter fullscreen mode Exit fullscreen mode

Node 18+. Key from the Model Studio console — free tier included, bl usage free shows the balance. Install guide here.

Scripts: genre rules live in the system prompt

bl text chat --max-tokens 8000 --system "You are a vertical short-drama screenwriter. One-minute episodes, every episode ends on a hook. Output per scene: setting, character actions, dialogue, shot suggestion, duration. 3-5 main characters." --message "Second-chance revenge romance: heroine betrayed and killed by her fiance and best friend, wakes up one month before the engagement. Write episode 1." > script/ep1.md
Enter fullscreen mode Exit fullscreen mode

Two things I learned the hard way:

  • --max-tokens 8000 — the 4096 default truncated the script mid-scene-five
  • "every episode ends on a hook" must be explicit — otherwise the model paces like prestige TV and vertical-drama viewers swipe away

The character bible: most valuable file in the repo

Serials die by character drift. Fix: a structured bible that every downstream step references.

bl text chat --max-tokens 8000 --system "Extract all main characters. Output a bible per character as JSON: {name, role, age, appearance(hair/face/build/signature outfit — concrete enough to draw), personality_keywords, core_motivation, arc}. Ban vague phrases like 'strikingly beautiful'." --message "$(cat script/ep1-v2.md)" > roles/roles.json
Enter fullscreen mode Exit fullscreen mode

"Concrete enough to draw" is the load-bearing clause. Without it: "coldly elegant" → ten runs, ten faces. With it: "long straight black hair, center part, oval face, cream turtleneck under camel coat" → a description that pipes straight into the image prompt.

Look tests: 12 casting references for cents

bl image generate --prompt "Vertical drama heroine look test, 25, long straight black hair center part, oval face, cream turtleneck under camel coat, studio grey backdrop, cinematic lighting, vertical half-body" --size 3:4 --n 3 --seed 42 --out-dir ./casting --out-prefix heroine
Enter fullscreen mode Exit fullscreen mode

--n 3 per run, --seed 42 so a prompt tweak doesn't reroll the whole vibe. Honest boundary: generative models don't hold a face across images. These are casting references and mood boards, not promo material — we printed that caveat on the deck's cover page and the producer read it as professionalism, not weakness.

Shot lists, concept frames, art boards

Shot list = text job with the table schema pinned in the system prompt (shot number / type / frame / action / VO / duration / lighting notes) — the director argues with row numbers. The money shot gets a 16:9 concept frame; sets, props, and costumes reuse the same command with different prompts and sizes (16:9 / 1:1 / 3:4). Nine boards in half an hour, each with a concrete downstream user: location scout, props team, wardrobe.

Narration sample

bl speech synthesize --list-voices --model cosyvoice-v3-flash
bl speech synthesize --text "Three years ago she walked away with nothing. Today she is the youngest executive director the group has ever named." --voice longtian_v3 --out audio/narration-demo.mp3
Enter fullscreen mode Exit fullscreen mode

Gotcha from testing: stacking --instruction on a system voice returns a 428 — pick the style via the voice itself.

The ledger

One evening's output: scripts, bibles, look tests, shot lists, boards, narration

3 scripts, 4 bibles, 12 look tests, 3 shot lists, 9 boards, 1 MP3 — one evening, single-digit dollars per bl usage stats --days 7, mostly free tier. The real win is the shape: the folder is a Git repo. Episode 4 starts with cat roles/roles.json into the prompt — no drift. Wardrobe change request = edit one bible field, rerun two commands.

When not to do this

Funded production's final art pass (a concept artist's work and an AI draft are different products); anything needing face consistency across images; and the script's soul — the model writes competent scaffolding, the 2 a.m. binge factor still comes from a human.

Pitch package due next week? Start with one episode: free tier here.

Curious: anyone wired script → storyboard regeneration into a Git hook? That's the automation I haven't built yet.

Top comments (0)