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:
- Google opens Gemini 4 Argon to every developer, at an introductory price that doubles on 1 December.
- 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.
- 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".
- 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.
- The sting (0–1.5 s) becomes the channel bug.
- The rundown lists four stories (1.5–6.0).
- 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.
- The rundown returns and is ticked off (45.0–47.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:
- ① The name (big type over the server plate), then the price change (split-flap board).
- ② The line breaking the −20 % threshold from the September high, on real closes, with a readout. Then who it hit: two chip stocks.
- ③ Who sent what: a map where two requests fly out of Brussels. The film does not show their contents, so the letters carry only grey text lines. Then what the official said: a quote card from the Commission's own speech, and the stamp.
- ④ A spec card. The whole and the part on one scale (816B vs 42B), then what it runs on (two Mac Studios, 512 GB each, ≈ 1 TB).
Formats spent, each for a new fact:
- sting that becomes the bug;
- rundown opened and ticked off;
- one lower-third strap with category tabs, including a profile strap;
- a source line per story;
- illustration corner tags;
- big-type title with a GA stamp and a typed model ID;
- split-flap price board;
- threshold line chart of real closes, with streak counter, readout panel and a stamp;
- falling bars with a reference line and badge;
- explainer map long take (members lighting from the city, push, pan) with documents flying out of the city;
- quote card with an underline and a stamp;
- spec card with proportion bars, a percentage badge, a context chip and a hardware group bracketed to its total;
- band wipe, hard cuts on timpani, slanted wipe;
- end card.
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
- 120 BPM, E minor news theme: spiccato violins (root–fifth–octave eighths), pizzicato bass on the beat, horn pads, a low-passed 16th-note saw pulse, kick on 1 and 3, snare on 2 and 4.
- Sting: tremolo violins, then a brass/timpani/crash tutti on the plate slam, then a glockenspiel run on the glint. Each rundown row lands on a glockenspiel note; timpani on every story change and hard cut.
- Story ①: full theme with a server-room hum under the plate.
- Story ②: violins an octave down, tremolo pads, four-on-the-floor kick and trading-room ticks. The music stops for one beat at 16.0. The break at 16.5 is the heaviest hit of the film (low brass, timpani E2, crash, bass drum), followed by a timpani roll and a tubular bell on the stamp.
- Story ③: pizzicato and horns only, soft air under the map, typewriter ticks as the letters fill. After the ENFORCING stamp (33.9) only cellos, contrabass and a horn hold a low E.
- Story ④: lifts to G major with a brass stab and a glockenspiel figure.
- Recap and end card: a glockenspiel note per tick, then a timpani roll into an E-major tutti on the end card.
- Voice: Doubao TTS 2.0, voice 解說小明 2.0 (
zh_male_jieshuoxiaoming_uranus_bigtts), eight lines,speech_rate0–15. - Use it rather than 雲舟
m191or 大壹dayi: of the three male 2.0 voices it is the closest to a brisk broadcast read. It reads briskly, in a steady mid-low register. - Spoken text in
vo/lines.jsonwrites numbers as Chinese words (say); the strap and subtitles keep the digits. - Speech-to-text hears 海力士 as 海利市 and 都柏林 as 督伯林 (same sounds); those lines carry the expected transcript in their
asrfield. - Music is ducked ≈ 7 dB and thinned in 1.2–5 kHz under speech.
- Master: −14.0 LUFS, peak −1.1 dBFS. Speech-to-text of the final mix matches the script.
Palette & props
- Colours: ink
#121417, cards#1B1E23/#22262C, lemon#F2CF1D(light#F8DE4A, dark#D8B30C), gold#D4B064, paper#F4F1E8. Breaking orange#FE6B3Dis reserved and unused. The colours are LemoLab's own brand. - Type: Noto Sans SC 900/700, Barlow Condensed 800/600/600 italic, IBM Plex Mono 500 (OFL subsets in
demo/fonts/). - Props: the LEMO plate (sting, bug, end card), the rundown, the strap, request letters, stamps, the spec card.
End card
From 47.5 s, held six seconds:
- Dateline "LEMO AI NEWS · WEEK 42 · 12–18 OCT 2026".
- "本週 AI 四件事" (120 px), then "The Week in AI" (lemon italic).
- A thin rule.
- "LEMO AI NEWS · 電視新聞包裝 BROADCAST NEWS PACKAGE".
- "LemoLab × Claude Opus 5.5".
- The large plate and wordmark on the right.
- 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.
- Fonts.
- Plates and map.
- Voice: Doubao if
DOUBAO_API_KEYis set. Otherwise it uses existingvo/*.wav, or stops and points to Kokoro. - Speech check.
- Reading check.
- Events.
- Render (1,605 frames, 30 fps).
- Mix.
- Master (−14 LUFS, no grain).
.srt.- 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
- Keep it a plain bulletin. No virtual studio, no numbered slat bumpers, no locator map.
- Commit the plates. Generate them once and commit the JPEGs, so a clone builds the same film.
- Keep story ③ to what the sources support:
- Don't say "for the first time" or "no fines": the Commission's own speeches contradict both.
- Keep the incident details behind the requests out of picture and voice: they come from a single report about real companies.
- "Bear market" depends on the peak. From June's record close the Kospi had been more than 20 % down since July. The film uses the September high, as the report does, and says so on the axis.
- Story ④ says "open weights", not "open source". The licence has limited commercial terms. "Most capable" is Meta's own claim and is not reported.