程式碼卡通
一部電影在這裡就是一個網頁。每個場景是一個 JavaScript 檔案,負責繪製其自身世界中時間 u 的畫面;一個小型引擎根據錄製的語音時間軸播放場景;無頭 Chrome 截取每一格;ffmpeg 將它們與語音、產生的音效和環境音混合。畫面完全不涉及影像模型或影片模型。
example/ 是一個以此方式完成的完整電影:《氣球》,2分41秒,13 種風格,16 個場景。開始新電影時,請複製 example/ 並取代其場景;引擎、工具和合約應保持原樣重複使用,無需修改。
工作順序(請勿重新排序)
- 先做風格板(
references/styles.md)。每種候選風格一張靜止圖,使用不同的技術,且都顯示同一個角色。共用色板和字型的風格會被視為同一種風格,因此請讓它們在色板、紋理、維度和技術上同時有所區別。風格板需獲得批准後才能開始動畫。 - 故事(
references/story.md)。一個出現在每個鏡頭中的載體物件,以及每次風格變換的理由。撰寫劇本時,為每句台詞標註情緒標籤。 - 語音先於畫面(
references/voices.md)。錄製每句台詞,然後根據實際時長建立時間軸。場景是根據時間軸來製作動畫,而非反過來。 - 引擎與合約。 重用
example/balloon.html、example/balloon/film.js、example/tools_balloon.mjs和example/balloon/CONTRACT.md。在撰寫任何場景之前,請先閱讀合約;它很短,且其中的每條規則都是因為缺少它而導致問題才存在的。 - 場景(
references/styles.md提供每種風格的配方,references/parallel-build.md說明如何同時構建多個場景)。每個場景一個檔案,draw(u, S)是時間u的純函數。 - 音效(
references/sound.md)。每個場景宣告其自身的音效、提示時間和環境音;工具會自動產生並混合。 - 逐場景渲染,再合併。
bash balloon/final.sh為每個場景渲染一個 MP4,因此只有被修改的場景需要重新渲染。 - 檢查完成的檔案(
references/checking.md)。您無法觀看或聆聽,所以請檢查可測量的部分,並如實說明哪些部分未被檢查。
適用於每個場景的規則
- 一格畫面是時間的純函數。 格點是一次一個、有時不按順序渲染的。不依賴前一格的狀態、無時鐘、無未種子的亂數。昂貴的固定工作放在
init中。 - 載體物件在每個場景的開頭和結尾,都出現在螢幕的相同位置(在範例中:紅色氣球位於 (700, 560),半徑 64)。下一個場景透過從該點向外擴張的圓形揭示,這讓每次轉場都自動成為匹配剪輯。
- 主角在所有風格中保持其比例。 只改變渲染方式,絕不改變形狀。
- 誰說話,誰就動,其他角色則靜止不動。沒有唇形同步;一個彈跳、一個鳥喙或一個閃爍的游標就足夠了。
- 螢幕上的數字是真實的。 一個顯示 600 條線或 512 條射線的計數器,必須反映該格實際使用的數量。
- 動作要有原因:跳躍前的預備動作、落地時的壓縮、衝擊對畫面的影響、笑點前三分之一到半秒的靜止。
- 字幕屬於引擎;場景應確保角色臉部和手部避開字幕區域。
指令(從電影資料夾執行)
npm install # three + puppeteer-core;若 Chrome 不在預設位置,請設定 CHROME_PATH
node tools_styles8.mjs # 風格板:每種風格一張靜止圖 -> out/styles8/board.jpg
python tools_balloon_vo.py # 語音 + 時間軸(需要 ELEVENLABS_API_KEY);--timeline 僅重建時間軸
node tools_balloon.mjs --scene=book --sheet=auto # 一個場景的 8 張靜止圖 + 拼貼表
node tools_balloon.mjs --glide=book # 一個場景的最終姿勢
node tools_balloon.mjs --film --sheet=13.1,24.8 # 整部電影在指定秒數的靜止圖(用於場景邊界)
bash balloon/final.sh # 渲染每個場景、音效、合併、封裝;`final.sh comic pixel` 僅重新渲染指定的場景
需要 Node 18+、Chrome、ffmpeg、Python 3 以及 requests numpy soundfile pyloudnorm。畫面不需要 API 金鑰;語音和音效需要 ElevenLabs 金鑰。
參考檔案
| 檔案 | 何時閱讀 |
|---|---|
references/styles.md | 選擇風格時,或構建其中一種風格的場景時 |
references/story.md | 編寫劇本時 |
references/voices.md | 選角、錄音、計時時 |
references/sound.md | 音效、環境音、混音時 |
references/checking.md | 在宣告某個場景或整部電影完成之前 |
references/parallel-build.md | 同時構建多個場景時,或機器 GPU 較弱時 |
example/balloon/CONTRACT.md | 始終在開始第一個場景之前閱讀 |