O que Faceless Shorts faz?
Você cria um curta vertical completo a partir de um tópico: roteiro, voz, legendas sincronizadas com as palavras, cenas animadas, som e música, renderizado em MP4. Tudo é código: desenho em canvas, captura com Chrome headless, ffmpeg, uma voz Kokoro local, Whisper local para temporização de palavras, numpy para som. Sem imagens ou vídeos de IA, sem chaves de API, sem créditos.
SKILL = a pasta onde este arquivo está. Os projetos ficam em ~/faceless-shorts/<nome-do-curta>/.
| estilo | o que faz | duração · proporção |
|---|---|---|
Deep Dive 3D deep-dive | o principal, estilo Zack D. Films: pessoas 3D esculpidas em cenários iluminados pelo sol, corpos brilhantes em raio-X, jornadas de câmera por vasos sanguíneos, foco raso. "O que acontece se…?" corpo e ciência | 30-45 s · 9:16 |
Night File 3D night-file | mistérios não resolvidos / true crime: lugares 3D escuros com uma luz, pessoas sem rosto (o sujeito brilha em vermelho), datas de máquina de escrever, inserções de arquivos de caso | 30-45 s · 9:16 |
Inside Out inside-out | explicador 2D plano "O que acontece se…?": um herói simples, cortes em raio-X, legendas em negrito de 1 a 3 palavras, cortes rápidos | 25-40 s · 9:16 |
Stick Story stick-story | "O que você faria se…?" passos de sobrevivência: bonecos de palito com olhos expressivos, cômodos planos dia/noite, cartões dourados de etapas | 30-45 s · 9:16 |
Paper Atlas paper-atlas | história em papel cortado: mapas de pergaminho, rotas carmesim, fitas douradas de data, figuras históricas | 30-45 s · 9:16 |
Tall Tale 3D tall-tale | histórias engraçadas reais: pessoas desenho 2D planas (cabeças grandes e redondas, contornos a tinta) atuando em um mundo 3D ensolarado de cidade pequena, câmera sempre em movimento, legendas de uma palavra | 40-60 s · 9:16 |
Qual estilo: corpo / saúde / ciência "o que acontece se" → Deep Dive 3D (ou Inside Out para um visual 2D mais leve e rápido) · assustador, inexplicado, true crime, "isso aconteceu em 1971" → Night File 3D · sobrevivência, dicas úteis, "aqui está o que você faz" → Stick Story · um evento histórico, "como X aconteceu" → Paper Atlas · uma história engraçada ou inteligente real, um golpe, uma brecha, "esse cara fez X" → Tall Tale 3D. Se não for óbvio, pergunte uma vez.
Cada estilo = styles/<estilo>/style-sheet.png (a aparência em uma imagem, desenhada pelo próprio código do estilo) + STYLE.md (as regras + o manual do mecanismo) + example/ (um projeto completo que renderiza como está). Leia o STYLE.md do estilo por completo antes de planejar.
0. Primeiro uso em um computador
bash SKILL/scripts/setup.sh até imprimir Tudo pronto (verifica Node 22+, ffmpeg, Chrome; constrói ~/.faceless-shorts/venv; baixa a voz Kokoro ~340 MB e Whisper small.en ~0.5 GB). Instale qualquer coisa faltando da forma oficial gratuita e pergunte antes de qualquer coisa que precise de senha. Em seguida, bash SKILL/scripts/selftest.sh deve imprimir SELFTEST PASSED: abra a folha de contato, recorte os nomes e observe-os.
1. Captação (UMA mensagem, padrões preenchidos)
Pergunte apenas o que é desconhecido, tudo de uma vez: tópico (ou "você escolhe 3 ideias"), um link para um curta cujo formato eles gostam (opcional), duração (padrão ~30 s), voz (SKILL/scripts/py SKILL/scripts/voice.py --list; padrão am_michael), modo de narração: voz IA (padrão) · gravação própria (eles gravam após ver o roteiro; words.py --audio) · apenas legendas (sem voz ainda; estimate.py), música (trilha embutida · nenhuma · arquivo royalty-free próprio), linha final / identificador. "Pode ir" = os padrões.
2. O plano (UMA tela, depois aguarde)
Mostre: título · a narração completa, uma linha por corte, com seus blocos de legenda (E SE *VOCÊ | ENGOLIR *CHICLETE?) · a lista de cenas, uma linha cada (o que vemos, o que se move, em qual palavra ela cai) · novos componentes que você adicionará ao kit, se houver · fatos e suas fontes. Pergunte "Construir?" e aguarde.
Regras do roteiro. Escreva como uma pessoa realmente falaria com um amigo: frases completas e fluidas com palavras de conexão ("Bem,", "onde", "mas", "então", "o que significa"), não uma lista de afirmações curtas tipo legenda. ~90-110 palavras para 35 s. Uma linha é um CORTE, não uma frase: divida cada frase em 1-3 linhas em pausas naturais (vírgulas, "e", "onde"), para que a imagem mude a cada 1,5-3,5 s enquanto a voz continua fluindo (voice.py fala cada frase inteira de uma vez). Forma: pergunta-gancho, depois escalada, um mito ou surpresa, uma reviravolta ("mas se você…"), uma última linha impactante que se repete. Escreva números como são falados ("sete"). Leia em voz alta mentalmente: se parecer legendas, reescreva. Apenas escrita original: pegue um formato de que você goste, nunca o roteiro ou as cenas de outro criador. Cada fato é verificado em uma fonte confiável (liste-as em script.json "sources"). Tópicos de saúde: precisos, sem sangue, sem desinformação assustadora.
3. Construção
bash SKILL/scripts/new_video.sh <estilo> <nome-do-curta>copia o exemplo para~/faceless-shorts/<nome-do-curta>/.- Escreva
script.json(linhas + caps + gaps; veja STYLE.md). - Temporização:
SKILL/scripts/py SKILL/scripts/voice.py <proj>depoisSKILL/scripts/py SKILL/scripts/words.py <proj>(gravação própria:words.py <proj> --audio their.m4a; apenas legendas:estimate.py <proj>). - Reescreva
src/shots.js: uma cena por linha (ou duas para linhas longas), cada uma posicionada comcut(i)e seus momentos-chave nas palavras comWd('palavra', linha). Reutilize o kit (src/core/kit.js); adicione novos componentes lá, no visual do estilo. - No projeto:
node tools/capture.mjs check(deve dizer CHECK OK) →node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA (seção 4) →node tools/capture.mjs video renders/<nome>.mp4. Iterando em uma cena:node tools/capture.mjs frames review/f "4.2,4.6"e observe.
4. QA: nunca mostre um quadro que você não olhou
node tools/capture.mjs sheet review/all.jpg 0.5 10 (um quadro a cada 0,5 s, com carimbo de data/hora) e leia a folha inteira, depois os quadros-chave em tamanho real. Para cada quadro pergunte:
- Faz sentido? Um modo visual por cena: se o corpo está em raio-X, TODO ele está em raio-X (sem mangas de camisa em um corpo de raio-X). Adereços se movem com o que os segura (o chiclete fica na mão até a mão chegar à boca). Nada aparece antes de sua causa.
- Corresponde à narração naquele momento? A imagem muda pouco antes de sua linha; revelações caem em sua palavra.
- Há alguma colisão? Objetos em movimento nunca cruzam rótulos, pílulas, a zona de legendas (y 1250-1550) ou uns aos outros acidentalmente.
- Legendas: 1-3 palavras, exatamente uma palavra amarela, escrita corretamente, na palavra sendo dita, legível em um telefone.
- Folha de estilo: apenas a paleta, formas planas, vistas de raio-X em ciano, perigo em vermelho.
- Som: voz clara sobre a música; efeitos suaves (sem tiques ou bipes agressivos). Corrija, re-renderize a folha, verifique novamente. Informe ao usuário o que você detectou e corrigiu.
5. Entrega
Abra o MP4 para o usuário. Também forneça: uma cópia para compartilhar se > 35 MB (ffmpeg -i in.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 160k -movflags +faststart share.mp4), o melhor quadro de capa (capture.mjs frames), um título, uma legenda e 5-8 hashtags. Para o modo de gravação própria, forneça também o roteiro com os tempos de cada linha para eles lerem. Ofereça uma rodada de alterações precisas e re-renderize apenas o que mudou.
5b. Publicar no YouTube via Zapier (apenas quando o usuário pedir para enviar)
Todas as chamadas são ferramentas de Modo Código: execute-as dentro de execute como tools.zapier.* (não as chame como ferramentas normais). Validadas uma vez em um envio real; os valores abaixo são exatos.
- Conectar. Se
list_zapier_skillstiver uma skill salva para envio, use-a. Caso contrário, certifique-se de que o app YouTube está habilitado:discover_zapier_actions({ app: "YouTube" })→enable_zapier_action({ selected_api: "YouTubeV4CLIAPI", app_display_name: "YouTube", action: "upload_video" }). Se não houver conexão ainda,manage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" })retorna uma URL de conexão para o usuário. - Hospedar o arquivo. O parâmetro
video/thumbnailda ação precisa de uma URL que os servidores do Zapier possam buscar; um caminho local é silenciosamente incorreto. Coloque o MP4 em um host temporário, nesta ordem (todos testados em 03/11/2026; no Windows usecurl.exe):- a. litterbox (expiração de 1 h a 72 h, até 1 GB):
curl -F "reqtype=fileupload" -F "time=1h" -F "fileToUpload=@renders/<nome>.mp4" https://litterbox.catbox.moe/resources/internals/api.php→ retorna a URL direta como texto simples. - b. uguu.se (expiração de cerca de 3 h, bom para curtos abaixo de 35 MB):
curl -F "files[]=@renders/<nome>.mp4" https://uguu.se/upload→ retorna JSON; usefiles[0].url(o linkd.uguu.se/...). - c. catbox (permanente, sem expiração): mesma chamada que (a) sem
-F "time=1h". Público para sempre, então apenas com a aprovação do usuário. - Pule estes (verificados como quebrados em 03/11/2026, não perca tentativas): 0x0.st (uploads desabilitados), tmpfiles.org (o link é uma página de visualização, não o arquivo bruto), gofile.io (download bruto precisa de token de conta), file.io (a API curl redireciona para seu aplicativo web), bashupload.com, temp.sh (mortos).
- Sempre verifique a URL antes de usá-la:
curl -sSI <url>deve retornar 200/206 com um tipo de conteúdo de vídeo. Nunca confie no JSON de um host sem verificar. - Informe ao usuário que isso coloca o vídeo em um host temporário público que expira sozinho.
- a. litterbox (expiração de 1 h a 72 h, até 1 GB):
- Confirmar primeiro. Isso escreve no canal real do usuário, então confirme antes de executar: título, visibilidade (privado / não listado / público) e categoria.
Resolva
category_idcominspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" })se necessário. Comédia = 23 (sugestão padrão para Tall Tale e Deep Dive), Educação = 27, Animais de Estimação & Animais = 15. - Enviar.
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<URL temporária>", title, description (termine com #shorts), tags: [5-8 hashtags sem #], category_id: "23", privacy_status, made_for_kids: false, embeddable: true, notify_subscribers: true, default_language: "en", license: "youtube" } }) - Relatar. O resultado contém
id; o link éhttps://www.youtube.com/watch?v=<id>. Um vídeo vertical de 60 s ou menos se torna um Short automaticamente (nenhum campo extra). Abra o arquivo local para o usuário (tools.browser.preview({ path: "renders/<nome>.mp4" })) e forneça a URL do YouTube em texto. O navegador no aplicativo frequentemente falha ao carregar youtube.com com ERR_ABORTED; isso não é uma falha de envio. - Miniaturas. Envios não listados não aceitam uma miniatura personalizada por meio desta ação; ofereça o quadro de capa salvo se o usuário tornar o vídeo público posteriormente.
Adicionando um novo estilo (quando o usuário pedir)
Crie styles/<novo-estilo>/ com style-sheet.png, STYLE.md (mesmas seções do Inside Out: regras de aparência, paleta, formato, mapa de mecanismo/kit, componentes, anatomia de cena, tipos de dica, armadilhas de QA) e um example/ completo. Copie os tools/, index.html, src/main.js, src/core/{lib,timing,captions}.js do Inside Out, depois construa o kit e as cenas do novo visual. Os scripts compartilhados (voice, words, estimate, new_video, selftest) funcionam inalterados. Adicione uma linha à tabela acima e execute selftest.sh até que todos os estilos passem.
Estilos 3D (Deep Dive, Night File, Tall Tale)
Eles renderizam 3D real com three.js em Chrome headless. Com placa gráfica é rápido e com qualidade total. Sem uma (laptop sem aceleração de GPU, uma sandbox na nuvem) renderize com SOFTWARE_GL=1 QS='&res=0.6&aa=0&shadow=1024' FPS=24 na frente de node tools/capture.mjs ... (≈2 s por quadro; informe ao usuário o tempo de renderização antecipadamente, execute em segundo plano e faça QA com sheet review/all.jpg 1 10 primeiro). Seus arquivos STYLE.md listam a API 3D.
Nunca
Gere imagens ou vídeos com IA; gaste o dinheiro ou créditos do usuário; envie para o YouTube ou qualquer host sem o usuário pedir e confirmar; copie roteiro, cenas ou quadros de outro criador; sobrescreva o projeto de um usuário sem perguntar; entregue um quadro que você não tenha olhado.