anime-reel
Entrada: um roteiro + um arquivo MP3 de voz por linha (o usuário anexa ambos). Saída: um reel 9:16 e uma cópia 16:9, cada um com o áudio original, além de uma cópia em 720p com menos de 20 MB para WhatsApp.
Regras rígidas (a cada execução)
- Desenhe tudo em código: canvas HTML, renderizado quadro a quadro em headless Chrome, codificado com ffmpeg. Nada de imagens de banco de imagens ou geradores de imagem. Use
engine/como base; estenda-o, não o substitua, para que o visual permaneça sempre o mesmo. - Cronometre cada palavra com alinhamento forçado (
torchaudio MMS_FAviascripts/align.py). Nunca adivinhe os tempos. Se o alinhamento falhar para uma linha, pare e informe o usuário o motivo; não recorra a espaçamento uniforme. - Exiba uma folha de contato com os quadros-chave antes da renderização completa e aguarde a aprovação.
- Pergunte antes de sobrescrever qualquer arquivo existente.
encode.shse recusa a sobrescrever e termina com código 2; repasse isso ao usuário. - Mantenha o áudio original intacto no MP4 final (as linhas de voz são apenas colocadas em uma linha do tempo, nunca reprocessadas). Nenhuma música de fundo, a menos que o usuário solicite.
Método
- Configuração. Execute
bash scripts/check_setup.sh(ffmpeg, Node, puppeteer, torch/torchaudio, uroman). Corrija qualquer pendência antes de continuar. Executebash scripts/sfx.sh <projeto>/sfxpara sintetizar sons de impacto/ataque/arremesso/pop com ffmpeg. - Divida o roteiro em planos. Um plano por linha de voz. Para cada um, escreva:
id,speaker,text(exatamente o que o MP3 diz),audio(caminho),place(rooftop, office, street, bedroom, sky, ou adicione um novo ramodrawPlace),camera(static|push|pull|pan+amount),cast,slots(left/center/right) efx. Salve comoshots.json(esquema emscripts/build_timeline.py). Mostre a lista de planos e permita que o usuário a corrija se estiver ambígua. - Personagens. Defina cada um em
characters(nome, skin, hair, hairStyle spiky|bob|long|short, eye, outfit, accent,color= cor da legenda daquele personagem). Eles devem ser originais, nunca copiados de animes existentes. Visual de anime: olhos grandes com brilho, contornos grossos e limpos, cor plana com exatamente um tom de sombra. Renderize a ficha do personagem e mantenha o JSON como fonte única da verdade, para que os personagens nunca mudem entre os planos:node scripts/render_frames.mjs sheet timeline.json landscape out/character_sheet.png - Alinhe e sincronize os lábios.
python3 scripts/build_timeline.py shots.json timeline.json workexecuta MMS_FA por linha (tempos das palavras) e constrói a curva de abertura de boca de cada personagem a partir da intensidade sonora daquela linha de voz (mouth.py). Piscadas e movimentos de espera são incorporados no mecanismo. Para linhas não-inglesas,align.pyromaniza com uroman mantendo a grafia original na tela. - Truques de anime em linhas-chave (adicione em
fx, tempos em segundos a partir do início do plano):speedlinesem revelações e determinação,impact(quadros brancos/pretos, comsfx: "impact") na linha mais importante,shakeem golpes,chibi(+who,sfx: "pop") em reações cômicas. Use com moderação: aproximadamente um truque a cada 2-3 planos, para que ainda tenham impacto. - Legendas e som. Legendas de 2-3 palavras já são tratadas pelo mecanismo, com a palavra falada na cor do falante e o restante em branco. Efeitos sonoros ficam nas mesmas marcações dos impactos visuais (através de
fx[].sfx). Misture compython3 scripts/build_audio.py timeline.json work/audio.wav. - Folha de contato, depois aprovação. Selecione cerca de 12 momentos distribuídos pelo episódio, incluindo cada truque:
node scripts/render_frames.mjs stills timeline.json portrait work/stills 0.5,2.0,...bash scripts/contact_sheet.sh work/stills out/contact_sheet.pngExibaout/contact_sheet.pnge pare. Não renderize o vídeo completo até que o usuário aprove. - Renderize após aprovação, para cada orientação (
portrait= 1080x1920,landscape= 1920x1080, 30 fps):node scripts/render_frames.mjs video timeline.json portrait work/reel_silent.mp4bash scripts/encode.sh work/reel_silent.mp4 work/audio.wav out/<nome>_9x16Repita para landscape comout/<nome>_16x9.encode.shmultiplexa AAC 256k de áudio e grava a cópia_720p.mp4(alvo ~17 MB, sempre abaixo de 20 MB). Verifique os tamanhos comls -lhe informe-os.
Configurações de renderização
- 9:16: 1080x1920, 30 fps, H.264 yuv420p, CRF 16, AAC 256k, faststart. 16:9: 1920x1080, mesmas configurações.
- Cópia para WhatsApp: 720p (720x1280 ou 1280x720), taxa de bits calculada a partir da duração para ficar abaixo de 20 MB.
- As legendas ficam a aproximadamente 68% da altura no 9:16 (fora da área superior de 250 px e inferior de 420 px da interface do app) e aproximadamente 86% no 16:9.
Arquivos desta skill
engine/engine.js,engine/index.html: mecanismo de canvas (personagens, cenários, speed lines, quadros de impacto, shake, chibi, legendas, emblema).scripts/:check_setup.sh,sfx.sh,align.py,mouth.py,build_timeline.py,build_audio.py,render_frames.mjs,contact_sheet.sh,encode.sh.