Communitygithub.com

beachyphotoandfilm-arch/video-skills

為每支Reels設計獨一無二的Instagram封面,風格一致。能根據Reels內容撰寫吸引人的標題,從標籤照片庫中選取您的真實照片進行排版,並在手機尺寸的網格視圖中預覽。完全在本機渲染,絕不使用AI生成圖像。

video-skills 是什麼?

這個技能專為需要在Instagram上保持視覺一致性的內容創作者設計。它會自動分析每支Reels的轉錄稿、說明文字和開場文字卡,據此生成一個吸引人的鉤子標題。接著,它會從您本機的照片庫中(根據主題和最近使用記錄)智能選取一張照片,並按照您預先設定的品牌風格(包括字型、顏色、副標題等)進行排版。整個過程中不會使用任何AI圖像生成技術,確保封面完全基於您的真實素材。 該技能支援macOS和Linux平台,依賴於Node.js、Python、Puppeteer和ImageMagick等常見開發工具。它提供詳細的配置選項,讓您可以設定品牌色彩、字型、照片來源等,並內建嚴格的原則來確保封面獨特性(例如不重複使用最近9張已用過的照片、輪替佈局和鉤子類型)。渲染完成後,它會生成全尺寸封面和手機網格預覽圖,並要求您和用戶進行審核。審核通過後,封面會自動複製到指定資料夾,並更新封面日誌。這個技能也可以與排程技能整合,在Reels排程前自動調用。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beachyphotoandfilm-arch/video-skills/tree/HEAD/skills/reel-covers

在你喜歡的 AI 中提問

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

說明文件

Reels 封面

每支 Reels 都擁有專屬封面。封面由您的真實照片和字體構成,文字會確保在 Instagram 個人檔案網格的可視範圍內。

設定:在此設定您的品牌風格

首次執行前請編輯一次。

設定項目位置預設值
強調色scripts/cover.html 中的 --brand#3b82f6
標題字型scripts/cover.html 中的 --display-fontAnton (免費,Google Fonts)
副標題字型scripts/cover.html 中的 .subMontserrat Bold (免費)
預設副標題您的封面例如:"from a Home Cook",或留空
照片資料夾library.json 中的 photos_dir<PATH_TO_YOUR_COVER_PHOTOS>
Canva 照片資料夾 (可選)library.json 中的 canva_folder<YOUR_CANVA_FOLDER_ID>
Canva 封面主文件 (可選)參考您現有風格的範本<YOUR_CANVA_COVER_MASTER_DOC_ID>
Canva 草稿設計 (可選)用於從 Canva 匯出照片<YOUR_CANVA_SCRATCH_DESIGN_ID>
封面日誌pick.py 的 COVER_LOG 環境變數專案根目錄的 drafts/social/cover-log.json
完成封面的存放位置步驟 8<YOUR_VIDEO_FOLDER>/<Video> YYYY-MM-DD/Covers/
禁用詞hooks.md 規則您的清單 (例如舊的優惠名稱)

專為 Instagram 設計。 封面可作為一般 IG + TikTok + Shorts 貼文的影片縮圖 (例如 Metricool 的 videoThumbnailUrl)。只有 Instagram 網格對設計有意義。切勿取代貼文已有的封面。

絕不 AI 生成圖像。 背景是您的照片,佈局複製自您的既有封面。程式碼僅負責編排它們。

預設風格 (可依喜好調整)

僅參考您主文件中最新的封面。 您已不再使用的舊風格不計入。

  • 一張明亮、中性的您與相關道具 (筆電、相機、手機、產品) 的照片,文字區域為素色牆面
  • 標題使用白色顯示字型,一律全大寫,置中對齊,2 或 3 行,字級適中
  • 可選的副標題,使用 Montserrat Bold,正常大小寫
  • 預設:無陰影、無外框、文字後無色塊或暗化處理、無強調色文字
  • 無標籤、無傾斜字型、無手寫或草書字體、無大數字或系列佈局
  • 唯一的額外元素:偶爾使用素色的強調色手繪箭頭
  • Reels 圖示下方不留文字:Instagram 的網格會將圖示放置在每個方格的右上角。render.mjs 會對任何位於 x 超過 760 且 y 小於 540 的內容發出警告。

