Communitygithub.com

MBehtemam/montagent-skills

編輯 Montagent 中的真實影片:談話人物與訪談、綠幕去背、字幕與逐字標記、下方第三條與姓名條、子母畫面,以及音量自動閃避以配合語音。適用於從錄製素材開始的 Montagent 影片專案。

montagent-skills 是什麼?

此技能專為 Montagent 影片編輯工具設計,提供一系列針對錄製素材(如談話人物、主持人片段或訪談剪輯)的實用食譜。它整合在 Montagent 的建置迴圈中,涵蓋從綠幕去背、逐字標記的字幕生成,到姓名條與子母畫面的完整流程。技能強調以語音時間碼為核心,透過內建腳本自動化字詞時間軸檢查、音量閃避與字幕生成,減少手動調整。支援 Claude Code、Cursor、Codex 等 AI 代理平台,讓開發者能快速生成高品質的影片編輯命令,提升專業影片製作效率。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MBehtemam/montagent-skills/tree/HEAD/skills/montagent-footage

在你喜歡的 AI 中提問

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

說明文件

編輯錄製影片

基於錄製素材的食譜。它們會插入到 montagent 的建置步驟迴圈中;如果尚未載入,請先載入 montagent。對於談話人物、主持人片段或訪談剪輯,請在規劃前開啟談話人物結構。

從素材開始

在編寫任何元素之前,請對每個剪輯進行 probe:其尺寸、幀率、長度以及是否有音訊。然後根據語音規劃片段。語音中的字詞時間碼是每個字幕、提示和音量閃避所依賴的時鐘,因此首先要檢查時間碼(請參閱字幕)。

若要從長剪輯中選擇一個時刻(例如,要在插入畫面中顯示的螢幕錄製片段),請將該剪輯單獨放入一個草稿專案中,並呼叫 frame --from 0 --to <其長度> --infill-ceiling <毫秒>,將上限設為長度的二十分之一。一次呼叫會每隔幾秒給出一個標記的預覽圖;在任何您想更近看的預覽圖上使用 frame --at。

食譜

每個食譜給出的都是起始範圍,而非最終答案。每個都以一個檢視步驟結束:載入 montagent-craft,然後按照步驟說明的位置進行檢視,再繼續下一步。

放置素材

{
  "frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#FF5A36", "duration": 6000, "output": "out/presenter.mp4",
  "tracks": [
    {"name": "presenter", "layer": 10, "elements": [
      {"id": "presenter", "type": "video", "start": 0, "end": 6000, "source": "media/clip.mp4", "source_start": 0, "source_end": 6000, "x": 540, "y": 2160, "origin": "bottom-center", "width": 3413, "height": 1920, "fit": "cover", "effects": [{"name": "chroma", "color": "#00FF00", "tolerance": 0.2, "softness": 0.08, "spill": 0.9}]}
    ]}
  ]
}
  • **將寬素材放入高畫框:**使元素與畫框一樣高,並根據來源畫面比例決定寬度(對於 16:9,高度 1920 時寬度為 3413),然後橫向滑動以保持演講者居中。
  • **眼睛:**位於畫框自上而下 25–35% 的位置。將元素的 bottom-center 降低到畫框底部邊緣以下以達到該位置;裁切掉腿部是正常的。
  • **頭頂空間:**頭髮上方留出畫框高度的 4–8%。
  • 比片段短的鏡頭: "overrun": "hold" 會凍結其最後一幀。保持凍結時間少於半秒,否則提前結束片段。
  • **剪輯內的凍結幀、速度變化或倒放:**使用 source_time 代替 source_start 和 source_end:一個字面值會凍結某個時刻,而將來源毫秒鍵映射到時間軸 t 則會產生速度變化(平坦的一對會凍結,下降的一對會倒放)。對於慢動作(speed < 1.0)或速度變化(source_time)的剪輯,設置 "frame_blend": "mix" 以在連續的來源幀之間進行交叉溶解,而不是在最近的幀之間切換("none")。若要對素材產生定格動畫效果,請使用階梯狀的 source_time 關鍵幀,在連續的時間軸幀上保持每個目標來源時間戳記。帶有 source_time 的剪輯在 volume 為 0 時是無聲的,因此將其聲音放在單獨的 audio 元素上。
  • **鏡頭自帶的聲音:**語音保持在 volume 1.0。其他所有聲音都在其下方混合。
  • **檢視:**在開始、中間和最後繪製的幀上使用 frame,檢查眼睛是否位於範圍內,並且畫框兩側沒有重要內容被裁切。

綠幕去背

在素材元素上使用 chroma 進行去背。從這裡開始:

  • color: 純色的螢幕顏色,綠色螢幕為 #00FF00。在這些容差下,略微偏藍或偏黃的螢幕也能同樣進行去背,因此您無需進行取樣。
  • tolerance: 0.2(範圍 0.18–0.25)。高於約 0.3 時,去背會吃掉黑色頭髮、白色衣領和深色衣物。
  • softness: 0.08(範圍 0.05–0.1)。
  • spill: 0.9(範圍 0.9–1.0)。

