半身皮套:從一張立繪到 VTube Studio
給不想手動建模、不想調網格的人。一張立繪或一段角色描述進去,Agent 一步步做出能在 VTS 裡直播用的半身 Live2D 皮套。用戶只做三件事:
- 確認立繪(第 1 步);
- 同意把立繪傳到 See-through(第 3 步,Hugging Face,備用魔搭);
- 在 VTS 裡看效果,回覆
通過或不通過:<現象>(第 5 步)。
其餘由 Agent 完成,並在交給用戶前自查。
跑一次就有的功能
| 功能 | 驅動 |
|---|---|
| 轉頭左右、上下(±30),歪頭時身體跟著傾斜 | 攝影機 |
| 身體跟隨:左右轉、前後、呼吸起伏 | 攝影機、VTS 自動呼吸 |
| 眨眼、單眼眨眼(快閉上時換成畫好的閉眼);半閉眼時雙眼皮淡出 | 攝影機(左右眼分開) |
| 眼珠跟隨、眉毛上下 | 攝影機 |
| 張嘴說話、嘴角笑 | 攝影機 |
| 頭髮分段擺動:劉海(可選)、兩側(三段,從髮根到髮梢一段跟一段;可別在耳後)、後髮或髮髻;點頭時上下彈。雙馬尾每條從髮繩往下單獨擺,同樣分三段。過肩長髮在肩膀以下跟身體走 | 物理 |
| 掛件(項鍊吊墜、耳墜)擺動 | 物理 |
| 眼鏡跟著臉轉 | 攝影機 |
| 表情:笑眼 N1、O 型嘴 N2、急眼 N3、困擾 N4,清除 N0 | 快捷鍵 |
| 手勢:招手 N5、攤手 N6、指向 N7 | 快捷鍵(也配了攝影機手勢,見「已知問題」) |
| 臉紅 N8 | 快捷鍵 |
做不到:大角度轉頭(要側臉素材)、全身、手臂跟著攝影機連續動(要分段手臂素材)。產出是 VTS 直接用的 .moc3,不是 Cubism Editor 的工程檔案(.cmo3),Editor 打不開。精修級的效果(更細的物理、更多表情、商業級網格)要把 layers-st/ 的圖層導進 Cubism Editor 重新綁定。
資料夾
素材/角色名/ 立繪、提示詞、變體、See-through 結果、圖層
A0-base.png 定稿立繪
prompts/ 從 references/提示詞/標準/ 複製,填好 [[…]]
check/ 每張變體的對位檢查圖
seethrough.psd See-through 的原始結果
seethrough/ 拆成每層一張 PNG
layers/ 自拆的圖層:只作 See-through 合成的底,不單獨交付
layers-st/ 最終圖層(See-through 合成,含手勢和臉紅)
R0-rest.png 最終圖層的靜止合成,手勢和臉紅變體的底圖
角色/角色名/
character.json 位置、幅度、圖層對照
標註.png character.json 裡的位置畫在立繪上
素材檢查/ prepared/ build/runtime/ 自查/ vts/
步驟
命令都在用戶的工作目錄(放 素材/、角色/ 的地方)裡跑,命令前加 PYTHONPATH=<skill 目錄>(如 ~/.claude/skills/live2d-halfbody),Python 才找得到 rigkit。
0. 檢查環境
python -m rigkit.doctor
有 ✗ 的先處理完再出圖,否則會在出完二十來張圖之後才卡住。! 只影響一部分:沒有 See-through 令牌時匿名額度不一定夠,沒有 ffmpeg 時出不了自查短片,沒有 Codex 時用其他圖像工具出圖(見第 2 步)。
1. 立繪 —— 用戶確認
把 references/提示詞/標準/ 整個複製到 素材/角色名/prompts/,先填好 A0-base.txt 裡的 [[…]](外貌、劉海、兩側頭髮、頭髮長短、眼鏡、耳墜)。
- 只有描述:照描述填,生成立繪。
- 有立繪:存為
素材/角色名/參考.png,生成時作為參考圖附上,得到一張按綁定要求畫的版本(脖子露出;有劉海時停在眉毛以上;兩側頭髮蓋住耳朵到下巴為止,或別在耳後;平光、白底、手臂和身體之間留縫)。原圖不滿足這些要求時,直接拆會在動起來時出問題。
python -m rigkit.variants 素材/角色名 A0-base
沒有 Codex 時按第 2 步的「用其他圖像工具出圖」出 A0。給用戶看,用戶確認後才往下做。
已有按 圖層清單 分好層的檔案時,跳到第 4 步。
2. 出圖
把 prompts/ 裡其餘的 [[…]] 換成這個角色的描述;角色沒有的部件刪掉對應的提示詞:帽子或髮飾 V1,耳前的側髮 V2,劉海 V3,掛件 V9(S1 裡同時刪掉那一行,見 出圖)。然後:
python -m rigkit.variants 素材/角色名
依序生成 13~17 張「整張圖改一處」的變體,每張出對位檢查圖。偏移 4 px 以內、改動只在該改的地方算合格;不合格刪掉重出,同一張最多三次。細節見 出圖。
用其他圖像工具出圖(沒有 Codex,或 Agent 自己能出圖):variants 遇到已經有的圖只做檢查,不重出,所以可以先用別的工具把圖出好放進去。
python -m rigkit.variants 素材/角色名 --list
每行一張圖:要附的圖、提示詞檔案、出了沒有。按順序一次出一張,附的圖標著「還沒有」時等它出好:
- 提示詞用
prompts/<名>.txt的全文,不改寫;只附列出的那一張圖,讓工具在它上面改。A0 附參考圖,沒有參考圖時直接生成。 - 工具要能改圖:給一張圖和提示詞,返回改過的同一個圖。只能憑文字出新圖的工具只能出 A0。
- 存為
素材/角色名/<名>.png,和附的圖長寬比相同。不裁、不加邊、不摳圖、不修補。 - A0 出成正方形;不是 1254×1254 時縮放到這個尺寸(做過的角色都是這個尺寸)。
出完一批,跑一次 python -m rigkit.variants 素材/角色名 出檢查圖,合格標準同上。第 3 步的手勢和臉紅同樣:--list F1-blush P1-wave P2-explain P3-point。還沒用 Codex 以外的工具完整做過一個角色。
3. 拆層 —— 用戶同意上傳
先用變體自拆,作為合成的底:
python -m rigkit.split 素材/角色名 素材/角色名/layers --pad-top 90
再問用戶是否同意把立繪傳到 See-through,同意後:
python -m rigkit.seethrough fetch 素材/角色名/A0-base.png 素材/角色名/seethrough
python -m rigkit.seethrough split 素材/角色名 素材/角色名/layers 素材/角色名/layers-st --pad-top 90
fetch 先試 Hugging Face,沒跑成再換魔搭(--site hf 或 --site modelscope 指定一個),各用能給的最高解析度。也可以把網頁版、ComfyUI 或自己顯卡跑出的 PSD 交給它:fetch 那個.psd 素材/角色名/seethrough。本機裝了 See-through 時用 --site local:不傳圖,不佔額度(見「環境」)。
最終圖層必須走 See-through:自拆的圖層動起來邊緣有碎點、被擋住的頭髮補不全,不單獨交付。當天沒有額度時,換另一個網站、等第二天,或者用 PSD。
split 會逐條打印它對 See-through 圖層做的修正(裁掉畫到別處的、挪回歸錯的配飾、補漏畫的部件),規則見 規則 的「See-through 合成」。看 layers-st/拆層總覽.png:每層只有自己的東西,靜止合成和立繪只差在畫風。
閉眼、笑眼是自拆的。它們帶進旁邊的線或邊緣毛躁、同一處改兩次還在時,把這兩張變體交給 See-through 拆,再跑一次上面的 split,它會改用 See-through 的睫毛層(規則第 103 條):
python -m rigkit.seethrough fetch 素材/角色名/D5-eyes-closed.png 素材/角色名/seethrough-D5-eyes-closed
python -m rigkit.seethrough fetch 素材/角色名/D6-eyes-smile.png 素材/角色名/seethrough-D6-eyes-smile
傳到網站同樣先問用戶,每張佔一次額度。本機跑時加 --site local --head-from 素材/角色名/seethrough,只拆頭部。
然後做手勢和臉紅:
python -m rigkit.extras 素材/角色名 素材/角色名/layers-st # 寫出 R0-rest.png
python -m rigkit.variants 素材/角色名 F1-blush P1-wave P2-explain P3-point
python -m rigkit.extras 素材/角色名 素材/角色名/layers-st # 加進圖層
看 layers-st/手勢和臉紅.png:每行是靜止、變體、模型裡打開後的樣子,手臂和身體接得上、手的邊緣乾淨才往下做。
4. 生成並自查
python -m rigkit.estimate 素材/角色名/layers-st 角色/角色名 --name 名字
python -m rigkit.check_art 角色/角色名/character.json
python -m rigkit.prepare 角色/角色名/character.json
python -m rigkit.build 角色/角色名/character.json # 幾分鐘
estimate不覆蓋已有的character.json,寫成character.draft.json;圖層改過要重估時,比對後換上。標註.png:臉的橢圓、眼眉鼻嘴、歪頭轉軸、頸根、肩、腰、髮根線不在對的位置時,改character.json裡對應的數字,重新 prepare 和 build。素材檢查/:露底有品紅、原畫對照有成線的紅色時,回到第 3 步。透出背景列出靜止時沒蓋住的地方、手勢時變透明的地方,再看青底.png(靜止和各手勢放在青色背景上):白衣服、淺色皮膚處的缺口在白底上看不出。手臂挪開處變透明是正常的,其餘回到第 3 步。
自查:
python -m rigkit.preview flips 角色/角色名/build/runtime
python -m rigkit.preview sheet 角色/角色名/character.json 角色/角色名/自查 新版=角色/角色名/build/runtime
python -m rigkit.preview clip 角色/角色名/character.json 角色/角色名/自查/動作.mp4 新版=角色/角色名/build/runtime
翻折三角形應為 0。看放大圖和短片裡的固定檢查區(眉毛和劉海、臉邊、下巴和脖子、太陽穴和耳朵、眼角和睫毛、嘴角),有問題先修,再交給用戶。有上一版時把上一版放在前面並排比。
再在 VTS 的背景色上,把閉眼、半閉、笑眼、張大嘴、半張嘴、三個手勢、左右甩頭各渲一張,眼睛、嘴、頭髮交界放大三到四倍看:用戶在 VTS 裡最先看到的就是這些畫面。
5. 裝進 VTS —— 用戶驗收
python -m rigkit.vts 角色/角色名/character.json --install
新模型可以在 VTS 開著時裝;覆蓋已裝的模型要先退出 VTS,這時保留用戶在 VTS 裡調過的設定,只補缺的快捷鍵和映射。VTS 開著又要換新版時,改 vts.name 和 vts.folder 裝成新資料夾。
給用戶並排圖、短片和下面這張清單,回覆 通過 或 不通過:<現象>:
| 看什麼 | 怎麼做 |
|---|---|
| 轉頭、歪頭 | 左右上下轉頭、歪頭:臉、頭髮、帽子、耳朵跟著轉,沒有裂縫、碎點、留在原地的東西 |
| 眼睛 | 眨眼、單眼眨眼、半閉眼;轉頭時睫毛不穿過頭髮 |
| 嘴 | 說話、笑;閉著嘴轉頭時不歪嘴 |
| 頭髮 | 甩頭:劉海、側髮、後髮分段擺,從髮根到髮梢一段比一段晚;點頭時上下彈;長髮在肩膀以下跟身體 |
| 掛件 | 身體動時吊墜擺動,底下的衣服完整 |
| 身體 | 身體跟隨左右轉、前後,呼吸起伏 |
| 表情 | N1~N4 切換,N0 清除 |
| 手勢 | N5~N7:身體畫風不跳,手的邊緣乾淨;手勢打開時轉頭,手臂跟著身體走 |
| 臉紅 | N8:邊緣柔和;甩頭時頭髮下面不露邊 |
調幅度
動作幅度都在 character.json:
| 想改 | 欄位 |
|---|---|
| 歪頭角度 | head.tilt_deg(滿幅時的度數) |
| 轉頭時臉走多遠 | head.yaw_px、head.pitch_px |
| 身體傾斜 | body.tilt_deg(每單位參數的度數,滿幅 ×10) |
| 呼吸起伏 | body.breath.head、body.breath.shoulder(像素) |
| 身體跟隨 | body.turn、body.shift、body.lean_y |
| 頭髮擺幅 | hair.locks.<圖層>.swing;中段和髮梢 hair.locks.<圖層>.bend;點頭 hair.locks.<圖層>.pitch |
| 物理手感 | hair.locks.<圖層>.chain(三段)或 physics:delay 越小越拖、length 越長越慢 |
| 掛件擺幅 | dangles.<圖層>.deg(滿幅時的度數) |
| 半閉眼 | eyes.crease_fade(雙眼皮淡出的區間)、eyes.lower_from(下眼瞼開始合的位置) |
| 嘴從哪裡開始張 | mouth.open_from:攝影機讀數低於它時保持閉嘴 |
幅度按 VTS 半身取景和真人動作判斷:正常歪頭約 15°,模型只轉 3° 就等於沒有。改完重新 build。其餘欄位見 配置說明。
規則
全部規則和來由見 規則。最常被違反的幾條:
- 動手前先查 Live2D 的標準做法,說清楚打算怎麼做。
- 切圖用 See-through,圖像模型只補它給不了的細節(表情、被擋住的部分、手勢)。
- 只處理有把握的部分:See-through 的圖層整塊用,程式碼只做整塊的取捨、挪動和按不相連的塊分開,不在它的層裡按顏色逐像素再切(切出來都毛躁)。要改一處,先和 See-through 原樣並排放大比,沒有明顯更好就不改。
- 新規則先在所有已有角色上量判斷依據、定適用範圍,改完新舊程式碼各跑一遍逐層比,不誤傷已通過的角色。每條規則寫明範圍:通用,還是只在某種情況下觸發(觸發條件、不管哪些情況)。
- 每輪給同尺寸並排圖和短片,由人判斷;翻折數、像素差只用來排查破面。
- 同一個症狀修了三輪還在,停止改程式碼,改用素材解決。
- 圖像模型只派「整張圖改一處」,不派「只留一部分」;要的部分由程式碼用差值算。
- 傳圖到外部服務前先問用戶;帳號和 token 由用戶自己註冊、自己填,不在對話裡複述 token。
- 安裝時不覆蓋用戶的 vtube.json,覆蓋已裝模型時 VTS 要先退出。
環境
- Python 3.10+:
pip install -r <skill 目錄>/requirements.txt(系統 Python 不讓裝時建一個虛擬環境)。出短片要 ffmpeg。 - Codex 命令列(出圖):ChatGPT 桌面版自帶,或單獨安裝的
codex(在 PATH 裡即可),登錄 ChatGPT 帳號;都不是時把環境變數CODEX指向它。沒有 Codex 時用其他能改圖的圖像工具,見第 2 步。 - See-through(拆層),兩個網站跑的是同一個模型,至少準備一個:
- Hugging Face(首選,幾分鐘一次,最高 1280):不登錄時每天的免費顯卡時間不一定夠跑一次;用戶註冊免費帳號、建一個 Read token,放進環境變數
HF_TOKEN或~/.cache/huggingface/token(hf auth login存的位置),每天約 1~2 次。 - 魔搭 ModelScope(備用,免費,最高 1536):用戶註冊帳號、建一個存取令牌,放進環境變數
MODELSCOPE_API_TOKEN或~/.cache/modelscope/token。要排隊,一次可能半小時。1536 的頭髮輪廓和眼睛比 1280 更接近原畫。 - 本機(可選,不傳圖,不限次數):在 Apple 晶片、24 GB 記憶體上驗證過,1280 整張約 21 分鐘,只拆頭部約 9 分鐘;第一次執行下載約 13 GB 模型。裝好後把環境變數
SEETHROUGH_DIR指向它,裝法見 出圖 的「本機跑 See-through」。
- Hugging Face(首選,幾分鐘一次,最高 1280):不登錄時每天的免費顯卡時間不一定夠跑一次;用戶註冊免費帳號、建一個 Read token,放進環境變數
- VTube Studio(Steam 版)。
- Live2D Cubism Core(預覽、自查、圖示要用):裝了 Cubism Editor 時自動找到;否則下載 Cubism SDK for Native,把環境變數
CUBISM_CORE指向其中的 Core 動態庫。Core 按 Live2D 的許可證使用,不隨本 skill 分發。
macOS 上驗證過;Windows 未驗證。
已知問題
- 攝影機手勢(張開手掌 = 招手、雙手張開 = 攤手、豎食指 = 指向):第一個角色能觸發,第二個角色配置逐欄位相同卻不觸發,原因未查明。快捷鍵 N5~N7 不受影響。
- 靜止時是 See-through 畫的樣子,比原畫軟一點,睫毛、髮梢描邊的細節少一些。
- 戴眼鏡、鏡框緊挨雙眼皮時,See-through 會丟掉雙眼皮線,在睫毛上沿畫一道淺灰帶,按原樣保留。
- 眼尾貼著臉頰和耳朵之間的輪廓線時(毛線帽),自拆的閉眼和笑眼圖層會帶進一小段這條輪廓線,轉頭時在臉邊露出來。把這兩張變體交給 See-through 拆可以去掉(第 3 步)。