Communitygithub.com

lower-thirds

此技能用於當使用者要求建立品牌化的下方字幕(lower third)——即顯示姓名與職稱的動畫標題卡,包含優雅的進場、足夠的停留時間與流暢的退場。

lower-thirds 是什麼?

Lower Thirds 是一個專為開發者與影片創作者設計的 AI 代理技能,用於生成外觀專業、品牌一致的下方字幕(lower third)動畫。它支援 Remotion 框架,以確定性幀驅動(使用 useCurrentFrame())取代不可靠的時間函數,確保在瀏覽器與影片渲染器中行為一致。此技能嚴格遵守廣播級安全區域規範,針對 16:9、9:16(直立影片)與 1:1 畫面提供明確的佈局規則,並強制使用兩行文字(姓名 + 職稱)與不低於 1.6 倍的字型大小對比,以建立清晰的視覺層級。動畫採用交錯進場(bar → name → role)與不對稱加減速曲線,並提供滑入 + 淡入、條形擦拭與遮罩揭示等多種進退場樣式。最重要的是,它將姓名、職稱與主題參數化,可將同一設計模板套用於整個講者清單,批次產出多支影片而無需重複調整動畫,大幅提升製作效率。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/iart-ai/tiktok-video-skills/tree/main/skills/lower-thirds

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Lower Thirds

建立一個乾淨、具品牌感的下方字幕——即位於畫面底部區域的姓名/職稱標題卡——使其流暢進場、停留足夠時間以閱讀,並在完成後優雅退場,不搶走畫面的風采。這項技術的關鍵在於克制:俐落的揭示、強烈的字型層級、正確的安全區域擺放,以及一個能驅動整批講者的模板。

使用時機

  • 講者/訪談姓名標籤、座談會名單、發言人標題
  • 廣播風格的標題、新聞條、Podcast/網路研討會名牌
  • 將同一設計套用至多個姓名/職稱清單 → 產出多個片段(這才是真正的價值)

結構分析

一個下方字幕由兩行文字與一個圖形底層組成,置於畫面底部區域:

元素功能字型處理方式
姓名(主要)顯示是誰最大、最粗、字距最緊
職稱/頭銜(次要)顯示做什麼/在哪裡約姓名大小的 45–60%、字重較輕、常用品牌強調色
長條 / 面板 / 裝飾元素確保在任何背景上都可讀實色或 70–85% 不透明度;裝飾線條與品牌連結

限制為兩行。一行姓名加上一行職稱就是全部工作——多餘的行數會破壞層級並壓縮安全區域。

三步驟避免廉價的標題

  1. 絕不讓標題直接切換出現或消失。 單純的出現/消失看起來就像失誤。即使是 12 幀的淡入淡出或滑動,也能讓它看起來經過精心製作。
  2. 交錯進場,不要一次全部出現。 讓條形先動,再來是姓名,最後是職稱,每個之間間隔 3–6 幀。所有元素同時到達感覺很平淡;短暫的層疊則顯得有設計感。
  3. 停留時間夠長讓觀眾閱讀兩次。 大約在螢幕上停留 3–5 秒(大聲朗讀兩遍)。太短則容易被忽略;太長則會讓人感到煩躁。動畫應該只在進場和退場發生,絕不要在片段中間。

進場與退場動畫

選擇一種動態語言並重複使用。最可靠、最適合閱讀的揭示方式:

揭示方式感覺做法
滑入 + 淡入乾淨、預設風格橫向移動約 24–40px 同時淡入;使用 ease-out 曲線
條形擦拭廣播風格條形縮放/掃入(scaleX / clip),文字在其後淡入
遮罩揭示高級感用移動的矩形遮罩文字,使字母「擦入」

使用不對稱的加減速曲線:進場用乾脆的 ease-out(cubic-bezier(.22,1,.36,1)),退場用更快的 ease-in。退場速度應比進場快(約進場時長的 ⅔),讓標題快速讓出空間。

/* 遮罩揭示:文字從左向右擦入,無需外掛 */
.lt-name { clip-path: inset(0 100% 0 0); animation: wipe .5s cubic-bezier(.22,1,.36,1) forwards; }
@keyframes wipe { to { clip-path: inset(0 0 0 0); } }

進/出時間與停留時長

思考三個階段。以幀為單位規劃預算,而不是憑感覺(以 30fps 為例):

階段預算備註
進場12–18 幀 (0.4–0.6 秒)交錯:條形 → 姓名 → 職稱
停留90–150 幀 (3–5 秒)可讀的停留時間;根據文字長度調整
退場8–12 幀 (0.27–0.4 秒)比進場快

在程式碼中,所有狀態應由當前幀(或暫停的時間軸)驅動,而非牆上時鐘時間——影片渲染器需要確定性幀。將進場/停留/退場表達為單一的進度曲線,使同一個元件在瀏覽器中即時運作,也能在渲染器中逐幀工作。

安全區域與廣播慣例

下方字幕必須能在所有螢幕和平臺 UI 上正常顯示。請在「標題安全區域」(內部約 90% / 外圍留 5% 邊距)內構圖,並注意平臺介面元素:

畫面比例錨點避免區域
16:9 (1920×1080)左邊緣約 5% 邊距;基線約在下方 80–85% 處外圍 5%(標題安全)、動作安全外圍 10%
9:16 (1080×1920)相同左邊距;將條形向上提下方約 18%(字幕/UI)、上方約 12%
1:1 (1080×1080)下方區域,靠左對齊外圍 5%

靠左對齊,並向右延伸,這樣不同長度的姓名就能固定位置,不會尷尬地重新置中。讓職稱行與姓名行保持相同的左邊距。對於 9:16 畫面,請勿將標題放在最底部——平臺字幕和按鈕都在那裡。

