Communitygithub.com

Block Town ─ 積木小鎮影片製作工具

從點子到完整的 1080×1920 MP4,製作「在這小鎮/在這世界」風格的 Roblox 立體垂直故事影片:規則、腳本、旁白、以程式碼在 Blender 中打造世界與角色、以 Three.js 渲染、鏡頭、生命層、手機畫面與道具、卡拉 OK 字幕、ElevenLabs 或內建音效、穩定的語音混音與音樂檔案。

Block Town ─ 積木小鎮影片製作工具 是什麼?

Block Town 是一個完整的 AI 輔助工具套件,專為製作「在這小鎮/在這世界」風格的 Roblox 式立體垂直故事影片而設計。它涵蓋從原始概念到最終 1080×1920 MP4 的完整流程:產生規則、撰寫腳本、生成旁白、在 Blender 中以程式碼建構世界與角色、用 Three.js 渲染、安排鏡頭、加入「生命層」動畫、手機畫面與道具、卡拉 OK 字幕、ElevenLabs 或內建音效,以及穩定的語音混音與音樂。支援 Claude Code、Cursor 及 Codex 等 AI 代理平台。此工具套件完全以程式碼驅動,不使用任何下載的模型或盜用素材;所有內容皆由 Python 腳本生成,確保版權與原創性。品質要求極高:畫面不可靜止、標籤不可被遮蓋或切斷、每個螢幕必須像真實手機、語音音量須維持 ±1 dB 範圍內。整個製作流程被分為七個明確的閘門,每個閘門都會暫停等待使用者確認,並在關鍵創意環節提供選項與建議。此工具整合了 Blender(建構與擺位)與 Three.js(最終渲染),將渲染時間從數小時縮短至約 10 分鐘。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/chihabMe/block-town/tree/HEAD

在你喜歡的 AI 中提問

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

說明文件

Block Town ─ 積木小鎮

這個資料夾就是完整工具包:小鎮、角色、動作、渲染器、語音、音效、音樂設定,以及從點子到完成垂直影片的步驟。技能資料夾是包含此檔案的目錄,以下簡稱 SKILL。每一集(episode)存放在技能資料夾之外(由使用者命名),以下簡稱 EPISODE。請使用絕對路徑。

開始建構前,請先閱讀:docs/ROBLOX_LOOK.md(世界、角色、道具、鏡頭製作方式)、docs/RENDER.md(Three.js 渲染器、生命層、標籤、手機畫面與列印道具)、docs/SCRIPT.md(故事撰寫方式)、docs/VOICE.md(語音與音樂)、docs/SOUND.md(音效、ElevenLabs、穩定語音混音)。docs/PROMPTS.md 提供了每個階段的提示。docs/GUIDE.md 是原始的積木風格手冊:地圖、pose()、移動與攝影機規則仍然適用。

影片製作方式(從 ep05 開始)

Blender 根據該集的 Python 程式碼建構並擺放所有物件;Three.js 負責繪製最終畫面。Blender 自身的渲染器僅用於設計圖與單幀靜態圖。

episode.py ──(Blender:建構小鎮、為每一幀擺位、生命層)──> 烘焙輸出:scene.glb + anim.bin + materials.json
           ──(Three.js 於 headless Chrome 中執行)──> EPISODE/frames/f_####.jpg  (每幀約 0.1-0.15 秒)
           ──(finish.py:字幕、均衡音量語音、音效、音樂)──> EPISODE/<名稱>.mp4 與 <名稱>_music.mp4

一部 66 秒的影片從幀到完成 MP4 約需 10-12 分鐘(Blender EEVEE 則約需 3 小時)。

