Engaging monologue (16:9)
參考影片:Ali Abdaal, "How I'd Create Content in 2026 (If I Had To Start Over)" (youtu.be/A8PxRHQrLJ8, 16 分鐘, 1080p)。
動作語言複製自該影片。視覺風格使用 FringeLines v2.1 設計系統:
My Drive/FringeLines Design System files/Fringe Lines Design system v2_1/ 以及位於 …/handoff/fringelines-tokens.css 的設計 token。
參考影片的運作原理
根據影片測量,取樣頻率為每 2 秒 1 幀,並在轉場附近密集取樣。
- 約 55% 為純說話畫面。 一台鎖定的攝影機,中景。每約 5 秒一次跳接(中位數):16 分鐘內約 122 次剪接。每次剪接交替使用廣角和推進鏡頭,使剪接看起來是有意為之。
- 僅兩種佈局,絕不更多:
- 全螢幕演講者,上面疊加其他元素:姓名下三分之一、左上角帶有小標籤按鈕的彩色提示卡片、底部的白色襯線句子、頭部附近的小型彩色標籤,以及底部中間的贊助商/CTA 按鈕。
- 紙質畫布。 演講者縮小為 人像子母畫面(圓角、白色邊框、右側、約 400×560),同時在一個帶有淺色弧線的暖色米白色頁面上建構圖形。畫布承載動態句子、編號路線圖卡片、橫條圖、金字塔圖,以及螢幕截圖或 B-Roll(以圓角卡片呈現,下方附有說明文字)。
- 無連續字幕。 螢幕上的文字是 精選 的。一次顯示一句,逐字與語音同步顯現。每個字從模糊開始,然後變清晰。關鍵短語會改變顏色。
- 圖表隨著每個項目被提及而逐步建構。 橫條圖以輕微的過衝效果彈入。金字塔圖層從上方落下。
- 攝影機在圖形內部移動。 5 卡路線圖在每個章節重複出現,放大作用中的卡片並模糊其他卡片。
- 轉場使用模糊淡出而非直接剪接。全螢幕↔子母畫面的轉換是一個約 0.4 秒的緩和變形。
- 節奏: 每 10–20 秒一個新的視覺想法,每個段落一個強調時刻(黑白畫面),並且在每個人首次出現時顯示下三分之一。
- 音效: 佈局切換時的柔和咻聲,以及元素落下時的輕微啵聲,音量保持在人聲之下。
如何對應到 FringeLines(請勿偏離此對應)
| 參考影片 | FringeLines 版本 |
|---|---|
| 暖色襯線字體搭配珊瑚色強調 | 所有顯示文字使用 Instrument Serif。強調為 斜體 短語,在紙上或影片上分別為墨藍色 #1A4F6B 或白色。僅對最重要的數字([7 AM],大數字)使用橘色 #D4622A。 |
| 橫條圖中的圓角無襯線字體 | 橫條圖、標籤、列表項目、堆疊標籤使用 Archivo 500–600 |
| 小型大寫標籤 | IBM Plex Mono 600,大寫,+0.14em,≥ 22 px:用於眉題、標籤按鈕、來源、元資料 |
| 珊瑚/紅色漸層提示卡片 | 設計系統漸層:綠色(預設)、藍色(第二個想法)、橘色(警告或「錯誤」) |
| 柔和路線圖卡片 | 綠色、藍色和橘色 淡彩,單色數字徽章和虛線橘色連接線 |
| 奶油色紙張 + 弧線 | 紙張 #F7F7F5 搭配一條淺綠色淡彩弧線 |
| 陰影 | 無。 平面表面,2 px 細線 #E3E5DF,子母畫面上的白色邊框,圓角半徑 16–18 |
| 贊助商按鈕 | 白色 CTA 按鈕(fringelines.co / 電子報)搭配橘色單色「Link in description」標籤 |
| 頻道結尾 | 綠色結尾卡片,Clip Slides 封面:單色眉題、橘色分隔線、襯線標題(含一個斜體短語)、Archivo 副標、● fringelines.co |
設計系統規則仍然適用:
- 每個畫面一個想法;
- 每個畫面一個橘色;
- 綠色為預設,藍色為比較色;
- 每個大數字都有一個
source; - 所有文字不小於 22 px。
組成元件
- 模板:
pipeline/remotion/src/Monologue.tsx,Monologue合成,解析度 1920×1080 / 30 fps。它重用了ShortV2.tsx中的臉部追蹤功能。 - 建構腳本:
pipeline/build_monologue.py,包含兩個步驟:cut和render。 - 工作資料夾:
work/monologue/<slug>/存放clip.mp4、props.json、transcript.txt、beats.json和faces.json。 - 輸出:
out/monologue/<slug>.mp4,標準化至 −14 LUFS。 - 範例:
work/monologue/morning-loop-test/beats.json,一個來自 10 月 30 日集節目 Quinn 的 62 秒片段。
1. 取得錄製片段
一個單一攝影機的 16:9 錄影,音質良好,一人,長度約 1–15 分鐘。將其放入 inbox/monologue/<slug>/take.mp4。
若要從一集節目中擷取獨白段落,請將攝影機畫面與其錄音室音軌合併。使用 build_short.xml_offsets 從 Descript XML 取得偏移量;請參閱 morning-loop-test 的製作方式:
ffmpeg -ss <t0-videoOffset> -t <dur> -i Quinn.mp4 -ss <t0-audioOffset> -t <dur> -i studio-sound-Quinn.m4a -map 0:v -map 1:a … take.mp4
2. 剪接
~/.shorts-skill/bin/python pipeline/build_monologue.py cut --slug <slug> --src inbox/monologue/<slug>/take.mp4 \
[--range 12.0:95.5 --range 120:180] [--replace "gtm=>GTM" --replace "quick=>Quick"]
剪接步驟的功能:
- 使用 Whisper 轉錄錄製片段(快取於
words-src.json)。 - 移除填充詞、口吃和長時間停頓,使用與短影片相同的規劃器。
- 每次跳接時,交替使用推進效果(1.0 / 1.12,以臉部為中心)。
- 寫入
transcript.txt,內容包含word@seconds,以剪接後的時間軸為準。
--replace 僅修正用於計時顯現的單字;不會自動加上字幕。
3. 編寫 work/monologue/<slug>/beats.json
閱讀 transcript.txt,並根據它規劃節奏。
{"brand": "FringeLines", "beats": [
{"type": "title", "at": 0.2, "end": 2.0, "eyebrow": "FringeLines · Monologue", "text": "The *morning loop*"},
{"type": "name", "at": 2.1, "end": 5.4, "text": "Quinn", "role": "Host · Fringe Lines"},
{"type": "chips", "at": 3.0, "end": 7.4, "items": [{"text": "GTM loops", "at": 3.1}, {"text": "Coding loops", "at": 5.1, "tone": "blue"}]},
{"type": "text", "at": 7.6, "end": 11.3, "eyebrow": "What's a loop?", "text": "Loop's just a *stated goal* and then it works *autonomously*"},
{"type": "callout", "at": 11.5, "end": 16.2, "label": "The setup", "tone": "green", "text": "I use Quick Desktop with routines that execute at any time"},
{"type": "overlay", "at": 16.4, "end": 18.3, "text": "I usually run it at [7 AM]"},
{"type": "stack", "at": 22.4, "end": 36.4, "title": "My core team · 4 people", "items": [{"text": "Account executive", "at": 25.6}, {"…"}]},
{"type": "stat", "at": 51.2, "end": 55.1, "kicker": "My regular account team", "value": 14, "text": "people I'm interacting with on a regular basis", "source": "Quinn's own count · Fringe Lines, Oct 30 2026"},
{"type": "end", "at": 58.4, "end": 61.4, "text": "Building the *morning loop*", "sub": "The full walkthrough is in this week's episode."}
]}
時間
- 時間單位為剪接後片段的秒數。
end(或hold)結束一個節拍,其轉場會在 0.3 秒內模糊淡出。 - 文字會逐字與語音同步顯示。
text中的每個單字都會與該節拍視窗內的字幕進行比對。- 請逐字引用演講者的話(輕微修剪是可以的),以便同步功能正常運作。
- 如果文字是改寫過的,則顯示會回退為均勻分佈。請使用
"reveal": "even"強制此行為。
- 項目
at時間預設為均勻交錯。請將其設定為每個項目被說出的時刻,大約在該單字前 0.1 秒。
標記語法
*斜體強調*:每個畫面一個短語。[強調數字]:橘色,每個畫面一個,僅限數字。
節拍類型
演講者全螢幕(疊加層):
| 類型 | 欄位 | 用途 |
|---|---|---|
title | text, eyebrow? | 開場標題,疊加在變暗的畫面上(前 2-3 秒) |
name | text, role? | 人物首次出現時的下三分之一 |
overlay | text | 底部白色襯線文字的一句口語句子:你想要被記住的那句話 |
callout | text, label?, tone?, side? | 左上角(或右側)的彩色卡片,帶有單色標籤按鈕:例如「錯誤 #1」、「設定」、「規則」 |
chips | items[{text, at, tone?}], side?, tone? | 2-3 個在頭部旁邊彈入的短標籤:內心獨白、名稱、選項 |
cta | text, sub? | 底部按鈕:電子報、該集節目或優惠。僅出現一次,通常在影片中段 |
bw | (無) | 以黑白畫面強調演講者;請與 overlay 搭配使用 |
media + "full": true | src, video?, from? | 滿版 B-Roll,演講者顯示在子母畫面中 |
紙質畫布(演講者移至子母畫面):
| 類型 | 欄位 | 用途 |
|---|---|---|
text | text, eyebrow?, align? | 一個動態句子:定義、論點、「最重要的一件事…」等 |
stack | items[{text, at, tone?}] (底部→頂部), title? | 金字塔或層次:基礎 → 策略 → 回報、團隊層級 |
compare | title?, left{label, items}, right{label, items}, winner? | A vs B:興趣 vs 收入、之前 vs 之後。失敗方在接近結尾時變灰 |
roadmap | items[{text}] (≤6), active?, zoom? | 影片的章節。在開頭顯示一次,然後每個章節重複使用,並設定 active = 章節索引,zoom = 何時放大 |
steps | items[{text, at}], title? | 帶有細線分隔線的編號列表:專家、工具、步驟 |
stat | value, prefix?, suffix?, decimals?, kicker?, text, source | 一個數字,以橘色計數遞增;必須提供 source |
media | src, title?, meta?, video?, from? | 圓角卡片中的螢幕截圖或 B-Roll,附有說明文字(標題 + 單色元資料行)。檔案放在工作資料夾中 |
end | text, eyebrow?, sub?, url?, tone? | 綠色結尾卡片(2-4 秒) |
如果兩個紙質節拍相隔少於 0.7 秒,則保持在子母畫面佈局,以免演講者來回跳動。
節奏規則(來自參考影片)
- 以前 5 秒內的
title和name開場。 - 紙質節拍佔總時長的 35–45%。 連續超過約 20 秒沒有視覺變化,且連續停留在紙質畫布上不超過約 15 秒。
- 交替使用兩種佈局。不要連續使用兩個
callout;在它們之間放入一個text或圖表。 - 每個節拍一個想法。 保持
text節拍 ≤ 14 字,提示卡片節拍 ≤ 16 字。 - 圖表項目在說出該單字時落地,絕不一次全部出現。圖表的第一個項目應在節拍開始後約 1 秒內落地;否則節拍應稍後開始。
- 段落:
- 在開場介紹結束時顯示一個
roadmap。 - 在每個段落開始時重複使用它,並設定
active。 - 以該段落的關鍵句
overlay結束每個段落,對於最重要的段落搭配bw。
- 在開場介紹結束時顯示一個
- 每 5 分鐘最多一個
cta,且絕不在前 30 秒內。 - 以
end卡片結束。它可以延續到最後一句話之後。
誠實原則
- 螢幕上的數字必須與所說的一致,或來自
source中指定的來源。 - 他人內容的螢幕截圖需要在
meta中標示出處。 - 不要替演講者添加未說的話:非引用的
overlay或text節拍應解讀為標籤,而非演講內容。
4. 渲染
~/.shorts-skill/bin/python pipeline/build_monologue.py render --slug <slug> [--sfx-db -22]
- 它會追蹤臉部一次(
faces.json;如果重新剪接,請刪除它)。 - 渲染時間隨影片長度增長;一個 1 分鐘的測試在 Mac mini 上需要幾分鐘。
- 音效:每次佈局切換時有咻聲,元素落地時有啵聲,以及在標題和結尾卡片處有漸強音。將
--sfx-db提高到接近 −18 以獲得更多能量感。
5. 品質檢查(務必執行)
for t in 1.5 5 10 20 30 40 50 60; do ffmpeg -v error -y -ss $t -i out/monologue/<slug>.mp4 -frames:v 1 -vf scale=640:-1 /tmp/m_$t.png; done
檢查以下各項:
- 文字: 沒有文字跑到子母畫面下方(紙質區域結束於 x = 1320)。堆疊標籤適合單行顯示。
- 強調: 沒有遺留的
*或[。每個畫面最多一個橘色。 - 臉部構圖: 臉部位於子母畫面中央,且推進效果不會切到頭部。
- 顯示時機: 文字顯示與口語單字對齊。如果某個節拍的淡色文字顯示時間過長,表示其
at設定過早。 - 音量:
ffmpeg -i out.mp4 -af ebur128 -f null - 2>&1 | grep " I:"讀數約為 −14。
向使用者報告:
- 影片長度和節拍列表(時間 → 類型 → 文字);
- 仍需檢查的項目:數字、名稱和螢幕截圖出處;
- 任何因文字非逐字引用而回退為均勻顯示的節拍。
尚未建構
- 9:16 版本: 此合成僅為 16:9。若要製作直向影片,請使用
editorial-short技能製作短影片。 - 自動規劃: 編寫
beats.json需進行判斷,因此需手動或由 Claude 根據transcript.txt完成。