primocode 10.15.2 → 10.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/edit-ia-pro.txt +32 -0
- package/LICENSES/fontes-OFL.txt +476 -0
- package/LICENSES/hyperframes-Apache-2.0.txt +205 -0
- package/LICENSES/permanent-marker-Apache-2.0.txt +204 -0
- package/LICENSES/selfie-multiclass-Apache-2.0.txt +227 -0
- package/LICENSES/three-MIT.txt +23 -0
- package/LICENSES/video-use-MIT.txt +24 -0
- package/LICENSES/woven-sfx-CC0.txt +16 -0
- package/LICENSES/yunet-MIT.txt +21 -0
- package/README.md +2 -2
- package/bin/primocode.js +74 -9
- package/editor/LICENSE.md +11 -0
- package/editor/README.md +321 -0
- package/editor/SKILL.md +307 -0
- package/editor/THIRD_PARTY_NOTICES.md +228 -0
- package/editor/assets/baixar.json +591 -0
- package/editor/assets/fonts/anton/OFL.txt +93 -0
- package/editor/assets/fonts/caveat/OFL.txt +93 -0
- package/editor/assets/fonts/figtree/OFL.txt +93 -0
- package/editor/assets/fonts/fonts.json +10 -0
- package/editor/assets/fonts/montserrat/OFL.txt +93 -0
- package/editor/assets/fonts/permanentmarker/LICENSE.txt +202 -0
- package/editor/assets/models/SELFIE_MULTICLASS_LICENSE.txt +227 -0
- package/editor/assets/models/YUNET_LICENSE.txt +21 -0
- package/editor/assets/sfx/licencas/bass_drop.txt +32 -0
- package/editor/assets/sfx/licencas/cash.txt +76 -0
- package/editor/assets/sfx/licencas/charge.txt +31 -0
- package/editor/assets/sfx/licencas/click.txt +46 -0
- package/editor/assets/sfx/licencas/coin.txt +50 -0
- package/editor/assets/sfx/licencas/count.txt +47 -0
- package/editor/assets/sfx/licencas/data.txt +31 -0
- package/editor/assets/sfx/licencas/error.txt +32 -0
- package/editor/assets/sfx/licencas/flash.txt +31 -0
- package/editor/assets/sfx/licencas/gears.txt +82 -0
- package/editor/assets/sfx/licencas/keyboard.txt +48 -0
- package/editor/assets/sfx/licencas/metal_hit.txt +62 -0
- package/editor/assets/sfx/licencas/metal_riser.txt +61 -0
- package/editor/assets/sfx/licencas/mouse_click.txt +50 -0
- package/editor/assets/sfx/licencas/notification.txt +54 -0
- package/editor/assets/sfx/licencas/pop.txt +38 -0
- package/editor/assets/sfx/licencas/rewind.txt +32 -0
- package/editor/assets/sfx/licencas/rise.txt +46 -0
- package/editor/assets/sfx/licencas/sinteticos.txt +21 -0
- package/editor/assets/sfx/licencas/snap.txt +50 -0
- package/editor/assets/sfx/licencas/success.txt +40 -0
- package/editor/assets/sfx/licencas/synth_hit.txt +32 -0
- package/editor/assets/sfx/licencas/tick.txt +14 -0
- package/editor/assets/sfx/licencas/whoosh.txt +47 -0
- package/editor/assets/sfx/licencas/wind.txt +31 -0
- package/editor/assets/sfx/sfx.json +832 -0
- package/editor/assets/sfx/sfx_sinteticos.json +317 -0
- package/editor/assets/sfx/sfx_woven.json +387 -0
- package/editor/assets/sfx/woven/LICENCA.md +16 -0
- package/editor/fichas/briefing-do-video.md +45 -0
- package/editor/fichas/conferencia-da-amostra.md +56 -0
- package/editor/fichas/matriz-de-ganchos.csv +3 -0
- package/editor/fichas/padrao.json +16 -0
- package/editor/fichas/planilha-de-cenas.csv +4 -0
- package/editor/fichas/planilha-de-versoes.csv +4 -0
- package/editor/fichas/plano-em-blocos.md +32 -0
- package/editor/fichas/registro-de-materiais.json +27 -0
- package/editor/helpers/assets_ocr/ocr_vision.swift +41 -0
- package/editor/helpers/bordas_precisas.py +272 -0
- package/editor/helpers/camera_viva.py +426 -0
- package/editor/helpers/captions.py +601 -0
- package/editor/helpers/common.py +308 -0
- package/editor/helpers/compose_final.py +3555 -0
- package/editor/helpers/conferir_corte.py +234 -0
- package/editor/helpers/conferir_dados.py +405 -0
- package/editor/helpers/contact_sheet.py +282 -0
- package/editor/helpers/corte_por_onda.py +433 -0
- package/editor/helpers/corte_seco.py +595 -0
- package/editor/helpers/denoise.py +971 -0
- package/editor/helpers/efeitos.py +408 -0
- package/editor/helpers/efeitos_gerar.py +159 -0
- package/editor/helpers/elevenlabs_api.py +442 -0
- package/editor/helpers/face_layout.py +570 -0
- package/editor/helpers/fetch_images.py +423 -0
- package/editor/helpers/ganho_por_trecho.py +214 -0
- package/editor/helpers/gen_image.py +312 -0
- package/editor/helpers/gen_music.py +316 -0
- package/editor/helpers/gen_sfx.py +148 -0
- package/editor/helpers/grade.py +307 -0
- package/editor/helpers/icloud.py +119 -0
- package/editor/helpers/make_sfx.py +940 -0
- package/editor/helpers/matte.py +1342 -0
- package/editor/helpers/medir_referencia.py +2232 -0
- package/editor/helpers/mixar_trilha.py +354 -0
- package/editor/helpers/montar_corte.py +295 -0
- package/editor/helpers/motion/__init__.py +13 -0
- package/editor/helpers/motion/engine.py +1915 -0
- package/editor/helpers/motion/registry.py +510 -0
- package/editor/helpers/motion/render.py +665 -0
- package/editor/helpers/motion/templates/barra_progresso.py +370 -0
- package/editor/helpers/motion/templates/carimbo.py +132 -0
- package/editor/helpers/motion/templates/checklist.py +271 -0
- package/editor/helpers/motion/templates/comentario_cta.py +380 -0
- package/editor/helpers/motion/templates/contador.py +222 -0
- package/editor/helpers/motion/templates/destaque.py +263 -0
- package/editor/helpers/motion/templates/etiqueta_preco.py +461 -0
- package/editor/helpers/motion/templates/grafico_barras.py +510 -0
- package/editor/helpers/motion/templates/grafico_linha.py +462 -0
- package/editor/helpers/motion/templates/notificacao.py +266 -0
- package/editor/helpers/motion/templates/palavra_impacto.py +410 -0
- package/editor/helpers/motion/templates/passos.py +321 -0
- package/editor/helpers/motion/templates/riscado.py +298 -0
- package/editor/helpers/motion/templates/selo_garantia.py +150 -0
- package/editor/helpers/motion_render.py +241 -0
- package/editor/helpers/motion_sugerir.py +961 -0
- package/editor/helpers/noise_check.py +134 -0
- package/editor/helpers/pack_transcripts.py +223 -0
- package/editor/helpers/palavras_na_onda.py +176 -0
- package/editor/helpers/plano_sfx.py +839 -0
- package/editor/helpers/portao.py +427 -0
- package/editor/helpers/preview_server.py +1177 -0
- package/editor/helpers/rastrear_rosto.py +298 -0
- package/editor/helpers/render_cut.py +1256 -0
- package/editor/helpers/respiros.py +89 -0
- package/editor/helpers/sincronizar_cameras.py +571 -0
- package/editor/helpers/speech_regions.py +423 -0
- package/editor/helpers/style_catalog.json +231 -0
- package/editor/helpers/style_samples.py +246 -0
- package/editor/helpers/tela_verde.py +2113 -0
- package/editor/helpers/text_render.py +2059 -0
- package/editor/helpers/texto_na_tela.py +366 -0
- package/editor/helpers/timeline_view.py +292 -0
- package/editor/helpers/tira_de_quadros.py +113 -0
- package/editor/helpers/transcribe.py +734 -0
- package/editor/helpers/transcribe_batch.py +129 -0
- package/editor/helpers/trilhas.py +1146 -0
- package/editor/helpers/trilhas_humores.json +66 -0
- package/editor/helpers/valores.py +187 -0
- package/editor/helpers/verify_cut.py +820 -0
- package/editor/helpers/voice_levels.py +233 -0
- package/editor/helpers/voz_check.py +386 -0
- package/editor/helpers/voz_limpa.py +81 -0
- package/editor/helpers/watch_preview.py +372 -0
- package/editor/modelo-projeto/LEIA.md +402 -0
- package/editor/modelo-projeto/assets/fontes/OFL-Caveat.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/OFL-JetBrainsMono.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/OFL-Montserrat.txt +93 -0
- package/editor/modelo-projeto/assets/fontes/larguras.json +1 -0
- package/editor/modelo-projeto/assets/three/BufferGeometryUtils.js +1438 -0
- package/editor/modelo-projeto/assets/three/GLTFLoader.js +4895 -0
- package/editor/modelo-projeto/assets/three/LICENSE +21 -0
- package/editor/modelo-projeto/assets/three/ORIGEM.txt +17 -0
- package/editor/modelo-projeto/assets/three/RoomEnvironment.js +185 -0
- package/editor/modelo-projeto/assets/three/three.core.min.js +6 -0
- package/editor/modelo-projeto/assets/three/three.module.min.js +6 -0
- package/editor/modelo-projeto/build.py +4828 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_antes_depois.html +199 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_arquivo.html +232 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_busca.html +315 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_comando.html +304 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_conversa.html +217 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_esquema.html +289 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_medidor.html +249 -0
- package/editor/modelo-projeto/compositions/cenas/2d/k2d_notas.html +233 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_caminho.html +197 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_explodida.html +152 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_tela.html +167 -0
- package/editor/modelo-projeto/compositions/cenas/3d/k3d_volume.html +124 -0
- package/editor/modelo-projeto/compositions/cenas/3d/motor-three.js +728 -0
- package/editor/modelo-projeto/compositions/cenas/LEIA.md +177 -0
- package/editor/modelo-projeto/ferramentas/medir_fontes.py +65 -0
- package/editor/modelo-projeto/ferramentas/pessoa_recortada.py +176 -0
- package/editor/modelo-projeto/ferramentas/rastrear_maos.py +189 -0
- package/editor/modelo-projeto/hyperframes.json +12 -0
- package/editor/modelo-projeto/package.json +11 -0
- package/editor/modelo-projeto/projeto.json +16 -0
- package/editor/preview/app.css +1009 -0
- package/editor/preview/app.js +2122 -0
- package/editor/preview/index.html +307 -0
- package/editor/pyproject.toml +23 -0
- package/editor/references/3d.md +236 -0
- package/editor/references/animacao-catalogo.md +672 -0
- package/editor/references/animacao.md +498 -0
- package/editor/references/comandos.md +92 -0
- package/editor/references/corte-seco-como-funciona.md +50 -0
- package/editor/references/corte-seco.md +88 -0
- package/editor/references/corte.md +290 -0
- package/editor/references/direcao-por-blocos.md +218 -0
- package/editor/references/enquadramento.md +654 -0
- package/editor/references/estilos-prontos.md +355 -0
- package/editor/references/estudio.md +100 -0
- package/editor/references/exemplo-eventos.json +67 -0
- package/editor/references/lettering.md +252 -0
- package/editor/references/modelos.md +494 -0
- package/editor/references/phase2.md +1007 -0
- package/editor/references/referencia-aplicar.md +203 -0
- package/editor/references/referencia-medir.md +375 -0
- package/editor/references/revisao.md +335 -0
- package/editor/references/som-e-trilha.md +146 -0
- package/editor/references/tabela-de-sons.md +130 -0
- package/editor/references/variacoes.md +234 -0
- package/editor/uv.lock +1141 -0
- package/lib/act.js +38 -8
- package/lib/app-chat.js +97 -0
- package/lib/catalogo.js +7 -1
- package/lib/chamada-torta.js +81 -0
- package/lib/editor-pro.js +786 -0
- package/lib/entrega.js +58 -0
- package/lib/estudio/conferencia-visual.js +76 -0
- package/lib/estudio/diretor.js +6 -1
- package/lib/estudio/exportar.js +3 -1
- package/lib/estudio/gosto/tela.html +1349 -0
- package/lib/estudio/gosto.js +305 -0
- package/lib/estudio/index.js +12 -1
- package/lib/estudio/kit-ae/base.jsx +119 -13
- package/lib/estudio/kit-ae/cenas.jsx +47 -15
- package/lib/estudio/kit-ae/guarda.jsx +274 -0
- package/lib/estudio/kit-ae/primitivas.jsx +180 -24
- package/lib/estudio/maquina-diretor.js +70 -12
- package/lib/estudio/maquina-foto.js +177 -0
- package/lib/estudio/maquina-guarda.js +207 -0
- package/lib/estudio/maquina-layout.js +22 -1
- package/lib/estudio/maquina.js +64 -11
- package/lib/estudio/referencias.js +1 -1
- package/lib/estudio/visao/visao.swift +97 -0
- package/lib/estudio/visao.js +60 -0
- package/lib/headless.js +15 -3
- package/lib/local/cerebro.json +285 -7
- package/lib/local/motor.js +5 -2
- package/lib/memoria-usuario.js +164 -0
- package/lib/nuvem.js +33 -2
- package/lib/passagem.js +50 -0
- package/lib/perigo.js +19 -11
- package/lib/protecao.js +134 -0
- package/lib/repeticao.js +1 -1
- package/lib/sandbox.js +57 -9
- package/lib/titulo-conversa.js +46 -0
- package/lib/tools.js +23 -4
- package/lib/ui.js +2 -2
- package/package.json +3 -2
- package/skills/editar-meu-video/SKILL.md +6 -2
- package/skills/editar-video/SKILL.md +113 -0
- package/studio/pessoa.py +52 -0
- package/voz/primo_voz/__main__.py +55 -40
- package/voz/primo_voz/app.py +500 -4
- package/voz/primo_voz/chat.html +1773 -0
- package/voz/primo_voz/conversa.py +0 -26
- package/voz/primo_voz/hud.html +8 -2
- package/voz/primo_voz/hud.py +129 -5
- package/voz/primo_voz/identidade.py +1 -1
- package/voz/primo_voz/painel_dados.py +134 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
# Projeto-modelo do editor de vídeo
|
|
2
|
+
|
|
3
|
+
Projeto HyperFrames que monta o vídeo final em cima do corte da skill (Fase 1): a cena de cada trecho (tela
|
|
4
|
+
cheia, prova, moldura, tela verde), a legenda, as animações do catálogo, as cenas sob medida, o texto atrás
|
|
5
|
+
da pessoa e os efeitos sonoros, tudo no tempo das palavras. Quem edita é a IA, seguindo
|
|
6
|
+
`references/enquadramento.md`, `references/animacao.md` e `references/som-e-trilha.md` da skill. A pessoa vê
|
|
7
|
+
tudo no estúdio do HyperFrames, com uma faixa por camada na linha do tempo; o render fica para o fim.
|
|
8
|
+
|
|
9
|
+
## O que precisa
|
|
10
|
+
|
|
11
|
+
- Python 3.8 ou mais novo e o `ffmpeg` (o corte da skill, Fase 1, já pede os dois).
|
|
12
|
+
- Node 22 ou mais novo (o HyperFrames roda pelo `npx`; a primeira vez baixa sozinho). O instalador da skill põe
|
|
13
|
+
o Node em `~/.editor-video/node`, e o `build.py` procura lá primeiro.
|
|
14
|
+
- A pasta `edit` do corte da skill (Fase 1), já aprovado, com `cut.mp4`, `cut_timeline.json`,
|
|
15
|
+
`transcripts/cut.json` e `face_layout.json`.
|
|
16
|
+
|
|
17
|
+
## Como começar
|
|
18
|
+
|
|
19
|
+
1. Crie o projeto a partir do modelo que está dentro da skill:
|
|
20
|
+
`python3 '<SKILL>/modelo-projeto/build.py' novo '<VIDEOS>/projeto' --edit '<VIDEOS>/edit'`.
|
|
21
|
+
Ele copia o modelo (sem sobras de outro projeto) e anota no `projeto.json` a skill de onde veio (`"skill"`)
|
|
22
|
+
e a pasta `edit`. As ferramentas usam essa skill, e não outra instalada no computador. Nunca edite o modelo
|
|
23
|
+
original. Copiou a pasta à mão? Escreva `"skill": "<SKILL>"` no `projeto.json` (ou deixe o
|
|
24
|
+
`EDITOR_VIDEO_DIR` apontando para a skill: o primeiro build anota).
|
|
25
|
+
2. No `projeto.json`, confira o `formato` (`9:16`, `16:9`, `4:5` ou `1:1`) e o `estilo` (`papelaria`, `noite` ou `laranja`).
|
|
26
|
+
3. `python3 build.py corte`: o corte inteiro só com o vídeo (enquadrado pelo rosto, tela cheia) e a legenda
|
|
27
|
+
simples. `python3 build.py estudio` e a pessoa revisa o corte no estúdio, antes de qualquer animação.
|
|
28
|
+
4. `python3 build.py palavras` mostra a fala com os tempos e os cortes.
|
|
29
|
+
5. Escreva os `blocos`, as `animacoes` e as `cenas_proprias` (exemplo abaixo).
|
|
30
|
+
6. Amostra (uns 8 s em edição simples, uns 15 s com motion, uns 5 s para texto atrás da pessoa):
|
|
31
|
+
`python3 build.py amostra 17.9 27.9`. O estúdio aberto recarrega sozinho. Vídeo curto, do tamanho da amostra
|
|
32
|
+
(um criativo de 10 s): a amostra já é o vídeo inteiro (o build diz numa linha `nota:`); confira e mostre esta
|
|
33
|
+
mesma, e depois do ok o `completo` sai igual, sem outra rodada.
|
|
34
|
+
7. `python3 build.py hf lint` e `python3 build.py hf check` (os dois sem erro).
|
|
35
|
+
8. A pessoa aprova a amostra no estúdio. Vídeo todo: `python3 build.py completo`, `hf lint`, `hf check` e
|
|
36
|
+
estúdio de novo.
|
|
37
|
+
9. Sons (seção "Sons", abaixo): `plano_sfx.py --projeto` e o `completo` de novo.
|
|
38
|
+
10. Render só no fim, com a aprovação: `python3 build.py hf render --quality draft --output renders/amostra.mp4`
|
|
39
|
+
para conferir e `python3 build.py hf render --quality delivery --output renders/final.mp4` para entregar.
|
|
40
|
+
Olhe o arquivo renderizado: ele é a referência, não a prévia do estúdio. A trilha entra por último, no
|
|
41
|
+
arquivo renderizado (`helpers/mixar_trilha.py`).
|
|
42
|
+
|
|
43
|
+
`python3 build.py preparar` baixa o GSAP para `assets/` (render sem internet). Sem ele, a página usa o GSAP
|
|
44
|
+
do CDN.
|
|
45
|
+
|
|
46
|
+
## Projeto antigo, modelo novo
|
|
47
|
+
|
|
48
|
+
O `build.py` do projeto é uma cópia do modelo do dia em que o projeto nasceu. Quando o modelo da skill muda no meio
|
|
49
|
+
do trabalho, leve o projeto para o modelo novo, sem refazer nada:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
python3 '<SKILL>/modelo-projeto/build.py' atualizar '<PROJ>'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Ele troca o `build.py`, este LEIA, o `package.json`, o `hyperframes.json`, as `ferramentas/`, os kits de cena
|
|
56
|
+
(`compositions/cenas/2d`, `compositions/cenas/3d` e o LEIA das cenas) e as fontes e o three.js de `assets/`. O que
|
|
57
|
+
mudou vai antes para `.antes-de-atualizar/<data>/` (volte um arquivo copiando de lá). O `projeto.json` (menos o
|
|
58
|
+
`"skill"`, que passa a ser a skill do modelo), os outros `assets` (sons, imagens, pessoa recortada), as cenas
|
|
59
|
+
próprias, o `eventos.json` e os `renders` ficam como estão. A saída diz o que foi trocado, o que é novo, o que só o
|
|
60
|
+
projeto tem (fica) e as novidades do modelo desde a versão do projeto (`MODELO_VERSAO` e `NOVIDADES` no
|
|
61
|
+
`build.py`). Depois: `python3 build.py completo` (ou a amostra), `hf lint` e `hf check`.
|
|
62
|
+
|
|
63
|
+
## Uma versão só do HyperFrames
|
|
64
|
+
|
|
65
|
+
O `package.json` fixa a versão (`hyperframes@0.8.79`). Chame sempre pelo `build.py hf`, que repassa ao `npx`
|
|
66
|
+
nessa versão: `python3 build.py hf lint`, `hf check`, `hf snapshot ...`, `hf render ...`. O estúdio usa a
|
|
67
|
+
mesma. `npx hyperframes ...` sem versão baixa a mais nova, e aí o lint, o check e o render rodam numa versão e o
|
|
68
|
+
estúdio em outra.
|
|
69
|
+
|
|
70
|
+
## Comandos
|
|
71
|
+
|
|
72
|
+
| comando | o que faz |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `python3 build.py novo <PASTA> [--edit <EDIT>]` | (rodado no modelo dentro da skill) cria o projeto e anota a skill e o `edit` no `projeto.json` |
|
|
75
|
+
| `python3 build.py atualizar <PASTA>` | (rodado no modelo dentro da skill) leva um projeto antigo para o modelo novo e diz o que mudou (seção "Projeto antigo, modelo novo") |
|
|
76
|
+
| `python3 build.py palavras [de] [ate]` | a fala com os tempos, os cortes e os blocos |
|
|
77
|
+
| `python3 build.py corte` | `index.html` do corte inteiro só com o vídeo e a legenda simples; blocos, animações, cenas, sons e cartão final ficam de fora |
|
|
78
|
+
| `python3 build.py amostra <inicio> <fim>` | `index.html` só desse trecho, com tudo |
|
|
79
|
+
| `python3 build.py completo` | `index.html` do vídeo inteiro (com o fim parado e o cartão final, se ligados) |
|
|
80
|
+
| `python3 build.py hf <comando> [...]` | o HyperFrames na versão do `package.json`: `lint`, `check`, `snapshot`, `render`. O `snapshot` roda sem as chaves de IA do ambiente (seção "Snapshot sem mandar quadros para fora") |
|
|
81
|
+
| `python3 build.py estudio [--porta N] [--sem-abrir]` | sobe o estúdio em segundo plano (porta livre a partir de 3002), confere que responde e escreve a URL com `#project/<pasta>`. Se já estiver no ar (na mesma versão), só mostra a URL |
|
|
82
|
+
| `python3 build.py estudio --parar` | derruba o estúdio deste projeto e confere que a porta fechou (os de outros projetos continuam) |
|
|
83
|
+
| `python3 build.py preparar` | baixa o GSAP para `assets/` |
|
|
84
|
+
|
|
85
|
+
## O projeto.json
|
|
86
|
+
|
|
87
|
+
| campo | o que é |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `titulo` | nome do vídeo |
|
|
90
|
+
| `skill` | a pasta da skill de onde o projeto veio (o `novo` escreve); as ferramentas usam essa primeiro |
|
|
91
|
+
| `edit` | pasta edit do corte da skill (Fase 1), relativa a esta pasta |
|
|
92
|
+
| `formato` | `9:16` (1080x1920), `16:9` (1920x1080), `4:5` (1080x1350) ou `1:1` (1080x1080). Em 4:5 e 1:1 a zona segura é uma margem folgada, **a conferir na rede** de destino (o build avisa) |
|
|
93
|
+
| `estilo` | `papelaria` (papel quadriculado lilás), `noite` (azul-marinho) ou `laranja` (escuro com laranja, o visual escuro de anúncio: fundo quase preto com grade e brilho laranja, cartão escuro com fio laranja, texto claro, laranja `#ff7a1a` de destaque, verde `#35d07f` e vermelho `#ff3b30`; o texto sobre o laranja é escuro; as cenas do kit 2D em tela cheia usam o mesmo fundo, com a grade e o brilho) |
|
|
94
|
+
| `correcoes` | o que a transcrição errou. A chave pode ter mais de uma palavra: `{"um IA": "uma IA", "S&A": "essa IA"}` troca só a sequência inteira; sem acento, maiúscula ou pontuação também casa (a pontuação do fim fica). Valor com outro número de palavras divide o tempo entre elas. Espaço sem quebra (U+00A0) no valor cola duas palavras numa só na legenda |
|
|
95
|
+
| `zoom` | zoom padrão da tela cheia (1,08); também vale no `corte` |
|
|
96
|
+
| `moldura` | `{"caixa": [x, y, largura, altura]}` para mudar o quadro da moldura |
|
|
97
|
+
| `blocos` | a cena de cada trecho (`references/enquadramento.md` da skill): `tela_cheia`, `prova`, `moldura`, `tela_verde`, `contida` (a gravação inteira com margem) e `comparar` (antes e depois); `zooms`, `borrar`, `inicio` da prova, `fundo` da moldura e da contida, `"acompanhar": true` (a câmera segue a pessoa dentro da tomada) |
|
|
98
|
+
| `legenda` | `ligada`, `estilo` (`padrao` ou `discreta`), `max_palavras` (3), `max_letras` (14 no padrão, 22 na discreta, em 9:16), `na_moldura` (false), `na_tela_verde` (true), `esconder` ([[de, ate]]). Nenhuma palavra dita some da legenda: cada frase (entre pausas de mais de 0,6 s e pontuação) é dividida por sentido, sem terminar legenda em artigo, preposição ou "não" e sem deixar palavra sozinha quando dá ("Eu gravei" / "esse vídeo" / "uma vez só,"); a palavra que piscaria menos de 0,3 s junta com a vizinha, mesmo passando de 3 por um instante |
|
|
99
|
+
| `animacoes` | as peças do catálogo (`references/animacao-catalogo.md` da skill), inclusive o texto atrás da pessoa |
|
|
100
|
+
| `cenas_proprias` | cenas escritas à mão: `[{"arquivo": "compositions/cenas/s03_orcamento.html", "de": 12.3, "ate": "cortou"}]` (`compositions/cenas/LEIA.md`). `"sobre_a_pessoa": true` quando a cena é um cartão pequeno acima da cabeça com a pessoa em tela cheia (`"area": "acima_do_rosto"` nas cenas `k2d_medidor`, `k2d_comando`, `k2d_busca` e `k2d_notas`): a câmera viva fica em zoom 1,0 e não aproxima nesse trecho (rode o `camera_viva.py` depois de marcar); o build ignora o campo |
|
|
101
|
+
| `sons` | os efeitos sonoros (seção "Sons"); quem escreve é o `plano_sfx.py --projeto` |
|
|
102
|
+
| `segura_fim` | segundos com o último quadro parado no fim, a voz já terminada, e as peças e cenas continuando (tempo de leitura do fim). 1 a 2 s é o comum. Peça ou cena própria cujo `sai`/`ate` cai no fim do corte (até 0,25 s antes) continua até o fim do quadro parado, legível até o último quadro (a saída dela cai depois do fim); o fundo desfocado ou a cor da contida também. Sem `segura_fim`, a peça que vai até o fim do corte também fica até o último quadro |
|
|
103
|
+
| `cartao_final` | `ligado`, `segundos` (1,8), `titulo`, `sub`, `botao`, `logo`. Com `segura_fim`, entra depois do fim parado |
|
|
104
|
+
|
|
105
|
+
Tempo é sempre em segundos do `cut.mp4`, ou a palavra (`"em": "produtos", "depois_de": 20`). Com o
|
|
106
|
+
`palavras_onda.json` na pasta `edit` (`uv run --directory '<SKILL>' python helpers/palavras_na_onda.py '<EDIT>'`), a
|
|
107
|
+
palavra usa o começo medido na onda, e não o do Whisper, que adianta até 0,3 s: as âncoras das peças, a legenda e as
|
|
108
|
+
`palavras` das cenas próprias. O `build.py palavras` diz qual tempo está valendo. Arquivo de outro corte é ignorado
|
|
109
|
+
com aviso (rode o helper de novo depois de cada corte).
|
|
110
|
+
|
|
111
|
+
Exemplo:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"titulo": "Criativo produtos digitais",
|
|
116
|
+
"skill": "/caminho/da/skill/editor-video",
|
|
117
|
+
"edit": "../edit",
|
|
118
|
+
"formato": "9:16",
|
|
119
|
+
"estilo": "papelaria",
|
|
120
|
+
"correcoes": {"um IA": "uma IA"},
|
|
121
|
+
"blocos": [
|
|
122
|
+
{"cena": "tela_cheia", "de": 0, "ate": 14.4, "zoom": 1.1, "zooms": [{"em": "nunca", "escala": 1.3, "ate": "vendi"}]},
|
|
123
|
+
{"cena": "prova", "de": 14.4, "ate": 18.3, "arquivo": "assets/reel.mp4", "inicio": 9.9, "rotulo": "Reel *publicado*",
|
|
124
|
+
"borrar": [{"caixa": [0.05, 0.1, 0.5, 0.06], "de": 15.0, "ate": 16.2}]},
|
|
125
|
+
{"cena": "moldura", "de": 21.933, "ate": 28.033},
|
|
126
|
+
{"cena": "tela_cheia", "de": 28.033, "zoom": 1.1}
|
|
127
|
+
],
|
|
128
|
+
"legenda": {"ligada": true, "estilo": "padrao", "max_palavras": 3, "na_moldura": false},
|
|
129
|
+
"animacoes": [
|
|
130
|
+
{"id": "fim", "tipo": "atras_da_pessoa", "texto": "O FIM", "em": "fim", "sai": "editores"},
|
|
131
|
+
{"id": "sem", "tipo": "lista_check", "titulo": "Você *não precisa* de", "marca": "x", "depois_de": 22, "sai": 27.9,
|
|
132
|
+
"itens": [{"texto": "Espaço", "em": "espaço"}, {"texto": "Estoque", "em": "estoque"}, {"texto": "Frete", "em": "frete"}]}
|
|
133
|
+
],
|
|
134
|
+
"cenas_proprias": [
|
|
135
|
+
{"arquivo": "compositions/cenas/s04_orcamento.html", "de": "orçamento", "ate": 34.2, "esconde_legenda": true}
|
|
136
|
+
],
|
|
137
|
+
"sons": [],
|
|
138
|
+
"segura_fim": 1.2,
|
|
139
|
+
"cartao_final": {"ligado": false}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Tipos de animação: `rotulo`, `carimbo`, `lista_check`, `passo_a_passo`, `contador`, `notificacao`,
|
|
144
|
+
`polaroide`, `objeto_na_mao`, `hud` (com `tamanho` e `topo`), `atras_da_pessoa` (com `frente`) e `lettering`. Campos
|
|
145
|
+
de cada um: `references/animacao-catalogo.md` da skill.
|
|
146
|
+
|
|
147
|
+
## Sons
|
|
148
|
+
|
|
149
|
+
Um caminho só, sem colar nada no `index.html` (o build reescreve o arquivo a cada vez):
|
|
150
|
+
|
|
151
|
+
1. `python3 build.py completo` grava `sons_sugeridos.json` (o som que cada animação, zoom, troca de cena e
|
|
152
|
+
entrada de prova pede, com o tempo do pico e o nível, `db`, em dBFS de pico). Os eventos das cenas próprias
|
|
153
|
+
vão num `eventos.json` na pasta do projeto (`[{"t": 12.4, "tipo": "pop"}]`).
|
|
154
|
+
2. `uv run --directory '<SKILL>' python helpers/plano_sfx.py --projeto '<PROJ>'`: monta o plano (um som por
|
|
155
|
+
animação, 0,65 s de espaço mínimo, o nível que a peça pediu), copia os sons para `assets/sfx` (com
|
|
156
|
+
`LICENCAS.txt`) e escreve o campo `sons` do `projeto.json`. Os níveis que o build pede seguem a tabela de sons:
|
|
157
|
+
pequeno -18 (pop, clique, tique, whoosh), médio -15, destaque -12 (carimbo, número final, notificação) e baixo
|
|
158
|
+
-20. Destaque é no máximo um a cada 6 s: o que vem logo depois de outro desce para médio no
|
|
159
|
+
`sons_sugeridos.json`. No `eventos.json`, o `"nivel"` do evento manda.
|
|
160
|
+
3. `python3 build.py completo` de novo: os sons entram no `index.html`, com faixa própria no estúdio, que toca
|
|
161
|
+
todos eles. O render sai com os sons.
|
|
162
|
+
4. Render. A trilha entra por último, no arquivo renderizado: `helpers/mixar_trilha.py`.
|
|
163
|
+
|
|
164
|
+
Cada som do `projeto.json`:
|
|
165
|
+
|
|
166
|
+
| campo | o que é |
|
|
167
|
+
|---|---|
|
|
168
|
+
| `arquivo` | o som, a partir da pasta do projeto (`assets/sfx/pop-hand.wav`) |
|
|
169
|
+
| `em` | o quadro em que o pico do som cai (segundos do corte ou a palavra) |
|
|
170
|
+
| `pico_no_arquivo` | onde fica o pico dentro do arquivo (sem ele, o build mede o maior pico) |
|
|
171
|
+
| `inicio_no_arquivo` | pula o começo do arquivo (segundos) |
|
|
172
|
+
| `dur` | quanto toca (padrão: até 1,2 s) |
|
|
173
|
+
| `volume` ou `db` | ganho direto (1 = 0 dB, no máximo 3,98) ou o pico que o som deve ter, em dBFS |
|
|
174
|
+
| `fade`, `fade_entrada` | descida no fim e subida no começo (segundos) |
|
|
175
|
+
| `tipo`, `nota`, `plano` | só para ler (o `plano: true` marca o que o `plano_sfx.py` escreveu; ele troca só esses) |
|
|
176
|
+
|
|
177
|
+
Som cujo começo cairia antes do 0 perde só a cabeça (entra com uma subida curtinha). Som que não cabe no vídeo,
|
|
178
|
+
sem arquivo ou sem `em` sai com uma linha `aviso:`; nenhum some calado.
|
|
179
|
+
|
|
180
|
+
## Texto atrás da pessoa (2,5D)
|
|
181
|
+
|
|
182
|
+
Uma palavra grande entre o vídeo e a pessoa recortada: a cabeça passa na frente da parte de baixo das letras,
|
|
183
|
+
a palavra desliza devagar de lado (paralaxe leve) e entra letra por letra na palavra falada. É composição em
|
|
184
|
+
planos, 2,5D: não tem 3D de verdade.
|
|
185
|
+
|
|
186
|
+
1. Só funciona com o recorte da pessoa daquele trecho. Rode antes
|
|
187
|
+
`python3 ferramentas/pessoa_recortada.py --edit '<EDIT>' --de 5.5 --ate 9.5` e aprove um teste de uns 5 s
|
|
188
|
+
(cabelo, mãos e borda). Sem o recorte, ou com o recorte de outro trecho, o build para e diz o comando certo.
|
|
189
|
+
2. `{"id": "fim", "tipo": "atras_da_pessoa", "texto": "O FIM", "em": "fim", "sai": "editores"}` em
|
|
190
|
+
`animacoes`. Só em tela cheia.
|
|
191
|
+
3. O build mede o topo da cabeça no próprio recorte e põe o meio das letras ali. Se o rosto medido cobrir mais
|
|
192
|
+
de uns 40% da largura das letras, ele avisa: suba o texto (`"altura": "topo"`), use uma palavra mais
|
|
193
|
+
comprida ou outro trecho.
|
|
194
|
+
|
|
195
|
+
Campos: `texto` (`*palavra*` sai na cor de destaque), `em`, `sai`, `altura` (`cabeca`, `topo` ou o topo em
|
|
196
|
+
pixels), `tamanho` (px; padrão: a maior que cabe na zona segura), `cor`, `paralaxe` (1; 0 desliga),
|
|
197
|
+
`caixa_alta` (true), `recorte` (`assets/pessoa.webm`; outro arquivo quando o vídeo tem tela verde num trecho e
|
|
198
|
+
texto atrás em outro: rode a ferramenta com `--saida assets/pessoa_fim.webm`), `frente` e `fundo_anda`.
|
|
199
|
+
|
|
200
|
+
**Terceiro plano.** `"frente": "assets/pote.png"` (ou `{"imagem": ..., "em": palavra, "sai": ..., "lado":
|
|
201
|
+
"esquerda|direita", "tamanho": px, "onde": [x, y]}`) põe uma imagem do projeto NA FRENTE da pessoa: entra depois da
|
|
202
|
+
palavra (padrão: 0,35 s depois; nunca antes de 0,2 s), num canto de baixo do lado oposto ao rosto, e sai com ela.
|
|
203
|
+
Use png com fundo transparente (jpg vira retângulo, o build avisa). Cada plano anda numa medida própria: o fundo
|
|
204
|
+
(a gravação, com a pessoa junto, porque os dois saem do mesmo vídeo) se aproxima uns 1,5% e desliza 6 px, a
|
|
205
|
+
palavra desliza 36 px e a frente 80 px, crescendo 4%. Depois o fundo volta ao normal em 0,5 s (no corte, seco).
|
|
206
|
+
`"fundo_anda": false` deixa o fundo parado. O build avisa quando a frente passa na frente do rosto e a legenda
|
|
207
|
+
desvia dela. Frente tem uma faixa própria no estúdio ("Frente · pote.png").
|
|
208
|
+
|
|
209
|
+
## Acompanhar a pessoa dentro da tomada
|
|
210
|
+
|
|
211
|
+
O `face_layout.json` guarda um rosto por tomada, então dentro de uma tomada o enquadramento fica parado. Quando a
|
|
212
|
+
pessoa se inclina, anda ou muda de lugar no meio da tomada e o trecho tem zoom (moldura, tela cheia a 1,15 ou mais,
|
|
213
|
+
um punch-in), ponha `"acompanhar": true` no bloco (`tela_cheia` ou `moldura`):
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{"cena": "moldura", "de": 7.07, "ate": 10.6, "acompanhar": true}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- Na primeira vez, o build mede o rosto 10 vezes por segundo no `cut.mp4` com o Python da skill
|
|
220
|
+
(`helpers/rastrear_rosto.py`, o mesmo detector do `face_layout.py`; uns segundos por minuto de vídeo) e grava
|
|
221
|
+
`<EDIT>/rosto_trilha.json`. Corte novo: mede de novo sozinho. À mão:
|
|
222
|
+
`uv run --directory '<SKILL>' python helpers/rastrear_rosto.py '<EDIT>'`.
|
|
223
|
+
- A trilha é suavizada: mediana de 5 medidas, zona morta de 3% da largura (tremida e micro movimento não mexem
|
|
224
|
+
em nada), cada mudança vira um movimento de 0,5 s em `sine.inOut`, o último ponto bom fica quando o rosto some
|
|
225
|
+
(mão na frente, virou de lado) e tudo recomeça em cada tomada.
|
|
226
|
+
- A câmera segue a trilha quadro a quadro (dados e laço, como o timecode: o seek em qualquer ponto acerta), fora
|
|
227
|
+
das transições animadas; a transição da moldura já termina no rosto acompanhado. A pessoa recortada
|
|
228
|
+
(`assets/pessoa.webm`, texto atrás da pessoa) recebe a mesma conta. Na moldura o tamanho do rosto é o da tomada
|
|
229
|
+
(o quadro não "respira").
|
|
230
|
+
- A cabeça inteira é conferida 10 vezes por segundo dentro do quadro: quando a pessoa vai para a borda da gravação
|
|
231
|
+
e o enquadramento não tem para onde ir, o build avisa com o intervalo ("não cabe"): diminua o zoom, use tela
|
|
232
|
+
cheia ou `contida` nesse trecho.
|
|
233
|
+
- Em tela cheia a 1,08 sobra só 8% de margem para andar: o efeito aparece com zoom maior ou num punch-in.
|
|
234
|
+
|
|
235
|
+
## Gravação contida, 4:5 e 1:1
|
|
236
|
+
|
|
237
|
+
`{"cena": "contida", "de": 10.6, "ate": 17.7}` mostra a gravação inteira dentro da tela, com margem, sobre o
|
|
238
|
+
próprio vídeo desfocado (`"fundo": "desfocado"`, o padrão), o papel do estilo (`"papel"`) ou uma cor (`"#1b1830"`).
|
|
239
|
+
`margem` (px, padrão 6% do lado menor) e `raio` (os cantos). Entra e sai do jeito da moldura: no corte, troca seca;
|
|
240
|
+
no meio da tomada, o quadro encolhe em 0,6 s (e volta em 0,55 s). A legenda fica ligada.
|
|
241
|
+
|
|
242
|
+
É a saída quando a região obrigatória não cabe no recorte (gesto largo, gravação em pé indo para 16:9, 4:5 ou
|
|
243
|
+
1:1): o corte 9:16 num projeto 4:5 passa da tela em cima e embaixo, e a contida mostra ele inteiro. O build
|
|
244
|
+
enquadra o rosto pelo retângulo que o vídeo ocupa de verdade (um corte em pé num 4:5 não perde o rosto).
|
|
245
|
+
|
|
246
|
+
Formatos 4:5 (1080x1350) e 1:1 (1080x1080): o `formato` do `projeto.json`. A zona segura deles é uma margem
|
|
247
|
+
folgada (4:5: x 100 a 960, y 110 a 1220; 1:1: x 90 a 970, y 90 a 980), sem medida conferida numa rede: **a conferir
|
|
248
|
+
na rede** de destino antes de publicar. O build avisa em todo build. Mudar o formato de uma edição aprovada é uma
|
|
249
|
+
versão nova: copie a pasta do projeto e troque o `formato`.
|
|
250
|
+
|
|
251
|
+
## Comparar (antes e depois)
|
|
252
|
+
|
|
253
|
+
```json
|
|
254
|
+
{"cena": "comparar", "de": 10.6, "ate": 14.0, "modo": "lado_a_lado",
|
|
255
|
+
"a": {"arquivo": "assets/cru.mp4", "inicio": 15.0, "rotulo": "Gravação crua"},
|
|
256
|
+
"b": {"arquivo": "corte", "inicio": 10.6, "rotulo": "Corte da skill"}}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
- Dois arquivos do projeto (vídeo ou imagem), ou dois trechos do mesmo arquivo (`inicio` diferente), ou um trecho
|
|
260
|
+
do próprio corte (`"arquivo": "corte"`, `inicio` em segundos do corte). Os dois tocam juntos, na mesma
|
|
261
|
+
velocidade, e aparecem no mesmo tamanho, inteiros (sem cortar nada), sobre o papel do estilo.
|
|
262
|
+
- `modo`: `lado_a_lado` (em linha ou empilhado, o que deixar a imagem maior) ou `alternando` (um de cada vez no
|
|
263
|
+
mesmo lugar, trocando em `"trocas": [palavra ou segundos]`; sem trocas, uma no meio; cada lado fica pelo menos
|
|
264
|
+
0,8 s). A troca é seca, sem efeito.
|
|
265
|
+
- `rotulo` é obrigatório e literal: o que aquele lado é ("Gravação crua", "Com a limpeza de voz"). Rótulo com
|
|
266
|
+
opinião ("melhor", "perfeito", "ruim") gera aviso.
|
|
267
|
+
- `som`: `voz` (o padrão: a fala do corte continua e os dois lados ficam mudos), `a` ou `b` (só o som desse lado; a
|
|
268
|
+
voz do corte sai do trecho e o build avisa quais palavras ficam mudas: deixe esse espaço no corte) ou `igualado`
|
|
269
|
+
(só no `alternando`: toca o som do lado que está na tela, os dois no mesmo volume percebido, medido em LUFS; o
|
|
270
|
+
mais alto desce, nenhum sobe). Nenhum lado é degradado: o build avisa quando a diferença de resolução ou de
|
|
271
|
+
proporção vem do arquivo.
|
|
272
|
+
- A legenda sai no bloco (texto por cima do que se compara atrapalha).
|
|
273
|
+
|
|
274
|
+
## Lettering
|
|
275
|
+
|
|
276
|
+
`{"id": "fim", "tipo": "lettering", "principal": "Ficou com a *melhor*", "apoio": "sem abrir o editor",
|
|
277
|
+
"chamada": "Veja o resultado", "em": "ficou", "sai": 21.2, "posicao": "topo", "estilo": "bloco"}`: o texto grande
|
|
278
|
+
com ordem de leitura (principal, apoio, chamada), letra por letra montada já no lugar, encaixe por sentido. Cada
|
|
279
|
+
palavra grande (e cada palavra do apoio) entra na hora em que é dita, medida na onda (`palavras_onda.json`),
|
|
280
|
+
antecipando no máximo 0,15 s; sem o arquivo, no tempo do Whisper, com aviso. A legenda sai do trecho, ou, com
|
|
281
|
+
`"legenda_junto": true` (o padrão quando a legenda é `discreta`), continua nas palavras que não estão escritas
|
|
282
|
+
grandes naquele instante. A última expressão que vai até o fim do corte fica legível até o último quadro. O build
|
|
283
|
+
avisa quando a expressão não tem 1 s de leitura antes da próxima entrar (tire uma expressão ou junte duas) e diz
|
|
284
|
+
numa linha `nota:` o tamanho da letra e por que não foi maior. Campos e regras: `references/animacao-catalogo.md`
|
|
285
|
+
(peça 12) e `references/lettering.md` da skill. A largura das letras vem de `assets/fontes/larguras.json`, medida no arquivo da
|
|
286
|
+
fonte e no peso usado (`ferramentas/medir_fontes.py` gera de novo quando a fonte muda); na página, a timeline só é
|
|
287
|
+
montada depois que a fonte carregou, e a linha que passar da largura desce a letra o que falta.
|
|
288
|
+
|
|
289
|
+
## Mãos fora do quadro
|
|
290
|
+
|
|
291
|
+
Com `assets/maos.json` (a ferramenta `rastrear_maos.py`, seção "Ferramentas"), o build confere as mãos em cada
|
|
292
|
+
quadro de tela cheia, moldura e tela verde: quando uma mão que a gravação mostra sai do quadro da moldura ou da tela
|
|
293
|
+
(o zoom ou o recorte corta o gesto) por 0,2 s ou mais, ele avisa com o intervalo. Se a mão mostra algo ali, aumente
|
|
294
|
+
o quadro, diminua o zoom, use tela cheia ou `contida`.
|
|
295
|
+
|
|
296
|
+
## Snapshot sem mandar quadros para fora
|
|
297
|
+
|
|
298
|
+
Com uma chave de IA no ambiente (`GEMINI_API_KEY` e parecidas), o `hyperframes snapshot` manda os quadros para o
|
|
299
|
+
serviço de fora. O `python3 build.py hf snapshot ...` (e o `hf check --snapshots`, que também tira quadros) roda
|
|
300
|
+
sem essas variáveis e diz quais tirou. Só com o pedido da pessoa: `python3 build.py hf snapshot --com-ia ...` (os
|
|
301
|
+
outros comandos não mexem no ambiente).
|
|
302
|
+
|
|
303
|
+
## Kit 2D
|
|
304
|
+
|
|
305
|
+
Oito cenas prontas em `compositions/cenas/2d/` (`k2d_arquivo`, `k2d_conversa`, `k2d_esquema`, `k2d_antes_depois`,
|
|
306
|
+
`k2d_comando`, `k2d_medidor`, `k2d_busca`, `k2d_notas`): objeto que muda de estado mantendo o desenho e o lugar, esquema
|
|
307
|
+
que cresce com a fala, comparação desenhada, barra que digita o pedido para a IA, medidor com agulha, barra de busca
|
|
308
|
+
com o resultado e a chamada e bloco de notas com a lista que se conclui. Entram
|
|
309
|
+
como cena própria. Quando usar e os parâmetros: `references/animacao.md` da skill, seção Kit 2D.
|
|
310
|
+
|
|
311
|
+
**Formato.** As cenas do kit (2D e 3D) declaram a raiz em 1080x1920 e se desenham pelo tamanho do vídeo que o build
|
|
312
|
+
manda. Em 16:9, 4:5 e 1:1 o build põe a raiz no tamanho do vídeo no `index.html` (uma linha de aviso diz quais),
|
|
313
|
+
sem mexer no arquivo: a cena sai inteira, no estúdio e no render. Cena escrita à mão com posições fixas e a raiz num
|
|
314
|
+
tamanho diferente do vídeo sai cortada, e o build avisa (`compositions/cenas/LEIA.md`, "O tamanho da raiz").
|
|
315
|
+
|
|
316
|
+
## 3D de verdade
|
|
317
|
+
|
|
318
|
+
O kit fica em `compositions/cenas/3d/` (o motor `motor-three.js` e quatro cenas prontas, `k3d_*.html`) e o
|
|
319
|
+
three.js em `assets/three`. Entra como cena própria. Como usar, o teste de 5 s e a alternativa quando o WebGL
|
|
320
|
+
não abre: `references/3d.md` da skill. As cenas do kit aparecem no painel Compositions do estúdio; é normal.
|
|
321
|
+
|
|
322
|
+
## O estúdio
|
|
323
|
+
|
|
324
|
+
`python3 build.py estudio` sobe o estúdio do HyperFrames em segundo plano e escreve a URL, por exemplo
|
|
325
|
+
`http://127.0.0.1:3002/#project/projeto`. A URL precisa do `#project/<nome da pasta>`: sem ele o estúdio abre
|
|
326
|
+
vazio. Ele continua no ar depois que o comando termina, recarrega sozinho a cada build e só para com
|
|
327
|
+
`python3 build.py estudio --parar`, que confere que a porta fechou (e tenta de novo se o HyperFrames não
|
|
328
|
+
conseguiu, o que acontece com a máquina carregada). Ele nunca derruba o estúdio de outro projeto.
|
|
329
|
+
|
|
330
|
+
A linha do tempo mostra, de cima para baixo: o vídeo do corte, a legenda (uma faixa com um clipe por
|
|
331
|
+
legenda), o fim parado, uma faixa para cada peça do catálogo e para cada cena própria (com o nome dela), a
|
|
332
|
+
pessoa recortada, os elementos de estrutura (câmera, moldura, papel, borda, fundo desfocado) e, embaixo, a voz e
|
|
333
|
+
os sons. Faixa com mais de um clipe aparece como "Track N" (cada clipe continua com o nome dele).
|
|
334
|
+
|
|
335
|
+
Pegadinhas:
|
|
336
|
+
|
|
337
|
+
- O estúdio toca o vídeo e a pessoa recortada como dois vídeos separados: numa emenda ou no texto atrás da
|
|
338
|
+
pessoa, uma camada pode aparecer atrasada por uma fração de segundo. No arquivo renderizado não aparece. O
|
|
339
|
+
render é a referência.
|
|
340
|
+
- No painel Browser do app, o vídeo do corte só é desenhado com o painel à mostra: escondido, a prévia fica
|
|
341
|
+
preta (a legenda e as peças aparecem). Com a máquina carregada o estúdio demora e pode dizer que "não
|
|
342
|
+
recarregou": recarregue a página.
|
|
343
|
+
- O que for mexido no estúdio (arrastar, esticar, trocar texto) fica no `index.html` e nas `compositions/`,
|
|
344
|
+
que o build reescreve. O build guarda uma cópia em `.mexido-no-estudio/` e avisa: passe a mudança para o
|
|
345
|
+
`projeto.json`.
|
|
346
|
+
- O estúdio carimba um `data-hf-id` nos elementos quando abre o projeto, inclusive nas cenas próprias. Isso é
|
|
347
|
+
normal e o build não confunde com mudança; ao editar uma cena própria depois disso, procure o trecho sem
|
|
348
|
+
contar com o texto exato das tags.
|
|
349
|
+
|
|
350
|
+
## O que o build grava
|
|
351
|
+
|
|
352
|
+
- `index.html`: a composição principal (não edite à mão: rode o build de novo).
|
|
353
|
+
- `compositions/<id>.html`: uma sub-composição por peça do catálogo (faixa própria no estúdio). O build apaga
|
|
354
|
+
e escreve de novo a cada vez; as cenas sob medida ficam em `compositions/cenas/` e nunca são mexidas.
|
|
355
|
+
- `assets/cut.mp4`: ligação (ou cópia) do corte. Com `borrar` num bloco, é uma cópia com o borrão queimado no
|
|
356
|
+
arquivo (quem recebe a pasta do projeto não vê o dado); o original sem borrão fica no `edit/`.
|
|
357
|
+
- `assets/gerado/`: o que o build tira do corte quando precisa: o último quadro (`segura_fim`), o corte
|
|
358
|
+
desfocado (moldura com `"fundo": "desfocado"`) e o arquivo da prova com o borrão (`<nome>_borrado`).
|
|
359
|
+
- `assets/gerado/` também guarda a cópia ligada de um arquivo usado nos dois lados do `comparar` (ou do próprio
|
|
360
|
+
corte), o último quadro do fundo desfocado para o fim parado e as imagens das peças (polaroide, objeto na mão,
|
|
361
|
+
frente, logo do cartão final) já no tamanho em que aparecem (`<nome>_<largura>x<altura>`): imagem maior que a
|
|
362
|
+
caixa, reduzida pelo navegador, saía com a borda diferente de um render para outro. A original não muda.
|
|
363
|
+
- `<EDIT>/rosto_trilha.json` (na pasta do corte, junto do `face_layout.json`): o caminho do rosto dos blocos com
|
|
364
|
+
`acompanhar`.
|
|
365
|
+
- `sons_sugeridos.json`: o som que cada animação pede, com o tempo do pico (para o `plano_sfx.py --projeto`).
|
|
366
|
+
- `.build.json`: o modo, a janela e a assinatura de cada arquivo gerado (para perceber mudança feita fora).
|
|
367
|
+
- `.estudio.json`: a porta e a versão do estúdio no ar (o `--parar` usa).
|
|
368
|
+
- `.antes-de-atualizar/<data>/`: o que o `atualizar` trocou, como estava antes.
|
|
369
|
+
|
|
370
|
+
Linhas `nota:` dizem o que o build decidiu sozinho (o tamanho da letra do lettering e o porquê, a amostra que já é o
|
|
371
|
+
vídeo inteiro). Linhas `aviso:` na saída do build pedem atenção: peça que não coube, item que ficou de fora, peça empurrada
|
|
372
|
+
para depois da moldura fechar, legenda encostando numa peça ou no rosto, som fora do vídeo, texto atrás da
|
|
373
|
+
pessoa ilegível, arquivo mexido no estúdio, vídeo em pé virando 16:9, cabeça ou mão saindo do quadro, lettering
|
|
374
|
+
sem tempo de leitura (tire uma expressão ou junte duas), zona segura a conferir na rede (4:5 e 1:1), fala que fica muda num `comparar`, cena própria
|
|
375
|
+
com a raiz num tamanho diferente do vídeo (ajustada ou cortada).
|
|
376
|
+
|
|
377
|
+
## Ferramentas
|
|
378
|
+
|
|
379
|
+
As duas primeiras usam primeiro a skill do `"skill"` do `projeto.json` e dizem na primeira linha qual skill usaram.
|
|
380
|
+
|
|
381
|
+
- `ferramentas/pessoa_recortada.py --edit '<EDIT>' --de 28 --ate 32.3`: a pessoa com fundo transparente para a
|
|
382
|
+
tela verde e para o texto atrás da pessoa (`assets/pessoa.webm` e `assets/pessoa.json`, com o topo da cabeça
|
|
383
|
+
de cada tomada), usando o recorte da skill (`helpers/matte.py`). Uns 2 a 3 minutos por minuto de vídeo na
|
|
384
|
+
primeira vez; depois o recorte fica guardado. `--skill` escolhe outra skill.
|
|
385
|
+
- `ferramentas/rastrear_maos.py`: as mãos quadro a quadro para o objeto preso na mão e para o aviso de mão fora
|
|
386
|
+
do quadro (`assets/maos.json`).
|
|
387
|
+
Rode sempre assim (o mediapipe 1.x e o Python 3.13 abortam com "Service is unavailable"):
|
|
388
|
+
`uv run --python 3.12 --with mediapipe==0.10.21 --with numpy python ferramentas/rastrear_maos.py --edit '<EDIT>' --de 8 --ate 13`.
|
|
389
|
+
A primeira vez o uv baixa o Python 3.12 e o mediapipe: uns minutos. Avise a pessoa antes. O modelo de mãos
|
|
390
|
+
fica em `~/.editor-video/modelos`.
|
|
391
|
+
- `ferramentas/medir_fontes.py`: mede a largura de cada letra das fontes de `assets/fontes` no peso usado
|
|
392
|
+
(`assets/fontes/larguras.json`, que o lettering usa para encaixar o texto). Rode com o Python da skill quando
|
|
393
|
+
trocar ou acrescentar uma fonte: `uv run --directory '<SKILL>' python '<PROJETO>/ferramentas/medir_fontes.py'`.
|
|
394
|
+
|
|
395
|
+
## Licenças
|
|
396
|
+
|
|
397
|
+
- Fontes Montserrat, Caveat e JetBrains Mono: SIL Open Font License 1.1 (`assets/fontes/OFL-*.txt`).
|
|
398
|
+
- three.js r181: MIT, em `assets/three` (licença em `assets/three/LICENSE`, origem em `assets/three/ORIGEM.txt`).
|
|
399
|
+
- GSAP (carregado do CDN ou baixado pelo `preparar`): licença padrão da GreenSock, uso gratuito.
|
|
400
|
+
- Efeitos sonoros copiados pelo `plano_sfx.py`: a licença de cada um em `assets/sfx/LICENCAS.txt` (os do Woven
|
|
401
|
+
SFX são CC0, com `assets/sfx/LICENCA-woven.md`).
|
|
402
|
+
- HyperFrames: Apache 2.0. Modelo de mãos do MediaPipe: Apache 2.0 (baixado na primeira vez).
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2014 The Caveat Project Authors (https://github.com/googlefonts/caveat)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
http://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
|
|
5
|
+
This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|