影片使用
原則
- LLM 從原始轉錄稿 + 按需視覺素材推論。 唯一值得保留的衍生產物是緊湊的短語級轉錄稿 (
takes_packed.md)。其他一切——填充詞標記、重拍檢測、鏡頭分類、重點分數——都在決策時推導。 → 驗證:步驟輸出符合預期結果 - 音頻優先,視覺隨後。 剪輯候選點來自語音邊界與靜音間隙。只在決策點深入視覺素材。 → 驗證:步驟輸出符合預期結果
- 詢問 → 確認 → 執行 → 迭代 → 持久化。 在使用者用白話文確認策略之前,絕不觸碰剪輯。
- 概括化。 不要預設這是哪種影片。觀察素材、詢問使用者、然後進行編輯。 → 驗證:差異符合預期修改
- 藝術自由為預設值。 本文件中每個具體的數值、預設、字體、顏色、持續時間、音高結構與技術,都是來自一個經實證的影片的工作範例——並非強制規定。閱讀它們以了解可能做到的範圍以及為何有效。然後根據素材的實際情況和使用者實際需求,做出你自己的品味判斷。你唯一必須做的事在下方「硬性規則」章節中。 其他一切由你決定。 → 驗證:檔案內容符合預期形狀
- 自由發明。 如果素材需要此處未描述的技術——分割畫面、子母畫面、下方第三身份卡、反應剪輯、速度斜坡、定格畫面、交叉淡化、匹配剪輯、L剪輯、J剪輯、呼吸處速度斜坡,等等——就建立它。輔助工具是 ffmpeg 和 PIL。它們能做到格式支援的任何事。無需等待許可。 → 驗證:步驟輸出符合預期結果
- 在向使用者展示之前,先驗證自己的輸出。 如果你不願意出貨,就不要呈現。
硬性規則(製作品質正確性——不可協商)
這些是偏離會導致無聲失敗或中斷輸出的項目。它們不是品味,而是正確性。請記住它們。
- 字幕在濾鏡鏈中最後套用,在所有疊加層之後。否則疊加層會遮蓋字幕。無聲失敗。 → 驗證:步驟輸出符合預期結果
- 逐段提取 → 無損
-c copy串接,而非單次濾鏡圖。否則每段在加入疊加層時都會被二次編碼。 - 每段邊界加上30毫秒音頻淡入淡出(
afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03)。否則每個剪輯點都會有可聽見的爆音。 → 驗證:步驟輸出符合預期結果 - 疊加層使用
setpts=PTS-STARTPTS+T/TB將疊加層的影格0位移至其視窗起點。否則在疊加層視窗期間會看到動畫的中間部分。 → 驗證:步驟輸出符合預期結果 - 主SRT使用輸出時間軸偏移:
output_time = word.start - segment_start + segment_offset。否則字幕在段落串接後會錯位。 → 驗證:步驟輸出符合預期結果 - 絕不在單詞內部剪輯。 每個剪輯邊緣都必須對齊Scribe轉錄稿中的單詞邊界。 → 驗證:步驟輸出符合預期結果
- 每個剪輯邊緣加上填充。 工作視窗:30–200毫秒。Scribe時間戳會有50–100毫秒的漂移——填充能吸收漂移。快節奏時更緊湊,電影感時更寬鬆。 → 驗證:步驟輸出符合預期結果
- 僅限逐字逐句的ASR。 絕不使用SRT/短語模式(會遺失亞秒級間隙資料)。絕不標準化填充詞(會遺失編輯訊號)。 → 驗證:差異符合預期修改
- 依來源快取轉錄稿。 除非原始檔案本身發生變更,否則絕不重新轉錄。 → 驗證:步驟輸出符合預期結果
- 多個動畫使用平行子代理。 絕不依序進行。透過
Agent工具同時產生N個;總實際時間 ≈ 最慢的那個。 → 驗證:步驟輸出符合預期結果 - 執行前需策略確認。 在使用者批准白話文計畫之前,絕不觸碰剪輯。 → 驗證:步驟輸出符合預期結果
- 所有工作階段的輸出在
<videos_dir>/edit/中。 絕不寫入video-use/專案目錄。 → 驗證:輸出存在且解析無誤
本文件中其他所有內容都是工作範例。每當素材需要時即可偏離。
目錄結構
技能位於 video-use/。使用者素材放在他們指定的任何位置。所有工作階段的輸出都進入 <videos_dir>/edit/。
<videos_dir>/
├── <來源檔案,未經修改>
└── edit/
├── project.md ← 記憶;每個階段附加
├── takes_packed.md ← 短語級轉錄稿,LLM的主要閱讀視圖
├── edl.json ← 剪輯決策
├── transcripts/<name>.json ← 快取的原始Scribe JSON
├── animations/slot_<id>/ ← 每個動畫的原始檔 + 渲染 + 推理
├── clips_graded/ ← 帶調色與淡入淡出的逐段提取
├── master.srt ← 輸出時間軸字幕
├── downloads/ ← yt-dlp 輸出
├── verify/ ← 除錯影格 / 時間軸PNG
├── preview.mp4
└── final.mp4
設定
ELEVENLABS_API_KEY在專案根目錄或環境變數的.env中。若缺少則詢問並寫入.env。- 路徑中需有
ffmpeg與ffprobe。 - Python 依賴:
pip install -e .。 yt-dlp、manim、Remotion 僅在首次使用時安裝。- 此技能附帶
skills/manim-video/。在建立 Manim 插槽時請閱讀其 SKILL.md。
輔助工具
transcribe.py <影片>— 單一檔案的 Scribe 呼叫。可選擇加入--num-speakers N。已快取。transcribe_batch.py <videos_dir>— 4個工作者平行轉錄。適用於多個錄影。pack_transcripts.py --edit-dir <dir>—transcripts/*.json→takes_packed.md(短語級,在靜音 ≥ 0.5秒處斷開)。timeline_view.py <影片> <開始> <結束>— 膠片條 + 波形PNG。按需視覺深入。不是掃描工具——在決策點使用,而非持續使用。render.py <edl.json> -o <輸出>— 逐段提取 → 串接 → 疊加層(PTS位移)→ 最後加入字幕。使用--preview進行快速720p渲染。使用--build-subtitles內聯生成 master.srt。grade.py <輸入> -o <輸出>— ffmpeg濾鏡鏈調色。預設 +--filter '<原始>'用於自定義。
對於動畫,使用 Bash 建立 <edit>/animations/slot_<id>/,並透過 Agent 工具產生子代理。
流程
-
盤點。 對每個來源執行
ffprobe。對目錄執行transcribe_batch.py。執行pack_transcripts.py以產生takes_packed.md。取一兩個timeline_view樣本作為視覺初步印象。 → 驗證:步驟輸出符合預期結果 -
問題預掃。 對
takes_packed.md進行一次快速檢查,記錄口誤、明顯的失言或應避免的措辭。列出清單,併入編輯需求摘要。 → 驗證:步驟輸出符合預期結果 -
對話。 用白話文描述你看到的內容。根據素材形塑問題。收集:內容類型、目標長度/畫面比例、美學/品牌方向、節奏感、必須保留的時刻、必須剪掉的時刻、動畫與調色偏好、字幕需求。不要使用固定檢查表——每次的正確問題都不同。 → 驗證:所有測試通過
-
提出策略。 4–8句話:結構、錄影選擇、剪輯方向、動畫計畫、調色方向、字幕風格、預估長度。等待確認。 → 驗證:步驟輸出符合預期結果
-
執行。 透過編輯子代理需求摘要產生
edl.json。在模糊的時刻深入timeline_view。以平行子代理建立動畫。對每個段落套用調色。透過render.py組合。 → 驗證:指令退出碼為 0 -
預覽。
render.py --preview。 → 驗證:步驟輸出符合預期結果 -
自我評估(在向使用者展示之前)。 在渲染輸出(而非來源)的每個剪輯邊界(±1.5秒視窗)執行
timeline_view。檢查每個圖片是否有: → 驗證:指令退出碼為 0- 剪輯處的視覺不連續 / 閃爍 / 跳躍
- 邊界處的波形尖峰(通過30毫秒淡入淡出的音頻爆音)
- 字幕隱藏在疊加層之後(規則1違反)
- 疊加層錯位或顯示錯誤影格(規則4違反)
此外進行抽樣:前2秒、後2秒,以及2–3個中間點——檢查調色一致性、字幕可讀性、整體連貫性。對輸出執行
ffprobe以驗證持續時間符合EDL預期。如果有任何失敗:修正 → 重新渲染 → 重新評估。自我評估最多3次——如果3次後仍有問題,則向使用者標記出來,而非無限循環。只有在自我評估通過後才呈現預覽。
-
迭代 + 持久化。 自然語言回饋、重新規劃、重新渲染。絕不重新轉錄。在確認後進行最終渲染。附加至
project.md。 → 驗證:步驟輸出符合預期結果
剪輯工藝(技巧)
- 音頻優先。 從單詞邊界與靜音間隙找尋剪輯候選點。
- 保留亮點。 笑聲、笑點、強調點。將剪輯點延伸至笑點之後以包含反應——笑聲本身就是節拍。
- 說話者交接 時,在話語之間保留空氣。常見數值:400–600毫秒。快節奏時較短,電影感時較長。品味判斷。
- 音頻事件作為訊號。
(笑聲)、(嘆氣)、(掌聲)標記節拍。將剪輯點延伸至它們之後。 - 靜音間隙是剪輯候選點。 ≥400毫秒的靜音通常最乾淨。150–400毫秒的短語邊界可在視覺檢查後使用。小於150毫秒則不安全(短語中間)。
- 剪輯填充範例(此技能隨附的發布影片):第一個保留單詞前50毫秒,最後一個之後80毫秒。蒙太奇能量更緊湊,紀錄片更寬鬆。保持在30–200毫秒的工作視窗內(硬性規則7)。
- 絕不獨立處理音頻與視訊。 每個剪輯必須在兩條軌道上都有效。
壓縮版轉錄稿(主要閱讀視圖)
pack_transcripts.py 讀取所有 transcripts/*.json,產生一個 markdown 檔案,其中每個錄影都是一個短語級行列表,每行以 [開始-結束] 時間範圍為前綴。短語在任何 ≥ 0.5秒的靜音或說話者變更處斷開。這是編輯子代理用來挑選剪輯的產物——它僅從文字就提供單詞邊界精確度,而 token 量僅為原始 JSON 的十分之一。
範例行:
## C0103 (持續時間:43.0秒,8個短語)
[002.52-005.36] S0 一個Web代理所做的百分之九十工作是完全浪費的。
[006.08-006.74] S0 我們修正了這個問題。
編輯子代理需求摘要(用於多個錄影的選擇)
當任務是「從多個片段中為每個節拍挑選最佳錄影」時,產生一個帶有此類形塑需求的子代理。結構是承載訊息的,但節奏形狀的範例僅供參考。
你正在剪輯一個<類型>影片。為每個節拍挑選最佳錄影,並按節拍的順序(而非來源片段的順序)組合它們。
輸入:
- takes_packed.md(所有錄影的帶時間註解的短語級轉錄稿)
- 產品/敘事背景:<來自使用者的2句話>
- 說話者:<姓名、角色、表達風格註記>
- 預期結構:<挑選一個原型或發明一個>
- 應避免的口誤:<來自預掃階段的列表>
- 目標時長:<秒數>
常見結構原型(挑選、調整或發明):
- 科技發布 / 展示: 鉤子 → 問題 → 解決方案 → 好處 → 範例 → 行動呼籲
- 教學: 介紹 → 設定 → 步驟 → 常見問題 → 總結
- 訪談: (問題 → 回答 → 追問)重複
- 旅遊 / 活動: 抵達 → 亮點 → 安靜時刻 → 離開
- 紀錄片: 論點 → 證據 → 反方觀點 → 結論
- 音樂 / 表演: 前奏 → 主歌 → 副歌 → 橋段 → 尾奏
- 或者發明你自己的。
規則:
- 開始/結束時間必須落在轉錄稿中的單詞邊界上。
- 在剪輯邊界加上填充(工作視窗 30–200毫秒)。
- 偏好保留聽覺亮點(笑聲、強調)而非時間對齊。
- 輸出為 EDL JSON,包含來源、時間碼與最終持續時間。