mori-sprite-studio:給角色一個可見的身體

從一張角色 ref 圖,自動生 8 個 state 的 1024×1024 sprite 動畫包 — Mori 的「身體工廠」,也適合任何想給角色可見形態的人

mori-sprite-studio cover

🔗 快速連結


這個工具做什麼

給它一張角色 ref 圖,它生出完整 8 個 state 的 sprite 動畫包:

必要 6 個 可選 2 個
idle(站著)/ sleeping(睡)/ recording(在聽)/ thinking(思考)/ done(完成歡呼)/ error(出包慌張) walking(走路)/ dragging(被滑鼠拎起來)

每個 state 都是 1024×1024 的 4×4 sprite sheet(16 frame row-major)。打包成 .moripack.zip 餵給 mori-desktop 的浮動視窗播放,Mori 就有可見的身體

當然也可以單獨匯出 APNG / GIF / WebM,做 LINE 動態貼圖、Discord、OBS overlay 都行。

為什麼做

Mori 是我自己的 Jarvis-style AI 夥伴,住在桌面上。她需要可見的身體 — 不同情境下要有不同表情(在聽我說話 vs 思考中 vs 報錯時驚慌),不是一張靜態 PNG 能搞定的。

一開始先求有 — bundled 的 sprite 是用 nanobanana 從一張 ref 圖直出的 256×256 PNG,靜態。後來把 sprite pipeline 升上 4×4(steps(4) + background-size: 400% 400%character-pack.md v1.0 spec、1024×1024 sheet 規劃)— 架構先到位,內容還是塞靜態複製。

這個 studio 就是把最後一塊補上:一張 ref 圖丟進去,30 分鐘出整套真正會動的 4×4 sheet(視 AI provider + 多少 reroll)。不用會畫畫,有美感修正 / 對齊 / 手動 cell 排序的工具,但不是必須。

怎麼用

最快路徑(60 秒看完整範例)

  1. mori-sprite-studio.vercel.app
  2. 點「✦ 載入 Mori 預設範本」(會跳確認對話框,接受)
  3. 看 sidebar 8 個 state 全部就位、桌面預覽看完整角色 — 我用這個工具做出的 Mori 就在裡面

完整流程

  1. 上傳角色 ref — 任何 PNG / JPG,任何背景都行
  2. 生 6 個靜態 — 一次 AI call 出 3×2 grid,自動切成 6 個 state pose
  3. 每 state 生動畫(必要 6 個)— pre-tile + 多 anchor identity ref,鎖住角色位置只加微擾(眨眼 / 呼吸 / 小手勢)
  4. 可選 walking + dragging — 走獨立 W/Dr pipeline(不 pre-tile,因為步行循環需要每格 pose 都不同)
  5. 手動細調 — 反向順序、換位模式、跨 state normalize、scale / offset sliders、單格重生
  6. 匯出 .moripack.zip — 拖進 mori-desktop characters 資料夾,重啟,角色就動起來了

三個技術重點

1. C template vs W/Dr template:idle 系列 vs 循環運動系列要分開

最直覺的做法是「一個 template 處理所有 state 的動畫」。試了一輪發現這不可行:

所以這 2 個 state 走獨立 W / Dr template + 不 pre-tile,只給 character ref + 其他 state 的 staticBase 當 identity anchor。AI 從零設計 16 frame 的 gait / swing cycle,template 內含明確的「cell 1 = 左腳前、cell 7 = 右腳前」結構引導。

2. AI image model 對連續 motion 有 fundamental 限制

Gemini / DALL-E / gpt-image 這類 image generation model 訓練資料是單張靜態圖,不是時間序列。當我們塞 4×4 grid 給它,它把整張 1024×1024 當「一張 16 mini-pictures 的拼接」看,不知道 cell 順序代表時間軸。

寫「Frame 1 左腳前、Frame 7 右腳前」這種 step-by-step,AI 不會精準照做。它畫得出單張的「左腳前」「右腳前」,但 4×4 grid 內的 16 frame 是否 form a coherent gait cycle — 這超出它的訓練分布。

實作上的妥協:

3. 跟 codex-image-service 的串接

預設 provider 是 Author Fallback(我自掏腰包跑的 server,per-IP 50 次/day,Vercel KV 持久化計數)。新 user 不用任何設定可以直接玩。

但長期用 Author Fallback 我會破產 😅。所以有 Codex-Image provider — 串接上篇文 介紹的 codex-image-service,讓 user 用自己的 ChatGPT Plus / Pro 訂閱額度跑生圖。

路徑 何時用
Author Fallback(預設) 嚐鮮 / 偶爾用 / 不想設定
自架 Codex-Image-Service 有 ChatGPT Plus + 想無限用
兩個都自架 全離線、全掌控

整合 codex-image-service 過程中順手送了兩個 PR 回 upstream(都已 merged):

Self-hosters 也 nginx 那邊加 CORS header 反射 origin,所以從 web app 跨 origin 呼叫沒問題。

跟 forest-guild 宇宙的位置

這是 Mori 宇宙的第 N 個側翼:

召喚師 ──┐
         │  (生產者)
         ▼
mori-sprite-studio  ──→  Mori 的可見身體
         │
         ▼
mori-desktop  ──→  Mori 的桌面實體(Rust + Tauri 2)
         │
         ▼
(耳 Whisper · 腦 LLM · 你是同伴)

跟其他姐妹專案的關係:

接下來

歡迎試玩,有 bug 開 issue,有趣的角色包貼給我看 🌿

想支持持續開發? 請我喝杯咖啡 → buymeacoffee.com/yazelin 自掏腰包跑 Author Fallback 的 quota 真的會撐爆,每杯咖啡都會直接灌進去。