Communitygithub.com

zhengshuyuan2023uk/cartoon-audio-short

製作垂直動畫卡通短片。提供10個點子、撰寫腳本,並將用戶的配音轉換為帶有音樂和音效的完整MP4,音效音量為人聲的50%。適用於任何卡通短片或動畫故事影片需求。

cartoon-audio-short 是什麼?

這個技能是一個完整的動畫短片製作工作流程,從創意發想到最終輸出MP4影片。它專為垂直格式(1080x1920,30 fps)設計,採用平面2D豆頭卡通角色,搭配彩色3D世界和黑色墨水輪廓。使用者只需提供配音(或點子),技能便會自動生成10個影片概念、撰寫腳本、進行時間校準、建立3D場景與角色動畫,最後混合音樂和音效,輸出長度與配音同步的影片。該技能整合了自訂的Three.js引擎、toon.ts角色繪圖庫,以及Python音訊處理工具,確保音樂和音效的音量精確維持在人聲的50%。支援Claude Code等具備檔案系統和命令執行能力的AI代理平台,要求Node 22.6+、Python 3(含numpy和Pillow)、ffmpeg和Playwright。整個過程包含嚴格的品質檢查,例如鏡頭規劃、關鍵影格渲染審查,以及音視頻同步驗證,以產出專業水準的動畫短片。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zhengshuyuan2023uk/muskill/tree/HEAD/cartoon-audio-short

在你喜歡的 AI 中提問

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

說明文件

卡通短片:點子 → 腳本 → 配音 → 完成MP4

外觀:平面2D豆頭卡通角色(畫布繪製的「卡片」,帶有梅子色輪廓),位於色彩繽紛的3D世界中,具有黑色墨水輪廓、繪畫紋理、景深和滑動攝影機。輸出為1080x1920,30 fps,長度與配音完全相同。用戶的聲音保持原樣。背景音樂和音效以合成方式產生,並設定在人聲的50%。已於「永不離開的士兵」(19.7秒,8個鏡頭)中驗證。

規則

  • 故事、角色和鏡頭必須始終原創。切勿逐鏡頭複製其他創作者的影片。針對相同概念提供原創詮釋。
  • 角色不能是真實、具名的在世人物,也不能使用品牌吉祥物或標誌。
  • 除非用戶要求,否則不加字幕。故事中的文字(如刻劃的訊息、招牌)可以接受,且必須正確閱讀(不能鏡像)。
  • 絕不編輯或重新調整配音的時間。畫面需配合配音時間,每個視覺反應應在該詞語出現前0-3幀內發生。
  • 音訊音量: 背景音樂設定在人聲的50%(−6 dB,門控RMS)。音效設定在50%或略低,峰值限制,確保沒有任何撞擊聲高過旁白。務必使用mix.py進行混音,絕不手動。不使用任何會改變此比例的閃避或壓縮;僅在整個混音上套用一個線性增益和一個峰值限制器。
  • 隨時告知用戶進度,使用任務清單。在長時間渲染前,先傳送靜態畫面聯絡表。

階段1:輸入(始終優先)

如果已有音訊檔案附件,直接跳到階段4。如果也提供了腳本,則使用該腳本進行時間校準。否則,提出一個 AskUserQuestion(或純文字,若該工具不可用):「您從哪裡開始?」

  • 配音已準備好:要求用戶上傳配音,以及腳本文字(如果有,腳本可使時間校準更精確)。收到後跳到階段4。
  • 我有腳本,需要配音:如有必要,根據階段3潤飾腳本,連同錄音提示一起回傳,要求用戶上傳,然後跳到階段4。
  • 需要影片點子和腳本:跳到階段2。同時詢問目標長度(如果用戶尚未提供)。預設為20-30秒;可接受45-60秒。

階段2:10個影片點子

一次回覆中提供恰好10個點子,編號,並要求用戶回覆一個數字(或「更多」)。每個點子需包含:

  • 標題(5-8個詞,引發好奇心,例如「永不離開的士兵」)
  • 鉤子句:第一句口白,以事實陳述一個悖論(「一個人賣掉了艾菲爾鐵塔。兩次。」)
  • 轉折:一行說明(影片結尾的諷刺性收尾)
  • 為何適合動畫化:2-3個重要的視覺時刻(倒塌、揭露、追逐)
  • 真實或傳說:清楚說明是文獻記載的歷史、有爭議的說法,還是民間傳說。