絕不

  • 不使用任何 Roblox 商品、下載的模型、影片素材、或其他創作者的故事與音訊。畫面中所有內容皆以程式碼建構,或由 blockworld/pictures.py 繪製。可研究爆紅影片的製作手法,但絕不挪用。
  • 未經使用者同意,不進行任何付費 API 呼叫。Fish Audio(語音)與 ElevenLabs(音效)會產生費用:執行前須告知費用。sfx_gen.py 會檢查剩餘 credits 並在保留額度前停止;絕不提高保留額度或循環生成「再試一次」。下載任何內容前須先詢問。
  • 此工具包不包含任何音樂與參考語音片段。音樂僅來自使用者提供的檔案,且僅放入 _music.mp4 版本。若該音樂檔案是從其他創作者影片中截取,必須明確告知 _music.mp4 不得發布:請發布乾淨的 <名稱>.mp4,並在 TikTok 的音效選擇器中加入歌曲。
  • 不更改八個固定角色(顏色、髮型、服裝):blockworld/town.py。
  • 不將已進行中的影片切換為另一種風格。
  • 不使用無法解釋的抽象圖形。光束、線條或兩個小人間的發光效果無法傳達資訊(ep05 的「送出每一條訊號條」光束看起來像「一條藍色線」)。請展示具體事物:從標籤飛出的訊號條、倒數計數器、寫著文字的手機畫面。

視覺風格

新影片使用 Roblox 風格:build_town(..., style="roblox")。圓頭搭配動漫風臉孔、多層次頭髮、印花衣服、閃亮塑膠質感、陽光/霧氣/雨天氛圍、三字卡拉 OK 字幕。較舊的積木風格(方塊頭、純色)仍保留給已開始使用該風格的影片:build_town(...) 不帶 style 參數即為積木風格,因此新影片務必寫入 style="roblox"。

品質標準(使用者曾拒絕或要求的事項)

  • 沒有任何事物是靜止的。 啟用生命層渲染(BT_LIFE=1,為 render_threejs.sh 的預設值):呼吸、視線移動、重心轉移、每次剪輯時的跳動、攝影機晃動與推進、搖曳的樹木、飄動的雲朵、漂浮的標籤、旋轉的載入轉圈、脈動的 Wi-Fi 環、跳動的訊號條。只有攝影機緩慢移動的鏡頭是無力的鏡頭:為它加入自己的動作。
  • 標籤與對話框永不遮蓋或切斷。 生命層將它們繪製在所有物件之上,提升至頭髮上方,並保持在 TikTok 安全區域內(x 5-85 %,y 在字幕上方)。檢查兩個標籤勿互相重疊(此功能尚未自動化)。
  • 每個螢幕看起來都像真實手機:使用 big_phone(screen=...) 搭配 pictures.py 繪製的圖片(狀態列、「沒有服務」、應用程式佈局、握著手機的手),絕不使用白色方塊加上 3D 文字。手持手機顯示鎖定畫面。
  • 道具在手機尺寸下清晰可讀:紙本地圖是真實繪製的地圖(paper_map()),標誌完整出現在畫面中(將攝影機拉遠:一個 10 單位的標誌在 9:16 畫面中約需 25 單位的距離)。
  • 語音音量絕不衰減。 finish.json 中的 {"voice": "vo/voice_level.wav", "loudness": "static"}:旁白逐句均衡,混音使用固定增益,因此大聲的音效不會讓語音音量降低。測量標準:全片短期響度應維持在 -14 LUFS 的 ±1 dB 範圍內。
  • 不疊加或使用刺耳的音效。 一個時刻只放一個音效;音效長度不超過該時刻;半秒內不出現兩個「錯誤」音效。

製作一集影片:七大閘門

每個閘門完成後暫停,展示結果,並等待使用者。遇到真正的創意選擇時,提供兩到三個選項,並說明你的推薦。

閘門你製作的內容向使用者展示
1 規則三個規則(來自使用者的點子或 docs/SCRIPT.md 測試),每個規則附帶氛圍與地標想法一個表格
2 腳本EPISODE/script.txt(每行一句)和 EPISODE/SCRIPT.md:選項 A 與 B、節拍表、評論分數腳本
3 語音vo.py、words.py、voice_check.py(免費 Fish 試錄)、level_voice.pyvo/voice.wav 及其數據
4 設計EPISODE/design/episode.py:每個新地標、道具、服裝與角色的一張靜態圖;所有手機畫面與列印道具的 EPISODE/pictures.json 與 pictures.pyDESIGN_SHEET.jpg + 螢幕畫面
5 靜態圖EPISODE/episode.py 包含所有鏡頭;check;修正;contact_sheet.pyCONTACT_SHEET.jpg
6 鉤子前約 15 秒:render_threejs.sh EPISODE 0 F1、音效提示、finish.pyMP4
7 完整影片render_threejs.sh EPISODE、音效、finish.py(純淨檔案 + 音樂檔案);經核可後,付費語音錄製兩個 MP4

