Files
heygen-com--hyperframes/skills/embedded-captions/references/aesthetic-principles.md
T
wehub-resource-sync 85453da49f
regression / regression-shards (style-16-prod style-9-prod style-17-prod iframe-render-compat variables-prod mp4-h265-sdr, shard-4) (push) Has been cancelled
regression / regression-shards (style-4-prod style-11-prod style-2-prod animejs-adapter typegpu-adapter parallel-capture-regression, shard-5) (push) Has been cancelled
regression / regression-shards (style-7-prod style-8-prod style-10-prod css-spinner-render-compat webm-transparency mp4-h264-sdr webm-vp9, shard-3) (push) Has been cancelled
regression / regression-shards (sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector, shard-7) (push) Has been cancelled
Windows render verification / Detect changes (push) Has been cancelled
Windows render verification / Preflight (lint + format) (push) Has been cancelled
Windows render verification / Render on windows-latest (push) Has been cancelled
Windows render verification / Tests on windows-latest (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Fallow audit (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Producer: integration tests (push) Has been cancelled
CI / Producer: unit tests (push) Has been cancelled
CI / File size check (push) Has been cancelled
CI / Test: skills (push) Has been cancelled
CI / Skills: manifest in sync (push) Has been cancelled
CI / CLI: npx shim (macos-latest) (push) Has been cancelled
CI / CLI: npx shim (ubuntu-latest) (push) Has been cancelled
CI / CLI: npx shim (windows-latest) (push) Has been cancelled
CI / SDK: unit + contract + smoke (push) Has been cancelled
CI / Test: runtime contract (push) Has been cancelled
CI / Studio: load smoke (push) Has been cancelled
CI / Smoke: global install (push) Has been cancelled
CI / CLI smoke (required) (push) Has been cancelled
CI / Semantic PR title (push) Has been cancelled
Player perf / Detect changes (push) Has been cancelled
Player perf / Preflight (lint + format) (push) Has been cancelled
Player perf / player-perf (push) Has been cancelled
Player perf / Perf: drift (push) Has been cancelled
Player perf / Perf: fps (push) Has been cancelled
Player perf / Perf: parity (push) Has been cancelled
Player perf / Perf: scrub (push) Has been cancelled
Player perf / Perf: load (push) Has been cancelled
preview-regression / Detect changes (push) Has been cancelled
preview-regression / Preflight (lint + format) (push) Has been cancelled
preview-regression / Preview parity (push) Has been cancelled
preview-regression / preview-regression (push) Has been cancelled
regression / regression (push) Has been cancelled
regression / Detect changes (push) Has been cancelled
regression / Preflight (lint + format) (push) Has been cancelled
regression / regression-shards (hdr-regression style-5-prod style-3-prod mov-prores, shard-1) (push) Has been cancelled
regression / regression-shards (overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence portrait-edge-bleed, shard-6) (push) Has been cancelled
regression / regression-shards (style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat audio-mux-parity, shard-8) (push) Has been cancelled
regression / regression-shards (style-15-prod hdr-hlg-regression style-1-prod many-cuts vfr-screen-recording render-symlinked-assets, shard-2) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docs / Validate docs (push) Has been cancelled
Sync skills to ClawHub / Publish changed skills (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:58:35 +08:00

7.6 KiB
Raw Blame History

Aesthetic Principles for Cinematic Captions

The 18 rules that separate "designed" caption work from "preset-generated" caption work. This is the single most important reference in the skill — every plan.json and every Standard-mode HTML should be checked against these before committing.

The whole competitive thesis: every AI caption tool in 2026 (Veed, Submagic, Opus Clip, Captions.ai, CapCut) is a preset picker. They hand the user a box of crayons. This skill is a director — it exercises judgment. Beat them on taste, not feature count.


The 18 rules

1. The subject always wins

Captions exist to serve the face, not compete with it. If the caption draws the eye before the speaker, the caption has failed. Before shipping any plan.json, ask: "does the caption or the subject read first?" If caption wins, shrink, dim, or move it.

2. Occlude, don't hover

World-class caption design puts text into the scene. Letters that pass behind a shoulder, mic, or head feel diegetic. Letters that float uniformly above the lower-third feel like PowerPoint. Use the matte pipeline — that's the moat over every competitor.

3. Contrast is a hierarchy problem, not a brightness problem

A white box behind text is a failure of taste. Priority order:

  1. mix-blend-mode: overlay or screen picking up scene luminance
  2. 23px dark stroke + soft drop shadow
  3. Narrow semi-opaque gradient bar (NOT a solid box)
  4. Dim the background plate by 1015% locally
  5. (LAST RESORT) A hard white pill box — banned on cinematic directions

4. Kill the constant lower-third

Fixed-bottom captions are monotone. Caption zone shifts with shot:

  • Tight close-up → upper sidebar or crown
  • Mid-shot → embedded on back wall / foam / whiteboard
  • Wide → classic lower-third offset to non-subject side

5. One family, two weights maximum

Hierarchy lives in weight (e.g., 500 → 800), not in font. Mixing Montserrat + script + serif in one clip is the #1 amateur tell. Ship Inter, SF Pro, Söhne, GT America, Aktiv Grotesk, or Neue Haas Grotesk with ≥5 weights and compose with weight + size.

6. Tracking tightens as size grows

Display-size (>40pt) wants negative tracking (-10 to -30 units, or -0.015em to -0.035em). Body-size (1420pt equivalent) wants positive tracking (+5 to +15, or +0.005em to +0.015em). Apple SF Pro's optical-size model is the reference. Submagic defaults do the opposite — they look cheap because of it.

7. Cap height ≈ 3.55% of frame height for body captions

  • 1080p vertical (1920 tall): body 6595px, emph/hook 130170px
  • 1080p landscape (1080 tall): body 4055px, emph 70100px
  • Hormozi-size (~79% of frame) is hook size, not body size. Reserve for punchlines.

8. Never italicize for emphasis in video text

Italics are a print convention for flow inside a paragraph. On 24fps motion they read as "tilted" not "stressed". Emphasize with weight (extrabold), color (single accent), or size (1.31.6×). Italics allowed only for:

  • Literal quotation of written material
  • Foreign word
  • Thought vs spoken dichotomy

9. Color discipline: one hue + neutrals

Pick one saturated accent per video for keyword highlights. Hormozi's yellow+green+red works for him because his content is already loud. Cinematic = single accent + white/bone/charcoal. Default palette:

  • Warm white #F5EFE6 on dark
  • Graphite #1A1A1A on light
  • Accent chosen from scene sampling

10. Animate transform only, never the letter itself

letter-spacing, filter:blur, font-weight animations cause inline-block reflow → line-jumps. Animate translateY, scale, opacity, clip-path. This is locked from the embedded-captions debugging.

11. Minimum 0.4s per word visible

BBC reading speed is 160180 wpm (0.330.38s/word). Cinematic feel wants more breathing room — 200220ms stagger per word, hold full phrase 0.40.6s before exit. Entries under 150ms read as frantic.

12. Stagger is the primary expressive axis

Same phrase, different stagger, totally different feel:

Stagger Feel
40ms machine-gun, urgent, TikTok-hook
80ms conversational, default
150ms deliberate, documentary
250ms+ poetic, ceremonial

Pick from content tone, not default to one value.

13. Emphasis escalates within a phrase, not between phrases

Every word bolded = no emphasis. Structure:

  • 70% plain body
  • 20% slight lift (color OR weight, not both)
  • 8% full emphasis (bigger, brighter, held longer)
  • 2% climax (biggest, held 1.5s, breath before + after)

14. Break rhythm once per 30s

Every-word-same-way = eye adapts, stops registering motion. Plant a rhythm-break every ~30s:

  • Phrase enters from opposite direction
  • A single word at 2× size
  • A beat of pure silence with no caption
  • A color shift

This is what separates Submagic-preset work from something designed.

15. Caption what adds, cut what restates

Transcribe everything. Display 7085%. Remove:

  • Filler ("um", "like", "you know", "I mean")
  • Self-corrections ("I think... I mean actually...")
  • Obvious visual echoes ("as you can see here" while pointing)

Editorial judgment — no existing AI caption tool does this. It's pure upside.

16. Segment on breath, not on duration

Chunk at natural pauses ≥ 250ms. A caption spanning a breath-break feels wrong. Whisper word-level timestamps make this trivial.

17. Safe zones per platform, always

  • 9:16 TikTok/IG/Shorts: caption zone y ∈ [12%, 78%] (bottom 22% is UI)
  • 16:9 broadcast: title-safe = center 80%
  • TV export: 5% margin on all sides

Bake into the layout solver. Never eyeball.

18. Letterbox/pillarbox is caption real estate

Black bars on 9:16 from 16:9 source? Those bars are the caption home. 2.35:1 cinematic frame on 16:9 export? Serif quotation in the letterbox reads as documentary.


Rhetorical judgment rules (editorial)

These are the "what to caption" decisions. No existing tool exercises them.

  • Filler suppression — off/light/strong. Default: light for documentary, strong for vlog.
  • Self-correction folding — display only the final version.
  • Breath-group segmentation — split on silences >250ms, never mid-phrase.
  • Semantic emphasis — LLM-pass per phrase: "which 12 words carry the meaning?" Highlight those. Don't default to stressed syllables or loudest words.
  • Silence honor — if speaker pauses 1.5s+ for rhetorical effect, don't back-fill with lingering prior caption. Let silence breathe.
  • Quote-sensing — "he said, quote…" or air quotes → italic (one of the allowed italic exceptions).
  • No [laughs] / [sighs] — those are accessibility captions. For aesthetic captions, they pollute the frame.

Self-critique checklist (run before rendering)

The agent's own pre-render pass. Flag violations:

  • Does the caption or subject read first? (Rule #1)
  • Any hard white pill boxes? (Rule #3 — banned on cinematic)
  • Still lower-third for a close-up? (Rule #4)
  • More than 2 weights or more than 1 font family? (Rule #5)
  • Italic used for emphasis? (Rule #8 — banned)
  • More than 1 saturated accent color? (Rule #9)
  • Letter-spacing or filter:blur animating? (Rule #10 — banned)
  • Stagger same for documentary and vlog? (Rule #12)
  • Every group emphasized? (Rule #13)
  • 30s+ with no rhythm-break? (Rule #14)
  • Displaying every filler word? (Rule #15)
  • Caption crossing breath-break? (Rule #16)
  • Caption in platform UI zone? (Rule #17)

Any "yes" to a violation question → regenerate the affected segment.