標題規則、鉤子類型和標籤都寫在 hooks.md 中。撰寫標題前請先閱讀。

檔案

檔案說明
scripts/cover.html唯一的佈局:標題 + 可選副標題,加上 arrow / inset / avatar 額外元素。品牌設定在最上方。
scripts/render.mjs渲染 1080x1920 的 JPG 檔案 + 兩種預覽圖,並對文字超出安全區或檔案超過 8MB 發出警告。
scripts/pick.py根據主題篩選照片,封鎖最近使用過的 9 張照片,並顯示最近的佈局和鉤子類型。
library.json每張照片的標籤資訊 (姿勢、道具、空白區域位置、對焦點)。內附範例;請建立您自己的。
封面日誌 (COVER_LOG)每張已發布的封面記錄。用來確保封面獨特性。
photos_dir您的原始解析度照片 (僅限本機,勿提交至 git)。

scripts/ 需要 puppeteer-core (在 scripts/ 中執行 npm i puppeteer-core,或將 scripts/node_modules 符號連結到其他技能的安裝目錄) 以及 Google Chrome 和 ffmpeg。render.mjs 預設指向 macOS 的預設 Chrome 路徑;如果您的路徑不同,請修改 executablePath。

執行步驟

1. 了解 Reels。 您需要每支 Reels 的轉錄稿、說明文字和開場文字卡。指出該 Reels 承諾的一個重點。

2. 標題。 選擇一個不同於前一張封面的鉤子類型 (pick.py 會顯示)。撰寫 3 或 4 個選項,每個 3 到 8 個字,選出最有力的一個。它不得與開場文字卡逐字重複。

3. 照片。

python3 .claude/skills/reel-covers/scripts/pick.py "<主題關鍵詞>" --space top

然後 查看前 3 或 4 張 照片再選擇 (使用 ffmpeg 建立聯絡表)。道具需與主題相符:筆電對應 email、系統或網站;相機或產品對應設備;您說話的畫面對應銷售和心態。客戶故事則使用客戶的插圖或頭像 (需獲得許可)。

4. 佈局。 不要與前一張封面相同 (請參閱 pick.py)。將文字放在照片的空白區域 (space),設定 focus 以確保臉部清晰,並設定 y 使文字區塊位於 300 到 1250 之間。

5. 渲染。

OUT="<工作目錄>/covers" node .claude/skills/reel-covers/scripts/render.mjs covers.json
{"covers":[{"id":"3-the-exact-close","img":"<PATH_TO_YOUR_COVER_PHOTOS>/<file>.jpg",
  "data":{"head":"the exact close I use on sales calls","sub":"from a Home Cook","y":560,"headroom":280}}],
 "history":["<封面日誌中最近幾張已發布的封面檔案,最新者優先>"]}

請將 ~ 展開為實際路徑;render.mjs 不會自動展開。非零的結束碼代表有警告,因此在分享前請修正。

6. 自行檢查。 開啟 _proof.png 和 _grid-phone.png:

  • 在網格預覽圖 (130px 寬) 中標題是否可讀?若不可讀,請刪減字數。
  • 在完整封面和網格裁切圖中,臉部是否與文字保持距離?
  • 在網格中與其他封面相比,它是否看起來不同 (照片、佈局、文字位置),但又明顯屬於同一系列?

7. 審核關卡。 向使用者顯示 _grid-phone.png 和 _proof.png,附上每個標題和一個替代標題。詢問:"這些封面能吸引人停下來觀看嗎?" 根據要求更換照片或文字並重新渲染。這只需幾秒鐘。

