Animator
你製作的是動畫:在 Remotion 中移動的繪製影像。你不是在製作影片素材。
範圍
- 請勿在此技能中調用 Veo、Kling、Sora 或任何文字轉影片模型。每一幀都是由 Remotion 從圖片、SVG 和程式碼組合而成。
- 如果需求需要真實影像、照片級寫實鏡頭或電影預告片,請停止並告知此技能無法完成。請勿暗中切換至影片模型。
品味準則
每一條準則都來自於被拒的版本。
- 場景,而非對話。 將每個要點呈現為一個舞台場景:角色行動、道具移動、場景變化。兩個頭像在背景前對話是失敗的結果。
- 動態。 每個鏡頭都要移動攝影機。經常改變鏡頭景別:全景、中景、特寫。在動作上剪接。任何鏡頭靜止不超過約 4 秒。
- 優雅的角色。 根據場景為角色精心打扮:完美的剪裁、優質的布料、有品味的細節。絕不使用通用的剪貼畫人物。
- 專業、體面的完成度。 必須看起來像工作室級別的動畫。沒有噱頭、沒有廉價特效、沒有迷因風格。
- 深度重於廣度。 一個要點呈現得好,勝過六個要點列成清單。如果主題有很多要點,建議每個要點製作一個影片。
- 主題允許時使用兩種聲音進行對話: 一個角色提問,另一個回答。詢問使用者哪個聲音扮演哪個角色。未經本人書面同意,絕不克隆真人的聲音。
- 對於模型或流程,使用示意圖剪輯。 不要問使用哪種剪輯。使用品牌色調的純 SVG 形狀,不含人物;旁白負責敘事。關於人物的故事則保持角色剪輯。
- 情緒跟隨主題。 一個有趣的應用程式得到一個有趣的影片:彈跳的動作、過衝的緩動、彈出的卡片。一個嚴肅的主題得到克制的處理。在選擇情緒之前先閱讀產品。
檔案位置
| 項目 | 位置 |
|---|---|
| 專案目錄 | ~/explainer/<名稱>/。使用 EXPLAINER_ROOT 覆蓋根目錄。每個專案一個資料夾;預覽和完整影片是同一專案的兩個合成 |
| 資料夾佈局 | 此檔案旁邊的 SCHEMA.md。in/ 輸入,assets/ 主檔案,public/ 渲染輸入,work/ 暫存,out/ 最終成果 |
| 起始套件 | 此檔案旁邊的 starter/:一個可播放故事板的簡化 Remotion 合成,以及品牌套件和動作輔助工具 |
| 腳本 | 此檔案旁邊的 scripts/。從專案根目錄執行它們。new-project.sh 將起始套件和工具複製到新專案 |
| 媒體生成 | 此檔案旁邊的 adapters/,以及合約的 ADAPTERS.md。設定 GEN_IMAGE、GEN_SPEECH、GEN_SFX、CUTOUT 和 GEN_MUSIC 為你自己的指令 |
| 品牌設定檔 | 此檔案旁邊的 brands/<名稱>/。brands/example/ 是一個可複製的中性設定檔 |
在每個 Shell 或專案的 .env 中設定工具路徑一次:
SKILL=~/.claude/skills/explainer-video
export GEN_IMAGE="python3 $SKILL/adapters/gen-image.py"
export GEN_SPEECH="python3 $SKILL/adapters/gen-speech.py"
export GEN_SFX="python3 $SKILL/adapters/gen-sfx.py"
export CUTOUT="python3 $SKILL/adapters/cutout.py"
export GEN_MUSIC="python3 $SKILL/adapters/gen-music.py"
程序
1. 劇本與故事板
- 編寫
storyboard.json。對於每個節拍,寫下說話者、台詞、場景(地點、動作、道具)、鏡頭景別和攝影機移動。請參閱SCHEMA.md了解節拍欄位。 - 確保每個要點至少有一個場景能在沒有文字的情況下展示它。
- 詢問使用者影片是否需要字幕。如果需要,詢問哪一種:內嵌在畫面中,還是影片旁邊的
.srt檔案。根據語音腳本製作字幕,而不是轉錄稿:腳本有正確的拼寫。 - 詢問使用者哪個聲音扮演哪個角色。提供一個免費聲音用於預覽,以及一個付費、富有表現力的聲音用於最終剪輯。
- 先使用免費聲音。 用免費聲音為所有預覽和第一個完整剪輯配音。保持角色的性別。只有在使用者批准了免費聲音剪輯後,才生成付費聲音。在故事板中保留每個節拍的
tag用於付費階段。
- 先使用免費聲音。 用免費聲音為所有預覽和第一個完整剪輯配音。保持角色的性別。只有在使用者批准了免費聲音剪輯後,才生成付費聲音。在故事板中保留每個節拍的
- 詢問使用者影片使用哪個品牌:
brands/<名稱>/中的設定檔、專案自己的外觀,或無。即使沒有明顯品牌的影片也需要這個問題。將答案寫入in/brief.md,以便從第一次渲染開始,卡片和色板就來自於它。 - 將故事板發送給使用者。在他們批准之前,不要生成圖片。
2. 角色
- 為每個角色編寫一個固定的描述:臉、頭髮、身體、衣服。逐字複製到每個圖片提示中。將其保存在
in/characters.md。 - 使用
gen-image.py在平坦、純色的背景上生成基礎圖畫。在提示中添加“無地面陰影、無光暈”。 - 使用
--input從基礎圖畫生成表演姿勢:走路、坐下、指點、反應、手勢、轉身。一個場景需要姿勢,而不僅僅是一個站立的人物。 - 製作嘴巴狀態(閉合、張開、大張)和眨眼。只將改變的區域粘貼到基礎圖畫上。絕不使用整張編輯過的圖像:臉部會偏移。
- 使用
cutout.py剪切每個姿勢。對於圖畫使用isnet-anime,對於照片使用u2net。 - 將所有姿勢放在同一張 1024 像素的畫布上,以便姿勢改變不需要偏移。
- 製作所有姿勢的聯繫表(ImageMagick
montage)。打開它,尋找一個臉部、衣服或比例不同的姿勢。重新生成該姿勢。每張圖像最多嘗試 3 次。
真人: 未經本人同意,不得繪製或動畫化真人。先詢問。
- 使用
cutout.py --model u2net剪切臉部。不要將其放在圓形中。 - 淺色頭髮在淺色背景上會消失在剪切中。如果發生這種情況,請使用另一張照片。
- 將脖子和肩膀漸漸消失在下巴下方,並用身體繪製脖子。裁剪的照片在那裡會有一個硬邊。
- 用程式碼(SVG 關節)繪製身體。這樣每個姿勢都是精確的,沒有臉部會偏移。
3. 場景與道具
- 生成每個地點作為背景(
--size 1536x1024),風格與角色相同,不含人物。 - 生成作為獨立剪切層的道具:手機、票卷、杯子、窗簾。
- 檢查每個螢幕、裝置和包裝上的品牌標記和文字。“無標誌”提示無法阻止它們。使用 ImageMagick 修補標記。不要使用圖像到圖像的編輯:它會移除錯誤的部分而保留標記。
- 在需要的地方生成前景層以實現視差:座位排、欄杆。
- 如果專案有品牌設定檔,請使用它。從
brand.css取色板,從images/取標誌和標語,從fonts/取字體。不要發明品牌顏色。閱讀設定檔的NOTES.md了解其品牌形狀。 - 如果專案沒有專門的圖示圖形,請使用 MDI 圖示(
@mdi/js,一個 24×24 的路徑)。不要手動繪製圖示,也不要用表情符號。如果專案的網站已經在一個東西上使用了 MDI 圖示,請在影片中使用相同的圖示。
4. 聲音
- 使用
gen-speech.py並為每個說話者使用相同的--voice生成每句台詞。- 在使用者批准剪輯之前,使用相同性別的免費聲音。關於付費模型的注意事項同樣適用於付費階段。
- 執行
scripts/regen-voices.py <模型>。只有當請求發生變化(文字、聲音、模型、設定,或同說話者的相鄰台詞)時,它才會將台詞發送到 API,因此已批准的版本會保留。不要為了修復一句台詞而重新生成所有台詞。 - 要故意重新生成一句台詞,使用
--fresh <節拍或說話者>。每次版本都保存在assets/voice/takes/。要回到較早的版本,使用--restore <版本>。 - 在快取之前製作的專案沒有每個節拍的
voice_key。使用--adopt執行一次,否則第一次執行會重新生成每句台詞。 - 使用富有表現力的模型時,在每句台詞前放一個英文音頻標籤,例如
[warmly],並設置模型的穩定性、相似性、風格和速度旋鈕。沒有這些,台詞聽起來會很平淡。將標籤保留在line之外,因為字幕顯示的是line:將其放在節拍的tag欄位中,並在文字之前發送。 - 不要對未記錄音頻標籤的模型使用音頻標籤。它可能會大聲說出它們。
- 對於每個聲音,先列出名稱、外來詞和字母代碼。即使設置了語言代碼,聲音也會以其自身語言的方式讀取它們。先嘗試單詞的音標拼寫,然後是行內 IPA。為每個拼寫製作三個版本和一個控制版本,讓使用者用耳朵選擇。
- 不要用大寫字母寫聲音。聲音可能會將大寫字母讀作單個字母。而是將聲音寫成一個單詞。
- 新的版本會移動每個單詞。將節拍內的幀偏移(攝影機、高亮、音效)對齊到字幕範圍的開始,而不是字面幀。在獲得新的版本後,通過語音轉文字處理獲取單詞時間,並只重置範圍開始。
- 執行
scripts/level-voices.py。它會根據語音的響度來均衡每句台詞。峰值均衡是不夠的:台詞可能分散超過 6 dB。- 另一種語言的版本:保留場景,並從同一來源生成第二個合成。為新語言提供自己的故事板(使用相同的節拍 ID)、自己的聲音資料夾、封套和音樂剪輯(在
check-audio.py中的STORYBOARD、VOICE_DIR、MUSIC)。 - 將新聲音均衡到已批准混音的語音水平,而不是同一個目標。
- 另一種語言的版本:保留場景,並從同一來源生成第二個合成。為新語言提供自己的故事板(使用相同的節拍 ID)、自己的聲音資料夾、封套和音樂剪輯(在
- 製作嘴巴封套並使用
scripts/gen-envelopes.mjs打包它們。
5. Remotion 中的動畫
- 舞台調度: 將每個場景作為行動來播放。角色走進來、坐下、反應並使用道具。在它們自己的層上移動道具。修復是添加缺失的部分;保留顯示原因的動作。
- 攝影機: 在每個鏡頭中推進、平移或跟拍。在背景、角色和前景之間使用視差。 夾緊每個攝影機移動,以便每個必須填充畫面的圖層在其視差深度上保持在其中(包括旋轉)。深度 < 1 的圖層移動得比攝影機少:拉出或結束於中心外的平移會暴露畫面邊緣,露出一條地面。
- 深度: 將地板和所有站在上面的東西(椅子、人、道具)放在同一層的同一個深度上。兩個深度會在每個攝影機移動下使地板和椅子腳分開,椅子會漂浮。一個靜止的點頭動作會繞著身體在座位線以上旋轉,而不是椅子。
- 動作: 使用帶有小過衝的彈簧。在移動之前使用預期動作。絕不在兩個姿勢之間使用硬切換。
- 靜止動作: 給呼吸、搖擺和眨眼各自的週期和相位。
- 嘴巴: 從封套驅動它,最少保持 3 幀(starter 的
motion.ts中的mouthStates)。 - 畫外音敘述者: 顯示一個跟隨封套的波形球,而不是敘述者的臉(starter 中的
NarratorOrb.tsx)。 - 燈光: 將燈光用作敘事工具。例如:房屋燈光變暗,手機螢幕在臉上發光。
- 轉場: 每個剪輯選擇一種(匹配剪輯、擦拭、硬切)。不要對所有剪輯使用同一種淡入淡出。
- 一個角色在剪輯之間保持為一個物體。 當一個角色從一個鏡頭移動到下一個鏡頭時,將其從原來的位置帶到新的位置。一個從一邊離開並從另一邊進入的角色會被解讀為第二個角色。
- 觀看者必須注意到的變化需要在畫外音中有一個暫停。 分割節拍,並在其後添加 1.5–2 秒的靜音。在該暫停中安排變化:標記舊狀態,使其變暗,交叉淡入淡出,然後在下一句台詞上高亮新狀態。
- 將暫停放在句子斷點處,絕不能放在短語內部。通過音量找到間隙:在單詞之後,取低於約 −38 dB(相對於峰值)的最長 20 毫秒窗口序列,並在其中間剪切。不要從語音轉文字單詞時間中取間隙:它們的邊緣可能相差 0.5 秒。
- 字幕和要點卡片:保持簡短。卡片支援一個場景。它絕不取代它。
- 畫面——每個影片都有:
- 開場標題卡,約 3 秒:標誌(如果適用)、影片標題和一行簡短文字。可以無聲或僅有音樂。
- 結束幻燈片,約 4 秒:標誌(如果適用)、主張或行動呼籲,以及 URL。可以無聲。
- 角落標誌: 在整個影片中,兩個卡片之間,在右下角有一個小標誌。在開場卡片後淡入,在結束幻燈片前淡出。保持其遠離臉部和關鍵元素。
- “如果適用”:品牌、產品或公司影片有標誌。個人影片沒有公司標誌。它仍然有標題卡和結束幻燈片。
- 要將畫面添加到已完成的影片中,不要重新調整畫外音的時間。將現有合成放在兩個卡片之間的
<Series>中。卡片在開始和結束時添加靜音,這是可以接受的。
- 品牌優先,始終如一。 如果專案有品牌設定檔,請使用它:來自設定檔的卡片、來自
brand.css的色板、作為真實資產的標誌和標記。如果專案有真實的應用程式截圖,將它們用作圖層:真實的螢幕勝過繪製的螢幕近似。只有人物、地點和道具是繪製的。UI、標誌和字體來自品牌。 如果設定檔明顯落後於即時應用程式,請告知並使用應用程式。
6. 檢查圖片
- 使用
npx remotion still在關鍵幀處渲染靜止畫面。 - 打開靜止畫面。尋找被卡片或字幕遮蓋的臉,以及被畫面邊緣切斷的角色。可選的第二意見:
ADAPTERS.md描述了REVIEW_IMAGE指令。將其判斷視為線索,而不是門檻,並在畫面上確認每個發現。 - 渲染一個約 20 秒的樣本,包含一個場景、一個姿勢變化、一個攝影機移動和一個對話交流。
- 圍繞每個姿勢變化提取幀
…
[已截斷以供翻譯]