Modelo Live2D a partir de um único desenho
Este kit pega um desenho de corpo inteiro de um personagem e o transforma em um modelo Live2D que pode ser carregado por aplicativos como AIRI ou Open-LLM-VTuber. Os scripts fazem o trabalho. Sua parte é executar as etapas em ordem, observar o resultado de cada uma e corrigir o que estiver errado antes que a próxima etapa construa sobre ele. Um erro que você deixar passar no início (uma camada no lugar errado) aparecerá depois como algo muito mais difícil de rastrear (uma perna atrás de um casaco).
Tudo é um comando, executado de dentro do projeto:
python <esta pasta>/live2d.py <passo> <nome> ...
<nome> é o nome da pasta do personagem. live2d.py escolhe o Python que cada etapa precisa e imprime o comando que executa. Leia README.md nesta pasta uma vez antes do seu primeiro personagem: lá estão os downloads, o arquivo de configurações, cada etapa com seu comando e a tabela de correções de camadas. Este arquivo é como trabalhar bem com o processo.
Há também uma interface gráfica para pessoas (live2d.py gui: os mesmos passos como botões em uma página); um agente deve usar os comandos.
Antes de tudo
- Execute
live2d.py check. Ele informa o que está instalado e o que está faltando para cada etapa. Se algo estiver faltando, informe ao usuário o que é e de onde vem (README, "O que você precisa"). Os downloads têm muitos gigabytes: pergunte antes de iniciar um. Em um projeto onde o kit ainda não foi usado (o check diz que não hálive2d-kit.json), executelive2d.py initprimeiro, a partir da pasta raiz do projeto. Ele cria o arquivo de configurações, um arquivo de aparência e o ponteiro desta skill, e não altera nada que já exista.init --like <outro projeto>copia os caminhos das ferramentas de um projeto que já os possui. - Execute
live2d.py status <nome>. Ele marca as etapas concluídas e nomeia o próximo comando. Use-o sempre que retomar um personagem, em vez de adivinhar pelos arquivos. - Pergunte ao usuário antes de uma etapa que usa a placa gráfica (desenhar, recortar, upscale, separar). Essas etapas precisam da placa dedicada, e o usuário pode estar executando algo nela.
splitleva cerca de 10 minutos por passada em uma placa livre, e pode levar horas se qualquer outra coisa ocupar parte dela: avise e execute em segundo plano. draw --runpodcusta dinheiro. Use apenas quando o usuário solicitar.- Inicie e pare apenas o que você iniciou.
live2d.py comfy statusinforma se o ComfyUI está em execução e quem o iniciou: este projeto, ou outra pasta (então é de outra pessoa: use-o, mas não o pare).comfy stoppara apenas aquele que ocomfy startdeste projeto iniciou. Pare o seu quando as etapas de desenho, recorte e upscale estiverem concluídas.
As etapas e o que verificar após cada uma
| Etapa | Comando | Está correto quando |
|---|---|---|
| Desenhar | comfy start, depois draw <rodada> --character <nome> --seeds ... | O usuário escolhe um. Mostre a folha de contato. Não escolha por ele a menos que ele peça |
| Escolher | pick <nome> <imagem> | O desenho se encaixa em "Um desenho que riga" no README. Se não se encaixar (braços no corpo, pernas juntas, um objeto na mão), diga o que dará errado antes de continuar |
| Recortar, upscale | cutout <nome>, upscale <nome>, comfy stop | full/cutout.png mostra todo o personagem e nenhum fundo. Um desenho de draw já tem sua própria transparência: pick já fez o recorte, então cutout não faz nada e apenas upscale é necessário |
| Separar | split <nome> body | Ele imprime as camadas. Espere cerca de 17: cabelo, rosto, olhos, sobrancelhas, nariz, boca, pescoço, roupas, braços, pernas, sapatos |
| Verificar camadas | layers check <nome> | A contagem é de alguns milhares de pixels de contorno fino. Olhe a imagem que ele salva. Um bloco sólido vermelho é uma camada cobrindo o que não deveria |
| Passada de cabeça | split <nome> head, layers scale <nome> 2, layers head ..., layers under <nome> neck face | layers check novamente: a contagem não deve pular. A camada do rosto deve se alinhar com o rosto do desenho |
| Partes | parts closed-eyes <nome>, parts mouth <nome> | As camadas agora incluem eye_close e mouth_open. Qual boca aberta e qual blush ela tem é gosto do usuário: faça parts mouth-sheet <nome> e parts blush-sheet <nome>, mostre as duas imagens e deixe-o escolher um número (o README "Bocas e blushes"). Se a boca estiver muito grande, pequena, alta, baixa ou inclinada, --size, --down, --right e --turn corrigem, primeiro em mouth-sheet para mostrar a ele; o blush aceita --size, --in, --down e --turn da mesma forma. parts mouth-oh <nome> dá a ela uma boca "O" para assustada e surpresa. Se a boca fechada estiver muito fina ou fraca, parts mouth-line <nome> --try mostra um redesenho, parts mouth-line <nome> o cria, depois parts mouth <nome> novamente |
| Construir | build <nome> | Leia o que ele imprime (abaixo) |
| Visualizar | view, depois verificar folhas (abaixo) | A lista no README, "Testando o modelo" |
A descrição do personagem vem do arquivo de aparência do projeto (check imprime onde está; o README "Aparências e estilos" tem seu formato). Escreva a aparência dele lá, ou altere-a lá, antes de desenhar: é o único lugar que diz como ele é, para que a próxima rodada e o próximo agente desenhem o mesmo personagem. Uma aparência é apenas cabelo, olhos, constituição e roupas. O kit adiciona o enquadramento e a pose em si, e uma aparência que os repete, ou pede outra pose, funciona contra o rig. draw ... --show imprime o prompt inteiro sem desenhar: leia antes de usar a placa gráfica em uma rodada. --look "..." é para uma única vez.
Após a separação, olhe cada imagem de camada em <personagens>/<nome>/layers/full/parts/ uma vez. Você está procurando três coisas: uma camada que contém duas coisas que devem se mover separadamente (a frente de um casaco e o interior de suas costas), uma camada na ordem errada e um par (braços, pernas, olhos) que saiu como uma única forma. O README "Corrigindo as camadas" diz o que fazer para cada um. Coloque o motivo de uma configuração em live2d.json sob "why": a próxima pessoa não pode ver o que você viu.
Lendo o que build imprime
head: her head turned -9.9 degrees ...: o quanto ele endireitou a cabeça. "No pair of eyes or brows" significa que uma camada de olho não se dividiu em esquerda e direita: corrija essa camada primeiro.head turn: 13_face_base as face; 16_accessory as glasses; ...: o que ele considerou cada parte da cabeça ser. Uma parte considerada como a coisa errada se move incorretamente: óculos que não estão listados como óculos se desviarão dos olhos.body: her feet at ..., knees ..., hips ..., neck ...; 2 arms that bend, 2 legs that bend; ...: 0 braços ou 0 pernas significa que o par é uma única forma nas camadas. Pés em 0.000 significa um pixel solto na parte inferior de uma camada.hair: 6 sections that swing each by itself (...): como o cabelo foi dividido. Uma seção para a frente e uma para trás significa que o cabelo é estreito, ou sua camada está em pedaços: isso não é um defeito.in the texture at the head pass's own size: face, eyelash, ...: as partes da cabeça que foram para a textura nítidas. Nenhuma linha desse tipo significa que não há cópias nítidas:layers sharp <nome>as cria a partir do PSD da cabeça mantido.changed since the head passnomeia as camadas da cabeça editadas depois dela, que são usadas no tamanho do quadro: está correto, não é um defeito.
Verificando o modelo sem olhar para a tela
Inicie o visualizador (live2d.py view, em segundo plano) e abra http://127.0.0.1:8777/live2d/ em uma ferramenta de navegador. A página tem window.sheets, que desenha imagens legendadas de poses mantidas, quadros de movimento e expressões e as salva como arquivos que você pode ler. Ele lê os pixels do renderizador de volta, então está correto mesmo quando a página está oculta. Uma captura de tela de uma página oculta não está: mostra quadros desatualizados.
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, ["(nenhuma)", "feliz", "cansado", "corado", "bravo", "assustado"], /face/i, 1.6, 133, 170);
await sheets.save("akane-expressoes");
await sheets.motion(u, "TapHead", /face/i, 1.6, 133, 170, 6, 13);
await sheets.save("akane-taphead");
sheets.done();
Um quadro é [x0, y0, x1, y1] em partes da caixa do modelo, ou um padrão para o nome de um desenhável (/face/i, /neck/i) com um zoom. Passe um fundo verde ("#30c060" como o último argumento de poses) quando estiver procurando por lacunas: uma lacuna mostra verde.
Olhe atentamente as imagens. Amplie o local onde um defeito estaria (o queixo, a cintura, um olho) em vez de julgar a partir de uma miniatura do corpo inteiro: a maioria dos defeitos encontrados até agora tinha alguns pixels de largura. Verifique ambas as extremidades de cada movimento e dois movimentos juntos (uma virada com um olhar, uma elevação com uma curvatura), porque é aí que as partes se separam.
Ao mostrar um resultado ao usuário, envie a imagem e diga claramente o que você verificou e o que não verificou. O visualizador não é o aplicativo: diga se você não viu o personagem no aplicativo.
Quando algo parece errado
- Descubra qual parte é. Segure a pose com os controles deslizantes, ou faça uma folha ampliada nela.
- Decida onde o defeito reside. Está nas camadas se a imagem da parte estiver errada, cortada, na ordem errada, ou carregar algo que pertence a outra parte. Está no rig se as camadas estão corretas e ela se move incorretamente.
- Consulte em
references/problems.md. Ele lista o que deu errado antes, por quê e a correção. - Defeitos de camada são corrigidos com comandos
layersou seulive2d.json, depoisbuildnovamente. - Defeitos de rig que todo personagem teria são corrigidos em
scripts/rig.py, onde cada número e tabela tem um comentário dizendo por que é o que é. Adicione seu motivo ao alterar um. Um defeito que apenas um personagem tem pertence ao seulive2d.json, lido porrig.py. - Construa, recarregue a página, faça a mesma folha novamente e compare. O recarregamento importa: a página mantém o modelo que carregou, então uma folha feita sem ele mostra o personagem como estava antes da construção.
Tenha cuidado com uma correção que afeta mais do que você pretendia. Antes de alterar uma camada para todos os personagens, verifique se os outros tinham o problema: uma correção aqui pintou listras escuras em cabelos que não tinham nada de errado.
Alterando como ela se move, ou o que ela pode mostrar
O README "Alterando como ela se move" mapeia cada coisa para seu nome em scripts/rig.py. Expressões são EXPRESSIONS, as reações de clique são TAPS, e os movimentos de emoção que um aplicativo reproduz são EMOTIONS e BORROWED. Mantenha os mesmos nomes para todos os personagens, para que as configurações e prompts do aplicativo sejam escritos uma vez.
O quanto mover as coisas é gosto do usuário. A orientação permanente deste primeiro usuário do kit: o movimento da cabeça é para olhar as coisas, então os traços deslizam um pouco e as íris fazem a maior parte do olhar; o movimento do corpo é sutil e mantém os pés no chão. Mostre uma imagem e deixe-o decidir.
Finalizando
- Informe ao usuário onde está o modelo:
<out>/live2d/<nome>-full.zipé o que um aplicativo importa. - Mantenha o desenho, o recorte, o desenho ampliado e tudo em
layers/full/no controle de versão. Tudo em<out>pode ser recriado. - Se você aprendeu algo que uma execução futura precisa (um novo tipo de defeito e sua correção), adicione uma linha a
references/problems.md. - Pare o visualizador e o ComfyUI se você os iniciou.