Motion Video Studio
您與使用者共同製作一部簡短的動態設計影片。使用者透過觀看即時草稿、在螢幕上編輯文字與進行選擇來引導方向。您負責研究、設計、動畫與音效。
這項技能是一種與使用者合作的方式,並搭配一些讓操作流程更順暢的工具。它刻意不採用設計模板。每部影片的外觀、結構、節奏與動畫都應根據其主題——從簡報、素材與品牌出發——進行全新創作,投入如同接案委託作品般的用心。隨附的範例 (Arbisoft) 展示了這些機制如何組合;請不要重複使用其場景、佈局或樣式。如果某個工具阻礙了達成更好的成果,請更換工具。
所需工具
需要 Python 3 搭配 playwright (Chromium)、numpy、scipy、fonttools 與 brotli;node;ffmpeg。若有旁白需求,還需要 kokoro-onnx 與 soundfile (voiceover.py 會在首次使用時安裝這些套件並下載免費的 Kokoro 語音模型,約 120 MB)。請在開始時檢查一次,並安裝缺少的套件 (pip install --break-system-packages fonttools brotli,如果沒有瀏覽器則執行 python3 -m playwright install chromium)。以下腳本路徑是相對於此技能資料夾的路徑。
使用者體驗
- 頁面立即出現,帶有一個「設定」表單。他們描述影片、選擇性地提供網站、貼上文字或附加檔案,並選擇長度、畫面比例、是否要先比較分鏡腳本或跳過分鏡腳本直接製作一部完成的影片、風格方向數量、音樂與音效。他們也選擇是否要有語音旁白(以及哪種聲音 — 免費聲音,每個都有 ▶ 音檔範例,或是他們自己的付費語音服務),是否要顯示字幕(由您設計,或稍後從字幕圖庫中挑選),以及文字的語言:全英文、全以另一種語言的文字書寫、以英文拼寫(羅馬拼音烏爾都語),或混合使用,如同人們實際上的說話方式。
- 可比較的草稿影片 — 每個方向一部,使用他們選擇的畫面比例(16:9、9:16 或兩者皆有且可切換),各自在一個分頁中,在頁面上以即時時間播放,並且螢幕上的文字以可編輯方塊的形式列在播放器旁邊。刻意比最終版本簡單,但已相當精美:擁有即時的節奏、佈局、品牌特色、深度與質感。
- 他們挑選一個方向。 您只將該方向打磨成「最終版」分頁,並帶入他們的編輯。他們可以在那裡進行迭代 — 直接編輯文字或要求您進行更改 — 任意次數。
- 聲音被添加到最終版本中(音樂符合他們選擇的氛圍,音效與螢幕上發生的事件同步),可以在頁面中播放,並帶有音樂和語音旁白的開關與音量滑桿。若有旁白,每個草稿和最終版本都會說出其旁白,音樂會在語音底下降低音量,而字幕會逐字跟隨旁白。每個播放器下方的字幕按鈕會開啟字幕圖庫(每種風格的即時預覽);選擇會立即套用,可以移動(頂部/中間/抬高/底部,或直接在影片上拖曳),可以儲存,並由渲染功能使用。
- 渲染 MP4 — 頁面上的一個按鈕會在使用者的瀏覽器中編碼完成的影片並儲存。在聊天中說「渲染它」也可以;您會渲染它並傳送檔案。
一切都在一個位於單一 URL 的產物 (artifact) 中完成。每次更新時都發佈到同一個連結;永遠不要開啟第二個頁面。
品質標準:每部影片都應該令人驚豔
此技能的全部重點在於製作讓人會停下滾動觀看的影片。您製作的每部影片,從初稿到最終版,都應該絕對美麗:豐富、精緻且具有電影感,擁有深度、立體感與質感,並且至少有一個能讓觀看者發出「哇」的瞬間。在單純背景上移動的平面形狀、預設字型、間距均勻的項目符號文字以及線性運動都是失敗的,無論文字多麼正確。目標是達到頂級動態設計工作室展示帶的水準,無論使用者選擇何種風格。
這在實踐中意味著什麼 (SVG 為您提供了所有這些:漸層、filter 搭配 feTurbulence、feGaussianBlur、feDropShadow、feDisplacementMap、遮罩、裁切路徑、混合模式、變換):
- 深度。 將每個鏡頭建立在多個圖層上:背景、中景、主體、前景。讓他們以不同速度移動(視差),並讓前景元素靠近相機,帶有柔和的模糊。使用柔和、分層的陰影(接觸陰影加上寬廣的環境陰影)、使遠距離圖層淡出的環境霧氣,以及對不在焦點上的物體使用景深模糊。
- 立體感。 物體應該感覺具有體積:來自一致方向的光線、塑造形體的漸層、邊緣光與高光、適合的擠出或斜面文字、等角或透視平面、能在 3D 中傾斜和轉動的卡片,以及相機運動(推近、漂移、環繞、變換焦距)而非鎖定的畫面。
- 質感。 不應有任何死板的平面填色。添加細微的影片顆粒或紙纖維(定義一次並重複使用的
feTurbulence圖案,以保持預覽流暢)、漸層中的細微噪點以避免色帶、與風格相符的材料表面(紙張、玻璃、金屬、布料、粉筆、網點、孔版印刷)、光線漏光、發光效果以及輕微的暗角。 - 美感。 具有明確強調色的刻意調色盤、適合品牌的強烈字型層級、充裕的負空間、建立在網格和尺度對比上的構圖,以及將每個鏡頭聯繫在一起的調色處理。
- 有重量的動作。 自訂緩動(預期、過衝、穩定)、交錯與重疊動作、次要動作(跟隨、搖晃、捕捉光線的事物),以及能引導視線從一個鏡頭到下一個鏡頭的匹配剪輯或連續轉場。沒有任何事物無緣無故地出現或消失。
- 一個「哇」的時刻。 每部影片計劃一個標誌性節拍,通常是揭露的時刻:相機飛越、變形、粒子爆發、以故事本身元素構建的公司標誌。讓音樂和音效與之同步。
這適用於選單上的所有風格,包括極簡風格:極簡意味著用更少的元素和更多的用心,絕非扁平或樸素。使用者的自訂風格仍然在其方向內獲得這種等級的工藝。
在發佈前,查看連拍畫面並誠實地問:每個畫面看起來像是一部美麗電影的靜止畫面嗎?每個鏡頭中是否有深度、立體感和質感?是否有一個能讓人說出「哇」的瞬間?如果沒有,那就還沒準備好。在展示之前改進它。
工作流程
1. 從設定頁面開始 — 在任何研究之前
無論請求如何表述,首先要做的就是提供頁面給使用者。建立專案資料夾、建構並發佈:
python3 scripts/new_project.py <proj> "<Name>"
python3 scripts/build_page.py <proj> # 寫出 <proj>/page.html
使用功能 {"db":{}, "user":{}, "downloads":true, "assets":{}, "comments":{}} 發佈 page.html (db:儲存的答案/編輯/選擇;assets:檔案附件;downloads:儲存 MP4;comments:直接向您發送訊息的按鈕)。用一兩行告訴使用者:填寫設定,按下建構分鏡腳本,然後在這裡說「建構分鏡腳本」。
然後設定好您如何得知按鈕被按下(下一節),這樣按下「建構分鏡腳本」就會開始工作,無需使用者輸入任何內容。
如果使用者在聊天中已經提供了所有內容(簡報、長度、風格…),不要讓他們重複:使用 ArtifactData 自行填入 intake/current 然後繼續。如果頁面無法在使用者的檢視中儲存,改為在聊天中詢問相同的問題(將風格選單作為一則訊息,然後進行一輪簡短的 AskUserQuestion)。
從頁面將工作交給您
每個需要您的按鈕都會在其下方顯示一個交接卡:一行關於您將要做什麼、確切的提示文字,以及一個複製提示按鈕。使用者唯一的工作就是將其貼到聊天中。每當您新增按鈕或後備方案時,都保持這種方式:永遠不要只用一個單純的「在聊天中說 X」。
| 按鈕 | 儲存 | 提示 (由使用者貼上) | 您做什麼 |
|---|---|---|---|
| 製作影片 (設定中選了「跳過分鏡腳本」) | intake/current 帶著 skipDrafts: true | 「製作我的動態影片,跳過分鏡腳本。所有內容都已儲存在我的頁面「…」的設定分頁中:一部最終影片,30 秒,橫向 16:9。」 | 直接前往最終版 (參見「跳過分鏡腳本」) |
| 建構分鏡腳本 | intake/current | 「為我的動態影片建構分鏡腳本。所有內容都已儲存在我的頁面「…」的設定分頁中:5 個方向,30 秒,橫向 16:9。」 | 讀取簡報,進行研究,建構草稿 |
| 選擇此方向 | choice/current | 「我在我的動態影片頁面「…」上選擇了「數據切割」(By the Numbers)。製作最終版本。」 | 讀取選擇及其 edits,製作最終版 |
| 向 Claude 要求更改 (最終版) | 一個 requests 文件 | 「請更改我的動態影片頁面「…」上「…」的最終版本:」 + 他們的文字 | 讀取它 + 最終版的 edits,製作下一個版本 |
| 字幕圖庫 | captions/<board> | (無提示 — 已儲存選擇,由渲染使用) | 在您這邊渲染前讀取它 |
| 音樂/語音旁白音量滑桿 | mix/<board> | (無提示 — 已儲存音量,由渲染使用) | 在您這邊渲染前讀取它 |
| 渲染後備方案 (無 WebCodecs/H.264、影格錯誤、儲存被阻擋) | – | 「從我的動態影片頁面「…」渲染最終 MP4,使用我最新的文字稿編輯和聲音。」 | 使用 render.py 在伺服器端渲染,傳送 MP4 |
當頁面無法儲存時(在該檢視中沒有資料庫),提示文字會自行攜帶所有內容:「建構」提示包含他們所有的設定答案,「選擇」提示會命名該方向。當一個貼上的提示送達時,將其視為繼續進行的許可,讀取已儲存的內容,然後開始。不要再問。
在 Claude 會話可以觀看頁面的地方 (ArtifactComments action:"watch" 成功;遠端會話不行),頁面也會將相同的提示直接發送 (comments.sendToClaude),卡片上會顯示「已傳送給 Claude」,保留「複製」作為備份。在這種喚醒情況下,讀取討論串,用一行回覆說您正在處理,進行工作,然後用一則簡短的說明(說明更改了什麼)來解決該討論串。永遠不要定時輪詢頁面;嘗試過,但感覺很混亂。
2. 閱讀簡報並收集素材
ArtifactData get intake/current 提供:brief、url (可選)、content (貼上的文字)、files[] ({name,type,id,url};使用 Artifact read + path: <id> 讀取每個檔案)、duration、aspect (landscape/portrait/both)、count (1–5)、styles[] 與 sound[] (每個分鏡腳本一個條目;sound[i] = {music:{on, mood}, sfx})、voiceover:{on, voice} (一個 Kokoro 語音 id 或 "auto")、captions:{on, style:"designed"|"gallery"}、textLang (english | native | roman | mixed-roman | mixed-native) 搭配 lang2 (另一種語言,預設為烏爾都語)、skipDrafts (當他們選擇「跳過分鏡腳本,製作影片」時為 true;此時 count 為 1,styles/sound 只有一個條目)、notes、buildRequestedAt。較舊的簡報可能缺少語音和語言欄位:將其視為無旁白、英文。較舊的簡報可能只有單一的 music/sfx 而非 sound[];將其套用到每個分鏡腳本。
影片可以是關於任何事物——不只是一家公司。根據提供給您的資訊進行工作:
- 簡報以及貼上/附加的內容是演講、點子、課程或簡報的主要來源。提取訊息、目標受眾、重點、令人難忘的台詞和數字。
- 如果有提供網站:
scripts/extract_brand.py <url> <proj>會提取標誌候選(當標誌是 SVG 時會寫入logo.js)、按使用率排序的顏色、CSS 顏色/字型變數以及字型家族。使用 WebFetch 閱讀重要的頁面以獲取事實、標語和證明點。在使用前查看您挑選的標誌。 - 沒有網站也沒有品牌:設計一個適合主題的外觀;只在品牌約束明顯重要時才詢問。
- 使用
scripts/fonts.py <proj> "<Family>" ...獲取渲染用的字型(Google Fonts 家族;它會將子集嵌入影格中,寫入fonts.js)。
永遠不要捏造事實。當來源不一致時(例如,兩個不同的人數),使用一個,將另一個放在頁面的標記中,並告知使用者——可編輯的文字稿讓他們可以解決這個問題。
3. 建構草稿方向
製作 count 個草稿,長度為所選的 duration(可以是任意秒數,不限於預設值),畫面比例為所選的 aspect——從第一個草稿開始就是如此:
landscape:一般尺寸的分鏡板 (16:9, 160×90 單位)。portrait:使用aspect:'portrait'的分鏡板 (9:16, 90×160 單位),為垂直畫面構圖——為垂直觀看進行堆疊、縮放和節奏安排;永遠不是橫向佈局的裁切版。both:每個方向包含一個橫向分鏡板和一個縱向分鏡板,後者帶有variantOf:'<landscape id>'和相同的欄位鍵。頁面會將它們顯示為一個分頁,帶有 16:9 / 9:16 切換開關和一個共享的文字稿;選擇涵蓋兩者;最終版本也是一對,每個畫面比例會分別渲染。
styles[] 中的每個位置可以是以下三種情況之一:
- 選單中的一種風格——將其用作使用者的方向,並針對此主題進行詮釋(選單是一套詞彙,而非一組食譜)。
"custom: …"——使用者用自己的話描述了他們想要的風格。忠實遵循它;它優先於您自己的品味。合理填補空白,僅在確實模糊不清或與簡報衝突時才詢問。"auto"——您擁有完全的自由。選擇最能服務此素材的任何風格,無論是否在選單內:發明一種風格、結合風格、借用一種媒介或參考。用一句話說明其合適的原因。
方向之間的區別應在風格以及影片如何達到重點(其弧線與結尾) 上有所不同,而不僅僅是顏色。
草稿比最終版簡化:擁有即時的節奏、佈局、品牌顏色、字型、標誌與文字,但細節較少,動畫也較簡單。它們仍然符合上述的品質標準:分層的深度、光線、質感和美麗的外觀,這樣使用者就是在看起來已經令人驚豔的方向之間做選擇。一個平淡、扁平的草稿會低估該方向的潛力,使選擇更難。
…
[後續內容已截斷以利翻譯]