在疊加任何其他內容之前先進行檢查:

  1. 三個無損裁切。 在頭髮、肩膀或衣袖邊緣以及手部的位置,對著您將交付的背景,使用 frame --crop <x,y,w,h> --png。裁切會以真實比例返回,因此 200–400 像素的框就足夠了。
  2. 已經完成了? 頭髮、衣領和手部邊緣結實,最多只有 1–2 像素的深色、橄欖色或棕褐色線條:去背已完成,繼續下一步。那條線是邊緣下限:從 0.12 到 0.3 的每個設置都會留下它,並且 spill 已將其從綠色變為棕褐色,因此對它的綠色像素計數讀數為零。
  3. 否則,每個瑕疵一個修正。 背景透過頭髮、衣領或深色衣物顯現:將 tolerance 降低 0.05。比邊緣下限更寬的蒼白或綠色光暈:將 tolerance 提高 0.03,或將 softness 提高 0.03。再次裁切並返回步驟 2。最多三個設置,全部在同一個去背元素上:按區域分割的去背副本會成倍增加渲染時間,並且仍然會留下接縫。
  4. 漂移。 對去背元素進行 measure。其不透明比例應在整個鏡頭中保持在一兩個百分點以內。出現階梯變化表示該處的照明發生了變化:在階梯變化前後使用關鍵幀調整 tolerance,或者在該幀處剪切元素並分別對每個部分進行去背。
  • 檢視: 在演講者移動最多的兩個時刻,對整個畫面使用 frame,並檢查輪廓是否保持穩定。

字幕 逐字高亮

字幕來自提供的字詞時間碼,透過內建腳本生成,非手動操作。python3 scripts/captions.py <project> <words> <spec>(使用 --help 查看規格)會檢查時間碼,使用 measure 將字詞分成一行或兩行的頁面,為每個字詞在其被朗讀時提供一個 highlight 窗口,並列印添加了字幕的專案。它會在 stderr 上報告每個修復。閱讀該報告:這就是時間碼檢查。

  • **它檢查的內容:**在語音恢復後才開始一個短語的字詞(典型的例子是提供的 "Now" 晚了 110 毫秒且長了 20 毫秒)、位於靜音內的字詞、重疊的字詞以及太短而無法看到的字詞。短字詞會被延長到 min_word(150 毫秒):延長到後面的停頓中,然後再從下一個字詞中借用。報告在靜音內的字詞表示該處的文件未對齊:修復文件,然後重新執行。
  • 大小: 在 1080 寬的畫框上為 56–72 像素,粗體,一行使用一種淺色,正在朗讀的字詞使用品牌的強調色。
  • 行數: 最多兩行,width 約為畫框寬度的 80%。頁面在句子結尾或停頓 400 毫秒或更長時斷開。
  • 背景: 使用最深的品牌色,透明度為 80–85%(CC–D9)的 pill,可以在任何素材上清晰閱讀。pad 上下左右各 28–36 像素,內部上下 14–20 像素,radius 20–28。
  • 位置: 在下巴下方,避開高畫框底部 15–20% 的區域(播放器會在此處顯示控制項)。在 1080×1920 的畫面上,居中位置大約在 y 1350–1450。在寬畫框上,將其居中於距離底部 10–14% 的位置。
  • 頁面 保持顯示直到下一頁開始,或者在較長停頓後,保持到其最後一個字詞之後的 1 秒。

它會寫入實際的字幕,因此請根據 validate 對它們提出的字幕發現採取行動。

  • 檢視: 在一頁上使用 frame --from --to:每個點亮單詞都是其自己的預覽圖。檢查每個預覽圖是否恰好點亮一個字詞,順序正確,並且框體避開了臉部。然後在最長停頓後的第一幀使用 frame --at,檢查新頁面是否已顯示,並且沒有內容被提前點亮。

素材上的姓名條

一個下方第三條從邊緣划入划出。素材不是純色,因此 montagent-motion 中的遮擋划入不能用於揭示條本身。取而代之的是,條從其邊緣開始增長,其文字則由一個與條同色的遮擋板揭示,該顏色是純色的。

