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.
Files changed (245) hide show
  1. package/LICENSES/edit-ia-pro.txt +32 -0
  2. package/LICENSES/fontes-OFL.txt +476 -0
  3. package/LICENSES/hyperframes-Apache-2.0.txt +205 -0
  4. package/LICENSES/permanent-marker-Apache-2.0.txt +204 -0
  5. package/LICENSES/selfie-multiclass-Apache-2.0.txt +227 -0
  6. package/LICENSES/three-MIT.txt +23 -0
  7. package/LICENSES/video-use-MIT.txt +24 -0
  8. package/LICENSES/woven-sfx-CC0.txt +16 -0
  9. package/LICENSES/yunet-MIT.txt +21 -0
  10. package/README.md +2 -2
  11. package/bin/primocode.js +74 -9
  12. package/editor/LICENSE.md +11 -0
  13. package/editor/README.md +321 -0
  14. package/editor/SKILL.md +307 -0
  15. package/editor/THIRD_PARTY_NOTICES.md +228 -0
  16. package/editor/assets/baixar.json +591 -0
  17. package/editor/assets/fonts/anton/OFL.txt +93 -0
  18. package/editor/assets/fonts/caveat/OFL.txt +93 -0
  19. package/editor/assets/fonts/figtree/OFL.txt +93 -0
  20. package/editor/assets/fonts/fonts.json +10 -0
  21. package/editor/assets/fonts/montserrat/OFL.txt +93 -0
  22. package/editor/assets/fonts/permanentmarker/LICENSE.txt +202 -0
  23. package/editor/assets/models/SELFIE_MULTICLASS_LICENSE.txt +227 -0
  24. package/editor/assets/models/YUNET_LICENSE.txt +21 -0
  25. package/editor/assets/sfx/licencas/bass_drop.txt +32 -0
  26. package/editor/assets/sfx/licencas/cash.txt +76 -0
  27. package/editor/assets/sfx/licencas/charge.txt +31 -0
  28. package/editor/assets/sfx/licencas/click.txt +46 -0
  29. package/editor/assets/sfx/licencas/coin.txt +50 -0
  30. package/editor/assets/sfx/licencas/count.txt +47 -0
  31. package/editor/assets/sfx/licencas/data.txt +31 -0
  32. package/editor/assets/sfx/licencas/error.txt +32 -0
  33. package/editor/assets/sfx/licencas/flash.txt +31 -0
  34. package/editor/assets/sfx/licencas/gears.txt +82 -0
  35. package/editor/assets/sfx/licencas/keyboard.txt +48 -0
  36. package/editor/assets/sfx/licencas/metal_hit.txt +62 -0
  37. package/editor/assets/sfx/licencas/metal_riser.txt +61 -0
  38. package/editor/assets/sfx/licencas/mouse_click.txt +50 -0
  39. package/editor/assets/sfx/licencas/notification.txt +54 -0
  40. package/editor/assets/sfx/licencas/pop.txt +38 -0
  41. package/editor/assets/sfx/licencas/rewind.txt +32 -0
  42. package/editor/assets/sfx/licencas/rise.txt +46 -0
  43. package/editor/assets/sfx/licencas/sinteticos.txt +21 -0
  44. package/editor/assets/sfx/licencas/snap.txt +50 -0
  45. package/editor/assets/sfx/licencas/success.txt +40 -0
  46. package/editor/assets/sfx/licencas/synth_hit.txt +32 -0
  47. package/editor/assets/sfx/licencas/tick.txt +14 -0
  48. package/editor/assets/sfx/licencas/whoosh.txt +47 -0
  49. package/editor/assets/sfx/licencas/wind.txt +31 -0
  50. package/editor/assets/sfx/sfx.json +832 -0
  51. package/editor/assets/sfx/sfx_sinteticos.json +317 -0
  52. package/editor/assets/sfx/sfx_woven.json +387 -0
  53. package/editor/assets/sfx/woven/LICENCA.md +16 -0
  54. package/editor/fichas/briefing-do-video.md +45 -0
  55. package/editor/fichas/conferencia-da-amostra.md +56 -0
  56. package/editor/fichas/matriz-de-ganchos.csv +3 -0
  57. package/editor/fichas/padrao.json +16 -0
  58. package/editor/fichas/planilha-de-cenas.csv +4 -0
  59. package/editor/fichas/planilha-de-versoes.csv +4 -0
  60. package/editor/fichas/plano-em-blocos.md +32 -0
  61. package/editor/fichas/registro-de-materiais.json +27 -0
  62. package/editor/helpers/assets_ocr/ocr_vision.swift +41 -0
  63. package/editor/helpers/bordas_precisas.py +272 -0
  64. package/editor/helpers/camera_viva.py +426 -0
  65. package/editor/helpers/captions.py +601 -0
  66. package/editor/helpers/common.py +308 -0
  67. package/editor/helpers/compose_final.py +3555 -0
  68. package/editor/helpers/conferir_corte.py +234 -0
  69. package/editor/helpers/conferir_dados.py +405 -0
  70. package/editor/helpers/contact_sheet.py +282 -0
  71. package/editor/helpers/corte_por_onda.py +433 -0
  72. package/editor/helpers/corte_seco.py +595 -0
  73. package/editor/helpers/denoise.py +971 -0
  74. package/editor/helpers/efeitos.py +408 -0
  75. package/editor/helpers/efeitos_gerar.py +159 -0
  76. package/editor/helpers/elevenlabs_api.py +442 -0
  77. package/editor/helpers/face_layout.py +570 -0
  78. package/editor/helpers/fetch_images.py +423 -0
  79. package/editor/helpers/ganho_por_trecho.py +214 -0
  80. package/editor/helpers/gen_image.py +312 -0
  81. package/editor/helpers/gen_music.py +316 -0
  82. package/editor/helpers/gen_sfx.py +148 -0
  83. package/editor/helpers/grade.py +307 -0
  84. package/editor/helpers/icloud.py +119 -0
  85. package/editor/helpers/make_sfx.py +940 -0
  86. package/editor/helpers/matte.py +1342 -0
  87. package/editor/helpers/medir_referencia.py +2232 -0
  88. package/editor/helpers/mixar_trilha.py +354 -0
  89. package/editor/helpers/montar_corte.py +295 -0
  90. package/editor/helpers/motion/__init__.py +13 -0
  91. package/editor/helpers/motion/engine.py +1915 -0
  92. package/editor/helpers/motion/registry.py +510 -0
  93. package/editor/helpers/motion/render.py +665 -0
  94. package/editor/helpers/motion/templates/barra_progresso.py +370 -0
  95. package/editor/helpers/motion/templates/carimbo.py +132 -0
  96. package/editor/helpers/motion/templates/checklist.py +271 -0
  97. package/editor/helpers/motion/templates/comentario_cta.py +380 -0
  98. package/editor/helpers/motion/templates/contador.py +222 -0
  99. package/editor/helpers/motion/templates/destaque.py +263 -0
  100. package/editor/helpers/motion/templates/etiqueta_preco.py +461 -0
  101. package/editor/helpers/motion/templates/grafico_barras.py +510 -0
  102. package/editor/helpers/motion/templates/grafico_linha.py +462 -0
  103. package/editor/helpers/motion/templates/notificacao.py +266 -0
  104. package/editor/helpers/motion/templates/palavra_impacto.py +410 -0
  105. package/editor/helpers/motion/templates/passos.py +321 -0
  106. package/editor/helpers/motion/templates/riscado.py +298 -0
  107. package/editor/helpers/motion/templates/selo_garantia.py +150 -0
  108. package/editor/helpers/motion_render.py +241 -0
  109. package/editor/helpers/motion_sugerir.py +961 -0
  110. package/editor/helpers/noise_check.py +134 -0
  111. package/editor/helpers/pack_transcripts.py +223 -0
  112. package/editor/helpers/palavras_na_onda.py +176 -0
  113. package/editor/helpers/plano_sfx.py +839 -0
  114. package/editor/helpers/portao.py +427 -0
  115. package/editor/helpers/preview_server.py +1177 -0
  116. package/editor/helpers/rastrear_rosto.py +298 -0
  117. package/editor/helpers/render_cut.py +1256 -0
  118. package/editor/helpers/respiros.py +89 -0
  119. package/editor/helpers/sincronizar_cameras.py +571 -0
  120. package/editor/helpers/speech_regions.py +423 -0
  121. package/editor/helpers/style_catalog.json +231 -0
  122. package/editor/helpers/style_samples.py +246 -0
  123. package/editor/helpers/tela_verde.py +2113 -0
  124. package/editor/helpers/text_render.py +2059 -0
  125. package/editor/helpers/texto_na_tela.py +366 -0
  126. package/editor/helpers/timeline_view.py +292 -0
  127. package/editor/helpers/tira_de_quadros.py +113 -0
  128. package/editor/helpers/transcribe.py +734 -0
  129. package/editor/helpers/transcribe_batch.py +129 -0
  130. package/editor/helpers/trilhas.py +1146 -0
  131. package/editor/helpers/trilhas_humores.json +66 -0
  132. package/editor/helpers/valores.py +187 -0
  133. package/editor/helpers/verify_cut.py +820 -0
  134. package/editor/helpers/voice_levels.py +233 -0
  135. package/editor/helpers/voz_check.py +386 -0
  136. package/editor/helpers/voz_limpa.py +81 -0
  137. package/editor/helpers/watch_preview.py +372 -0
  138. package/editor/modelo-projeto/LEIA.md +402 -0
  139. package/editor/modelo-projeto/assets/fontes/OFL-Caveat.txt +93 -0
  140. package/editor/modelo-projeto/assets/fontes/OFL-JetBrainsMono.txt +93 -0
  141. package/editor/modelo-projeto/assets/fontes/OFL-Montserrat.txt +93 -0
  142. package/editor/modelo-projeto/assets/fontes/larguras.json +1 -0
  143. package/editor/modelo-projeto/assets/three/BufferGeometryUtils.js +1438 -0
  144. package/editor/modelo-projeto/assets/three/GLTFLoader.js +4895 -0
  145. package/editor/modelo-projeto/assets/three/LICENSE +21 -0
  146. package/editor/modelo-projeto/assets/three/ORIGEM.txt +17 -0
  147. package/editor/modelo-projeto/assets/three/RoomEnvironment.js +185 -0
  148. package/editor/modelo-projeto/assets/three/three.core.min.js +6 -0
  149. package/editor/modelo-projeto/assets/three/three.module.min.js +6 -0
  150. package/editor/modelo-projeto/build.py +4828 -0
  151. package/editor/modelo-projeto/compositions/cenas/2d/k2d_antes_depois.html +199 -0
  152. package/editor/modelo-projeto/compositions/cenas/2d/k2d_arquivo.html +232 -0
  153. package/editor/modelo-projeto/compositions/cenas/2d/k2d_busca.html +315 -0
  154. package/editor/modelo-projeto/compositions/cenas/2d/k2d_comando.html +304 -0
  155. package/editor/modelo-projeto/compositions/cenas/2d/k2d_conversa.html +217 -0
  156. package/editor/modelo-projeto/compositions/cenas/2d/k2d_esquema.html +289 -0
  157. package/editor/modelo-projeto/compositions/cenas/2d/k2d_medidor.html +249 -0
  158. package/editor/modelo-projeto/compositions/cenas/2d/k2d_notas.html +233 -0
  159. package/editor/modelo-projeto/compositions/cenas/3d/k3d_caminho.html +197 -0
  160. package/editor/modelo-projeto/compositions/cenas/3d/k3d_explodida.html +152 -0
  161. package/editor/modelo-projeto/compositions/cenas/3d/k3d_tela.html +167 -0
  162. package/editor/modelo-projeto/compositions/cenas/3d/k3d_volume.html +124 -0
  163. package/editor/modelo-projeto/compositions/cenas/3d/motor-three.js +728 -0
  164. package/editor/modelo-projeto/compositions/cenas/LEIA.md +177 -0
  165. package/editor/modelo-projeto/ferramentas/medir_fontes.py +65 -0
  166. package/editor/modelo-projeto/ferramentas/pessoa_recortada.py +176 -0
  167. package/editor/modelo-projeto/ferramentas/rastrear_maos.py +189 -0
  168. package/editor/modelo-projeto/hyperframes.json +12 -0
  169. package/editor/modelo-projeto/package.json +11 -0
  170. package/editor/modelo-projeto/projeto.json +16 -0
  171. package/editor/preview/app.css +1009 -0
  172. package/editor/preview/app.js +2122 -0
  173. package/editor/preview/index.html +307 -0
  174. package/editor/pyproject.toml +23 -0
  175. package/editor/references/3d.md +236 -0
  176. package/editor/references/animacao-catalogo.md +672 -0
  177. package/editor/references/animacao.md +498 -0
  178. package/editor/references/comandos.md +92 -0
  179. package/editor/references/corte-seco-como-funciona.md +50 -0
  180. package/editor/references/corte-seco.md +88 -0
  181. package/editor/references/corte.md +290 -0
  182. package/editor/references/direcao-por-blocos.md +218 -0
  183. package/editor/references/enquadramento.md +654 -0
  184. package/editor/references/estilos-prontos.md +355 -0
  185. package/editor/references/estudio.md +100 -0
  186. package/editor/references/exemplo-eventos.json +67 -0
  187. package/editor/references/lettering.md +252 -0
  188. package/editor/references/modelos.md +494 -0
  189. package/editor/references/phase2.md +1007 -0
  190. package/editor/references/referencia-aplicar.md +203 -0
  191. package/editor/references/referencia-medir.md +375 -0
  192. package/editor/references/revisao.md +335 -0
  193. package/editor/references/som-e-trilha.md +146 -0
  194. package/editor/references/tabela-de-sons.md +130 -0
  195. package/editor/references/variacoes.md +234 -0
  196. package/editor/uv.lock +1141 -0
  197. package/lib/act.js +38 -8
  198. package/lib/app-chat.js +97 -0
  199. package/lib/catalogo.js +7 -1
  200. package/lib/chamada-torta.js +81 -0
  201. package/lib/editor-pro.js +786 -0
  202. package/lib/entrega.js +58 -0
  203. package/lib/estudio/conferencia-visual.js +76 -0
  204. package/lib/estudio/diretor.js +6 -1
  205. package/lib/estudio/exportar.js +3 -1
  206. package/lib/estudio/gosto/tela.html +1349 -0
  207. package/lib/estudio/gosto.js +305 -0
  208. package/lib/estudio/index.js +12 -1
  209. package/lib/estudio/kit-ae/base.jsx +119 -13
  210. package/lib/estudio/kit-ae/cenas.jsx +47 -15
  211. package/lib/estudio/kit-ae/guarda.jsx +274 -0
  212. package/lib/estudio/kit-ae/primitivas.jsx +180 -24
  213. package/lib/estudio/maquina-diretor.js +70 -12
  214. package/lib/estudio/maquina-foto.js +177 -0
  215. package/lib/estudio/maquina-guarda.js +207 -0
  216. package/lib/estudio/maquina-layout.js +22 -1
  217. package/lib/estudio/maquina.js +64 -11
  218. package/lib/estudio/referencias.js +1 -1
  219. package/lib/estudio/visao/visao.swift +97 -0
  220. package/lib/estudio/visao.js +60 -0
  221. package/lib/headless.js +15 -3
  222. package/lib/local/cerebro.json +285 -7
  223. package/lib/local/motor.js +5 -2
  224. package/lib/memoria-usuario.js +164 -0
  225. package/lib/nuvem.js +33 -2
  226. package/lib/passagem.js +50 -0
  227. package/lib/perigo.js +19 -11
  228. package/lib/protecao.js +134 -0
  229. package/lib/repeticao.js +1 -1
  230. package/lib/sandbox.js +57 -9
  231. package/lib/titulo-conversa.js +46 -0
  232. package/lib/tools.js +23 -4
  233. package/lib/ui.js +2 -2
  234. package/package.json +3 -2
  235. package/skills/editar-meu-video/SKILL.md +6 -2
  236. package/skills/editar-video/SKILL.md +113 -0
  237. package/studio/pessoa.py +52 -0
  238. package/voz/primo_voz/__main__.py +55 -40
  239. package/voz/primo_voz/app.py +500 -4
  240. package/voz/primo_voz/chat.html +1773 -0
  241. package/voz/primo_voz/conversa.py +0 -26
  242. package/voz/primo_voz/hud.html +8 -2
  243. package/voz/primo_voz/hud.py +129 -5
  244. package/voz/primo_voz/identidade.py +1 -1
  245. 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.