Communitygithub.com

代碼卡通

用代碼逐幀畫出卡通,再配上角色配音和音效,渲成 MP4,不靠生圖或影片模型。

代碼卡通 是什麼?

每場戲是一個 JavaScript 檔,自己畫出第 u 幀。小引擎按錄好的聲音時間線播放,無頭 Chrome 截下每一幀,ffmpeg 再混入對白、音效和氛圍。從附帶的示例片複製,再換掉其中的場次即可。

相容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/krisuuu2/code-cartoon-skill/tree/HEAD

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

程式碼卡通

一部電影在這裡就是一個網頁。每個場景是一個 JavaScript 檔案,負責繪製其自身世界中時間 u 的畫面;一個小型引擎根據錄製的語音時間軸播放場景;無頭 Chrome 截取每一格;ffmpeg 將它們與語音、產生的音效和環境音混合。畫面完全不涉及影像模型或影片模型。

example/ 是一個以此方式完成的完整電影:《氣球》,2分41秒,13 種風格,16 個場景。開始新電影時,請複製 example/ 並取代其場景;引擎、工具和合約應保持原樣重複使用,無需修改。

工作順序(請勿重新排序)

  1. 先做風格板(references/styles.md)。每種候選風格一張靜止圖,使用不同的技術,且都顯示同一個角色。共用色板和字型的風格會被視為同一種風格,因此請讓它們在色板、紋理、維度和技術上同時有所區別。風格板需獲得批准後才能開始動畫。
  2. 故事(references/story.md)。一個出現在每個鏡頭中的載體物件,以及每次風格變換的理由。撰寫劇本時,為每句台詞標註情緒標籤。
  3. 語音先於畫面(references/voices.md)。錄製每句台詞,然後根據實際時長建立時間軸。場景是根據時間軸來製作動畫,而非反過來。
  4. 引擎與合約。 重用 example/balloon.html、example/balloon/film.js、example/tools_balloon.mjs 和 example/balloon/CONTRACT.md。在撰寫任何場景之前,請先閱讀合約;它很短,且其中的每條規則都是因為缺少它而導致問題才存在的。
  5. 場景(references/styles.md 提供每種風格的配方,references/parallel-build.md 說明如何同時構建多個場景)。每個場景一個檔案,draw(u, S) 是時間 u 的純函數。
  6. 音效(references/sound.md)。每個場景宣告其自身的音效、提示時間和環境音;工具會自動產生並混合。
  7. 逐場景渲染,再合併。 bash balloon/final.sh 為每個場景渲染一個 MP4,因此只有被修改的場景需要重新渲染。
  8. 檢查完成的檔案(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始終在開始第一個場景之前閱讀

相關技能