{
  "frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 7000, "output": "out/namebar.mp4",
  "fonts": {"bold": [{"file": "fonts/Inter-Bold.ttf"}]},
  "fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
  "tracks": [
    {"name": "bar", "layer": 20, "elements": [
      {"id": "bar", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 760, "height": 160, "fill": "#101418", "radius": 8, "scale": [{"t": 1000, "v": [0.0, 1.0]}, {"t": 1300, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}, {"t": 6266, "v": [1.0, 1.0], "ease": "linear"}, {"t": 6533, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
    ]},
    {"name": "bar-edge", "layer": 21, "elements": [
      {"id": "bar-edge", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 12, "height": 160, "fill": "#FF5A36"}
    ]},
    {"name": "bar-name", "layer": 22, "elements": [
      {"id": "bar-name", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1128, "origin": "center-left", "width": 400, "height": 70, "font": "bold", "size": 58, "color": "#F5F0E6", "runs": [{"text": "Montagent"}], "caption": false}
    ]},
    {"name": "bar-line", "layer": 22, "elements": [
      {"id": "bar-line", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1196, "origin": "center-left", "width": 560, "height": 44, "font": "bold", "size": 34, "color": "#F5F0E6", "runs": [{"text": "Video your agent can read"}], "caption": false}
    ]},
    {"name": "bar-cover", "layer": 23, "elements": [
      {"id": "bar-cover-on", "type": "rect", "start": 1300, "end": 1700, "x": 800, "y": 1160, "origin": "center-right", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 1300, "v": [1.0, 1.0]}, {"t": 1666, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]},
      {"id": "bar-cover-off", "type": "rect", "start": 6000, "end": 6266, "x": 84, "y": 1160, "origin": "center-left", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 6000, "v": [0.0, 1.0]}, {"t": 6233, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
    ]}
  ]
}
  • **划入:**條從左邊緣在 250–350 毫秒內增長,使用 [0.65, 0, 0.35, 1]。文字及其遮擋板在條完全展開的那一幀開始(絕不能更早,否則遮擋板會在素材上顯示)。遮擋板從其遠端在 300–400 毫秒內縮小,按閱讀順序揭示文字。
  • 划出, 在其提示信號時開始:遮擋板在 200–300 毫秒內重新遮蓋文字,然後條在 250–300 毫秒內縮回到其邊緣。整個條在提示信號後 450–600 毫秒內完全消失。
  • 大小: 在 1080 寬的畫框上,條高 130–180 像素,名字字體 52–64 像素,第二行字體 30–38 像素。在前緣有一條 8–16 像素寬的強調色條。
  • 遮擋板: 完全使用條的 fill 顏色,位於條的兩端內部 20 像素,上下邊緣內部 10 像素,位於文字之上。
  • 位置: 距離畫框側邊 48–80 像素,避開字幕框和演講者的臉部,通常在高畫框高度的 55–65% 處。
  • 檢視: 從每個提示信號開始的 1 秒內使用 frame --from --to --keyframes,並檢查在任何預覽圖上都沒有遮擋板顯示在條之外。在條靜止時使用 frame --at,檢查其左邊緣是否與字幕框的邊距對齊。

圓形子母畫面

在圓形中顯示第二個剪輯:一個帶有圓形 mask 的影片元素,其後有一個環,並使用 overshoot 貝茲曲線進行彈出動畫。

{
  "frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 6000, "output": "out/pip.mp4",
  "tracks": [
    {"name": "pip-ring", "layer": 30, "elements": [
      {"id": "pip-ring", "type": "ellipse", "start": 1000, "end": 5500, "x": 800, "y": 900, "origin": "center", "width": 384, "height": 384, "fill": "#F5F0E6", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "shadow", "dx": 0, "dy": 16, "radius": 40, "color": "#101418", "opacity": 0.35}]}
    ]},
    {"name": "pip", "layer": 31, "elements": [
      {"id": "pip", "type": "video", "start": 1000, "end": 5500, "source": "media/clip.mp4", "source_start": 10000, "source_end": 14500, "volume": 0, "x": 800, "y": 900, "origin": "center", "width": 640, "height": 360, "fit": "contain", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "mask", "shape": "circle", "x": 140, "y": 0, "width": 360, "height": 360}]}
    ]}
  ]
}
  • **圓形的矩形區域:**一個與元素等高的正方形。其 x 決定顯示圖片的哪個部分。中心點是 (width - height) / 2,這是應該使用的值:彈出動畫會圍繞元素的 origin 進行縮放,因此偏離中心的圓在增長時會橫向漂移。若要顯示圖片的另一部分,請選擇一個 source_start,使該部分位於中間,或者使元素更大並設置其 x,使所需部分落在圓內,然後在彈出曲線上對 x 進行關鍵幀設置,以便圓的中心保持靜止。
  • 大小: 寬度為畫框寬度的 30–40%。環比圓寬 12–24 像素,使用背景中最淺的顏色,並帶有柔和的 shadow。
  • 彈出動畫: 兩者均在 350–450 毫秒內,使用 [0.34, 1.56, 0.64, 1],從 0 刻度開始,在相同關鍵幀上。退出在 200–300 毫秒內,使用 ease-in,回到 0。
  • 時間點: 在演講者首次提到它所顯示的內容時進入,在結束前一個節拍退出,以便關閉乾淨利落。
  • 位置: 在演講者旁邊,胸部高度,避開臉部和字幕框,距離畫框邊緣 40 像素或更多。
  • 聲音: volume 為 0,除非剪輯本身自帶聲音是重點。
  • 檢視: 在彈出動畫峰值時(開始後加上其持續時間的 40%)使用 frame,檢查圓是否避開了臉部和畫框邊緣。在靜止時使用 frame,檢查相關部分是否在圓內。

語音下的背景音樂

音樂在語音說話時閃避,在停頓時恢復音量。scripts/duck.py 會根據語音的字詞時間碼(使用 --words,一個 JSON 文件,格式為...

Individual skills in this repo

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

相關技能