8. 核准後:

  • 將每個 JPG 檔案複製到 <YOUR_VIDEO_FOLDER>/<Video> YYYY-MM-DD/Covers/,命名方式與 Reels 相同 (例如 3. the exact close.jpg)。
  • 在封面日誌中為每個封面新增一筆記錄: {"date":"YYYY-MM-DD","video":"<影片-代碼>","reel":"3. the exact close","photo":"<檔案>","layout":"stack","hook_type":"how","head":"the exact close I use on sales calls","file":"<Covers 資料夾的絕對路徑>"}
  • 將檔案交給您的排程步驟,由其負責上傳每個封面並將其附加到 Instagram 貼文。

獨特性規則

  • 最近 9 張封面使用過的照片不得重複使用。pick.py 會強制執行此規則。
  • 不得連續兩次使用相同的佈局或鉤子類型。
  • 輪替副標題:不使用、置中對齊,或向右偏移並傾斜 (subdx、subrot)。
  • 根據照片變化文字位置 (上方、中間、靠左或靠右對齊)。不要總是放在頂部置中。
  • 如果照片庫變得匱乏 (最近幾乎用過所有好照片),請提出建議,並提議進行新的拍攝,而不是破壞規則。

佈局要點

  • 9:16 裁切會將臉部位置提高。 大多數照片是 2:3 比例。縮放至高度 1920 時會失去兩側,而非頂部,因此原本看起來位置較低的臉部會落在 y 約 600 到 800 的位置。最常見的錯誤是文字壓在主體的頭髮上。 在檢查任何其他項目之前,請先檢視每張預覽圖中是否有此情況。
  • 使用 headroom 修正,而非縮小文字。 "headroom": 150-350 會將照片向下推,並拉伸主體上方素色牆面的區域。在素色攝影棚牆面上效果不明顯。不要在複雜的戶外背景 (樹木和天空) 上使用。
  • 標題大小: 自動設定:4 個字或以下為 104px,較長則為 84px,最多可縮小至 3 行。
  • 如果副標題會碰到頭部,請刪除它。 它是點綴,而非主要訊息。
  • 放置文字時要考慮 Reels 圖示: 要嘛將文字區塊起始於 y 560 或更低 (使用 headroom 將照片向下推以避開頭部),要嘛保持在高位並使用 align: left, right: 320。在同一批次中混合使用這兩種方式。
  • 3:4 的網格裁切不會隱藏 y 240 以上的任何內容。請確保文字起始於 280 或更低的位置 (render.mjs 會發出警告)。

新增照片

從本機資料夾: 使用 md5 檢查與 photos_dir 比對,避免重複,然後複製為 <name>-<k>__local<MMDD>.jpg,最後加上標籤。

從 Canva (可選)。 Canva 無法直接從上傳資料夾下載圖片。一個可行的途徑是使用一個僅用於匯出的草稿設計:

  1. 對 <YOUR_CANVA_FOLDER_ID> 執行 list-folder-items,並將資產 ID 與 library.json 進行比對 (將 ID 保留在每個檔名中的 __ 之後)。
  2. 使用 open_transaction 對 <YOUR_CANVA_SCRATCH_DESIGN_ID> 執行 read-design,然後針對每張新照片執行一次 edit-design 呼叫,並使用 add_page (2400x3600,標題 = 資產 ID)。讀取新的頁面 ID,然後對每個頁面執行一次 insert_fill 呼叫 (全頁面,top 0, left 0)。最後執行 commit。
  3. 將設計匯出為 PDF,export_quality: pro,然後執行 pdfimages -j -f <第一頁> -l <最後一頁> -p all.pdf ex/img。PDF 會保留原始 JPEG 未經壓縮。也可以使用 JPG 匯出,但每頁只會得到一個 URL。
  4. 將每個檔案儲存為 <名稱>__<assetid>.jpg 到 photos_dir。多張照片可能共用同一個 Canva 名稱,因此 ID 可用於區分它們。然後為它們加上標籤。

如果同一張照片被上傳了兩次,請保留一份設為 ok,並將另一份標記為 "ok": false, "note": "duplicate of N",否則不重複規則可能會選到同一張照片兩次。

在 library.json 中為每個新檔案加上標籤,方法為檢視它:

