Broadcast News Package — our demo

One example among many. Don't reuse its story, arc, shots, props or timings.

Demo: The Week in AI (本週 AI 四件事, 53.5 s) · news-package.mp4 · subtitles news-package.srt (external only, Chinese + English) · source in demo/

LEMO AI NEWS, LemoLab's own channel, reports four stories from the week of 12–18 October 2026, with a Chinese anchor voice:

  1. Google opens Gemini 4 Argon to every developer, at an introductory price that doubles on 1 December.
  2. Korea's Kospi falls 7.57 % in a day, the seventh losing session in a row, and ends more than 20 % below its September high.
  3. The EU's AI Office sends questions to OpenAI and Anthropic (as reported by Euronews). In Dublin, the Commission's Executive Vice-President says the office "has started enforcing these rules".
  4. Meta releases the weights of Muse Spark Open: 816B parameters, 42B active per token, running on two Mac Studios.

Every number and sentence is checked against the sources in demo/FACTS.md. The Kospi line is drawn from real daily closes.

This is an unofficial film made from public information: company pages, exchange data, news reports and a European Commission speech. None of Google, Meta, OpenAI, Anthropic, Samsung, SK hynix, Apple, Euronews or the European Commission made or endorsed it. Their names are set in type, never as logos. Two background plates (a server aisle, a silicon wafer) are AI-generated illustrations and carry an "ILLUSTRATION / 示意" tag whenever they are on screen.

Story & structure

Shape: a bulletin round-up.

  1. The sting (0–1.5 s) becomes the channel bug.
  2. The rundown lists four stories (1.5–6.0).
  3. Story ① runs 6.0–13.0, ② 13.0–24.0, ③ 24.0–35.5 and ④ 35.5–45.0. Each is entered with the band wipe and announced by the strap's category tab. The package layer (strap words, tab, source line, corner tag) belongs to each picture: the band brushes the old strap words off and the new ones in, and the new picture's first frame already has its graphic entering.
  4. The rundown returns and is ticked off (45.0–47.5).
  5. End card (47.5–53.5).

The strap stays at the bottom from the first story to the recap. There is no crawl and no burned-in subtitles.

Each story reduces its fact to one or two graphics:

Formats spent, each for a new fact:

Shots

Times in seconds; cuts and wipes on the 120 BPM grid (beat 0 = 1.5 s).

# Time Shot Format / move Note
1 0.0–1.5 sting slashes 0.04 / 0.10, plate slam 0.16–0.42 with ring and shake, wordmark 0.5, glint 0.85, plate flies to the bug 1.12–1.45 band wipe 1.2–1.5
2 1.5–6.0 rundown date block already entering under the band (1.3–2.3); four rows flip in 2.3 / 2.7 / 3.1 / 3.5; row 01 outlined 4.4 v1 1.6
3 6.0–9.0 big type over the server plate (ILLUSTRATION) Gemini slides in under the band 5.8 / 4 6.1 / Argon 6.6, 正式開放 GA stamp 7.1, model ID typed 7.6 strap, tag and source line arrive with the band; v2 6.1
4 9.0–13.0 split-flap price card intro $2 / $10 (to 30 Nov) 9.2–9.4; then $4 / $20 (from 1 Dec) 9.9–10.1; ×2 10.3 held 2.5 s complete
5 13.0–20.0 line chart, % from the 23 Sep high (real closes 15 Sep – 15 Oct) axes and the first days drawn under the band from 12.6, 12 days by 13.5, then the streak one day per step 14.15–15.65 with a counter; silence 16.0–16.5; the break 16.5 (shake, ring); readout 16.55; 熊市 BEAR MARKET stamp 17.35 v3 13.1
6 20.0–24.0 two bars over the wafer plate (ILLUSTRATION) Samsung −9.48 % 20.3, SK hynix −11.06 % 20.8, −9 % line 21.3, 都超過 9% badge 21.5 v4 20.1; hard cut: strap and source change on the same frame
7 24.0–30.5 Europe map, one take: the 27 EU members as shapes, all other land one shape with no borders EU members light from Brussels 23.75 (under the band); Belgium flashes and the Brussels ring 24.05; push 24.55–25.45; EU AI Office label 24.95; pan 25.35–26.05; requests fly to OpenAI 25.45 and Anthropic 26.2 v5 24.1; letters held 4 s
8 30.5–35.5 quote card (Commission speech) quote mark 30.45, two lines 30.65 / 30.83, slow push, underline on "enforcing" 33.3, 已開始執法 ENFORCING stamp 33.9 hard cut, profile strap on the same frame; v6 30.6; silence 2 from 33.9
9 35.5–45.0 spec card title pushed up under the band 35.25, 開放權重 OPEN WEIGHTS stamp 36.0; bars 816B 36.9 and 42B 38.2, 約 5% badge 38.65; 1M token chip 39.0; two Mac Studios slide in 40.0 / 40.25 and fill their memory cells; bracket 41.2, ≈ 1 TB 41.4 v7 35.6; bars held 6 s, Macs 3.5 s
10 45.0–47.5 rundown, recap ticks 45.8 / 46.2 / 46.6 / 47.0 v8 45.1; the strap leaves under the band
11 47.25–53.5 slanted wipe → end card the end card is already animating under the wipe; fade 52.7–53.4

