하나의 그림으로 Live2D 모델 만들기
이 키트는 캐릭터의 전신 그림 한 장을 AIRI나 Open-LLM-VTuber 같은 앱이 로드할 수 있는 Live2D 모델로 만듭니다. 스크립트가 작업을 수행합니다. 여러분의 역할은 단계를 순서대로 실행하고, 각 결과를 확인한 후, 다음 단계가 이를 기반으로 쌓기 전에 잘못된 부분을 수정하는 것입니다. 초기에 놓친 결함(잘못된 위치의 레이어)은 나중에 훨씬 추적하기 어려운 문제(코트 뒤에 가려진 다리)로 나타납니다.
모든 작업은 프로젝트 내부에서 실행되는 하나의 명령어로 이루어집니다:
python <이 폴더>/live2d.py <단계> <이름> ...
<이름>은 캐릭터의 폴더 이름입니다. live2d.py는 각 단계에 필요한 Python을 선택하고 실행하는 명령어를 출력합니다.
첫 번째 캐릭터 작업 전에 이 폴더의 README.md를 한 번 읽으십시오: 다운로드, 설정 파일,
각 단계와 명령어, 레이어 수정 표가 있습니다. 이 파일은 작업을 잘 수행하는 방법을 설명합니다.
사람을 위한 GUI도 있습니다(live2d.py gui: 페이지의 버튼 형태로 된 동일한 단계). 에이전트는 명령어를 사용해야 합니다.
시작하기 전에
live2d.py check를 실행합니다. 설치된 항목과 각 단계에 누락된 항목을 알려줍니다. 누락된 항목이 있으면 사용자에게 무엇이 어디서 오는지 알려줍니다(README, "필요한 것"). 다운로드는 수 기가바이트입니다: 시작하기 전에 사용자에게 물어보십시오. 키트가 아직 사용되지 않은 프로젝트에서(check에live2d-kit.json이 없다고 표시됨), 먼저 프로젝트의 최상위 폴더에서live2d.py init을 실행합니다. 설정 파일, looks 파일 및 이 스킬의 포인터를 만들고 이미 있는 것은 변경하지 않습니다.init --like <다른 프로젝트>는 도구 경로를 이미 설정이 있는 프로젝트에서 복사합니다.live2d.py status <이름>을 실행합니다. 완료된 단계에 체크 표시를 하고 다음 명령어를 알려줍니다. 파일을 보고 추측하는 대신 캐릭터 작업을 다시 시작할 때마다 사용하십시오.- 그래픽 카드를 사용하는 단계(draw, cutout, upscale, split) 전에 사용자에게 물어보십시오.
이 단계들은 카드를 독점해야 하며, 사용자가 카드로 다른 작업을 실행 중일 수 있습니다.
split은 여유 카드에서 패스당 약 10분이 걸리며, 다른 작업이 카드의 일부를 점유하면 몇 시간이 걸릴 수 있습니다: 그렇게 말하고 백그라운드에서 실행하십시오. draw --runpod는 비용이 발생합니다. 사용자가 요청할 때만 사용하십시오.- 시작한 것만 시작하고 중지하십시오.
live2d.py comfy status는 ComfyUI가 실행 중인지, 누가 시작했는지 알려줍니다: 이 프로젝트인지, 다른 폴더인지(다른 사람의 것이라면 사용은 하지만 중지하지 마십시오).comfy stop은 이 프로젝트의comfy start가 시작한 것만 중지합니다. drawing, cut-out, upscale 단계가 완료되면 여러분의 것을 중지하십시오.
단계 및 각 단계 후 확인 사항
| 단계 | 명령어 | 올바른 조건 |
|---|---|---|
| 그리기 | comfy start, 그 다음 draw <round> --character <이름> --seeds ... | 사용자가 하나를 선택합니다. 연락처 시트를 보여주십시오. 사용자가 요청하지 않으면 그들을 위해 선택하지 마십시오 |
| 선택 | pick <이름> <그림> | 그림이 README의 "리깅 가능한 그림" 조건에 맞습니다. 맞지 않으면(팔이 몸에 붙어 있거나, 다리가 모여 있거나, 손에 소품이 있는 경우), 진행하기 전에 무엇이 잘못될지 말하십시오 |
| 컷아웃, 업스케일 | cutout <이름>, upscale <이름>, comfy stop | full/cutout.png가 캐릭터 전체를 보여주고 배경이 없습니다. draw에서 나온 그림은 자체 투명도를 가지고 있습니다: pick이 이미 컷아웃을 만들었으므로 cutout은 아무것도 하지 않고 upscale만 필요합니다 |
| 분할 | split <이름> body | 레이어를 출력합니다. 약 17개 예상: 머리카락, 얼굴, 눈, 눈썹, 코, 입, 목, 옷, 팔, 다리, 신발 |
| 레이어 확인 | layers check <이름> | 개수가 얇은 외곽선의 수천 픽셀입니다. 저장된 그림을 확인하십시오. 빨간색의 단색 블록은 레이어가 덮으면 안 되는 부분을 덮고 있다는 의미입니다 |
| 헤드 패스 | split <이름> head, layers scale <이름> 2, layers head ..., layers under <이름> neck face | layers check 다시: 개수가 급증하지 않아야 합니다. 얼굴 레이어가 그림의 얼굴과 일치해야 합니다 |
| 파츠 | parts closed-eyes <이름>, parts mouth <이름> | 이제 레이어에 eye_close와 mouth_open이 포함됩니다. 어떤 열린 입과 어떤 블러셔를 가질지는 사용자의 취향입니다: parts mouth-sheet <이름>과 parts blush-sheet <이름>을 만들고, 두 그림을 보여준 후 번호를 선택하도록 하십시오(README의 "입과 블러셔"). 입이 너무 크거나, 작거나, 높거나, 낮거나 기울어진 경우 --size, --down, --right, --turn으로 수정하며, 먼저 mouth-sheet로 보여줍니다; 블러셔도 같은 방식으로 --size, --in, --down, --turn을 사용합니다. parts mouth-oh <이름>은 놀람과 겁에 쓸 "O" 입을 만듭니다. 닫힌 입이 너무 가늘거나 희미해서 보이지 않는 경우, parts mouth-line <이름> --try로 다시 그리기를 보여주고, parts mouth-line <이름>으로 만든 후 parts mouth <이름>을 다시 실행합니다 |
| 빌드 | build <이름> | 출력 내용을 읽으십시오(아래) |
| 뷰 | view, 그 다음 시트 확인(아래) | README의 "모델 테스트하기" 목록 |
캐릭터 설명은 프로젝트의 looks 파일에서 가져옵니다(check가 위치를 출력합니다; README의 "룩과 스타일"에 형식이 있습니다).
그림을 그리기 전에 거기에 그녀의 룩을 작성하거나 변경하십시오: 그것은 그녀의 외모를 설명하는 유일한 장소이므로,
다음 라운드와 다음 에이전트가 동일한 캐릭터를 그립니다. 룩은 그녀의 머리카락, 눈, 체형, 옷만 포함합니다.
키트가 프레이밍과 포즈 자체를 추가하며, 이를 반복하거나 다른 포즈를 요청하는 룩은 리깅에 역효과를 냅니다.
draw ... --show는 전체 프롬프트를 그리지 않고 출력합니다: 그래픽 카드를 사용하기 전에 읽으십시오.
--look "..."은 일회용입니다.
분할 후, <characters>/<이름>/layers/full/parts/의 각 레이어 그림을 한 번씩 살펴보십시오.
세 가지를 찾습니다: 함께 움직여야 하는 두 부분을 포함하는 레이어(코트 앞면과 뒷면 안쪽), 잘못된 순서의 레이어,
하나의 모양으로 나온 쌍(팔, 다리, 눈). README의 "레이어 수정"에서 각각에 대한 방법을 설명합니다.
설정에 대한 이유를 그녀의 live2d.json에 "why" 아래에 기록하십시오: 다음 사람이 당신이 본 것을 알 수 없습니다.
빌드 출력 읽기
head: her head turned -9.9 degrees ...: 얼마나 바로잡았는지. "No pair of eyes or brows"는 눈 레이어가 왼쪽과 오른쪽으로 분할되지 않았다는 의미입니다: 먼저 해당 레이어를 수정하십시오.head turn: 13_face_base as face; 16_accessory as glasses; ...: 각 헤드 파트를 무엇으로 간주했는지. 잘못된 것으로 간주된 파트는 잘못 움직입니다: 안경으로 나열되지 않은 안경은 눈에서 벗어납니다.body: her feet at ..., knees ..., hips ..., neck ...; 2 arms that bend, 2 legs that bend; ...: 0개의 팔이나 0개의 다리는 해당 쌍이 레이어에서 하나의 모양이라는 의미입니다. Feet at 0.000은 레이어 하단의 떨어진 픽셀을 의미합니다.hair: 6 sections that swing each by itself (...): 머리카락이 어떻게 나뉘었는지. 앞쪽에 한 섹션, 뒤쪽에 한 섹션은 머리카락이 좁거나 레이어가 조각난 경우입니다: 결함이 아닙니다.in the texture at the head pass's own size: face, eyelash, ...: 헤드 텍스처에 선명하게 들어간 부분. 해당 줄이 없으면 선명한 복사본이 없다는 의미입니다:layers sharp <이름>이 저장된 헤드 PSD에서 만듭니다.changed since the head pass는 헤드 패스 이후 편집된 헤드 레이어를 나타내며, 프레임 크기로 사용됩니다: 정상이며 결함이 아닙니다.
화면을 보지 않고 모델 확인하기
뷰어를 시작하고(live2d.py view, 백그라운드에서) 브라우저 도구에서
http://127.0.0.1:8777/live2d/를 여십시오. 페이지에는 window.sheets가 있으며,
이것은 레이블이 지정된 포즈, 모션 프레임 및 표정의 그림을 그려 파일로 저장합니다.
렌더러의 픽셀을 다시 읽으므로 페이지가 숨겨져 있어도 정확합니다. 숨겨진 페이지의 스크린샷은
오래된 프레임을 보여주므로 정확하지 않습니다.
const u = "/live2d/models/akane-full/model/model.model3.json";
await sheets.poses([
["face", u, /face/i, 2.6, [["rest", {}], ["turn", {ParamAngleX: 30, ParamEyeBallX: 1}],
["half shut", {ParamEyeLOpen: 0.5, ParamEyeROpen: 0.5}], ["tilt", {ParamAngleZ: -30}]]],
["body", u, [0.15, 0, 0.85, 1], 0, [["rest", {}], ["sway", {ParamBodyAngleX: 10}],
["arms", {ParamArmLA: 10, ParamArmLB: -10}], ["knee", {ParamLegLB: 10}]]],
], 200, 300);
await sheets.save("akane-check"); // -> <out>/live2d/checks/akane-check.png
await sheets.expressions(u, ["(none)", "happy", "tired", "blushing", "angry", "scared"], /face/i, 1.6, 133, 170);
await sheets.save("akane-expressions");
await sheets.motion(u, "TapHead", /face/i, 1.6, 133, 170, 6, 13);
await sheets.save("akane-taphead");
sheets.done();
프레임은 모델 상자의 비율로 [x0, y0, x1, y1]이거나 드로어블 이름 패턴(/face/i, /neck/i)과 줌입니다.
틈을 찾을 때는 녹색 배경(poses의 마지막 인수로 "#30c060")을 전달하십시오: 틈이 녹색으로 나타납니다.
그림을 자세히 보십시오. 전신 썸네일로 판단하지 말고 결함이 있을 곳(턱, 허리, 눈)을 확대하십시오: 지금까지 발견된 대부분의 결함은 폭이 몇 픽셀에 불과했습니다. 각 움직임의 양 끝을 확인하고, 두 움직임을 함께 확인하십시오(돌리면서 보기, 들어 올리면서 구부리기), 그 때 부품이 서로 떨어지기 때문입니다.
사용자에게 결과를 보여줄 때, 그림을 보내고 무엇을 확인했는지, 무엇을 확인하지 않았는지 명확히 말하십시오. 뷰어는 앱이 아닙니다: 앱에서 그녀를 보지 못했다면 그렇게 말하십시오.
뭔가 잘못된 경우
- 어떤 부분인지 찾으십시오. 슬라이더로 포즈를 유지하거나 확대된 시트를 만드십시오.
- 결함이 어디에 있는지 결정하십시오. 부분의 그림이 잘못되었거나, 짤렸거나, 순서가 잘못되었거나, 다른 부분에 속한 것을 포함하고 있으면 레이어에 있습니다. 레이어가 올바르고 움직임이 잘못되었으면 리깅에 있습니다.
references/problems.md에서 찾아보십시오. 이전에 발생한 문제, 이유, 수정 방법이 나열되어 있습니다.- 레이어 결함은
layers명령어나 그녀의live2d.json으로 수정한 후build를 다시 실행하십시오. - 모든 캐릭터가 가질 리깅 결함은
scripts/rig.py에서 수정하며, 각 숫자와 표에는 그것이 왜 그런지에 대한 주석이 있습니다. 변경할 때 이유를 추가하십시오. 한 캐릭터만의 결함은rig.py가 읽는 그녀의live2d.json에 속합니다. - 빌드하고, 페이지를 새로고침하고, 동일한 시트를 다시 만들어 비교하십시오. 새로고침이 중요합니다: 페이지는 로드한 모델을 유지하므로, 새로고침 없이 만든 시트는 빌드 이전 상태를 보여줍니다.
의도한 것보다 더 많은 부분에 영향을 미치는 수정에 주의하십시오. 모든 캐릭터에 대한 레이어를 변경하기 전에 다른 캐릭터가 문제를 가졌는지 확인하십시오: 한 번의 수정으로 아무 문제 없던 머리카락에 어두운 줄무늬가 생겼습니다.
움직임이나 표정 변경하기
README의 "움직임 변경하기"는 각 항목을 scripts/rig.py의 이름에 매핑합니다.
표현은 EXPRESSIONS, 클릭 반응은 TAPS, 앱이 재생하는 감정 모션은 EMOTIONS와 BORROWED입니다.
모든 캐릭터에 대해 이름을 동일하게 유지하여 앱의 설정과 프롬프트가 한 번만 작성되도록 하십시오.
움직임의 범위는 사용자의 취향입니다. 이 키트의 첫 번째 사용자의 기본 지침: 머리 움직임은 무언가를 보기 위한 것이므로 특징은 약간 움직이고 홍채가 대부분의 시선을 담당합니다; 몸 움직임은 미묘하며 발을 바닥에 유지합니다. 그림을 보여주고 사용자가 결정하도록 하십시오.
마무리
- 사용자에게 모델 위치를 알려주십시오:
<out>/live2d/<이름>-full.zip이 앱이 가져오는 파일입니다. - 그녀의 그림, 컷아웃, 업스케일된 그림 및
layers/full/의 모든 것을 버전 관리에 유지하십시오.<out>의 모든 것은 다시 만들 수 있습니다. - 향후 실행에 필요한 것을 배웠다면(새로운 유형의 결함 및 수정 방법),
references/problems.md에 행을 추가하십시오. - 시작한 경우 뷰어와 ComfyUI를 중지하십시오.