Communitygithub.com

orange9angel/dula-flat-cel

使用圖像模型和腳本製作平塗線條動畫短片,從故事、角色設計、繪圖到嘴型變體,最終輸出含聲音的完整影片。僅需 Python 和 ffmpeg。適用於動畫短片、電視卡通風格、有限動畫、對白影片、維持角色跨鏡頭一致性,或修正嘴型不同步與繪圖切換閃爍問題。

dula-flat-cel 是什麼?

這個技能專注於平塗色彩動畫的製作流程,透過靜態圖像(每張約維持3-4幀)的切換與嘴型變化來產生動態效果,最適合簡單的電視卡通風格設計。它不需要3D建模或影片生成模型,僅依賴Python與ffmpeg即可執行,大幅降低技術門檻。 該技能支援完整的動畫製作管線:從故事腳本與分鏡設定、角色設計(最關鍵步驟)、背景與圖稿生成、嘴型與眨眼變體製作、聲音素材整合(支援TTS或現有音檔),到最終測試與輸出。特別強調角色一致性,透過錨點系統(anchors.tsv)、跟隨欄位(follow column)與調色盤控制來確保每個鏡頭中角色外觀、比例和方向的穩定。 平台支援方面,它設計為與各大AI代理(如Claude Code、Codex、Cursor等)相容的腳本工具集,所有腳本位於`scripts/`資料夾,使用者需依序執行`paint.py`、`prep_cels.py`、`build_film.py`與`render.py`等命令。每個步驟都有內建檢查機制(如`check_alpha.png`用於偵測去背瑕疵,`check_mouths.py`檢查嘴型凍結),並提供常見問題的故障排除表。 此流程特別適合對白驅動的短劇、教學動畫或系列卡通,但限制是用於複雜動作場面、長時間連續動作或寫實風格的繪畫。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/orange9angel/dula-craft/tree/HEAD/skills/dula-flat-cel

在你喜歡的 AI 中提問

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

說明文件

平塗動畫

每張圖稿維持3-4幀,動畫表現來自於圖稿切換與嘴型變化。對於簡單的電視卡通設計而言,這條路線能讓圖像模型維持最高的一致性。它不需要3D模型,也不需要影片模型。

腳本位於此技能scripts/檔案夾中,路徑相對於此SKILL.md。下方以$S代表該檔案夾。除了new_project.py之外,請在影片專案資料夾中執行這些腳本。如果遇到環境問題,請使用dula-start。

使用對方的語言與其溝通。

工作流程

python $S/new_project.py my_film && cd my_film

1. 故事與分鏡

撰寫story.md,然後設定config/film.json(請參閱 film.json 參考文件)。第一部影片請控制在20-30秒內,一句口白大約2-3秒,所以15秒約可容納3-5句台詞。僅使用原創角色。

針對每一句台詞,思考是誰說的、對誰說的,以及鏡頭要拍誰。笑話不應依賴觀眾聽不懂的詞彙。因果關係也需要畫出來(跑進來 → 抓住 → 物品飛出去)。不要用剪接跳過。

2. 角色設計(最重要的步驟)

將每個角色放入config/anchors.tsv(名稱<TAB>外觀描述),然後執行:

python $S/paint.py anchors config/anchors.tsv

請親自打開並檢查每一張產生的圖片。 有些檢視器會將透明區域顯示為黑色底上的有色光暈,看起來像失敗的去背。如有疑慮,請在步驟3後檢查build/check_alpha.png。然後將設計稿展示給對方,獲得批准後再繼續。後續的所有繪圖都以此為基礎,所以在這裡犯錯的修正成本最高。用文字修正比例,例如:「頭部佔全身高度三分之一,圓臉,黑色小圓珠眼睛,紅色吊帶褲」。

3. 背景與圖稿

填寫config/plates.tsv(名稱<TAB>描述)和config/cels.tsv(繪圖名稱<TAB>角色<TAB>姿勢)。繪圖名稱請以角色名稱開頭,例如hero_run_a。

python $S/paint.py plates config/plates.tsv
python $S/paint.py cels config/cels.tsv
python $S/prep_cels.py --bases-only    # 在繪製嘴型前,檢查 build/check_alpha.png 中的去背狀況

每張圖片約需1-3分鐘,paint.py會即時回報進度。如果你的工具會中斷長時間執行的指令,請讓它在背景執行。重新執行時會跳過已完成的圖片。若要重做某張圖,請使用--only <名稱> --force。

為了保持圖稿與場景的連續性,可以多加一欄指定要跟隨的項目:

hero_run_a	hero	向右跑,左腳在前。
hero_run_b	hero	向右跑,右腳在前。	hero_run_a
meadow		灰色雨雲下的草地。
meadow_sun		雨停了,陽光穿過雲層。	meadow

規則:

  • 每張圖片只畫一個角色。角色設計永遠是第一參考。切勿使用被拒絕的圖片作為參考。
  • 先決定角色的面向。 一次只產生一張圖片時,每張都會自行選擇方向,所以對話中的兩個人很容易變成背對背。請一開始就指定方向,並使用 flip 來修正錯誤。
  • 動作循環中的每個繪圖都要跟隨前一個(上述的額外欄位),這樣方向、比例和形狀才能保持穩定。沒有這個設定,循環就會跳動。
  • 若需改變一天中的時間,請重新繪製背景,並跟隨原始場景圖。疊加顏色效果無法隱藏藍天。
  • 在每個鏡頭中檢查角色的比例。像「脖子向上伸」這樣的姿勢描述可能會變成不同的身體。