readcheck.mjs passes on every key text: strap headlines, price board, chart readout, bars, map labels, letters, quote, spec card and end card. The exception is the opening rundown rows. They are previews: they return in the recap, and each story's strap repeats them.

Score structure

Palette & props

End card

From 47.5 s, held six seconds:

  1. Dateline "LEMO AI NEWS · WEEK 42 · 12–18 OCT 2026".
  2. "本週 AI 四件事" (120 px), then "The Week in AI" (lemon italic).
  3. A thin rule.
  4. "LEMO AI NEWS · 電視新聞包裝 BROADCAST NEWS PACKAGE".
  5. "LemoLab × Claude Opus 5.5".
  6. The large plate and wordmark on the right.
  7. Six lines: news sources; data and speech sources; CC0 samples and public-domain map data; OFL fonts; the Doubao voice; the two AI-generated plates.

There is no CC BY material in this film. The "LemoLab × Claude Opus 5.5" sign-off belongs to this library's demo only; a user's film carries no LemoLab credit and no copy of this card. No mascot, no watermark.

Build notes

demo/
  index.html, main.js     the page; SCENES and WIPES tables; EV for the mix; CUES for the .srt
  mix.py                  score (sampled), foley from events.json, voice, ducking
  vo/lines.json           narration: text (screen/subtitles), say (spoken), speech_rate, asr
  prompts/                the plate prompts (<name>.txt + common.txt), run by tools/gen_plates.sh
  assets/plates/          the two illustrative plates (AI-generated JPEGs, committed; the build stops if one is missing)
  tools/prep.py           plate grade (duotone) → assets/plate_*.jpg + Natural Earth → Europe projection (EU members as shapes, all other land merged, no borders)
  tools/tts_doubao.py     optional Doubao TTS client (reads DOUBAO_API_KEY from the environment; caches takes)
  tools/fonts.sh          OFL subsets for every character in main.js
  tools/subs.py           CUES → ../news-package.srt
  tools/gen_plates.sh   make new plates with the Codex CLI through core/image/gen_image.py (optional; see STYLE.md §10)
  tools/footage.py        footage finder with licence logging (not needed here)
  FACTS.md, SOURCES.md, CREDITS

Where the moves live in main.js:

Move Code
sting shotSting(), stingLogo(), plate()
rundown rundown(t, close); the recap calls it shifted, as RECAP
strap strap(t) over the STRAP table
split-flap flipTile(), shotPrice()
threshold chart shotKospi() over KDATA (PK = peak index, ST = last day before the streak)
bars shotChips()
map long take shotEU(), euView(), doc() with the EUT timing table
quote card shotQuote() with the QUOTE object
spec card shotStory4() with the S4 timing table
end card shotEnd(), shifted as END

sh demo/build.sh needs the library set up with setup.sh deps voice music and the vsco2ce / vcsl sample packs.

  1. Fonts.
  2. Plates and map.
  3. Voice: Doubao if DOUBAO_API_KEY is set. Otherwise it uses existing vo/*.wav, or stops and points to Kokoro.
  4. Speech check.
  5. Reading check.
  6. Events.
  7. Render (1,605 frames, 30 fps).
  8. Mix.
  9. Master (−14 LUFS, no grain).
  10. .srt.
  11. Poster and styleframe (18.4 s, the broken threshold with its readout).

The voice is optional equipment: with no Doubao key, write the same lines for Kokoro (core/tts/tts.py, a zf_*/zm_* voice with "lang": "cmn") and retime VO_AT and CUES from the new words.json.

Demo-specific choices and pitfalls