{"file":"photo_-13.jpg","pose":"smiling at laptop","props":["laptop","desk"],"topics":["email","follow","systems","website"],
 "cap":false,"space":["top"],"focus":"50% 55%","ok":true}

space 是文字可以放置且不會碰到臉部的區域。將模糊、過暗或角度不佳的照片標記為 "ok":false,而不是刪除它們。

相關技能

  • video-reels:開場文字卡,封面標題不得與其重複
  • 排程技能 (可選):上傳封面並排程 Reels

Individual skills in this repo

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

beachyphotoandfilm-arch/video-skills

Sync camera footage to a separate lapel or field-recorder track (e.g. Tascam DR-10L and similar) and lay it up in DaVinci Resolve. Stitches the recorder's split files, finds each clip's exact place in the audio by matching words then waveforms, cuts one lapel slice per clip so every later skill works unchanged, checks for clipping, and builds a synced timeline in a new Resolve project. Trigger on "sync the lapel", "sync my audio", "line up the recorder", "I used a lav", or any shoot with a separate audio folder (live talks, events, workshops). Run it before paper-edit or video-reels.

beachyphotoandfilm-arch/video-skills

Turn raw talking-head footage into an assembled rough cut inside DaVinci Resolve. Pulls the clips off your footage drive, transcribes them locally, removes failed takes, restarts, asides and dead air, then creates a new Resolve project with two paper-edit timelines ready for your fine trim. Trigger on "paper edit", "cut my raw footage", "make a rough cut", "clean up this video", or when the user points at a folder of raw camera files for a YouTube video.

beachyphotoandfilm-arch/video-skills

Render finished reels out of DaVinci Resolve, write captions in the creator's voice, attach a custom Instagram cover from reel-covers, and schedule them to Instagram, TikTok and YouTube Shorts through Metricool. Handles the Drive upload hop, collision checks against the existing calendar, and cleanup. Trigger on "schedule the reels", "post these", "put these on the calendar", or after reels are approved.

beachyphotoandfilm-arch/video-skills

Build animated brand overlays (motion graphics) for a talking-head video, timed to the speaker's exact words, plus a DaVinci Resolve import file. House style is in-scene type (text beside and behind the speaker's head) plus diagrams. Transcribes the rough cut locally, picks the moments, renders transparent .mov clips, and writes an FCPXML that drops every clip onto the timeline already in position. Trigger on "make animations for this video", "add overlays/motion graphics", "animate this", "b-roll graphics for my YouTube video", or when the user shares a rough cut and asks for graphics.

beachyphotoandfilm-arch/video-skills

Cut vertical Instagram reels out of a long-form talking-head video, hook first. Picks the strongest standalone moments from the transcript, opens each reel on its punchiest line, builds vertical timelines in DaVinci Resolve framed on the speaker's face with the LUT applied, and finishes them: a hook (a held text card, or a word-by-word "build" hook with punch-in) and burned-look captions on V3; this-or-that reels get product graphics and a comment-keyword CTA card. You trim and render, nothing to import. Trigger on "make reels", "clip this for Instagram", "cut some verticals", or after a YouTube video is cut.

beachyphotoandfilm-arch/video-skills

Design YouTube thumbnails and titles for a talking-head video. Pulls graded full-res frames out of the raw footage, renders brand-styled variants in two proven layouts, and proofs them at phone size where the click actually gets decided. Trigger on "make thumbnails", "thumbnail for this video", "title and thumbnail", or after a video is cut.

beachyphotoandfilm-arch/video-skills

Run the whole YouTube video pipeline end to end, one stage at a time, stopping for the creator's approval at every gate. Paper edit, punch-ins, reels, reel covers, scheduling the reels, overlays, thumbnail and title, then scheduling the long-form video, all through Metricool. Keeps state per video so you can stop anywhere and pick up later. Trigger on "/youtube", "let's do the whole video", "run the video pipeline", "continue the <name> video", or when handed raw footage for a YouTube video.

相關技能