4. 嘴型與眨眼

每個有對話的繪圖都需要對同一張圖片進行局部編輯。在 config/variants.tsv 中:

hero_stand_m1	hero_stand	僅將嘴巴改為半開的小橢圓形。
hero_stand_m2	hero_stand	僅將嘴巴改為大開。
hero_stand_blink	hero_stand	閉上雙眼,用簡單的弧線表示。其他不變。

命名規則:<基底>_m1 是半開,<基底>_m2 是大開。如果只有 _m1,嘴巴就有開與閉兩種狀態,這樣也行。基底繪圖本身嘴巴必須是閉合的。如果基底畫的是張開的嘴,請製作一個閉合的變體,並在 film.json 中用 talk 設定三種狀態。

每個有對話的角色都需要有自己的嘴型,包括走路循環中的每個繪圖。

python $S/paint.py variants config/variants.tsv
python $S/prep_cels.py

prep_cels.py 會將繪圖壓縮成真正的平塗色彩,並將每個變體鎖定到其基底。然後打開 build/check_alpha.png,在洋紅色背景上檢查去邊效果。重新繪製任何留有背景殘缺、缺少零件或眼睛被擦除的圖像。如果它警告有大面積改變,表示模型修改了身體。請在 variants.tsv 的第4欄添加一個視窗 x,y,w,h。

顏色偏移? 你可以添加 config/palette.json({"skin": [250, 220, 190]}),使用從角色設計中取樣的顏色。只有接近的顏色會對齊到它,而 prep_cels.py 會在你修改後再次套用它。

5. 聲音

選擇一種方式:

  • 使用 dula-voice 生成語音,需使用對方自己的 API 金鑰。
  • 使用現有音檔:將其放在 audio/voice/<台詞ID>.wav,或在台詞上設定 file 屬性。mp3 和 wav 都支援。
  • 製作無聲草稿:為台詞設定一個 seconds 數值。

嘴型是根據這段音檔計算的,所以在製作測試版之前要先確定語音。

可選項目:ambience(環境音)、bgm(背景音樂)、sfx(音效)和 songs(歌曲)。僅使用對方擁有版權的素材。此專案不生成音樂。在沒有授權音樂的情況下,可以省略配樂,讓環境音和音效來支撐影片。

6. 測試

python $S/build_film.py
python $S/render.py --stills 1,3,5,8,12
python $S/render.py --range 0,20 -o output/pilot.mp4

當有可見角色說話但嘴巴無法移動時,build_film.py 會報錯並停止,這是最容易忽略的錯誤。在展示測試版之前,請檢查每一張靜止畫面。 不要等到整部影片完成才給任何人看。

要讓角色接觸地面:猜測 ground 值,渲染一張靜止畫面,然後調整。這比計算快多了。

不要讓鏡頭靜止不動。除非某個節拍刻意要靜止,否則每個鏡頭都要有一個動態元素:背景平移、bob(晃動)或 shake(震動)、圖稿切換,或疊加效果(如雨)。影片的最後一個鏡頭要以 fade_out(淡出)結束。

7. 完整影片與最終檢查

python $S/render.py
python $S/check_mouths.py

在交付前確認以下每一項,如果無法做到,請坦誠告知:

  • 你已親自查看每個鏡頭的實際幀
  • check_mouths.py 未回報任何嘴型凍結
  • 每個角色在不同鏡頭中看起來仍是同一個人(臉部和比例比顏色更重要)
  • 對話中的人們面向彼此
  • 單張繪圖在螢幕上移動時有 bob 效果或更多圖稿,否則看起來像滑動
  • 你已經聽過聲音。如果你無法聽,請說明音檔未經人耳檢查

完整範例

此倉庫中的 examples/rainy-slide 包含一部完成的15秒影片的提示詞和鏡頭清單,docs/tutorial.md 則有說明。從此檔案可找到位於 ../../examples/rainy-slide 和 ../../docs/tutorial.md 的內容。當有人要求範例時,請將它們作為模型使用。

節奏

經驗法則:鏡頭平均3-5秒,角色每個繪圖維持3-4幀(約每秒7張圖稿),多使用特寫和誇張的表情。hold 是每個繪圖的幀數。

常見問題

症狀原因與修正
切換嘴型時身體顏色閃爍變體未經過 prep_cels.py 處理
走路或跑步動作忽高忽低不要分別調整繪圖尺寸。同一個角色會自動共享一個比例。也可以加上 align_head
道具顏色錯誤調色盤條目太接近。移除它或降低 SNAP 值
說話時嘴巴保持張開二態嘴型使用0.5的閾值。檢查音訊是否模糊不清
安靜的字詞嘴巴保持閉合一個大聲的字詞會設定該句台詞的縮放比例。添加 _m2,或降低該句的 mouth_open_at 值
聽不到雨聲或風聲環境音預設較小聲。為它設定 level_db 值,例如 -35
持續的嘶嘶聲環境音素材只是噪音。替換它。增益已上限,所以不會再被放大
Codex 說參考圖像遺失圖像生成必須是它的第一個動作。paint.py 會處理這個問題,所以重新執行它

限制

此路線不適合複雜的打鬥、長時間的連續動作或寫實風格的繪畫。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能