AGENT SKILL 一日工作坊 · 案例單元

AI 看不懂影片?那就讓它先看一遍

一支一小時的演講影片要變成一篇圖文文章,AI 卻不知道哪一秒是重點。解法很妙:讓 Gemini 先看一遍、標出每個重點落在第幾秒,本地腳本照著時間戳切圖切 gif。

8 頁 · 案例單元 9 步 pipeline · 8 支腳本 素材來源:魁哥 · 倉鼠特報員
這支是魁哥的代表作。它把「讓 AI 讀懂影片」這件不可能的事,拆成 Gemini 負責看、本地 ffmpeg 負責切。多模態分工,今天最值得學的一招。

先看清楚難在哪

一小時的演講,哪一秒才是重點?

文章要配圖,圖得從影片裡截。但 AI 根本不知道該截哪一格。

🙈 它看不到畫面

純文字 AI 只拿得到字幕。講者秀的架構圖、操作示範,字幕裡完全沒有。

⏱️ 它不知道時間

就算知道某段重要,那畫面在第幾秒?沒有時間戳,ffmpeg 切不出來。

🗑️ 截了也是廢圖

隨機截,十之八九是講者說話的臉、或動畫展開一半的殘影。塞滿這種圖等於沒配圖。

核心矛盾:會寫字的 AI 看不到畫面,看得到畫面的工具又不會寫字。這兩件事,得拆開來各做各的。

整套 skill 的靈魂

讓 Gemini 先看一遍,把重點標成時間戳

解法不是硬要一個 AI 全包,而是分工。Gemini 看完回一張清單:每個重點在第幾秒、哪段值得做成 gif。本地腳本照著戳切就好。

👁️ Gemini 負責「看」

把影片送進 Gemini,它回傳結構化 JSON:key_frames(每個重點截圖的 timestamp、重要度、該段在講什麼)+ gif_segments(值得做成動圖的起訖時間)。

"key_frames": [
  { "timestamp": "12:38",
    "importance": "high",
    "description": "封閉迴路架構圖",
    "article_context": "對應..." }
]

✂️ 本地 ffmpeg 負責「切」

拿到 Gemini 給的精確時間戳,直接擷取那一刻的幀,不需要本地再做任何啟發式選幀。Gemini 已經看過了,本地只負責執行。

一句話:Gemini 是眼睛,ffmpeg 是手。眼睛說「12:38 那張」,手就去把 12:38 切下來。
這就是多模態分工的精髓。看影片交給看得到的、切素材交給切得準的,別逼一個工具做它不擅長的事。

從影片到文章的全程

9 步走完,每一步誰負責一目了然

01
環境初始化建本次專屬暫存目錄,所有中繼檔放這
腳本
02
Gemini 視覺分析 → analysis.json核心洞察那步:看影片、標時間戳
腳本
03
素材擷取 → images/ + manifest.json照時間戳切圖切 gif,品質檢查派子代理
腳本+子代理
04
字幕獲取清理 → transcript_clean.txt下字幕、去時間碼、合併破碎短句
主 Agent
05
主題地圖萃取 → notes_theme-map.md抽:問題背景→核心主張→機制→案例→限制
主 Agent
06
草稿撰寫(純文字)→ article_draft.md派子代理寫,先不嵌圖
子代理
07
審校配圖 → article_draft.md(含圖)子代理校對 + 按 manifest 把圖插對位置
子代理
7.5
完整性檢查 → fidelity_check.md對照字幕抓漏,critical 自動補
子代理
08
Final Gate + 預覽 + 交付正規化把關,強制停等使用者確認
主 Agent
看右邊那一欄就懂了:機械的事交腳本、要判斷的事主 Agent 親做、吃 context 的重活派子代理。下三頁各拆一頁。

補一課:skill 裡的腳本

8 支腳本,哪支、在哪步、幹嘛

v2a 要精算、要操作檔案,所以配了腳本。這就是「什麼時候才需要腳本」的標準答案。

