Filme cinematográfico
Um filme feito desta forma é um único movimento de câmera sobre um único mundo. Cada foto, cartão, recorte, mapa e número vive em um grande painel, e a câmera viaja entre eles ao longo de fios, rotas e setas conforme a história avança. Cada acerto visual é sincronizado com a palavra que o narrador diz. É tudo código (Skia em Python), então renderiza da mesma forma a cada execução, qualquer tema se encaixa, e uma nova voz reajusta todo o filme automaticamente.
Construído a partir de um documentário de 5:22 sobre Al Capone e depois aberto para qualquer assunto. As regras aqui foram escritas a partir do que quebrou enquanto o fazia.
Ferramentas
| Arquivo | O que faz |
|---|---|
scripts/check_setup.py | Verifica Python, skia-python, ffmpeg, fontes e memória; informa o que instalar |
scripts/get_fonts.py | Obtém fontes de licença aberta (Bebas Neue, Homemade Apple) para qualquer papel de texto que esta máquina não possua |
scripts/new_project.py | Inicia um projeto a partir de assets/template/ (um explicador executável), ou o exemplo de documentário com --example |
scripts/make_beats.py | Escreve beats.md, a tabela que você aprova; valida cronologia, tamanho da linha, dígitos no texto falado |
scripts/tts_say.py | Voz experimental gratuita (macOS say, espeak-ng ou qualquer comando TTS) para ajustar o filme antes da voz final |
scripts/split_takes.py | Corta takes de seções inteiras em um clipe por linha e sinaliza cortes suspeitos |
scripts/build_narration.py | Junta as linhas em audio/narration.m4a e audio/timing.json, que são a base do filme |
scripts/fetch_commons.py | Pesquisa no Wikimedia Commons, baixa com licença e crédito, recusa arquivos não livres, escreve credits.md |
scripts/make_map.py | Projeta limites de domínio público (qualquer país ou região) para o mapa |
scripts/prep_assets.py | Uniformiza todas as imagens em um único visual (preto e branco, sépia ou cor natural); gera as texturas do painel |
scripts/engine.py | O motor do filme: câmera, foco, itens, mapas, visuais, finalização do filme |
scripts/render.py | Stills, tiras de contato, a lista de deixa e a renderização MP4 paralela |
scripts/build_sfx.py | Sintetiza todos os efeitos sonoros a partir da lista de deixa (sem amostras, nada a licenciar) |
scripts/mix_soundtrack.py | Voz, efeitos e música opcional, com ducking e normalização de loudness |
scripts/burn_captions.py | Grava um dos quatro estilos de legenda no filme finalizado e escreve um arquivo SRT |
Requer Python 3.9+, pip install skia-python numpy pillow (scipy opcional) e ffmpeg. Execute scripts/check_setup.py primeiro; no Linux ou Windows, execute também scripts/get_fonts.py por projeto. Todos os comandos aceitam --project <pasta>.
Escolha o filme
| Tipo | Visual | Imagens | Itens típicos |
|---|---|---|---|
| História, true crime, investigação | wall, slate | Fotos de arquivo e documentos, uniformizadas bw | Impressões, recortes rasgados, carimbos, barbante vermelho, rotas de mapa |
| Lançamento de produto, história de marca ou fundador | studio, charcoal | Suas fotos de produto e fotos da equipe, uniformizadas natural | Cartões, números grandes, contadores, setas |
| Ciência, engenharia, como funciona | blueprint, paper | Diagramas, imagens de arquivo ou IA | Cartões, contadores, marcas de caneta, mapas |
| Tecnologia, espaço, trailers | night | Capturas de tela, renders, imagens de IA | Letras grandes, contadores, rotas, cartões |
Misture livremente: os visuais são um painel e um acabamento, e todos os itens funcionam em todos os visuais. references/story.md tem um formato de história para cada tipo.
As regras
- Um herói por linha. Cada linha de narração tem exatamente uma coisa na qual a câmera está. O foco escurece todo o resto.
- Os acertos caem na palavra falada. Um carimbo bate em "acusado", não no início da linha. Cronometre tudo com
doc.W(linha, "palavra"). - Mostre uma frase de uma forma só. Ou digite-a na tela ou mostre-a em um documento real, nunca ambos. O texto do corpo em documentos são linhas cinzas, nunca palavras de preenchimento.
- O tempo só avança após a abertura. Uma abertura fria pode pular para frente. Após uma linha de ponte ("Quatro anos antes..."), o tempo da história só avança.
- Texto legível em um telefone em um segundo. Maiúsculas condensadas grandes. Um rótulo digitado na tela deve ter cerca de 3% ou mais da altura do quadro.
- Menos é mais. Os fios desaparecem após sua batida e os itens antigos escurecem. O recuo final deve parecer composto, não confuso.
- Nada inventado que pareça real. Fotos e documentos reais recebem créditos. Um documento desenhado em código é rotulado como recriação e cita apenas palavras que foram realmente escritas. Imagens de IA são aceitáveis para ilustração, mas nunca como evidência de um evento real ou de uma pessoa real.
Fluxo de trabalho
Pare para aprovação do usuário nos quatro portões (marcados Portão).
- História. Pesquise, depois escreva
script.json: takes (seções) de linhas, cada uma comtext,spoken(números por extenso),heroetyped. Mantenha notas factuais junto. 60 a 90 segundos equivalem a cerca de 150 a 230 palavras. Detalhes emreferences/story.md. - Tabela de batidas. Execute
scripts/make_beats.pye corrija todos os avisos de lint. Portão: o usuário aprovabeats.md, incluindo os fatos. - Imagens. Liste cada imagem em
photos.json: seu id, tipo e origem.- Imagens de arquivo:
fetch_commons.py search,categoryeget. - Arquivos do próprio usuário: coloque-os em
<projeto>/assets/photos/. - Stills de IA: gere-os em um único estilo (a skill
motion-assetsplaneja e precifica). references/archive.mdcobre outros arquivos e as regras de direitos.
- Imagens de arquivo:
- Voz experimental. Execute
tts_say.py, depoissplit_takes.py, depoisbuild_narration.py. Ouça cada linha quesplit_takes.pysinalizar. Agora os tempos são reais. - Assets. Execute
make_map.pyse a história viajar, depoisprep_assets.py. - Cena. Escreva
scene.py: organize o painel em clusters por seção, adicione itens nos temposdoc.L/doc.W, depois a câmera e as chaves de foco (film.shot). Leiareferences/film.md. Ambos os projetos enviados mostram os padrões:assets/template/scene.py(explicador, visual studio) eassets/wright-flyer/scene.py(documentário, todos os tipos de item). - Teste de visual. Execute
render.py --probeem um still por linha em 1280x720 e olhe para todos, depois--stripem cada grande movimento de câmera. Portão: mostre ao usuário stills da abertura e do visual. - Rascunho. Renderize os primeiros 30 segundos em 1280x720 com a voz experimental. Portão: o usuário assiste.
- Voz final. Grave com qualquer TTS ou uma pessoa (
references/voice.md). Execute split, build e probes novamente; nada na cena muda. - Som. Execute
render.py --cues, depoisbuild_sfx.py, depoismix_soundtrack.py, adicionando uma trilha, se desejado. Leiareferences/sound.md. - Finalização. Faça a renderização completa, depois
burn_captions.pye o SRT. Leiareferences/performance.mdantes de renderizar em 1440p ou 4K. Entreguecredits.mdjunto com o filme.
Auto-revisão, sempre
Olhe para os stills antes de afirmar que algo funciona. Estes são os erros que apareceram, todos em uma renderização real:
- Tinta escura em um painel escuro: invisível. Use texto claro em visuais escuros, ou
bar_h=0.92para um bloco de rótulo completo atrás de texto escuro. - A câmera se moveu, mas o foco ficou para trás, deixando um quadro escuro. Use
film.shot()a menos que devam se separar. - Escala do mapa muito pequena: uma costa inteira menor que uma foto. Escolha
Kpara que cada lugar com impressões tenha seu próprio espaço (references/film.md). - Rótulos do mapa colidindo. Coloque o rótulo no lado oposto ao seu vizinho.
- Um cluster na borda do mapa. Mantenha clusters no mapa ou claramente fora dele.
- Destaques alguns pixels fora de suas palavras. Use
PaperDoc.phrase_spansedoc.on(print, fx, fy)com frações lidas de uma grade de sobreposição da imagem.
Projetos enviados
assets/template/: "From Cherry to Cup", um explicador de 25 segundos no visual studio, feito de cartões, setas e um contador, sem imagens.new_project.py my-filmcopia. Dê uma voz experimental e ele renderiza.assets/wright-flyer/: "Twelve Seconds", um documentário de 90 segundos sobre o primeiro voo e o rival de $50.000 que caiu duas vezes. Usa sete fotos de domínio público, o mapa dos EUA, dois documentos tipografados e todos os tipos de item.
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a
Skills relacionadas
De Open 3D Skills: motion-assets planeja e precifica stills de IA quando um filme precisa de ilustração, e frame-capture grava páginas web em vez de filmes desenhados em código.