各閘門的詳細說明在 docs/PROMPTS.md(提示 1 可執行整個流程)。複製 examples/ep05-wifi 作為起點:這是一集使用此方法完成的範例,包含其設計稿、42 個鏡頭、手機圖片、提示與設定。

付費最終錄音是新的錄製:重新執行 words.py 與 level_voice.py,然後 check,再重新渲染(鏡頭會跟隨語音時間點)。因此請在閘門 3 核准免費試錄的時間點,但如果使用者想要發布,請在閘門 6 之前進行付費錄音。

指令

# 語音(閘門 3)
python3 SKILL/blockworld/vo.py EPISODE                 # 使用 Fish "Roblox" 語音錄製一次(vo_config.json)
python3 SKILL/blockworld/vo.py EPISODE --post-only     # 對已儲存的錄音重新調整緊湊度/臨場感/速度,不進行新呼叫
python3 SKILL/blockworld/words.py EPISODE              # 語音時間點 -> vo/times.json
python3 -I SKILL/blockworld/voice_check.py EPISODE     # 速度、停頓、亮度與爆紅影片範圍比較
python3 -I SKILL/blockworld/level_voice.py EPISODE     # 所有句子均衡至同一音量 -> vo/voice_level.wav

# 道具用圖片(閘門 4)
python3 -I SKILL/blockworld/pictures.py EPISODE        # EPISODE/pictures.json -> EPISODE/pictures/*.png

# 鏡頭(閘門 4-5):Blender,一律透過 run.py 並使用 --factory-startup
blender -b --factory-startup --python-exit-code 1 -P SKILL/blockworld/run.py -- EPISODE check
BT_LIFE=1 blender -b --factory-startup --python-exit-code 1 -P SKILL/blockworld/run.py -- EPISODE stills [shot ...]
blender -b --factory-startup --python-exit-code 1 -P SKILL/blockworld/run.py -- EPISODE frame 12.5
python3 -I SKILL/blockworld/contact_sheet.py EPISODE   # 每個鏡頭一張編號靜態圖 -> CONTACT_SHEET.jpg

# 最終幀(閘門 6-7):Three.js
bash SKILL/blockworld/render_threejs.sh EPISODE              # 所有幀 -> EPISODE/frames/(66 秒約需 10 分鐘)
bash SKILL/blockworld/render_threejs.sh EPISODE F0 F1        # 僅 F0..F1(鉤子、重新製作的鏡頭)

# 音效(閘門 6-7):請參閱 docs/SOUND.md
python3 -I SKILL/blockworld/sfx_gen.py --credits             # ElevenLabs 剩餘 credits
python3 -I SKILL/blockworld/sfx_gen.py el-tag-pop ep07-...   # 從 sfx/ELEVENLABS_LIST.md 生成具名音效
python3 -I SKILL/blockworld/cues.py EPISODE cues_spec.json   # 根據語音文字產生提示("say": "froze")-> EPISODE/cues.json