什麼樣的點子對這個格式來說「完美」:

  • 一個令人驚訝的故事,具有可展示的物理因果關係。
  • 一個清晰的平凡角色,賭注逐漸升高,並在最後一句話中有轉折。
  • 一個可以用簡單3D形狀加上卡通卡片建構的場景(城鎮、橋樑、船隻、城堡、沙漠、實驗室、宮殿)。
  • 混合10個不同時代和主題的點子:古代、中世紀、1800年代、現代、科學、動物、發明、災難、奇怪的法律、幸運的意外。
  • 對於任何呈現為真實的內容,在提供前先透過網路搜尋驗證關鍵事實。不要將流傳的傳說當作事實呈現。如果用戶仍想要,則以「傳說稱」的方式呈現。
  • 不能以真實在世人物作為笑點,不能有血腥暴力或政治內容。

階段3:腳本(用戶選擇後)

僅撰寫旁白(口白文字中不含舞台指示),速度約為每秒3.7個詞:20秒 ≈ 75個詞,30秒 ≈ 110個,60秒 ≈ 220個。公式:

  1. 鉤子(第一句,無鋪陳):荒謬的事實。
  2. 背景:1-2行:何時、何地、何人、一個具體細節。
  3. 升級:2-4個節拍,每個節拍更加劇烈。他人懷疑或嘲笑。使用一個誇張的笑話。
  4. 謎團或轉折:「但當...」/「你知道,」引出真正的機制,通常用一個日常的比喻。
  5. 轉折/收尾:簡短、諷刺,並作為影片的最後一句話。使用簡單的口語英文、縮寫,句子長度約8-15個詞,數字寫成單字。絕不描述觀眾已經看到的內容。

然後回覆:

  • 包含腳本的可複製區塊,附上字數和預估長度。
  • 一段視覺計劃(你將製作的鏡頭)。
  • 錄音提示:一個平穩、溫暖的旁白聲音;ElevenLabs效果不錯(深沉的旁白聲音,速度約1.05-1.1,穩定性約45-55%)。Mp3或wav格式均可。在句子結尾處留自然停頓。匯出時不含音樂。
  • 要求:「配音準備好後請上傳,我將製作完整的影片。」 保留最終腳本文字。它驅動階段4的時間校準,因此無需語音辨識。如果用戶錄製了修改過的版本,請要求提供最終文字。

階段4:建構影片(配音上傳後)

從這裡開始不間斷地執行所有操作。僅在時間無法解決時提問。

4.0 取得套件

程式碼套件位於此技能資料夾內的kit/(引擎、工具、工作範例,以及來自github.com/mromidev/claude-animated-shorts的第三方three.js r160和toon.ts Pen函式庫,兩者均為MIT授權)。使用find / -name SKILL.md -path "*cartoon-audio-short*" 2>/dev/null定位資料夾,並將其kit/視為唯讀。

然後執行bash <skill>/kit/tools/setup.sh ~/shorts/<slug>。它會將引擎和工具複製到專案中,安裝第三方three.js,使用Node 22的module.stripTypeScriptTypes從toon.ts移除型別,並連結Playwright。無需網路。如果第三方檔案遺失,它會回退到npm或git clone。

  • 需求:Node 22.6+、Python 3(含numpy和Pillow)、ffmpeg,以及Playwright搭配Chromium(若缺少則執行npm i -g playwright && npx playwright install chromium)。
  • 如果套件註冊表被封鎖,透過GitHub的git通常可行。絕不禁用TLS或繞過代理。
  • Chromium:使用預先安裝的Playwright瀏覽器,搭配--use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist。這可提供CPU WebGL,每幀約3-10秒。

4.1 時間校準

執行python3 timing.py voice.mp3 script.txt --out work。

  • 如果已安裝whisper或faster-whisper,則使用詞彙時間戳記。
  • 否則,它會將腳本詞組(依標點符號分割)對齊到靜音偵測到的語音片段,使用動態規劃將音節與時長匹配,並懲罰句子結尾位於片段內以及詞組內的長間隔。
  • 沒有ASR也沒有腳本時,要求提供腳本。Claude無法聽取音訊。
  • 檢查work/phrases.json:停頓應落在句子結尾。總幀數 = round(持續時間 × 30)。

4.2 鏡頭計劃(程式碼前先有work/PLAN.md)

