anime-reel
輸入:一個腳本 + 每行一個語音 MP3(使用者同時提供兩者)。輸出:9:16 直式短片與 16:9 橫式版本,皆包含原始音訊,以及一個低於 20MB 的 720p WhatsApp 版本。
每回執行都必須遵守的硬性規則
- 所有畫面皆以程式碼繪製:使用 HTML Canvas,在 headless Chrome 中逐幀渲染,並以 ffmpeg 編碼。不得使用任何圖庫或圖像生成器。以
engine/為基礎,擴充而非取代它,以確保每次外觀一致。 - 每個單字都必須透過強制對齊(torchaudio MMS_FA,透過
scripts/align.py)進行時間標記。絕不猜測時間。如果某一行對齊失敗,請停止並告訴使用者原因;不可回落至均勻間隔。 - 在完整渲染前,先顯示一張靜態畫面的聯絡表(contact sheet)並等待使用者批准。
- 覆蓋任何現有檔案前必須先詢問。
encode.sh拒絕覆寫並以代碼 2 退出;請將此訊息轉達給使用者。 - 最終 MP4 中保留原始音訊不變(語音僅放置於時間軸上,絕不重新處理)。除非使用者要求,否則不加入背景音樂。
方法
- 設定。 執行
bash scripts/check_setup.sh(檢查 ffmpeg、Node、puppeteer、torch/torchaudio、uroman)。修復任何缺少的項目後再繼續。執行bash scripts/sfx.sh <project>/sfx以 ffmpeg 合成打擊/颼颼/衝擊/爆裂音效。 - 將腳本拆分為鏡頭。 每行語音對應一個鏡頭。每個鏡頭需記錄:
id、speaker、text(MP3 中說的內容)、audio路徑、place(天台、辦公室、街道、臥室、天空,或新增一個drawPlace分支)、camera(static|push|pull|pan+amount)、cast、slots(left/center/right)和fx。儲存為shots.json(schema 在scripts/build_timeline.py中)。顯示鏡頭列表,若內容不明確則讓使用者修正。 - 角色。 在
characters中定義每個角色(名稱、膚色、頭髮、髮型 spiky|bob|long|short、眼睛、服裝、口音、color=該角色對白字幕顏色)。角色必須原創,不得複製現有動畫。動畫風格:大眼睛附高光、粗而乾淨的線條、純色加一個陰影層。渲染角色表並將 JSON 作為唯一真實來源,以確保角色在不同鏡頭間保持一致:node scripts/render_frames.mjs sheet timeline.json landscape out/character_sheet.png - 對齊與嘴型同步。
python3 scripts/build_timeline.py shots.json timeline.json work對每行執行 MMS_FA(單字時間標記),並根據該語音音量的響度建立每個角色的嘴巴張開曲線(mouth.py)。眨眼和靜止動作已內建於引擎中。對於非英文台詞,align.py使用 uroman 進行羅馬化,同時螢幕上保留原始拼寫。 - 關鍵台詞的動畫技巧(加入
fx,時間以鏡頭開始後秒數計算):speedlines用於揭露和決心場景,impact(白/黑閃幀,加上sfx: "impact")用於最重要的台詞,shake用於打擊,chibi(+who、sfx: "pop")用於喜劇反應。節制使用:大約每 2-3 個鏡頭用一個技巧,以保持效果。 - 字幕與音效。 2-3 字字幕已由引擎處理,說話者的文字使用其代表色,其餘文字為白色。音效與視覺打擊的提示點同步(透過
fx[].sfx)。混合音訊:python3 scripts/build_audio.py timeline.json work/audio.wav。 - 聯絡表,然後批准。 選取約 12 個時間點,均勻分佈在整個影片中,並包含每個技巧:
node scripts/render_frames.mjs stills timeline.json portrait work/stills 0.5,2.0,...bash scripts/contact_sheet.sh work/stills out/contact_sheet.png顯示out/contact_sheet.png並停止。在使用者批准前,不得渲染完整影片。 - 批准後渲染,分別針對兩種方向(
portrait= 1080x1920,landscape= 1920x1080,30 fps):node scripts/render_frames.mjs video timeline.json portrait work/reel_silent.mp4bash scripts/encode.sh work/reel_silent.mp4 work/audio.wav out/<name>_9x16以out/<name>_16x9對 landscape 重複此步驟。encode.sh會混合 AAC 256k 音訊,並寫入_720p.mp4副本(目標約 17 MB,始終低於 20 MB)。使用ls -lh檢查檔案大小並回報。
渲染設定
- 9:16:1080x1920,30 fps,H.264 yuv420p,CRF 16,AAC 256k,faststart。16:9:1920x1080,相同設定。
- WhatsApp 副本:720p(720x1280 或 1280x720),碼率根據時長計算,以保持在 20 MB 以下。
- 字幕位置:9:16 約在 68% 高度處(避開頂部 250 px 和底部 420 px 的應用程式 UI),16:9 約在 86% 高度處。
此技能中包含的檔案
engine/engine.js、engine/index.html:Canvas 引擎(角色、場景、速度線、衝擊幀、震動、Q版、字幕、徽章)。scripts/:check_setup.sh、sfx.sh、align.py、mouth.py、build_timeline.py、build_audio.py、render_frames.mjs、contact_sheet.sh、encode.sh。