stripe-youtube 是做什麼的?
Adnaan 長格式技能 (adnaan-youtube) 的 Stripe 版本:相同的流程與應用於 16:9 畫板的 v7 設計系統,所有顏色皆來自單一品牌檔案。預設品牌為 Stripe(brand/stripe.json,根據 Stripe 官方品牌頁面編寫:blurple #533AFD 強調色、slate #061B31 圓盤與墨水、cool paper #EEF1F6、白色卡片、僅用於數據的 strawberry 色)。其他公司 = 另一個品牌檔案($Y/brand.py init --edit-dir edit --brand acme.json);其餘部分不變。在所有動作之前,請先查看 assets/style/stripe_youtube_sheet.jpg(該技能製作的第一支影片的實際影格)並瀏覽 examples/stripe-v1/(其節拍表與場景)以及 examples/yt-01-v7/。藝術指導方向具有約束力,並存放在 references/style.md 中;章節、視窗與節奏則在 references/planning.md 中;描述在 references/description.md 中。(較舊的 Greg Light/Dark 標記器風格僅在要求時保留。)
品牌如何導入: edit/brand/brand.json → $Y/brand.py 寫入 brand.css(它會重新指向執行階段的 token)→ board.py 在它準備的每個場景中,於 v7yt.css 之後連結它;talkcaps.py 也對字幕疊層執行相同操作;執行階段的 tween(V.mintTo / V.charcoalTo)也會讀取這些 token,而 compose 的 plates 則遵循該檔案。場景中絕不直接鍵入十六進位色碼。品牌檔案中指名的標誌,會從官方套件中擷取到 edit/logos/ 中(絕不重繪)。
此技能是 adnaan-reel 的長格式兄弟,並重複使用其輔助工具(轉錄、剪輯、驗證、頁面擷取、標誌/照片/圖示擷取器、渲染/音量標準化流程、音效套件、頭部姿勢偵測)。它必須安裝在 ~/.claude/skills/adnaan-reel。使用該專案的環境執行每個輔助工具:uv run --project ~/.claude/skills/adnaan-reel python <helper> … — 下方將使用 R=~/.claude/skills/adnaan-reel/helpers,Y=~/.claude/skills/stripe-youtube/helpers。
長格式影片的建構方式(與短影片的不同之處)
短影片會將每個節拍都做成一個完整的 HyperFrames 場景。長影片則不能這樣做(渲染時間過長,觀看時也容易疲乏)。以下是其方法:
- 剪輯(
$R/render.py --base-only)→base.mp4:他的攝影機畫面,經過剪輯,1920x1080,附帶語音(透過一次樣本精確的傳遞建立 — 請參閱反模式、唇形同步漂移),然後$Y/lookdowns.py在低頭動作期間暫停一個影格。 - 設計時刻為 HyperFrames 場景(
$Y/board.py):畫布、地圖、白板、證明(不透明,3–10 秒)與說明疊層 — 每個影片通常有 25–45 個,由代理平行建構。談話字幕是生成的疊層($Y/talkcaps.py),每個全畫面談話視窗一個。 - 其他所有內容則進行合成(
$Y/compose.py):談話 = 基礎全畫面 + 字幕;螢幕 = 白板 plate + 他的螢幕錄影(使用相同範圍剪輯,透過$Y/zoomplan.py縮放)+ 講者卡片;場景視窗 = 渲染 + 卡片;頂層疊加;音效 + 標準化音量背景音樂;−14 LUFS。每分鐘影片約需 40 秒合成。
原則
- 白板是基礎,他位於卡片上。 約 70–85% 的影片時間是白板佈局,他的單純攝影機畫面在卡片中(固定位置,僅在剪輯時移動,帶有強調色環);全畫面談話作為標點符號使用(開場、意見、故事、CTA)。預設無遮罩 — 他喜歡單純的卡片。
- 一種外觀,一個品牌檔案。 紙張 + 網格 + 強烈暗角,品牌的 primary 色作為唯一的 ONE 強調色(Stripe blurple),其深色用於帶有白色 Phosphor 字形的圓盤與墨水(Stripe slate),純白卡片,乾淨的向量筆畫,Inter Tight / Inter(Stripe 的官方字型未公開)。數據顏色(strawberry
#E8435A)僅用於數字。無標記筆,無 Caveat 字型,無粉彩色調,場景中不鍵入十六進位色碼。 - 談話附帶字幕,每個字都有。 全畫面談話視窗帶有全覆蓋式動態字幕(白色,每個短語一個 hero 字詞使用品牌的淺色強調色,在他背景的平靜區域左側欄位)。白板視窗則在設計內部包含文字。仍會交付 SRT 檔案。螢幕上的文字就是他說的文字。
- 展示真實內容。 他提及的每個頁面、紙張、貼文、研究,都以真實形式呈現(白色卡片中的可讀條帶,品牌色調螢光筆標記在口語短語上);每個工具/公司都使用其官方標誌;人物使用真實照片。絕不虛構數字、引言、螢幕截圖。
- 螢幕就是操作示範。 他的 Cap 錄影放在一個視窗卡片中,根據他的點擊進行縮放(他的 Cap 縮放優先,其次是點擊集群,然後是手動目標),縮放完成後繪製說明。等待時間會被剪掉,絕不加速。
- 兩次審批,然後建構所有內容。 章節大綱 → 節拍表 → 試點(2–3 個場景 + 該外觀中的字幕)→ 平行建構所有時刻 → 合成 → 自我檢查 → 交付。自動駕駛模式(「直接做」)跳過等待。
- 絕不讓白板空著。 每個設計時刻都有一個主角物件來演繹該句子 + 1–3 個微動畫;攝影機移動;每個場景的第 0 幀都已經顯示其標題或主要物件。
- 聲音輔助語音。 僅使用結構性音效(約每 30–60 秒一個,低音量且溫暖的 v6 套件),一個平靜的淡入背景音樂,約比他的語音低 5 dB(太安靜他會聽不到),語音在最上層,−14 LUFS。
- 在展示之前進行驗證。 影格計數精確,每個剪輯點檢查唇形同步,每個視窗邊界在一張圖表上檢查,字幕對照剪輯結果朗讀,測量音量。他絕不應該是發現同步或音量問題的那個人。
嚴格規則
- 大綱審批通過後,節拍表才能審批,之後才能建立任何場景(除非使用自動駕駛模式)。
adnaan-reel的剪輯規則不變地適用:字邊界剪輯,每個填充詞剪輯和每個連接點都使用$R/verify_cuts.py驗證(閱讀 ⚠ TAIL/HEAD 標誌),絕不將測試用的 EDL 渲染到edit/中,30 毫秒淡入淡出。- 從他的 Cap 修剪開始(
source/cap.json中的 "trims")。然後移除重拍:保留每句台詞的最後一個完整版本,絕不從兩次嘗試中拼接同一句台詞,丟棄他口頭拒絕的內容(「不」、「再來」、「划掉那個」)以及花絮;檢查錄影結尾是否有重新錄製的鉤子。透過獨立轉錄每個保留的區段,然後將每個區段與其相鄰區段進行比對來找出重複內容 — 對長剪輯執行 whisper 會將同一句台詞的兩個版本合併為一個。 - 無空白音訊:將每個區段修剪至其語音內容(噪音基準 + 7 dB,語音前 0.07 秒 / 後 0.09 秒),並分割 ≥ 0.22 秒的內部停頓(
$R/audio_env.py tighten --margin 7 --min-gap 0.22)。他兩次要求剪掉「所有停頓」 — 第一次處理保留的 0.3–0.9 秒空白聽起來仍是停頓。 - 螢幕使用與攝影機相同的範圍進行剪輯(compose.py 從 timeline.json 執行此操作)。
- 場景:精確符合其影格計數(board.py 預設,
board.py check驗證);執行階段(board.css/js、v7yt.css/js)已安裝,絕不為單一場景編輯;全域外觀變更僅在templates/runtime/中進行一次 →board.py runtime。卡片區域清晰;第 0 幀不為空。 - 僅透過
board.py render渲染(代理也一樣,使用--only <id>):它為疊層選擇 ProRes 4444 .mov(h264 .mov 是不透明的 — 談話視窗會顯示紙張而不是他),並在整個機器中共享渲染插槽。絕不pkill渲染程序 — 一個代理的 pkill 會終止所有其他代理的渲染。 - 說明位置來自
compose.py where <out_t> <sx> <sy>,絕不猜測。 - 每個場景(或共享一個物件的場景家族,例如鏈條)一個子代理,所有子代理在同一條訊息中產生;在它們就緒時審查每個場景的靜止畫面,使用 SendMessage 將修正發送給同一個代理。共享物件有一個唯一擁有者,負責編寫共享模組 + 註釋;其他代理複製,絕不分支它。信任檔案時間戳記,而非報告。
- 透過
$R/fetch.py下載,透過$R/capture.py擷取(記錄到 credits.md);所有輸出在<project>/edit/中;在編輯期間,絕不寫入技能目錄內部。 - 在剪輯前對攝影機進行鏡像檢查(在一張全解析度靜止畫面中,放大他衣服/背景上的任何印刷文字)。
- 在 shell 迴圈中,為 ffmpeg 加上
-nostdin(否則它會吃掉迴圈的標準輸入)。
輔助工具
| 輔助工具 | 功能說明 |
|---|---|
$Y/cap.py find / info <p.cap> / ingest <p.cap> --edit-dir E | Cap 專案(最新的優先)→ source/cam.mov、source/screen.mp4、source/cap.json(點擊、移動、修剪、縮放) |
$R/transcribe.py source/cam.mov --edit-dir E --vocab "…" | 詞級轉錄 → transcripts/cam.json(快取) |
$R/pack_transcripts.py · $R/audio_env.py · $R/verify_cuts.py · $R/timeline_view.py | 讀取錄影、緊縮、驗證每個連接點(adnaan-reel) |
$R/headpose.py source/cam.mov --start 0 --end <s> > E/headpose_report.txt | 整個錄影的頭部俯仰 → 低頭動作時段 |
$R/render.py edl.json -o base.mp4 --base-only | 剪輯 → base.mp4 + timeline.json(樣本精確的語音) |
$Y/lookdowns.py --edit-dir E | 在台詞開頭/結尾的低头動作期間,暫停一個攝影機影格;每次基礎渲染後重新執行 |
$Y/sync_check.py --edit-dir E [--final final.mp4] | 每個區段的唇形同步(畫面 vs 語音 vs 來源)以及最終版本 vs 基礎版本;不同步時退出碼為 1 |
$R/capture.py · $R/fetch.py logo/photo/icon/url/credits | 可讀頁面條帶、官方標誌、真實照片、Phosphor 圖示、下載、credits.md |
$Y/board.py prepare/runtime/render/check --edit-dir E [--only ids] | 從 animations/scenes.json 建立場景專案(v7 runtime + 圖示 + 起始模板 + 資源 + TASK.md);限制插槽的渲染;精確影格 / Alpha 檢查 |
$Y/talkcaps.py --edit-dir E [--dry-run] | 全覆蓋式談話字幕:每個談話視窗生成一個 cNN_talk 疊層(在每次剪輯/場景變更後重新執行) |
$Y/compose.py plan / where <t> <sx> <sy> / render -o final.mp4 [--preview] [--only-window N] / sheet <video> | 視窗表;說明座標;合成(視窗 + 卡片 + 疊層 + 音效 + 標準化音樂 + −14 LUFS);邊界圖表 |
$Y/zoomplan.py | 縮放攝影機(函式庫) |
$Y/deliver.py srt / chapters / stills <video> t… | deliver/captions.srt、deliver/chapters.txt(為 YouTube 驗證)、縮圖靜止畫面 |
$Y/brand.py init / css / apply --edit-dir E [--brand x.json] | 品牌檔案 → brand.css → 每個場景(board.py 和 talkcaps.py 呼叫它;apply 手動重新安裝) |
$Y/review.py --edit-dir E <ids> | 每個場景的審查圖表(5 幀,卡匣區域已標示)→ verify/review/<id>.jpg |
$Y/inserts.py clip / splice / shift --edit-dir E | 在品牌白板上帶有自身音訊的片段 → 以幀為精確單位拼接到合成中 → SRT + 章節位移 |
起始模板(templates/scenes/):canvas、map、board、proof(不透明)、callout_overlay、talk_overlay(透明)以及 talk_captions(talkcaps.py 的模板)。執行階段標頭(board.js、v7yt.js)列出了每個基元。參考場景:examples/stripe-v1/(Stripe 影片:節拍表、場景列表、鏈條 + 品牌卡片 + 頁面模組)以及 examples/yt-01-v7/(鏈條地圖 + 共享模組、數據長條圖、證明頁面、白板流程、字幕)。
目錄結構
<project>/
└── edit/
├── project.md 會話記憶
├── source/ (cam.mov, screen.mp4, cap.json) transcripts/ (cam.json 原始, CAM.json 修正)
├── edl.json, base.mp4 (+ base_unfrozen.mp4), timeline.json, headpose_report.txt, layout.json
├── brand/ (brand.json, brand.css) captures/ logos/ photos/ icons/ downloads/ music/ inserts/
├── animations/ (scenes.json, <id>/{hf/, TASK.md, render.mp4|mov, beats.json, qa/}, cNN_talk/ generated)
├── compose/ (plates, screen_cut.mp4, windows/) verify/
└── final.mp4, deliver/ (captions.srt, chapters.txt, description.txt, thumb_*.png), credits.md
流程
- 繼續。 如果
edit/project.md存在,用一行總結上次會話並詢問是否繼續。 - 輸入。 如果他沒有提供路徑:
$Y/cap.py find並確認錄影。如果不是 Cap 專案:將攝影機檔案連結為source/cam.mov(螢幕錄影為source/screen.mp4,使用同一個時鐘;一個最簡的cap.json)。收集腳本、連結以及他想展示的任何內容。品牌:$Y/brand.py init --edit-dir edit(Stripe;其他公司使用--brand x.json),然後將品牌檔案指定的官方標誌套件中的標誌擷取到edit/logos/。在建立其餘場景之前,先用該品牌測試一個場景。 - 輸入 + 讀取。
ffprobe;用於鏡像檢查的全解析度靜止畫面;$R/transcribe.py source/cam.mov --edit-dir edit --vocab "<腳本/連結中的每個名稱>";$R/pack_transcripts.py;$R/headpose.py對整個錄影進行處理 →headpose_report.txt(他…
[翻譯已截斷]