video_analyzer.py
送 Gemini 分析影片 Step 02把影片上傳 Gemini File API,回傳 key_frames + gif_segments 的結構化 JSON。整套的核心。
extract_assets.sh
照時間戳切圖切 gif Step 03讀 analysis.json,用 ffmpeg 直接擷取每個時間戳的幀與動態片段(gif ≤ 12 秒)。
create_contact_sheet.py
人物幀校正用的 2×2 拼圖 Step 03把 ±2 秒的 4 張候選幀拼成 A/B/C/D,讓子代理一次 vision 判斷哪張最對。
frame_aligner.py
微對齊,挑最清晰的一幀 Step 03用 Laplacian 變異數+幀差,在小窗口內找最清楚、最定格的幀,避開轉場與動態模糊。
get_transcript.py
字幕三層 fallback Step 04youtube-transcript-api → yt-dlp → 本地 whisper,前者沒拿到才跑後者。
final_gate.py
發布前正規化+阻擋 Step 08簡轉繁、em-dash 轉全形逗號、壓雙逗號;擋連續圖、HTML tag、中英黏連。
prepare_temp_dir.sh
開暫存目錄 Step 01建本次 session 專屬資料夾,含 frames/final 子目錄。
cleanup_temp_dirs.sh
清過期暫存 收尾把超過 TTL 的舊 session 目錄掃掉,不留垃圾。
記一條判準:要精算、操作檔案才寫腳本;純判斷、純講規則的事,用文字寫進 SKILL.md 就好。

三個角色,一個劇本

為什麼寫作要另外派一個子代理?

三種角色,每一刀分工都有原因。最值得學的是「寫作為什麼要外包」。

🔧 腳本

做精確、可重複的事。切第 12:38 秒那一幀、簡轉繁、壓雙逗號。這種事不需要判斷,要的是每次都一模一樣,交給程式最穩。

🧭 主 Agent

做需要判斷的事。抽主題地圖、決定哪些漏掉的細節要補、最後對著你的反饋拍板。它是導演,留著清醒的腦袋掌全局。

🧹 子代理

做又重又髒的活,用完即丟。寫草稿、配圖、校對。跑完只回主 Agent 一段摘要,乾淨的 context 進、乾淨的摘要出。

關鍵在這:transcript 動輒 30k token。主 Agent 自己讀就永久卡在主 context,每次壓縮都重付代價。派子代理讀完寫完只回 200 字摘要,那坨字幕跟著消失。子代理就是保護主 context 的隔離艙。

最值錢的一頁

寫滿「別這麼做」的地方,才是專家經驗

真正值錢的不是流程圖,是這些用血換來的禁令。每一條都是踩坑後寫進去的。

❌ 禁純人物畫面
截到講者說話的臉沒有資訊量。Gemini 分析時就明令只抓投影片、圖表、操作畫面。
❌ 禁連續兩張圖
兩張圖之間一定要有一段實質文字。連著貼等於把文章變相簿。
❌ 講者影像最多 1 張
整篇只准放一張講者照,用在介紹講者那段。多了就只挑最清楚的一張,其餘全跳過。
❌ cover 別被截圖覆蓋
封面要用 YouTube 官方縮圖。子代理常手癢換成內文截圖,發布前主 Agent 要檢查救回。
❌ 別用 ps aux 輪詢腳本
analyzer 在跑時別反覆查狀態。ps aux | grep gemini 一個指令就吃掉 12,000 token,耐心等 timeout 就好。
這就是「隱性知識」。流程誰都抄得到,但「在這一步千萬別這樣」只有真的跑壞過的人才寫得出來。

收束:把關與串接

最後一關,不過就不准發

🚦 final_gate 自動正規化

發布前 final_gate.py 先做機械正規化,再硬擋。確定性的事不靠人盯。

自動修:em-dash → 全形逗號、簡轉繁(OpenCC s2tw)、壓掉雙逗號。
硬擋:連續圖片、HTML tag、dash 殘留、中英黏連。不過這關,禁止發布。

🔗 fidelity 對照字幕

Step 7.5 拿三類元素去字幕裡逐一比對,確認文章沒漏掉真正重要的東西。

三類元素:數字(金額/百分比)、反直覺金句(「不是 X 而是 Y」)、具名故事(人名+動詞+結果)。漏了 critical 自動補回。
🔗 串接寫作方法論:Step 06/07 的子代理會自動載入 hamster-writing-craft,套上 Opening Hook、認知階梯、結尾框架。v2a 只把影片變素材,寫成好文章交給專門的 skill。skill 串 skill,各自單一職責。
素材來源:v2a 影片轉文章 pipeline,魁哥為「倉鼠特報員」打造的代表作。本單元為教學用途整理,腳本與防漂移細節均取自真實 SKILL.md。