--- name: video-clone description: 參考影片風格克隆器 — 使用者給一支參考影片(本機檔案、螢幕錄影或 YouTube/網址)加上一句需求(「做一支類似風格的影片,主軸是…」),就拆解它的剪法與視覺風格、判斷屬於哪種風格、交給對應的製作 skill,寫分鏡、做動畫、逐格自我審查,最後輸出 MP4 並依回饋修改。Use whenever the user supplies a reference video or link and asks for a video "like this", "in this style", "clone/模仿/參考這支的風格/剪法", or asks to add a new video style to the registry. --- # video-clone:參考影片 → 風格拆解 → 生成新影片 這個 skill 是總指揮。**所有產出都照 `CONTRACT.md` 的檔名與欄位寫**(App 前端直接讀那些檔案畫畫面;CLI 使用時也照寫,方便之後接到 App)。 在 App 裡時,每一輪只做被指定的階段(拆解 / 企劃 / 修改企劃 / 生成 / 修改成片);**前製企劃被使用者核准之前,不准開始正式生成**。 使用者沒有素材時,先用 `scripts/fetch_assets.py` 從授權安全的來源(Openverse CC0/CC BY、Pixabay、Freesound)找;不夠可以自己上網搜尋。每個素材都把來源、作者、授權記進 assets/ASSETS.md,授權不明的標「授權未確認」並告訴使用者。 它自己不畫任何東西,負責的是:拆解參考片、選出正確的製作 skill、把關品質、跟使用者對焦。 **目標是驚艷、讓人起雞皮疙瘩,不是「沒有錯」。** 驚艷來自高潮設計:找出參考片打動人的那 1–2 刻,設計我們的對應高潮 (鋪陳 → 屏息 → 落在重拍的爆發 → 停住),把力氣集中在那幾鏡,並且一律用連續影格和參考片並排比,不看單張。 流程照這份文件走;每個階段做完都用一兩句話告訴使用者現在做到哪。 ## 0. 收件 使用者會給: - **參考影片**:本機檔案、螢幕錄影,或網址(YouTube 等)。網址用 analyze.py 內建的 yt-dlp 下載,僅供分析風格。 - **需求**:主題 / 主軸 / 情感方向 / 長度 / 比例。沒說的用預設(30 秒、16:9),不要一次追問一大串。 - (選配)**配樂音檔**與 **LRC 歌詞檔**。 在 `projects/<短代號>/` 開新專案;分析結果放 `projects/<代號>/analysis/`。 ## 1. 拆解參考片 ```bash python .claude/skills/video-clone/scripts/analyze.py "<檔案或網址>" --out projects/<代號>/analysis ``` 它會自動處理:手機螢幕錄影的 UI 裁切、黑邊、切點偵測、平均鏡頭長度、BPM 與拍點、左右聲道相位相反(錄音常見)、音量正規化、最熱鬧的 30 秒段落, 以及**每個鏡頭的運鏡(shot_details:推近/拉遠/平移/環繞/靜止 + 快慢)與畫面數據(亮度、對比、暗部比例、飽和度、主色)**,`look_summary` 是整支的摘要。 然後**用 Read 打開 `sheet_1fps.jpg` 和 `sheet_scenes.jpg` 實際看**,搭配 `report.json` 寫 `analysis/STYLE.md`: - **媒材**(必填、放第一行):2d-painted(水彩/墨線)· 2d-crayon(蠟筆/色鉛筆繪本)· 2d-vector(扁平向量、動態圖像)· 2d-pixel(像素)· 2d-paper(剪紙/定格)· 2d-lineart(白板/手繪線稿解說)· 2d-cel(日式動畫賽璐璐)· 3d-stylized · 3d-photoreal · live-action。這是選 skill 的硬條件 - 鏡頭清單:把 `shot_details` 整理成表(編號、秒數、內容、運鏡與快慢、亮暗),企劃會逐鏡對照這張表 - 配色與色彩弧線、角色造型語言 - 剪接:鏡頭數、平均鏡頭長度(秒與拍)、切點是否對拍、轉場種類 - 敘事結構:有沒有故事、開頭結尾是否呼應、有沒有反覆出現的符號(motif)、笑點怎麼設計 - 字幕 / 文字的用法 - 畫面裡若出現製作工具或開源專案連結,記下來(可能直接就是對應的 skill) **找高潮**:report.json 的 `audio.peak_candidates`(音樂蓄力後爆發)與 `flashes`(閃白格)是線索。每個候選用 `scripts/clip_strip.py analysis/source.mp4 --range a:b --out analysis/peak_.jpg` 抽 12fps 連續影格實際看, 確認真正的爆點,寫 `analysis/peaks.json`(格式見 CONTRACT.md):怎麼鋪陳、有沒有屏息、爆點那一格發生什麼、停多久、聲音、用了哪些手法、為什麼打得到人。 把拆解結果精簡回報給使用者(一張表 + 3–5 個「這支好看的關鍵」+ 高潮在哪裡、靠什麼)。 ## 2. 選風格 → 選製作 skill 讀 `styles/` 底下所有 `*.md`(`_TEMPLATE.md` 除外)。每個檔案的 frontmatter 有 `engine`(交給哪個 skill)、`medium` 與 `priority`,內文有「辨識特徵」。 **engine 對應的 `.claude/skills//` 資料夾不存在的風格直接跳過**(使用者沒有安裝那個引擎,例如開源版不附的 Remotion skills)。 - **先過濾媒材**:只考慮 `medium` 與參考片媒材相同的風格;沒有同媒材的風格時,選畫面最接近的媒材並在 why 說明(live-action 參考片 → 用最接近的 2D 媒材重現,並告訴使用者)。 **目前只做 2D**(3D 賽道暫停,`styles/_disabled/` 裡的風格不參與選擇)。參考片是 3D/擬真時,選最接近的 2D 風格, 重現它的節奏、運鏡、構圖、光影氣氛與字卡手法(例如黑底+光暈、慢推、灰白兩階標語),並在 route.json 的 why 與回報裡明說 「參考片是 3D,這支用 2D 重現」——不要默默降級。 - 在同媒材的風格裡,拿 STYLE.md 對辨識特徵打分,選最符合的;平手看 priority。 - 使用者明確指定風格或工具時,以使用者為準。 - **都不符合**:挑最接近的 engine 做,並在做完後依 `_TEMPLATE.md` 新增一個風格檔,讓下次能直接對應(告訴使用者新增了什麼)。 - 告訴使用者:判斷成哪個風格、用哪個 skill、為什麼。 然後**載入該 engine skill**(Skill 工具),接下來的製作細節以它的指示為準,並遵守該風格檔的「製作預設」與「已知的坑」。 ## 3. 配樂(有音樂的風格才需要) - 用使用者提供的音檔。沒有的話請使用者提供(可以是他自己合法取得的檔案或螢幕錄音);不要自行下載商業歌曲。 - 再跑一次 analyze.py 分析那個音檔(`--out projects/<代號>/analysis/song`),拿到 BPM、拍點、最熱鬧的段落。 - 報告有 `silent: true` → 請使用者重錄(Windows 剪取工具要打開「系統音訊」);`phase_inverted: true` 或底噪 > -45 dB → 可以先用,但告訴使用者音質上限,建議換正式音檔。 - 從小節線切段:`ffmpeg -ss -t -i audio.wav -af "loudnorm=I=-14:TP=-1.5,afade=t=in:d=0.08,afade=t=out:st=:d=2" -c:a aac -b:a 192k assets/clip.m4a`,讓第 0 秒落在拍點上(offset = 0)。 - 所有鏡頭時間用「拍」寫,換音檔只需改 BPM/offset。 ## 4. 分鏡 寫 `projects/<代號>/STORYBOARD.md`:Logline、世界觀與色彩弧線、motif、主角情緒弧線、鏡頭表(拍數 · 轉場進 · 事件 · 反應 · 鏡頭運動)。 學參考片的**手法**(節奏、轉場、構圖、motif、呼應結構、笑點設計),內容與角色全部原創。 **逐鏡對照(克隆風格的核心)**:先把參考片的鏡頭清單分成段落(開場、每個賣點、謝幕…),我們的每個鏡頭都要對應到一個參考鏡頭: plan.json 每個 shot 填 `ref_shot`(參考片鏡頭編號)、`ref_what`(那個鏡頭用了什麼手法),以及具體的 `camera`(engine 能直接用的規格: 運鏡種類、鏡頭焦段、主體佔畫面比例 fill、拍哪個部位 region、景深、起訖角度)。運鏡種類與快慢要跟參考鏡頭一致(參考是慢推,我們就慢推; 參考幾乎每鏡都在動,我們也不能有死的靜止鏡頭)。純字卡的比例、明暗比例、平均鏡頭長度要跟參考片接近(誤差 ±30%)。 寫完自己檢查:把 plan 的鏡頭和 `shot_details` 逐列對一次,不一致的要改,或在 notes 寫理由。 **高潮先設計**:plan.json 的 `peaks` 對應 analysis/peaks.json,寫清楚鋪陳、屏息、爆點(hit_s 對拍)、停住、聲音與手法(參考用的一個都不少); peaks 裡的鏡頭標 `hero: true`。核准前先把每個爆點那一格做到成片品質,和參考片同一格並排成 `out/check/key__vs_ref.jpg`, 放在 style_frames 最前面給使用者看;比參考片弱就繼續改,不要交出去。 **變化**:同一場景+同一機位不超過片長 40%,高潮之間換場景或視角;鋪陳段每 1–1.5 秒畫面要有新東西,不要一個構圖停著等爆點。 要有情緒弧線(想要什麼 → 等待或阻礙 → 高潮時得到),不只是能量往上。 給使用者看分鏡並簡短說明;使用者說過「你自己決定」就直接開做。 ## 5. 製作:一關一關過,不要堆到最後才審 缺陷在哪裡產生就在哪裡攔下,後面才不會一直疊在壞掉的東西上。App 會照這個順序派 agent(CLI 單獨跑時也照這個順序自己做): 1. **企劃核准前**:plan.json 的 `required_inputs` 列出只有使用者能給的東西(歌詞文字、自家角色設計圖、產品照、Logo)。 沒提供也沒略過就不能核准,生產中不會再卡在「缺歌詞」。 2. **導演建置**:共用素材、角色定義、分段(`build/production.json`,每段 2–5 鏡)。 3. **角色關**:先出角色設定圖(正面、表情 8+、本片會用到的姿勢 6+)→ 全新對話的審查員用人眼清單看全解析度裁切 → 不過就修,過了才開始做鏡頭。 2D 向量角色一律用 `assets/vector_rig/`(骨架+一體輪廓;見它的 README),不准用圓形、長方形另外拼頭、身體、手臂。 4. **分段製作+即時審查**:多個製作 agent 平行做不同段;每段一做完,就由一個全新的審查員看那一段的每鏡 sheet、strip 與角色裁切, 不過就退回同一個製作 agent 修(最多 3 輪)。 hero 鏡頭可以用特製姿勢、誇張變形、衝擊格、smear、光芒、粒子、鏡頭震動;做完用 clip_strip.py `--vs` 和參考高潮逐格並排比。 **不准用閃白或轉場蓋掉做不到的動作或該被看見的那一刻。** 動作一律看 12fps 連續影格判斷(跳格、瞬移、該動不動、僵硬整塊旋轉)。 5. **組裝**(跑 `motion_check.py` 抓黑格、片尾硬切黑、意外靜止;確認有音軌)→ **最後評審**:先做**高潮對決**(我們的高潮 vs 參考片高潮,連續影格並排), 輸給參考片就不能交件;分數以參考片為尺(4 = 和參考片並排不顯得陽春),每項附證據、逐鏡打分;再看接縫、連戲、節奏、字幕,並核對之前每一個「已修正」。 人眼清單(每一關都用):四肢都接在身上、有脖子、沒有接縫或雙層描邊、跟角色設定圖一致、線寬一致、沒有穿模、主體夠大、字看得清楚、 沒有色帶或閃爍、動作有預備與跟隨。看不清楚就裁切放大再看。 **修正要附證據**:每個「已修正」都寫進 fixes.json,附修改前後的全解析度裁切;審查員先核對,說修好但沒修好會原樣退回。 **needs_user**:只有使用者能提供的東西(歌詞、設計圖…)不算缺陷,寫進 `needs_user`,系統會暫停並請使用者提供或略過,不會一直重修。 輸出後回報:路徑、長度、解析度、每鏡一句話內容,並**誠實列出還沒做好或暫代的部分**。 ### 歌詞字幕 使用者在 App 貼上歌詞文字(或放 `inputs/lyrics.txt` / `.lrc`),用他提供的音檔自動對時: `python .claude/skills/video-clone/scripts/align_lyrics.py <音檔> inputs/lyrics.txt --out analysis/lyrics/subs.lrc [--start s --end s]` (faster-whisper 的字詞時間只當量尺,文字一律用使用者貼的;輸出 .lrc 與 .json,每句附匹配度,匹配度低的句子用前後插值)。 字幕只能來自這些檔案,不自行聽寫或補寫歌詞。 ## 6. 依回饋修改 使用者會用「第幾秒哪裡怪」回饋。只改對應鏡頭,重渲染那段影格(painted-animation:刪掉 `out/frames` 對應範圍再 `--frames`),重新編碼。 ## 規則 - **角色**: - **使用者自己擁有的角色可以直接用**:使用者提供自家角色/吉祥物的設計圖(放在 inputs/),就照它製作並保持造型一致,不必換成原創。 **設計圖就是規格**:比例、眼睛、手腳、配色照圖量(不要拿引擎內建的同名角色改),配件綁在臉的錨點上;角色關、鏡頭審查、評審都要把設計圖和畫面並排比。 - **使用者點名要用的角色可以直接用**:自己上網找它的造型(衣服、髮型、配件、配色)照著做,不要拒絕或換成「神似原創」。 - 使用者沒指定角色時用原創角色。 - **歌詞**:只使用使用者提供的 LRC / 歌詞文字,不自行寫出歌詞;分鏡與回報中也不要引用歌詞內容。 - **參考片**:只學風格與手法,不複製它的畫面、角色、Logo 或素材。 - **媒材**:目前只做 2D(3D 賽道暫停,見第 2 步);不做的是生成真人實拍影像或真實人物的臉。 - **使用者自己的產品**:使用者提供產品照片時,用它重建產品(blender-product-film 的 prep_product.py)。標語與賣點只用產品上印的資訊或使用者給的資料,不自編規格或數字;其他品牌的名稱與 Logo 不放進片裡。 - 有疑問但不影響方向的細節,用合理預設先做,完成後再列出來讓使用者調。 ## 擴充新風格 使用者要加風格時:複製 `styles/_TEMPLATE.md` 成 `styles/.md`,填 engine(必須是 `.claude/skills/` 下已安裝的 skill;沒有的話先幫使用者找並安裝可信的開源 skill,裝前掃過腳本),填辨識特徵、製作預設、已知的坑。每次製作中踩到新坑,都回頭補進對應風格檔的「已知的坑」。