為每個鏡頭製作一行:幀數、詞語、場景、光線、攝影機移動、角色/姿勢/表情、效果和音效提示。

  • 第0幀即為鉤子影像。
  • 通常一個詞組一個鏡頭。將極短的詞組合併到下一個鏡頭。
  • 逐句說明每個句子。道具承載笑點。
  • 變化鏡頭大小:鉤子中特寫 → 廣角揭露 → 兩人鏡頭 → 關鍵物體的特寫插入 → 反應特寫 → 環境移動以呈現收尾。
  • 用光線表現節拍:白天用於正常,金色用於衰落或戲劇性,夜晚藍色用於解釋。時間跳躍會有一個6幀的白色閃光。
  • 轉折句搭配一個刺擊音效(音樂停止、低音撞擊、推近並旋轉)。最後一個鏡頭的物理收尾落在最後一個詞上。

4.3 世界(web/main.js)

保留引擎部分:卡通材質、墨水收縮、add/tbox、天空、燈光、卡片、渲染目標/後處理、applyLight、drawActors、swapForNd、renderFrame。將// ---------- world ----------和// ---------- cards ----------之間的範例世界,以及worldState()的故事部分替換掉。

  • 使用基本幾何形狀,搭配繪製的畫布紋理(paint.js:木板、橫樑、腐爛木頭、石頭、苔蘚/常春藤、草、泥土、灰泥、屋瓦、大理石、旗幟、雕刻文字)。以相同的平面帶深色接縫風格撰寫新的繪製器。
  • 使用tbox保持恆定像素密度、2級卡通漸層,以及霧 = 地平線顏色。
  • 背景:山丘(半埋球體)、山脈(圓錐 + 雪帽)、柏樹/松樹、遠方房屋、繪製的雲廣告板。
  • 場景道具(崩塌、墜落、門)是由0..1進度驅動的樞軸群組,來自worldAt(f),並帶有緩和和交錯的部分。
  • 曲線故事文字使用平面UV。檢查它沒有鏡像。

4.4 演員(web/roman.js → web/toon.js)

  • romanFront(p, outfitKey, opts) 在600x1000的設計畫布上繪製,腳底在y=975處。卡片高2.25米,因此1單位 = 0.00225米。
  • 將服裝添加到OUTFITS(束腰外衣/披風/盔甲/頭盔/頭髮/帽子/鬍鬚/圍裙/洋裝/長袍),並以相同風格添加新的頭飾和道具。
  • 手臂姿勢:垂掛、持矛、指、舉起、揮舞、叉腰、摸肚、摸太陽穴(+旋轉)、舉起、伸手(+舉起)、摸臉頰、盾牌、交叉、豎拇指。
  • 表情:toon.ts的FACE集合加上打鼾、固執、瞇眼。擴展FACE以獲得更多表情。
  • 編輯後使用cat web/toonbase.js web/roman.js > web/toon.js重建。在使用新設計前,渲染一個角色測試表。
  • 廣告板僅繞偏航旋轉,獲得接觸點模糊和Alpha測試陰影,且絕不被世界通道描繪墨線。
  • 從q()四捨五入的值構建卡片鍵(以便畫布僅在可見變化時重新繪製)。
  • 分離的部分(例如,舉起的頭盔)是它自己的卡片,與headCenter(seed)對齊:y = DECK + (partY − hc) × 0.00225。

4.5 動態:流暢且生動(web/motion.js)

  • 攝影機:camFromKeys(keys, f, {kicks})。使用更平滑的步進滑行(18-45幀),揭露和甩鏡時使用easeOut,以及經過點(Catmull-Rom)的path進行曲線移動。每個靜止都有微動,且沒有任何東西保持靜止超過4幀。在戲劇性場景使用3-5°旋轉,衝擊時使用7幀翻轉晃動。
  • 連續性:偏好連續移動(從特寫拉回廣角、拉焦、透過甲板移動起重機、推近物體)。僅在位置或時間跳躍時使用硬剪輯,並伴隨閃光。
  • 角色絕不靜止:對每個卡片套用idle(f, seed)、blinkAt眨眼,以及重音詞語上的頭部擺動。
  • 動作:預期 → back超調 → spring穩定。跺腳是2幀的下潛+灰塵噗+踢擊。笑聲是交替的傾斜+擺動。
  • 次要動態:旗幟布料波浪、葉子/灰塵/水滴/Zzz效果卡片、流動的水。總有東西在動。
  • 行走:walk()給出距離+步伐相位。腳掌著地,擺動3-7%。
  • 鏡頭:特寫和中景使用景深(cInf 8-14像素),對焦於眼睛。廣角鏡頭清晰。拉焦約需14幀。

