卡通短片:點子 → 腳本 → 配音 → 完成版 MP4
外觀:扁平 2D 豆形頭卡通角色(畫布繪製的「卡片」,帶有李子色外框)在色彩繽紛的 3D 世界中,搭配黑色墨水外框、繪畫紋理、景深和滑行攝影機。輸出為 1080x1920,30 fps,長度與配音完全一致。用戶的聲音保持不變。背景音樂和音效是合成的:音樂低於人聲 16 dB,音效不超過人聲的 50%。已在「從未離開的士兵」(19.7 秒,8 個鏡頭)上得到驗證。
如果此技能以檔案形式到達聊天中
用戶可能會發送 SKILL.md 和 cartoon-short-kit.zip,並說「讀取此技能,安裝它並使用它」。然後:
- 閱讀整個檔案並遵循它。不要解釋什麼是技能,也不要問設定問題。
- 將工具包解壓縮到一個可寫入的資料夾(見 4.0)。確認
engine/main.js和vendor/three.module.js已存在。 - 如果此環境有個人技能資料夾(例如
~/.claude/skills/),請將SKILL.md和工具包複製到其中的cartoon-audio-short/。如果沒有,不要說它已永久安裝:只用一行說明它已準備好在本次聊天中使用,並且這兩個檔案需要在新的聊天中再次發送。 - 用一行簡短回覆,然後直接進入階段 1。
語言:阿拉伯語或英語
- 聊天: 從第一次回覆開始,用使用者訊息的語言回答。如果他們用阿拉伯語寫信或要求阿拉伯語,則每一條訊息都是阿拉伯文:問題、選項標籤和描述、任務清單、想法、進度說明、錯誤和交付說明。使用簡單的日常用語,如果他們用某種方言書寫,則匹配他們的方言。英文只保留在檔案名稱和命令中,並獨自佔一行,以免從右到左的文字打亂它們。
- 腳本: 腳本的語言遵循聊天,除非他們另有要求。在任何問題中輸入「أريد أفكار بالعربي」意味著進入階段 2,使用阿拉伯語。
- 阿拉伯語變體: 除非他們用某種方言(伊拉克語、埃及語、海灣語、黎凡特語等)書寫或要求,否則書寫簡單的標準阿拉伯語。不要停下來詢問。用一行結束腳本回覆:「تريده بلهجة ثانية؟ اكتب اللهجة وسأعيد كتابته。」除非他們要求,否則切勿在一個腳本中混合標準語和方言。
- 阿拉伯語的固定問題。 使用以下措辭:
- "من أين نبدأ؟"
- "الصوت جاهز": 上傳音訊檔案,如有文字也一併上傳,我將製作影片。
- "عندي نص": 我會改進它並給你錄音建議,然後在上傳音訊後製作影片。
- "أحتاج إلى أفكار ونص": 我會建議十個原創點子,然後為你選擇的點子寫腳本。
- "كم مدة الفيديو؟"
- "من 20 إلى 30 ثانية (مُوصى به)": 大約 40 到 60 個單詞。
- "من 30 إلى 45 ثانية": 大約 60 到 90 個單詞。
- "من 45 إلى 60 ثانية": 大約 90 到 120 個單詞。
- "من أين نبدأ؟"
規則
- 故事、角色和鏡頭始終是原創的。切勿逐鏡頭複製其他創作者的作品。而是提供相同點子的原創詮釋。
- 沒有真實的、具名的在世人物作為角色,也沒有品牌吉祥物或標誌。
- 除非使用者要求,否則不要加字幕。文本內文字(雕刻的訊息、標誌)是可以的,並且必須正確閱讀(不是鏡像)。標誌、標籤和標題使用腳本的語言:阿拉伯語影片使用 "بِيعَ",而不是 "SOLD"。按照 4.3 中的方式繪製它們。
- 切勿編輯或重新調整聲音的時間。圖片是根據聲音來定時的,每個視覺反應都在其單詞之前的 0-3 幀內。
- 音訊電平: 背景音樂應低於人聲 16 dB(閘控均方根),因此旁白保持清晰。音效位於 50% 或略低,峰值被限制,沒有任何打擊音突出於旁白之上。始終使用
mix.py進行混音,不要手動操作。不要使用會改變此比率的閃避或壓縮;只有一個線性增益加上一個峰值限制器應用於整個混音。 - 使用任務清單讓使用者知曉。在長時間渲染之前發送一張靜態影像連拍圖。
階段 1:接收(始終優先)
如果已附加音訊檔案,請跳到階段 4。如果也提供了腳本,則使用它進行定時。 否則,提出一個 AskUserQuestion(或純文字,如果該工具缺失):「您從哪裡開始?」
- 配音已準備好:要求他們上傳它,如果有的話也一併上傳腳本文字(腳本使定時更精確)。到達後進入階段 4。
- 我有腳本,需要配音:如有必要,根據階段 3 收緊腳本,連同錄音技巧一起回傳,要求上傳,然後進入階段 4。
- 需要影片點子和腳本:進入階段 2。 同時詢問目標長度(如果他們尚未說明)。預設為 20-30 秒;允許 45-60 秒。在阿拉伯語聊天中,使用「語言」部分下的措辭。
階段 2:10 個影片點子
在一次回覆中準確給出 10 個點子,編號,並要求使用者回覆一個數字(或「更多」)。每個點子獲得:
- 標題(5-8 個單詞,好奇心驅動,例如「從未離開的士兵」)。
- 鉤子句:第一句口語,一個悖論被陳述為事實(「一個人賣掉了艾菲爾鐵塔。兩次。」)。
- 轉折點一行(結束影片的諷刺性報應)。
- 為什麼它動畫化效果好:2-3 個重要的視覺時刻(倒塌、揭露、追逐)。
- 真實還是傳說:簡單說明它是有記錄的歷史、有爭議的描述還是民間傳說。
使一個點子「完美」適合此格式的因素:
- 一個具有可展示的物理因果關係的驚人故事。
- 一個清晰的普通人角色、不斷升級的利害關係以及最後一句話的轉折。
- 一個可以從簡單的 3D 形狀加上卡通卡片(城鎮、橋樑、船隻、城堡、沙漠、實驗室、宮殿)構建的場景。
- 將 10 個點子跨越時代和主題進行混合:古代、中世紀、19 世紀、現代、科學、動物、發明、災難、奇怪的法律、幸運的意外。
- 對於任何呈現為真實的內容,在提供之前用網路搜尋驗證關鍵事實。不要將病毒式傳說呈現為事實。如果使用者無論如何都想要它,則將其框定為「傳說說」。
- 沒有真實的在世人物作為笑話的對象,沒有圖形內容,也沒有政治內容。
對於阿拉伯語點子:
- 用阿拉伯語寫標題、鉤子、轉折點和說明。用自然的阿拉伯語句子書寫鉤子,而不是翻譯。給外國名字其常見的阿拉伯語拼寫。
- 將來自阿拉伯和伊斯蘭歷史與科學的故事與世界故事混合,使列表感覺像是為這個觀眾量身定做的。
- 同時搜尋阿拉伯語和英語。流行的阿拉伯語故事也常常沒有來源地傳播,因此以相同的方式標註它們為真實還是傳說。
- 切勿展示先知、他們的同伴或其他神聖人物作為角色。不要拿宗教、教派、部落或國籍開玩笑。
階段 3:腳本(在他們選擇之後)
只寫旁白(口語文字中沒有舞台指示)。英語約為 3.7 字/秒:20 秒 ≈ 75 字,30 秒 ≈ 110,60 秒 ≈ 220。阿拉伯語較慢,約為 2 字/秒:20 秒 ≈ 40 字,30 秒 ≈ 60,60 秒 ≈ 120。 阿拉伯語單詞承載更多音節,實際阿拉伯語聲音測量為 1.6-2.1 字/秒。公式:
- 鉤子(句子 1,無鋪陳):荒謬的事實。
- 設定用 1-2 行:何時、何地、何人、一個具體細節。
- 升級,2-4 個節拍,每個更大。其他人懷疑或嘲笑。使用一個誇張的笑話。
- 謎團或轉折:「但當…」 / 「你看,」引入真實機制,通常用一個日常類比。
- 轉折/報應:簡短、諷刺,並且是影片的最後一句話。 使用簡單的口語英語、縮寫、句子約 8-15 個單詞,數字寫成單詞。永遠不要描述觀眾已經看到的內容。
對於阿拉伯語腳本:
- 保持句子約 6-12 個單詞,並使用相同的五部分公式。諸如「لكن عندما…」和「والسبب؟」的轉折效果很好。
- 將數字和年份寫成單詞(ألف وتسعمئة وأربعة وتسعون),並將外來詞和品牌名稱用阿拉伯字母拼寫,以便聲音正確讀取它們。
- 為聲音加標點:「،」和「。」用於呼吸,「…」用於揭示前的停頓,「?」用於問題。定時也使用此標點。
- 提供一個可複製的語音區塊,準備好貼上到語音產生器中:
- 每個單詞上的變音符號,這在名稱和具有多種讀音的單詞上最有幫助。省略敘述者不會說的詞尾變化,並按口語書寫方言。如果他們要求不加變音符號,或者聽起來不對,則將其刪除。
- 英文的 Eleven v3 音頻標籤,例如 [excited]、[curious]、[serious]、[whispers]、[warmly]。每個句子組最多使用一兩個,僅在單詞需要的地方使用。
- 伊拉克語的 "g": 在口語發音需要的地方書寫 گ 和 چ(تِگْدَر,لْگِيت),因為 ك 讀作 "k"。
- 部分: 對於超過約 700 個字元的腳本,在句子結尾將其分成編號的部分。
- 字數和長度使用上述阿拉伯語速率,忽略標籤和變音符號。
然後回覆:
- 腳本在可複製區塊中,附帶字數和估計長度。
- 一段視覺計劃(你將製作的鏡頭)。
- 錄音技巧:一個穩定、溫暖的敘述者聲音;ElevenLabs 效果很好(深沉的敘述者聲音,速度約 1.05-1.1,穩定性約 45-55%)。Mp3 或 wav 都可以。在句子結尾留下自然停頓。匯出時不帶音樂。
- 阿拉伯語錄音技巧:使用 Eleven v3,因為舊型號會大聲朗讀 [tags] 標籤。從穩定性設定為自然,速度約 0.95 開始,在產生所有內容之前先嘗試前幾個句子。使用另一個產生器時,首先刪除標籤。他們自己的聲音也可以,無需標籤或變音符號。
- 要求:「配音準備好後上傳,我將製作完整的影片。」 保留最終的腳本文字。它驅動階段 4 中的定時,因此不需要語音辨識。如果他們錄製了更改過的版本,請要求提供最終文字。
階段 4:建立影片(上傳配音後)
從現在開始不間斷地執行所有操作。僅在無法解決定時問題時才提問。
4.0 取得工具包
程式碼工具包包含引擎、工具、實例、供應的 three.js r160、來自 github.com/mromidev/claude-animated-shorts 的 toon.ts Pen 庫(均為 MIT 許可)和 Lalezar 阿拉伯語字體(SIL OFL)。按以下順序找到它,並將其視為唯讀:
- 此
SKILL.md旁邊的kit/資料夾,使用find / -name SKILL.md -path "*cartoon-audio-short*" 2>/dev/null找到。 - 一個已解壓縮的
cartoon-short-kit資料夾。 - 在本次聊天中發送的檔案中的
cartoon-short-kit.zip:find / -name "cartoon-short-kit*.zip" 2>/dev/null,然後將其解壓縮到~/cartoon-short-kit-src/。工具包是其中包含engine/的資料夾。
然後執行 bash <kit>/tools/setup.sh ~/shorts/<slug>。它將引擎和工具複製到專案中,安裝供應的 three.js,使用 Node 22 的 module.stripTypeScriptTypes 從 toon.ts 中移除類型,並連結 Playwright。無需網路。如果缺少供應的檔案,它會回退到 npm 或 git clone。
- 要求:Node 22.6+、帶有 numpy + Pillow 的 Python 3、ffmpeg,以及帶有 Chromium 的 Playwright(如果缺失,執行
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。如果沒有腳本,則為阿拉伯語新增 --lang ar。腳本可以是準確的語音區塊:它會移除 [tags] 和變音符號,並在阿拉伯語標點處分割片語。
- 如果安裝了 whisper 或 faster-whisper,它會使用單詞時間戳記。對於阿拉伯語,它使用多語言模型,並保留腳本本身的單詞,因此聽錯的方言單詞不會改變文字。
- 否則,它會將腳本片語(在標點處分割)對齊到靜音偵測到的語音片段,使用一個 DP 來比對音節與持續時間,並懲罰在片段內部的句子結尾以及在片語內部的長間隙。
- 沒有 ASR 且沒有腳本時,要求提供腳本。Claude 無法聽到音頻。
- 檢查
work/phrases.json:停頓應落在句子結尾。總幀數 = round(duration × 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。檢查它是否沒有鏡像。
- 任何物體上的阿拉伯文字: 使用
P.signCanvas(text, opts)搭配P.tex()用於標誌和標籤,P.drawText()用於你自己的畫布,或P.carvedText()用於雕刻。它們載入捆綁的字體,設定從右到左,並繪製完整的字串。永遠不要逐字母繪製阿拉伯文。
4.4 角色
使用 P.character():一個附加身體/衣服/頭髮的豆形頭。臉部表情是繪製的:眼睛(睜開/閉上/瞇眼/驚嚇/思考)、眉毛(向上/向下/內八/外八/聳肩/無聊)、嘴巴(微笑/悲傷/O 型/露齒/大喊/噘嘴/僅張開/閉著)。將其保存下來。
- 保持可讀:卡片上的繪圖是清晰的線條藝術,在 1080p 下具有良好的對比度。
- 顏色:使用 3-4 種色調的色調範圍。為角色的衣服和頭髮設定統一的外觀。
- 每個鏡頭使用
P.createActors()並只繪製需要的演員。 - 動畫:透過位置變化、循環行走動畫以及關鍵姿勢之間的形狀插值來實現。
4.5 配音定時
將 framework/voice.js 中的音訊資料複製到 main.js 中:一個形如 {phrase: [startTime, endTime] ...} 的時間戳記陣列。使用 voicecue(name) 來觸發片語。
- 對話氣泡(可選):使用
P.bubble()搭配框架和文字。如果是阿拉伯語,則從右到左對齊。檢查文字方向。
4.6 渲染
執行 node web/main.js。它會建立一個名為 work/render/ 的資料夾,帶有 PNG 幀。然後執行 bash tools/render.sh work/voice.mp3 30。這會產生 final.mp4。
- 如果幀已存在且
main.js沒有改變,則main.js會跳過渲染(斷點續傳)。 - 如果 Chromium 失敗,請檢查它是否已安裝且可執行。如果需要,使用
playwright install chromium重新安裝。 - 音訊:
mix.py處理最終音訊混合。
4.7 交付
將 final.mp4 傳送給使用者。同時傳送一兩幀,以便他們可以看到結果。
工具
timing.py:對齊腳本和音訊。paint.js:生成畫布紋理。mix.py:混合音訊。setup.sh:設定專案。render.sh:渲染最終影片。