animate 是做什麼的?
將參考資料和一個粗略想法,轉化為一部完全由程式碼繪製每一幀、並合成音效的 MP4 動畫。 使用者提供品味;你負責導演。一個簡短的任務說明就足夠了,所以請自行做出創意決定,只詢問會改變整個作品方向的問題。
所有檔案都存放在 animations/<slug>/ 目錄下:
refs/ study/ style.md beats.md piece.html score.json out/<slug>.mp4
必要時可在此目錄下新增輔助腳本或筆記。examples/bee-dance/ 是本技能資料夾中一個完整的示範影片。
在以下指令中,$SKILL 代表本技能所在的資料夾。請在使用者的專案目錄下,使用 $SKILL/.venv/bin/python 來執行(如果該路徑存在的話),否則使用 python3。如果缺少套件,請參閱 README.md 中的設定說明。這些指令需要 ffmpeg 和 Chrome。
選擇任務
| 使用者想要 | 任務 | 作法 |
|---|---|---|
| 「將這張圖片動起來」 | 移動藝術作品 | 將圖片分割成多個圖層並移動它們。閱讀 references/move-an-image.md。跳過第 3-4 階段的 piece.html;渲染是透過 Python 腳本完成。 |
| 「畫出這個」、「重新創作這個場景」 | 重新繪製 | 在 piece.html 中繪製整個場景,緊密貼合參考資料。 |
| 某個主題或故事「用這種風格」 | 新影片 | 遵循以下完整流程。參考資料設定視覺風格;主題則是全新的。 |
如果他們沒有指定長度或畫面比例,對於影片請使用 15 秒、1080x1920 的設定;對於動態圖片則使用 5 秒。
程式碼擅長處理形狀、線條、漸層和紋理:扁平向量、線稿、紙雕、孔版印刷、水彩、動畫背景、植物圖鑑。它不擅長寫實照片和人物面部表情。如果參考資料是寫實照片,請在開始製作前先告知使用者,並提議一個插畫風格的改編版本。
第 1 階段:研究所有參考資料
使用者可能會給你很多參考資料,所以請賦予每個參考資料一個明確的角色,而不是把它們全部混在一起平均處理。
python3 $SKILL/scripts/study.py animations/<slug>/study <files or folders...>
這會為每個參考資料提供:一張聯絡表、一個色板,對於影片還會提供剪輯點和節奏曲線。如果只有影片的一部分重要,請在檔名後加上秒數範圍,例如 "reel.mp4@0-12",否則人物訪談的鏡頭會扭曲分析結果。然後請親自查看這些聯絡表,並在需要觀察紋理細節的地方進行裁切放大。數字無法告訴你為什麼某個東西感覺很好。
撰寫 style.md:
- 每個參考資料提供了什麼,一行一個:從這個取得紋理,從那個取得風格,從另一個取得節奏。
- 我們不會複製的內容:姿勢、角色、標誌、簽名、精確的構圖。學習風格,而不是複製作品;但對於使用者要求動起來的圖片所進行的「重新繪製」或「移動」任務則例外。
- 色板(以十六進位數值表示)、字型(
assets/fonts/初始有兩個字型可供使用,或者你可以複製任何開放字型)、紋理、動態感覺。 - 一個能將整個作品串聯起來的裝置:一個鏡頭、一道漣漪、一條從未中斷的線條。沒有這種裝置的影片感覺就像幻燈片。
為每個新的參考資料在 animations/library.md 中添加一張簡短的卡片,讓學到的經驗能超越這個專案。當使用者指向他們以前用過的風格時,重複使用這些卡片,只有當你學到新東西時才擴充現有的卡片。
檢查點: 你必須能用一句話說出這個作品看起來像什麼,以及為什麼這樣的風格能服務於主題。
第 2 階段:節奏
如果作品中有事實資訊,請先進行驗證。一個畫得很漂亮但錯誤的主張仍然是錯的,而且流行的「事實」常常是不嚴謹的。請記錄下你為了最終報告而軟化了哪些內容。
撰寫 beats.md,採用表格形式。畫面和聲音需要一起規劃,因為這種同步正是讓作品看起來高級的原因。
| 時間 | 畫面 | 聲音 |
|---|---|---|
| 0-1.5 秒 | 一滴橙色的水滴落下並擴散 | 滴落聲,潮濕的綻放音,Pad 音色加入 |
| 1.5-3 秒 | 標題出現,細節逐一彈出 | 每個字一個撥弦聲,細微的滴答聲 |
檢查點: 前 0.5 秒內有動態發生;故事的形狀是:鉤子、鋪陳、一個呼吸點、高潮回報;沒有任何一個片段超過 2 秒而沒有新的畫面想法;結尾大約停留 1.5 秒以便閱讀。讓畫面承載新的想法,而不是文字:每個字幕大約需要 1.5 秒的螢幕時間,所以寧可剪掉字幕也不要縮短它們的顯示時間。在豎直畫框中,保持文字不出現在頂部 12% 和底部 18% 的區域。
第 3 階段:建構畫面
複製 assets/piece-template.html 到 piece.html 並在其中進行繪製。合約規定了 window.PIECE 以及 window.renderFrame(t)。
renderFrame(t) 必須只依賴於 t,並且可以是非同步的。靜止幀可以直接跳到任何時間點,因此任何在幀之間記住的狀態,或任何未設定種子的 Math.random(),都會破壞它們。請在 window.ready 內部,使用設定過種子的生成器一次性繪製昂貴的靜態圖層,然後在每一幀進行合成。
若要在作品中顯示另一部影片,請將其幀提取為編號的 JPEG 圖片,存放於 clips/ 目錄中,然後在非同步的 renderFrame 內部使用 Image 物件載入所需的幀,並將其繪製到 Canvas 上。
在繪製之前請閱讀 references/styles.md,裡面有可用的配方(卡通雲朵、樹葉、行走的人物、水、水彩、紙張效果)以及可供複製的原始碼。景深來自於不同速度移動的圖層,生動感來自於細微的次要動態:搖曳、漂移、閃爍、明滅。
請及早且頻繁地審視靜止幀,遠在全片渲染之前:
python3 $SKILL/scripts/render.py animations/<slug>/piece.html --stills 0.5 3 7 12
以全尺寸檢視它們,並與參考資料並排比較,修正任何不對的地方。預期需要數輪修改。第一張靜止幀通常只是草稿,而這個迭代循環正是品質的來源。
python3 $SKILL/scripts/compare.py animations/<slug>/out/compare.jpg <stills and reference images...>
檢查點: 從中間選取的一張靜止幀,看起來必須與參考資料使用相同的材質:相同的紙張、顏料、線條和顏色。主題可以是新的。如果只是參考資料的剪貼畫版本,則不能通過。
第 4 階段:聲音
根據 beats.md 中相同的時間點來撰寫 score.json。請參閱 scripts/synth.py 的標頭以了解可用的音效:撥弦聲、鈴聲、Pad 音色、水滴聲、滴答聲、漸強音、呼嘯聲、撞擊聲、大鼓聲和雜訊基底。
python3 $SKILL/scripts/synth.py animations/<slug>/score.json animations/<slug>/out/score.wav
保持在同一個調性內。將重要的打擊點對齊畫面事件,而不是對齊節奏網格。在高潮來臨前留出真正的寂靜,因為對比才能讓高潮更有衝擊力。使用幾行 Python 程式碼生成長串的音符,而不是手動一個一個輸入。
你無法聽到聲音,所以請閱讀 synth.py 輸出的音量報告:注意是否有計劃外的音量驟降,以及主要音色是否被其他聲音掩蓋。
如果作品包含旁白
旁白應在畫面之前錄製,因為文字的 timing 決定了每個節拍。使用使用者擁有的任何語音工具進行錄製,使用工具(faster-whisper 可以勝任)將其轉錄為帶有時間戳的文字,然後根據這些時間點建構節拍和字幕。Whisper 可能會在字詞實際開始前的靜音部分就開始計時,所以在裁剪停頓之前請檢查波形。
將人聲與配樂混合,然後使用混合結果作為 --audio 參數進行渲染。配樂會在人聲下方自動降低音量,因此在停頓處音樂會再次升起:
python3 $SKILL/scripts/mix.py animations/<slug>/out/voice.wav animations/<slug>/out/score.wav animations/<slug>/out/mix.wav
第 5 階段:渲染、檢查、修正
python3 $SKILL/scripts/render.py animations/<slug>/piece.html --audio animations/<slug>/out/score.wav
python3 $SKILL/scripts/qc.py animations/<slug>/out/<slug>.mp4
render.py 會輸出 out/<slug>.mp4,主音量調整至 -14 LUFS。它會顯示進度,對於典型的 15 秒作品,大約需要 1-2 分鐘;如果作品很複雜,請在背景執行。如果只更改了聲音,請加上 --remux 參數,以便在幾秒內更換音訊,而無需重新繪製畫面。
qc.py 會標記出靜態段落、單幀錯誤和音量問題,並生成一張聯絡表。它無法判斷動態是否流暢,所以你也要閱讀這張聯絡表,然後逐幀檢查有風險的時刻(使用近距離裁切):過渡、文字出現和消失、圖層重疊處,以及任何重複動作的完整循環。修正問題並重新渲染,直到畫面乾淨為止。
交付
使用使用者的日常語言進行報告:你做了什麼、每個參考資料是如何使用的、你檢查了什麼、以及你無法檢查什麼。你無法聽到配樂或觀看動畫的速度,所以請如實告知。另外,請加上:
- 一個需要知道的事實,如果你軟化了某個主張。
- 簡單的調整:3 或 4 個他們可以要求的具體修改建議。
- 參考資料是否屬於他人,以及在商業使用前需要深思熟慮。