4.6 外觀檢查(完整渲染前)

在每個鏡頭的中間點以及轉場和關鍵動作處渲染靜態畫面:node render.mjs stills/a "5,40,...",然後執行python3 sheet.py stills/a stills/sheet_a.jpg。檢查看板並修正以下陷阱:

  • 狹窄的垂直畫面:水平半寬度 = d·tan(hfov/2),其中hfov = 2·atan(tan(vfov/2)·0.5625)。在4米和fov 40時約為±0.8米,因此角色需在深度上安排。
  • 欄杆或柱子擋住臉部(攝影機在欄杆內或約2.5米高)。攝影機路徑穿過房屋、屋頂或灌木叢。前景道具距離小於約2米。主角躲在柱子後面。
  • 鏡像文字。分離部分卡片的偏移方向錯誤。
  • 擠出材質群組:0 = 端蓋,1 = 側面+頂部。
  • 缺少墨線:偵錯僅邊緣輸出。墨線半徑約2.5像素(1080p)。天空被視為遠距離,而非卡片。將看板連同一行鏡頭摘要發送給用戶,然後開始完整渲染。

4.7 音效(audio.py → 音軌 → mix.py)

為故事重寫提示表;合成器保持不變。audio.py僅寫入音軌(music.wav、sfx.wav)。

  • 音樂:類似進行曲的短循環(大鼓/小鼓、撥奏貝斯、銅管墊)。在轉折句處停止,然後一個低沉的持續音繼續。
  • 音效基於事件(以幀/30為單位):大動作時有呼嘯聲、跺腳時有砰聲、崩塌時有隆隆聲和撞擊聲、金屬刮擦聲、揭露時有叮噹聲、轉折時有刺擊聲、吱嘎聲、啪聲、潑、潑濺聲、鼾聲、樹葉聲、水環境音。
  • 使用python3 mix.py voice.mp3 music.wav sfx.wav進行混音。它會將音樂準確設定為人聲門控RMS的50%(−6 dB),並將音效設定為50%,峰值限制為人聲峰值的0.7倍。它會列印測量到的音量:確認音樂顯示相對於人聲為−6.0 dB,音效等於或低於此值。
  • 在製作音效前鎖定畫面時間。任何時間變更都意味著需要重新執行audio.py和mix.py。

4.8 渲染 + 完成

  • 使用Bash的run_in_background執行node render.mjs frames "0-<N-1>",並由監控循環監視,該循環回報進度並捕獲錯誤或程序退出。設定RESUME=1可在中斷後繼續。不要同時在小機器上運行沉重的Python程序。
  • 執行bash finish.sh "Title"。它會套用一個線性增益至約−14 LUFS,加上一個−1 dBFS峰值限制器,編碼為H.264 CRF 17 + AAC,執行凍結/黑畫面和大聲品質檢查,並寫入out/qa_sheet.jpg。查看看板。連續凍結≥0.4秒或黑畫面需要修正。
  • 使用SendUserFile交付MP4,並附上幾行關於每個鏡頭顯示內容的說明。提供字幕、調整或列表中下一個點子的選項。

引擎注意事項(保留在套件中;如果重建請保留)

  • #include <fog_vertex> / <fog_fragment> 需獨佔一行。
  • 最終通道寫入linearToOutputTexel(...)(渲染目標為線性HalfFloat)。
  • 法線+深度通道會按網格交換材質:世界 → 法線/深度,卡片 → Alpha測試遮罩(rgb 0,a = 深度),模糊/雲/天空隱藏,水 → 平面法線。在此期間霧和陰影關閉。
  • 墨線僅在深度跳躍的近側繪製。褶皺來自法線點積。相鄰卡片跳過。墨線在約140-520米處淡出。
  • 景深:48個取樣點,每個取樣點有CoC測試(無前景滲色)。
  • 太陽來自每個光照預設的方位角/仰角。陰影攝影機以每個鏡頭的動作中心為中心。

架構(編輯套件的參考)

  • web/index.html透過本地HTTP伺服器載入main.js(ES模組)

...

[因翻譯而截斷]

Individual skills in this repo

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

相關技能