# 完成(閘門 6-7)
python3 -I SKILL/blockworld/finish.py EPISODE                # 字幕 + 語音 + 音效(含循環背景)+ 音樂 -> 輸出 MP4
  • check 不渲染任何畫面:它會執行每個鏡頭,印出鏡頭表,並警告超過 2.5 秒的鏡頭。
  • 自動靜態圖檢查(blockworld/stillcheck.py,自 ep08 起):在每個鏡頭中呼叫 focus(character, tag, ...)。check 和 stills 會回報面部被擋住(被柱子、人物、標籤或角色自己的手臂遮擋)、面部落在字幕區域下方、標籤超出安全區域(x 5-85 %,位於 TikTok 頂部欄與字幕之間)、標籤互相重疊,以及任何距離鏡頭 1 單位內的物體。結果寫入 EPISODE/still_check.txt。在展示靜態圖之前修正每一項,然後仍然要親自檢視靜態圖:此檢查不判斷構圖或圖片是否傳達台詞。
  • 60 fps 搭配動態模糊(選擇性):finish.json 中的 "render_fps": 240, "blur": 4 會渲染每秒 240 幀,並將每 4 幀平均為 1 個 60 fps 幀。渲染時間約為影片每秒需要 1.6 分鐘。
  • 色彩轉折(選擇性):finish.json 中的 "grade": {"word": 24, "ramp": 0.5, "saturation": 0.6, "brightness": -0.05, "cool": 0.1, "vignette": true} 會從該腳本詞語(故事的轉折點)開始,使畫面變得更冷、更暗、更平面。字幕不受色彩調整影響。finish.py EPISODE --plain 也會寫出 <名稱>_plain.mp4(30 fps、無動態模糊、無色彩調整),供並排比較使用。
  • ep08(episodes/ep08-price-tags-10s)是這些功能的 10 秒測試,鏡頭長度約 1 秒。
  • stills 會為每個鏡頭寫入兩張半尺寸的 Blender 圖片(進度 30% 與 85%)到 EPISODE/stills/。請使用 BT_LIFE=1,這樣標籤的位置會與最終渲染相同。在展示任何靜態圖之前,請先逐一檢視每一張。
  • render_threejs.sh 會背景執行(若指令超時,約 10 分鐘可完成 66 秒)。首次使用時會安裝兩個 npm 套件(blockworld/threejs/),並需要 Chrome 或 Chromium(使用 CHROME=/路徑 指定)。烘焙檔案保留在 EPISODE/threejs/;使用者接受影片後,可刪除該資料夾與 frames/ 資料夾。
  • 修改 episode.py、某個佈景或圖片後:重新執行 render_threejs.sh(烘焙會讀取程式碼;每次執行之間無快取)。
  • render_all.sh(Blender EEVEE 幀)僅保留用於比較:每幀約 3-6 秒。
  • 鉤子:執行 render_threejs.sh EPISODE 0 F1,其中 F1 是約 15 秒後第一次剪輯前的最後一幀,然後執行 finish.py(它會使用已存在的幀),並重新命名 MP4 以免被完整影片覆蓋。
  • 觀看整部影片中的幀(至少每個鏡頭一幀),並在完成前測量響度。若無法收聽,請明確說明,並列出你檢查了哪些項目。

檔案配置

路徑內容
blockworld/town.py街道、角色、pose()、燈光、攝影機、build_town(style=...)
blockworld/roblox.pyRoblox 風格:rchar、塑膠材質、氛圍、rule_sign、giant_clock、puddles
blockworld/rprops.py預製道具:訊號條標籤與飛出條碼、附真實螢幕與手的電話、發光與列印圖片、折疊地圖、海報、肩帶、高帽、公車、門、光束、鴿子、Wi-Fi 塔
blockworld/pictures.py、blockworld/pictures/從 pictures.json 繪製手機畫面、鎖定畫面與地圖;工具包預設圖片
blockworld/anim.py語音時間輔助工具、卡片(標籤、對話框)、stand、walk、跑步者
blockworld/life.py生命層(BT_LIFE=1):閒置動作、攝影機、場景搖晃、轉圈、標籤放置
blockworld/threejs/渲染器:bake.py(Blender 端)、scene.html + capture.mjs(Three.js 端)
blockworld/render_threejs.sh烘焙 + 繪製,標準的最終幀製作方式
blockworld/vo.py、words.py、voice_check.py、level_voice.py語音、語音時間點、語音檢查、音量均衡
blockworld/sfx_gen.py、sfx/ELEVENLABS_LIST.mdElevenLabs 音效:生成器與提示列表
blockworld/finish.py字幕、語音、音效(包含循環背景)、音樂、穩定混音、輸出 MP4
blockworld/cues.py根據語音文字產生的提示列表 -> cues.json
sfx/音效:Pixabay 素材(sfx/CREDITS.md);ElevenLabs 音效生成後存放於此,命名為 el-*.mp3 / epNN-*.mp3(截至 ep05 尚無任何檔案)
examples/ep05-wifi完整實作範例(Roblox 風格,Three.js 渲染器)
examples/ep00-roblox-look、examples/ep01-introRoblox 風格與積木風格的簡短示範

相關技能