字型層級與品牌樣式

層級就是整個設計。讓姓名明確佔據主導地位:

  • 大小對比 ≥ 1.6 倍(姓名 vs 職稱)。如果不確定,請放大姓名,而不是職稱。
  • 字重 + 顏色:姓名使用粗體/接近白色;職稱使用較輕的字重和品牌強調色(一種強調色,一致使用)。
  • 可讀性對比:文字會疊加在未知的畫面上。使用實色/半透明條形、輕微的漸層遮罩或柔和的文字陰影,使其在明亮和黑暗的素材上都能閱讀。
  • 品牌鎖定:將字體、強調色、條形樣式和圓角半徑固定於一個主題物件中,確保系列中的每個標題都一致。

將一個設計套用至多個名單

用程式碼建構的理由:改變文字/資料,重新匯出——無需重新製作動畫。將姓名/職稱/主題設定為屬性(props),絕不寫死,然後將名單映射到多個實例。

const ROSTER = [
  { name: "Ada Lovelace",  role: "Founder, Analytical Engines" },
  { name: "Grace Hopper",  role: "Rear Admiral, US Navy" },
  { name: "Alan Turing",   role: "Mathematician" },
];
// 一個 <LowerThird> 設計;將清單映射 → 多個實例(在渲染器中依序排列)
{ROSTER.map((p, i) => <LowerThird key={p.name} {...p} theme={BRAND} startFrame={i * 150} />)}

在渲染器中,將名單作為輸入屬性,並對每一行渲染一次(--props),以產出每人一個品牌化的片段——同樣的動畫、同樣的品牌,只有文字改變。請參閱 references/lower-third-component.md 以獲取完整的可執行元件與批次腳本。

輸出檢查清單

  • 僅兩行:主要姓名、次要職稱(≥1.6 倍大小對比)。
  • 進場與退場皆有動畫(無硬切);進場交錯條形→姓名→職稱;退場更快。
  • 停留 3–5 秒(可閱讀兩次);動畫僅在頭尾發生,絕不在片段中間。
  • 靠左對齊並位於標題安全區域內;9:16 的條形需向上提,避開下方 18% 的 UI 區域。
  • 文字在任何畫面上皆可讀(使用條形/漸層遮罩/陰影);全片使用一種品牌強調色。
  • 姓名/職稱/主題皆為屬性——一個模板即可渲染整個名單。

交付與驗證(渲染靜止幀 → MP4)

內建輔助工具(scripts/):使用 scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png 拼接你的靜止幀,然後使用 scripts/probe-mp4.sh out.mp4 [WxH] [fps] 確認編碼。詳見 scripts/README.md。

此下方字幕以 Remotion 合成(<Composition> + zod schema + defaultProps,姓名/職稱/主題作為屬性)形式提供——進場/停留/退場全部由 useCurrentFrame() 驅動,絕不使用 Date.now() / Math.random() / 計時器。交付物 = out/*.mp4 + 專案檔案(按名單中的每個人重新渲染)。9:16 直立影片(1080×1920)為預設格式。

驗證循環——渲染靜止幀 → 檢查 → 編碼。 對三個階段進行取樣,以便在編碼(或批次處理整個名單)之前,及早發現交錯或安全區域的錯誤。

# 進場 / 停留 / 退場的靜止幀 —— 使用實際輸入的屬性(一個真實的名單成員,而非預設值)
npx remotion still LowerThird out/f-enter.png --frame=10  --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-dwell.png --frame=75  --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-exit.png  --frame=N   --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'

# 檢查每個 PNG —— 重點檢查停留幀(完全顯示在螢幕上):
#  - 層級成立:姓名佔主導(>= 1.6 倍於職稱),職稱使用品牌強調色;兩者完全揭示,不在擦拭過程中
#  - 品牌鎖定:字體、強調色、條形/漸層遮罩正確;在畫面上可讀
#  - 9:16 安全區域:條形向上提,位於底部約 20-35% UI 區域之上,避開上方約 12% 與右側操作欄;靠左對齊且在標題安全區域內
#  - 進場/退場幀顯示部分揭示(動畫確實運作),而非硬切

npx remotion render LowerThird out/lower-third.mp4 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion render LowerThird out/demo.gif --codec=gif                # README 展示片段

批次處理名單:在渲染所有姓名之前,先透過靜止幀驗證一個名單成員——一次抓到版面/溢位問題,而不是 N 次。使用 npx remotion compositions 取得 durationInFrames/fps,以選擇停留與退場的幀數。

結束之前:

  1. 靜止幀在進場、停留和退場時都能乾淨渲染——沒有遺失字型/品牌素材。
  2. 在停留幀中:姓名明顯大於職稱,品牌強調色與條形正確,完全(而非部分)揭示。
  3. 條形位於 9:16 安全區域內——向上提至底部 UI 區域之上,避開上方與右側操作欄——在檢查的每個幀中都符合。
  4. 僅以幀驅動——沒有 Date.now() / Math.random() / 計時器;進場/退場顯示動畫,絕非硬切。
  5. 一個真實的名單成員(非 defaultProps)能正確渲染;MP4 已編碼,GIF 為選擇性。

參考檔案

  • references/lower-third-component.md —— 一個完整可執行的下方字幕:包含交錯彈簧進場、可讀停留與純由幀驅動的更快退場的 Remotion 元件;用於品牌鎖定的型別化主題物件;清單→多實例的序列化模式;每行批次渲染腳本;以及相同設計的無依賴 CSS/HTML 版本(包含遮罩揭示與條形擦拭變體)。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相關技能