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,1007 @@
|
|
|
1
|
+
# Fase 2: como escrever o `edit_data.json`
|
|
2
|
+
|
|
3
|
+
O `compose_final.py` lê `<EDIT>/edit_data.json` e monta o `final.mp4` em cima do `cut.mp4`.
|
|
4
|
+
Leia este arquivo antes de escrever o primeiro `edit_data.json` da sessão.
|
|
5
|
+
|
|
6
|
+
Três regras valem para tudo:
|
|
7
|
+
|
|
8
|
+
- **Caminhos** são relativos à pasta `<EDIT>` (ex.: `"assets/foto1.jpg"`).
|
|
9
|
+
- **Tempos** são segundos no `cut.mp4`. O final tem a mesma duração do corte, então o tempo no
|
|
10
|
+
final é o mesmo do corte.
|
|
11
|
+
- **Seção que não está no arquivo fica desligada** (câmera, gancho, legenda, inserts, animações,
|
|
12
|
+
chamada, aviso, efeitos, trilha, limpeza de ruído). Os padrões do catálogo servem para a tela de estilo,
|
|
13
|
+
não para o compose: escreva cada elemento escolhido. Uma seção com `"enabled": false` também
|
|
14
|
+
desliga.
|
|
15
|
+
- **Posição automática.** `camera.focus_y` e os `center_y` do gancho, da legenda, da chamada e do
|
|
16
|
+
aviso aceitam um número ou `"auto"`. Deixe de fora (é o mesmo que `"auto"`): o compose acha o
|
|
17
|
+
rosto em cada trecho do corte e põe cada coisa no lugar certo. Número só se a pessoa pedir.
|
|
18
|
+
|
|
19
|
+
## Exemplo completo
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"version": 1,
|
|
24
|
+
"base": "cut.mp4",
|
|
25
|
+
"timeline": "cut_timeline.json",
|
|
26
|
+
"output": {"width": 1080, "height": 1920, "fps": 30},
|
|
27
|
+
"accent": "#FFC400",
|
|
28
|
+
"camera": {"zoom_cuts": true, "zoom_levels": [1.0, 1.14], "push_in": false,
|
|
29
|
+
"push_in_amount": 0.05},
|
|
30
|
+
"hook": {"enabled": true, "style": "manchete", "text": "Olha o que eu *achei pra revender*",
|
|
31
|
+
"start": 0.0, "end": 2.8},
|
|
32
|
+
"captions": {"enabled": true, "style": "impacto", "file": "captions.json",
|
|
33
|
+
"hide_during_hook": true, "font_scale": 1.0},
|
|
34
|
+
"inserts": [
|
|
35
|
+
{"type": "split_top", "src": "assets/bolsa1.jpg", "start": 5.5, "end": 9.0,
|
|
36
|
+
"ken_burns": true, "split": 0.46, "sfx": "whoosh"},
|
|
37
|
+
{"type": "full", "src": "assets/vitrine.jpg", "start": 16.6, "end": 18.4}
|
|
38
|
+
],
|
|
39
|
+
"transitions": [{"at": 16.6, "type": "flash"}],
|
|
40
|
+
"motion": [
|
|
41
|
+
{"template": "checklist", "start": 10.2, "end": 13.4,
|
|
42
|
+
"params": {"title": "O que você *recebe*:", "items": ["Acesso na hora", "Suporte", "Garantia"],
|
|
43
|
+
"times": [0.3, 1.1, 1.9]}}
|
|
44
|
+
],
|
|
45
|
+
"cta": {"enabled": true, "text": "Toque em Saiba Mais", "sub": "Acesso na hora",
|
|
46
|
+
"start": null, "duration": 2.5},
|
|
47
|
+
"sfx": {"enabled": true, "volume": 0.6},
|
|
48
|
+
"music": {"enabled": false},
|
|
49
|
+
"audio": {"denoise": "off"},
|
|
50
|
+
"loudness": {"i": -14, "tp": -1.0}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Campo por campo
|
|
55
|
+
|
|
56
|
+
### Raiz
|
|
57
|
+
|
|
58
|
+
| Campo | Padrão | O que faz |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `version` | 1 | Sempre 1. |
|
|
61
|
+
| `base` | `"cut.mp4"` | Vídeo de base. |
|
|
62
|
+
| `timeline` | `"cut_timeline.json"` | Onde ficam os cortes (zoom muda em cada um). |
|
|
63
|
+
| `output` | do timeline | `width`, `height`, `fps`. Deixe igual ao corte. |
|
|
64
|
+
| `accent` | `"#FFC400"` | Cor de destaque (formato `#RRGGBB`). Vale para legenda, gancho e chamada. |
|
|
65
|
+
| `edit_type` | nenhum | `"tela_verde"` liga a tela verde (seção `tela_verde`): os inserts `split_top`/`split_bottom` viram o fundo atrás da pessoa. `clean`, `split_top` e `split_bottom` são só anotação: o que muda o vídeo são os `inserts`. |
|
|
66
|
+
|
|
67
|
+
### `camera`
|
|
68
|
+
|
|
69
|
+
| Campo | Padrão | O que faz |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `zoom_cuts` | false | Muda o zoom exatamente em cada corte, alternando `zoom_levels`. Disfarça o pulo do corte. |
|
|
72
|
+
| `zoom_levels` | `[1.0, 1.14]` | Zooms em ciclo, cada um entre 1.0 e 1.6. Mais que 1.2 começa a perder nitidez. |
|
|
73
|
+
| `push_in` | false | Aproximação lenta e suave dentro de cada trecho. |
|
|
74
|
+
| `push_in_amount` | 0.05 | Quanto aproxima em cada trecho (0 a 0.25). Entre 0.03 e 0.06 fica natural. |
|
|
75
|
+
| `focus_y` | `"auto"` | Altura dos olhos como fração da altura do vídeo (0.1 a 0.9). Auto: os olhos de cada trecho. O zoom enquadra em volta dele. |
|
|
76
|
+
|
|
77
|
+
### Como a posição automática funciona
|
|
78
|
+
|
|
79
|
+
O compose roda o `face_layout.py` (detector de rosto YuNet) em vários quadros de cada trecho do
|
|
80
|
+
`cut.mp4` e grava `<EDIT>/face_layout.json`. Com isso:
|
|
81
|
+
- o zoom de cada trecho mira nos olhos daquele trecho;
|
|
82
|
+
- a tela dividida reenquadra a pessoa em cada trecho que a janela cobre, e empurra o rosto para
|
|
83
|
+
longe da legenda que fica na divisão;
|
|
84
|
+
- cada texto vai para o lugar livre mais perto da altura normal (gancho 430, legenda 1400,
|
|
85
|
+
chamada 1110 ou 1180, aviso 1548, na tela 1080x1920), sem cobrir olhos, nariz e boca;
|
|
86
|
+
- textos que aparecem juntos nunca se sobrepõem. Prioridade: chamada, gancho, legenda, aviso. O
|
|
87
|
+
de menor prioridade muda de lugar (se estiver em auto) ou some enquanto os dois estariam juntos.
|
|
88
|
+
Tudo fica em `verify/final_report.json` (`adjustments`).
|
|
89
|
+
|
|
90
|
+
Para ver o que ele achou antes de montar (uma linha de resumo):
|
|
91
|
+
`uv run --directory '<SKILL>' python helpers/face_layout.py --edit-dir '<EDIT>'`
|
|
92
|
+
Se o resumo disser "o rosto muda de altura entre os trechos", deixe tudo em auto: cada trecho
|
|
93
|
+
ganha a sua posição. Trecho sem rosto (tela, produto) usa a posição normal.
|
|
94
|
+
|
|
95
|
+
### `hook` (gancho)
|
|
96
|
+
|
|
97
|
+
| Campo | Padrão | O que faz |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| `enabled` | true | Liga o gancho. |
|
|
100
|
+
| `style` | `manchete` | Um id de estilo de gancho (tabela abaixo). |
|
|
101
|
+
| `text` | obrigatório | 1 ou 2 linhas. `*palavras*` entre asteriscos saem na cor de destaque. |
|
|
102
|
+
| `start` | 0.0 | Entrada. |
|
|
103
|
+
| `end` | 3.0 | Saída. Entre 2 e 3,5 s. Termine junto do fim de uma frase. |
|
|
104
|
+
| `center_y` | `"auto"` | Centro vertical em pixels (tela 1080x1920). Auto: perto de 430, fora do rosto. |
|
|
105
|
+
| `sfx` | `"pop"` | Som na entrada. `null` tira. |
|
|
106
|
+
|
|
107
|
+
- O gancho entra com um pulinho e some suave nos últimos quadros.
|
|
108
|
+
- A legenda some enquanto o gancho está na tela (`hide_during_hook`), então não briga com ela.
|
|
109
|
+
- Número manual: nunca acima de 300 (a barra do Reels cobre o topo).
|
|
110
|
+
- O vídeo já tinha texto escrito na imagem: ponha o gancho numa altura longe dele (número manual)
|
|
111
|
+
e confira na folha de quadros.
|
|
112
|
+
- Texto longo encolhe a letra e o compose avisa "gancho longo demais". Encurte.
|
|
113
|
+
|
|
114
|
+
### `captions` (legendas)
|
|
115
|
+
|
|
116
|
+
| Campo | Padrão | O que faz |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| `enabled` | true | Liga as legendas. |
|
|
119
|
+
| `style` | do `captions.json` ou `impacto` | Id de estilo de legenda (tabela abaixo). |
|
|
120
|
+
| `file` | `"captions.json"` | Gerado pelo `captions.py`. |
|
|
121
|
+
| `hide_during_hook` | true | Esconde a legenda enquanto o gancho aparece. |
|
|
122
|
+
| `font_scale` | 1.0 | 0.9 a 1.15. Acima disso a largura segura limita o tamanho. |
|
|
123
|
+
| `center_y` | `"auto"` | Altura em pixels (tela 1080x1920). Auto: perto de 1400 em cada trecho, fora do rosto. Um número vale para o vídeo inteiro. |
|
|
124
|
+
|
|
125
|
+
- O `captions.json` é agrupado para um estilo. Mudou o estilo? Rode de novo
|
|
126
|
+
`captions.py --edit-dir '<EDIT>' --style NOVO`. O compose avisa quando os dois não batem e recusa
|
|
127
|
+
legendas feitas para outro corte.
|
|
128
|
+
- As palavras vêm das transcrições das fontes, mapeadas no tempo do corte. Linhas `confira:` do
|
|
129
|
+
`captions.py` mostram onde a transcrição do corte ouviu outra coisa; corrija com
|
|
130
|
+
`--replace 'errado=certo'`.
|
|
131
|
+
- Durante uma tela dividida a legenda vai para a linha da divisão (mesmo com `center_y`).
|
|
132
|
+
- **Vídeo que já tem legenda escrita na imagem:** `"enabled": false`, a não ser que a pessoa peça
|
|
133
|
+
as duas. Legenda em cima de legenda é o erro mais visível de um anúncio.
|
|
134
|
+
|
|
135
|
+
### `inserts` (imagens e vídeos por cima)
|
|
136
|
+
|
|
137
|
+
Lista. Cada item:
|
|
138
|
+
|
|
139
|
+
| Campo | Padrão | O que faz |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| `type` | obrigatório | `split_top`, `split_bottom`, `full` ou `pip`. |
|
|
142
|
+
| `src` | obrigatório | Imagem (jpg, png, webp) ou vídeo (mp4, mov). |
|
|
143
|
+
| `start`, `end` | obrigatórios | Entrada e saída, exatas no quadro. |
|
|
144
|
+
| `ken_burns` | true em imagem, false em vídeo | Movimento lento de zoom e deslize (até 6%). |
|
|
145
|
+
| `split` | 0.46 | Fração da altura para a imagem na tela dividida (0.25 a 0.75). |
|
|
146
|
+
| `sfx` | `"whoosh"` | Som na entrada. Efeito pronto: o ponto forte dele cai no quadro em que a imagem entra. Arquivo: começa 2 quadros antes. `null` tira. |
|
|
147
|
+
| `corner` | `"top_right"` | Só no `pip`: `top_right` ou `top_left`. |
|
|
148
|
+
|
|
149
|
+
O que cada tipo faz:
|
|
150
|
+
- `split_top`: imagem na faixa de cima, a pessoa reenquadrada embaixo (em cada trecho que a janela
|
|
151
|
+
cobre), com uma sombra suave na divisão. Bom para mostrar produto ou tela enquanto a pessoa fala.
|
|
152
|
+
- `split_bottom`: pessoa em cima, imagem embaixo. Use quando o rosto fica alto no quadro.
|
|
153
|
+
- `full`: a imagem cobre a tela toda (a voz continua). Use por pouco tempo, até 2,5 s.
|
|
154
|
+
- `pip`: cartão branco arredondado com sombra, 380 px de largura, no canto de cima. Coloque no
|
|
155
|
+
canto oposto ao rosto.
|
|
156
|
+
- Vídeo como insert começa do próprio início e repete se for mais curto que a janela.
|
|
157
|
+
- Inserts sobrepostos: o que vem depois na lista fica por cima (evite).
|
|
158
|
+
- Na tela verde (`"edit_type": "tela_verde"`), `split_top` e `split_bottom` não dividem a tela: viram o fundo
|
|
159
|
+
atrás da pessoa no tempo deles e aceitam `encaixe`, `escurecer` e `desfocar` (seção `tela_verde`).
|
|
160
|
+
`full` e `pip` continuam iguais.
|
|
161
|
+
|
|
162
|
+
### `tela_verde` (você recortado na frente de um fundo)
|
|
163
|
+
|
|
164
|
+
Com `"edit_type": "tela_verde"` a pessoa aparece recortada, sem o fundo da gravação, na frente das imagens e
|
|
165
|
+
vídeos da edição. Sem esse `edit_type` a seção fica de fora (o compose só avisa). Outro `edit_type` (`clean`,
|
|
166
|
+
`split_top`, `split_bottom`) não muda nada no compose.
|
|
167
|
+
|
|
168
|
+
**As imagens e vídeos entram como inserts normais.** Na tela verde, `split_top` e `split_bottom` não dividem a
|
|
169
|
+
tela: cada um vira o fundo atrás da pessoa, exatamente do `start` ao `end` dele, com o mesmo arquivo, o mesmo
|
|
170
|
+
`ken_burns`, o mesmo `sfx` e os flashes de `transitions` nas bordas. O `split` dele não vale. `full` continua
|
|
171
|
+
cobrindo a tela toda e `pip` continua como cartão por cima, no canto longe do rosto (o `corner` pedido, se ele
|
|
172
|
+
não cair no rosto). Nunca ponha tela dividida e tela verde no mesmo vídeo: trocar o tipo não pede mudar os
|
|
173
|
+
inserts. `tela_verde.fundo` é só para fundo extra que não depende de um momento da fala (uma página rolando o
|
|
174
|
+
vídeo todo, uma cor).
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
"edit_type": "tela_verde",
|
|
178
|
+
"tela_verde": {"posicao": "direita", "altura": 0.55, "contorno": {"cor": "#FFFFFF", "largura": 8},
|
|
179
|
+
"sombra": true, "fundo_original_desfocado": false, "sem_rosto": "original",
|
|
180
|
+
"fundo": [{"src": "assets/pagina_rolando.mp4", "start": 0, "encaixe": "cobrir", "escurecer": 0.25,
|
|
181
|
+
"ken_burns": false, "desfocar": 0}]},
|
|
182
|
+
"inserts": [{"type": "split_top", "src": "assets/print_painel.png", "start": 0.0, "end": 5.0},
|
|
183
|
+
{"type": "split_top", "src": "assets/clipe_quadrado.mp4", "start": 13.9, "end": 16.8, "sfx": null},
|
|
184
|
+
{"type": "full", "src": "assets/vitrine.jpg", "start": 20.1, "end": 21.9}]
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
| Campo | Padrão | O que faz |
|
|
188
|
+
|---|---|---|
|
|
189
|
+
| `posicao` | `"direita"` | `"direita"` (canto direito), `"esquerda"` (canto esquerdo) ou `"centro"` (meio). |
|
|
190
|
+
| `altura` | 0.55 no canto, 0.75 no meio | Fração da altura da tela que a pessoa ocupa, do alto da cabeça até embaixo (0.3 a 1.0). No canto a pessoa nunca passa de 72% da largura, e no meio nunca passa da largura da tela: gravação bem de perto fica menor para continuar parecendo canto e não perder nitidez. |
|
|
191
|
+
| `contorno` | `{"cor": "#FFFFFF", "largura": 8}` | Contorno em volta da pessoa, em pixels da tela 1080 de largura (0 a 40). `null` tira. |
|
|
192
|
+
| `sombra` | true | Sombra suave atrás da pessoa. |
|
|
193
|
+
| `fundo` | nenhum | Fundo de base, no tempo do corte (abaixo). Os inserts `split_top`/`split_bottom` ganham dele enquanto duram. |
|
|
194
|
+
| `fundo_original_desfocado` | false | O próprio vídeo, desfocado e escurecido, onde nenhum fundo cobre. |
|
|
195
|
+
| `sem_rosto` | `"original"` | Trecho em que o detector não acha rosto (gravação de tela, produto na mão): `"original"` mostra como foi gravado, em tela cheia; `"recorte"` recorta mesmo assim. |
|
|
196
|
+
| `espelhar` | false | `true` vira a pessoa de lado, como num espelho (só os trechos recortados; os mostrados como foram gravados continuam como estão). Use quando a câmera cortou o corpo do lado contrário ao canto escolhido e não há texto na roupa nem nos objetos que aparecem (texto sairia invertido). |
|
|
197
|
+
|
|
198
|
+
Cada item de `fundo` (e cada insert `split_top`/`split_bottom`, que aceita `encaixe`, `escurecer` e `desfocar`
|
|
199
|
+
do mesmo jeito):
|
|
200
|
+
|
|
201
|
+
| Campo | Padrão | O que faz |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| `src` | obrigatório | Imagem (jpg, png, webp, HEIC do iPhone), vídeo (mp4, mov) ou, só no `fundo`, uma cor `#RRGGBB`. |
|
|
204
|
+
| `start` | o `end` do item anterior (0 no primeiro) | Segundo do corte em que o fundo entra (no insert, obrigatório). |
|
|
205
|
+
| `end` | o `start` do próximo item, ou o fim do vídeo | Segundo em que sai (no insert, obrigatório). |
|
|
206
|
+
| `ken_burns` | true em imagem, false em vídeo e cor | Zoom lento de 6%. |
|
|
207
|
+
| `encaixe` | `"auto"` | `"cobrir"` enche a tela 1080x1920, cortando o que sobra (página mais alta que a tela mostra o topo). `"inteiro"` mostra a imagem ou o vídeo inteiro e nítido, na largura da tela, na faixa que a pessoa não cobre (acima dela, no canto e no meio), sobre uma cópia desfocada e escura dele mesmo. Vídeo com borda lisa (estúdio, cor lisa, como os clipes de IA) não ganha essa cópia: a própria borda dele continua até as beiradas da tela, sem caixa em volta. `"auto"` usa `cobrir` quando o formato é perto de 9:16 (ou mais alto) e `inteiro` nos outros (print de celular ou de painel, foto deitada, clipe quadrado). |
|
|
208
|
+
| `escurecer` | 0.15 com `cobrir`, 0 com `inteiro` e em cor | De 0 a 0.9: escurece o fundo para a pessoa e os textos aparecerem mais. |
|
|
209
|
+
| `desfocar` | 0 | Desfoque em pixels (0 a 80). |
|
|
210
|
+
|
|
211
|
+
**Como o fundo cobre o vídeo**
|
|
212
|
+
- Os itens de `fundo` são a base. Um insert `split_top`/`split_bottom` ganha deles do quadro do `start` até o
|
|
213
|
+
quadro antes do `end`. Entre itens do mesmo tipo, o que vem depois na lista fica por cima (o compose avisa).
|
|
214
|
+
- Buraco sem nenhum fundo (entre dois inserts sem `fundo`, ou depois do último): continua o fundo de antes. A
|
|
215
|
+
imagem segue com o zoom lento (no máximo o dobro do tempo dela) e depois fica parada; o vídeo continua
|
|
216
|
+
repetindo: cada volta começa com 0,4 s de transição suave a partir do último quadro (não pula nem congela).
|
|
217
|
+
O vídeo toca inteiro, quadro a quadro, no tempo do próprio insert; a transição só aparece depois do fim dele.
|
|
218
|
+
- Quadros vazios no começo ou no fim do vídeo (clipe que abre com o cenário vazio e os objetos entram depois,
|
|
219
|
+
ou que termina sumindo) nunca aparecem sozinhos: no começo, o fundo de antes se dissolve no vídeo enquanto
|
|
220
|
+
os objetos entram (sem fundo antes, fica parado o primeiro quadro com conteúdo); no fim, fica o último
|
|
221
|
+
quadro com conteúdo. Clipe que termina encolhendo até sumir (um X que diminui depois de aparecer) para no
|
|
222
|
+
último quadro que ainda tem pelo menos 65% do conteúdo do pico final. O relatório mostra quantos foram em
|
|
223
|
+
`quadros_vazios`.
|
|
224
|
+
- Antes do primeiro fundo: o vídeo original desfocado (com `fundo_original_desfocado`) ou uma cor escura, com
|
|
225
|
+
aviso. Sem nenhum fundo: cor escura e aviso.
|
|
226
|
+
- `inteiro`: a imagem ocupa a largura da tela e fica na faixa entre o topo (120 px) e a cabeça da pessoa nos
|
|
227
|
+
trechos em que ela aparece. A parte principal (num print com margem vazia, só o cartão) fica centrada nessa
|
|
228
|
+
faixa; a margem vazia pode passar para trás da pessoa. Se a parte principal não couber, a imagem diminui
|
|
229
|
+
(até metade da largura). Com legenda automática, a faixa deixa espaço para ela logo acima da cabeça quando a
|
|
230
|
+
imagem continua com pelo menos 75% do tamanho.
|
|
231
|
+
- Vídeo `inteiro` com borda lisa (`borda_lisa` no relatório) fica largo: diminui no máximo até 75% da largura,
|
|
232
|
+
para sobrar a faixa da legenda entre a parte principal e a cabeça. A parte principal é a faixa de linhas
|
|
233
|
+
com 85% dos objetos do clipe todo (um fio ou um brilho na beirada não conta) e fica no alto da faixa; o que
|
|
234
|
+
não cabe acima da cabeça passa para trás da legenda e da pessoa. A borda dele continua até as beiradas da
|
|
235
|
+
tela, então ele vira o cenário atrás de você, não uma caixa.
|
|
236
|
+
- Vídeo começa do próprio início quando o item entra.
|
|
237
|
+
|
|
238
|
+
**Como a pessoa é colocada**
|
|
239
|
+
- O recorte sai do `helpers/matte.py` (modelo de recorte de pessoa, no computador, sem internet) e fica
|
|
240
|
+
guardado em `renders/matte/`, um arquivo por trecho do corte. Leva uns 3 minutos por minuto de vídeo na
|
|
241
|
+
primeira vez; depois, mudar fundo, posição ou textos não recorta de novo. Para adiantar:
|
|
242
|
+
`uv run --directory '<SKILL>' python helpers/matte.py --edit-dir '<EDIT>'`.
|
|
243
|
+
- A pessoa fica encostada embaixo. No canto, o lado que a câmera cortou (ombro, braço) encosta na borda da
|
|
244
|
+
tela; um corte que ainda cai dentro da tela some num degradê de 90 px só onde o corpo encosta nele (o braço
|
|
245
|
+
que não encosta fica inteiro, e o contorno não aparece através dele). Pessoa que a câmera não cortou fica a
|
|
246
|
+
40 px da borda.
|
|
247
|
+
- No canto, trecho em que a câmera corta os dois lados do corpo (os dois em 20% dos quadros ou mais) ocupa a
|
|
248
|
+
largura toda da tela (se para isso a pessoa crescer no máximo 1,6 vez), com a cabeça na mesma altura do
|
|
249
|
+
canto: até 20% da parte de baixo da gravação fica abaixo da tela. Assim nenhum corte cai no meio da tela.
|
|
250
|
+
O compose avisa (`tela verde: em 00:00.00-00:20.03 a câmera corta os dois lados do seu corpo...`) e o trecho
|
|
251
|
+
ganha `largura_toda` e `corte_embaixo` no relatório.
|
|
252
|
+
- O contorno vai só em volta do corpo: um vão fechado (entre o braço e o corpo, entre o relógio e o pulso,
|
|
253
|
+
contando a borda de baixo e os lados cortados como fechados) mostra o fundo, sem contorno nem sombra nele.
|
|
254
|
+
- O começo de cada trecho do recorte usa o quadro de logo depois como referência: onde a imagem quase não
|
|
255
|
+
mudou e esse quadro mostra fundo, um pedaço da sala que o modelo ainda achava que era você some (só pedaço
|
|
256
|
+
encostado no fundo; mão e buraco dentro do corpo não mudam). O primeiro quadro, que costuma virar a capa,
|
|
257
|
+
sai limpo. No meio, o lado cortado também fica na borda quando dá, e uma gravação cortada dos dois lados cresce
|
|
258
|
+
até encher a largura (se faltar até 15%).
|
|
259
|
+
- Onde a imagem não mudou nada entre um quadro e o seguinte, um pulo do modelo (um pedaço da sala que ele toma
|
|
260
|
+
por você por dois ou três quadros) não entra de uma vez: o recorte só vai aos poucos na direção dele.
|
|
261
|
+
- Cenário aprendido (câmera parada): de cada tomada (os trechos do mesmo vídeo bruto com o mesmo
|
|
262
|
+
enquadramento) o compose aprende como é a sala atrás da pessoa, com os quadros em que o recorte mostra fundo.
|
|
263
|
+
Onde o recorte fica em dúvida e a imagem é exatamente essa sala, o pedaço sai (névoa, mancha clara que pisca;
|
|
264
|
+
uma sala escura só quando é diferente do corpo ao lado), e a cor da sala sai da borda macia da pessoa (franja
|
|
265
|
+
clara ou azul). O que o modelo toma por corpo com certeza e nunca mostrou como fundo (uma cadeira escura
|
|
266
|
+
entre o braço e o corpo) continua. Câmera que se mexe não ganha cenário. O relatório mostra cada tomada em
|
|
267
|
+
`fundo_do_cenario` (`tomada`, `trechos`, `usado`, `conhece`, `motivo`).
|
|
268
|
+
- Trecho em que o rosto sai da câmera por um lado (a pessoa se inclinou) fica encostado nesse lado da tela,
|
|
269
|
+
mesmo que o canto escolhido seja o outro: o rosto nunca aparece cortado no meio da tela. O compose avisa
|
|
270
|
+
(`tela verde, trecho 00:05.07-00:05.97: o rosto sai da câmera pela direita...`) e o trecho ganha `posicao`
|
|
271
|
+
no relatório.
|
|
272
|
+
- Se a câmera corta o corpo do lado de dentro do canto em boa parte do vídeo (40% ou mais), o compose avisa e
|
|
273
|
+
sugere o que fica mais natural: o outro canto ou `"espelhar": true`, ou o `centro` quando o corte é dos dois
|
|
274
|
+
lados e a pessoa teria que crescer mais de 1,6 vez para ocupar a largura. Repasse a sugestão para a pessoa em
|
|
275
|
+
uma frase.
|
|
276
|
+
- Trechos da mesma tomada ficam do mesmo tamanho. `camera.zoom_cuts` e `camera.push_in` aumentam a pessoa
|
|
277
|
+
(presa no lado da borda, ou na cabeça no meio); o vídeo inteiro não recebe o zoom da câmera, só os trechos
|
|
278
|
+
mostrados como foram gravados.
|
|
279
|
+
|
|
280
|
+
**Textos**
|
|
281
|
+
- Rosto e corpo são calculados onde a pessoa ficou. Legenda, gancho, chamada, aviso e animações em auto nunca
|
|
282
|
+
ficam no rosto e, quando cabe, ficam fora do corpo. Por cima do fundo pode.
|
|
283
|
+
- Legenda, gancho e chamada também fogem da parte principal de uma imagem `inteiro`: a legenda fica entre a
|
|
284
|
+
imagem e a cabeça quando cabe, senão abaixo do rosto e, sem espaço ali, por cima da parte de baixo da
|
|
285
|
+
imagem.
|
|
286
|
+
- Um `center_y` escrito à mão (legenda, gancho, chamada) fica onde está, a menos que caia no rosto (a pessoa
|
|
287
|
+
mudou de lugar na tela verde): aí vai para a altura livre mais perto, com aviso e `adjustments`
|
|
288
|
+
(`"because": "rosto (tela verde)"`). Para ela se ajustar sozinha, tire o `center_y`.
|
|
289
|
+
- O aviso de resultado só aparece se a edição ligar o `disclaimer`.
|
|
290
|
+
|
|
291
|
+
**No relatório** (`verify/final_report.json`): `layers` com `"type": "tela_verde"`: `posicao`, `altura`,
|
|
292
|
+
`contorno`, `sombra`, `espelhar`, `corte_dentro` (`lado`, `parte`, `melhor`, `espelhar`, ou null), `fundo` (cada trecho com o arquivo ou a cor que ficou, `item` quando veio de `fundo`,
|
|
293
|
+
`insert` quando veio de um insert, `encaixe` e, no `inteiro`, `rect` e `content` em pixels da saída; em vídeo,
|
|
294
|
+
`borda_lisa` e `quadros_vazios` com `inicio` e `fim`),
|
|
295
|
+
`inserts_no_fundo` (cada insert que virou fundo: `insert`, `type`, `src`, `start`, `end`, `encaixe`, `rect`,
|
|
296
|
+
`stage`), `segments` (por trecho do corte: `mode` `"pessoa"` ou `"original"`, `scale`, `x`, `y`, `zoom`,
|
|
297
|
+
`height_share`, `width_share`, `on_screen_edge`, `cut_edge_inside`, `posicao` quando o trecho foi para o lado
|
|
298
|
+
em que o rosto sai da câmera, `espelhado`, `largura_toda` e `corte_embaixo` quando o trecho ocupa a largura
|
|
299
|
+
toda), `matte` (motor, trechos, do cache ou não, de onde leu: `"fonte"` o vídeo bruto, `"corte"` o `cut.mp4`),
|
|
300
|
+
`fundo_do_cenario` e `seconds` (`matte` e `compose`, separados). Cada
|
|
301
|
+
insert que virou fundo aparece em `layers` com `"type": "insert"` e `"as": "fundo"`. O compose imprime `tela
|
|
302
|
+
verde: os inserts 1, 2 (imagem em cima) vão para o fundo, atrás de você (sem tela dividida)`, `recorte da
|
|
303
|
+
pessoa: ...` durante o recorte e `tela verde pronta: recorte Xs, montagem Ys`.
|
|
304
|
+
|
|
305
|
+
**Exemplos**
|
|
306
|
+
|
|
307
|
+
Comentando uma página, com o print dela e depois um vídeo do produto (os dois como inserts):
|
|
308
|
+
|
|
309
|
+
```json
|
|
310
|
+
"edit_type": "tela_verde",
|
|
311
|
+
"tela_verde": {"posicao": "direita"},
|
|
312
|
+
"inserts": [{"type": "split_top", "src": "assets/print_pagina.png", "start": 0.4, "end": 9.5},
|
|
313
|
+
{"type": "split_top", "src": "assets/produto.mp4", "start": 9.5, "end": 15.0, "escurecer": 0.25}]
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
No meio, sem arquivo de fundo, com o próprio vídeo desfocado e contorno amarelo:
|
|
317
|
+
|
|
318
|
+
```json
|
|
319
|
+
"edit_type": "tela_verde",
|
|
320
|
+
"tela_verde": {"posicao": "centro", "fundo_original_desfocado": true, "contorno": {"cor": "#FFC400", "largura": 10}}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Uma página rolando o vídeo todo como base, com um print que entra só na fala dele:
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
"edit_type": "tela_verde",
|
|
327
|
+
"tela_verde": {"posicao": "esquerda", "fundo": [{"src": "assets/pagina_rolando.mp4", "encaixe": "cobrir"}]},
|
|
328
|
+
"inserts": [{"type": "split_top", "src": "assets/print_pedido.png", "start": 6.2, "end": 10.0, "encaixe": "inteiro"}]
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### `transitions` (flash)
|
|
332
|
+
|
|
333
|
+
Lista de `{"at": segundos, "type": "flash", "sfx": "click"}`. O flash é um clarão branco de 5
|
|
334
|
+
quadros com pico no quadro `at`. `"sfx": null` tira o som. Só existe o tipo `flash`.
|
|
335
|
+
|
|
336
|
+
### `motion` (animações de texto e número)
|
|
337
|
+
|
|
338
|
+
Textos e números que se desenham na tela, feitos em Python quadro a quadro: lista com check, lista
|
|
339
|
+
riscada, passo a passo, etiqueta de preço, contador, barra, gráficos, palavra de impacto, chamada para
|
|
340
|
+
comentar, notificação e destaque desenhado. Servem para o que a IA de vídeo não desenha certo (texto e
|
|
341
|
+
número exatos). Vídeo feito com IA (Higgsfield, Kling) continua em `inserts`.
|
|
342
|
+
|
|
343
|
+
Lista, ou `{"enabled": true, "tema": "papelaria", "quantidade": 3, "items": [...]}`. `tema` é o visual de
|
|
344
|
+
todas; um `params.tema` no item vale só para ele:
|
|
345
|
+
- papel claro com base colorida, Montserrat, cada um com a sua paleta: `papelaria` (lilás, o estilo da
|
|
346
|
+
Vit, letra à mão Caveat), `papel_azul`, `papel_verde`, `papel_laranja` (Caveat), `papel_grafite`
|
|
347
|
+
(cinza e vermelho-tijolo, sóbrio);
|
|
348
|
+
- `pop`: cartão creme, contorno preto grosso e sombra dura; `neon`: cartão escuro com borda brilhante e
|
|
349
|
+
letra condensada;
|
|
350
|
+
- `escuro` (vidro) e `claro` (branco): usam a cor de destaque do vídeo.
|
|
351
|
+
Papel, pop e neon mantêm a própria paleta mesmo com outra cor no vídeo; só o `cor` do item muda.
|
|
352
|
+
`quantidade` é quantas a pessoa pediu no preview (o `motion_sugerir.py` lê). `"enabled": false` desliga
|
|
353
|
+
sem apagar. Cada item:
|
|
354
|
+
|
|
355
|
+
| Campo | Padrão | O que faz |
|
|
356
|
+
|---|---|---|
|
|
357
|
+
| `template` | obrigatório | O modelo (tabela abaixo). |
|
|
358
|
+
| `start` | obrigatório | Segundo do corte em que a animação começa. O quadro 0 dela cai exatamente nesse quadro. |
|
|
359
|
+
| `end` ou `duration` | a duração sugerida pelo modelo | Fim (ou duração). Use só um dos dois. Passou do fim do vídeo: é cortada, com aviso. |
|
|
360
|
+
| `params` | `{}` | Os campos do modelo (tabela abaixo). Campo que falta usa o padrão. |
|
|
361
|
+
| `region` | `"auto"` | `"auto"`: o lugar do modelo, e o compose desvia do rosto, da chamada, do gancho e de outra animação. `"top"`, `"middle"` ou `"bottom"` (ou `topo`, `centro`, `baixo`, `faixa_topo`, `tela`): fica nesse lugar, sem desviar. `{"x": 140, "y": 1000, "w": 800, "h": 520}`: caixa exata em pixels da tela 1080x1920. |
|
|
362
|
+
| `sfx` | true | Toca os sons do modelo (só com a seção `sfx` ligada). `false` deixa a animação muda. |
|
|
363
|
+
| `enabled` | true | `false` pula este item. |
|
|
364
|
+
| `note`, `id` | nenhum | Anotação sua (o `motion_sugerir.py` põe a fala aqui). O compose ignora. |
|
|
365
|
+
|
|
366
|
+
**Regras de uso**
|
|
367
|
+
- Só onde a fala pede: lista, "você não precisa de...", passo a passo, preço, porcentagem, número com
|
|
368
|
+
unidade, "comenta X", e os momentos fortes: a oferta (grátis, liberado, bônus, garantia), a virada da
|
|
369
|
+
história ("o caminho que eu descobri", "mas...") e frase curta de impacto. No máximo uma animação a
|
|
370
|
+
cada 6 s, uma por vez na tela.
|
|
371
|
+
- Comece depois do fim do gancho e termine antes da chamada. `comentario_cta` é uma chamada: se ele for
|
|
372
|
+
o fim do vídeo, desligue o card `cta` ou termine antes dele.
|
|
373
|
+
- Deixe `region` em `"auto"`. Nunca em cima do rosto.
|
|
374
|
+
- **Número só do material.** Use os números, valores e preços que a pessoa disse ou mostrou, como
|
|
375
|
+
qualquer outro número (faturamento vira `contador` ou gráfico). Nunca invente número, venda,
|
|
376
|
+
depoimento ou prova que não existe no material; o preço antigo precisa ser o de verdade.
|
|
377
|
+
- `times` (e `cross_times` no `riscado`): segundo de cada item contado do `start` da animação, para cada
|
|
378
|
+
item entrar junto com a fala.
|
|
379
|
+
|
|
380
|
+
**Sugestões pela fala**
|
|
381
|
+
|
|
382
|
+
`uv run --directory "<SKILL>" python helpers/motion_sugerir.py --edit-dir "<EDIT>"` lê a fala do corte
|
|
383
|
+
(`transcripts/cut.json`) e imprime itens prontos de `motion`, com o tempo de cada palavra e a frase em
|
|
384
|
+
`note`. Ele só sugere: nunca mexe no `edit_data.json`. Valor que a pessoa diz que fez ("faturei 50 mil")
|
|
385
|
+
vira `contador` com `prefix` "R$", não etiqueta de preço.
|
|
386
|
+
`--json` imprime só o JSON; `-o arquivo.json` também grava. `--quantidade N` fica com as N mais fortes,
|
|
387
|
+
uma em cada parte do vídeo (padrão: `motion.quantidade` do edit_data); `--tema` põe o visual em todas.
|
|
388
|
+
Pontos marcados com "Motion aqui" no preview (`preview_marks.json`, `"kind": "motion"`) entram sempre,
|
|
389
|
+
por cima da quantidade, com o pedido da pessoa em `note` ("PEDIDO: ...").
|
|
390
|
+
|
|
391
|
+
**Ver um modelo antes**
|
|
392
|
+
|
|
393
|
+
`uv run --directory "<SKILL>" python helpers/motion_render.py --template riscado --params '{"items": ["Ter estoque"]}' --out "<EDIT>/verify/motion"`
|
|
394
|
+
gera `riscado.mov` e `riscado_folha.png` (8 quadros com a área segura). `--fundo "<EDIT>/verify/quadro.png"`
|
|
395
|
+
usa um quadro do vídeo de fundo; `--list` mostra os modelos e `--describe ID` todos os campos de um deles.
|
|
396
|
+
|
|
397
|
+
**Modelos**
|
|
398
|
+
|
|
399
|
+
| `template` | O que mostra | Lugar e duração | Sons |
|
|
400
|
+
|---|---|---|---|
|
|
401
|
+
| `checklist` | Lista num cartão; cada item entra e ganha um check na cor de destaque. | `baixo`, 3 s | `pop`, `tick` por item, `success` no fim |
|
|
402
|
+
| `riscado` | Lista que aparece e depois é riscada item por item (linha vermelha ou X). | `baixo`, 3,5 s | `pop`, `tick` (linha) ou `error` (X) por risco |
|
|
403
|
+
| `carimbo` | Uma palavra cai carimbada na tela, torta e com moldura, e a tela treme junto. | `centro`, 2 s | `bass_drop` na batida |
|
|
404
|
+
| `selo_garantia` | Selo redondo com serrilha e fita, com o prazo em dias no meio. | `centro`, 2,4 s | `pop` e `success` |
|
|
405
|
+
| `passos` | 2 a 4 passos em círculos numerados, ligados por setas. | faixa acima do rosto, 3 s | `pop` por passo |
|
|
406
|
+
| `etiqueta_preco` | Etiqueta de preço que pula e fica inclinada; preço antigo riscado em cima. | `baixo`, 3 s | `cash` (com preço antigo: `pop`, `tick`, `cash`) |
|
|
407
|
+
| `contador` | Número que sobe até o valor, com prefixo, sufixo e legenda. | `centro`, 3 s | `pop`, `count` |
|
|
408
|
+
| `barra_progresso` | Barra (ou anel) que enche até a porcentagem. | `baixo`, 3 s | `pop`, `count`, `success` em 100% |
|
|
409
|
+
| `grafico_barras` | 2 a 6 barras que crescem, com valor e nome. | `baixo`, 3,5 s | `pop`, `tick` por barra |
|
|
410
|
+
| `grafico_linha` | Linha que se desenha subindo, com área e valor no topo. | `baixo`, 4 s | `pop`, `count`, `pop` no fim |
|
|
411
|
+
| `palavra_impacto` | 1 a 4 palavras gigantes que batem na tela com tranco, clarão e tremida. | `baixo`, 2 s | `metal_hit` (ou `bass_drop`, `synth_hit`) por palavra |
|
|
412
|
+
| `comentario_cta` | Barra de comentário genérica: a palavra-chave é digitada e enviada. | `baixo`, 3,8 s | `pop`, `keyboard`, `mouse_click`, `pop` |
|
|
413
|
+
| `notificacao` | Notificação de celular genérica que desce do alto e sobe no fim. | `faixa_topo` (fixo), 3,5 s | `notification` |
|
|
414
|
+
| `destaque` | Traço de caneta num ponto da tela: círculo, sublinhado ou seta. | `target` (fixo), 2 s | `whoosh` (seta: `whoosh` e `pop`) |
|
|
415
|
+
|
|
416
|
+
`notificacao` e `destaque` ficam sempre no mesmo lugar (não desviam do rosto). Todo modelo aceita
|
|
417
|
+
também `tema` (`"escuro"`, padrão, ou `"claro"`; só muda o cartão: com `card: false` a letra é sempre branca
|
|
418
|
+
com contorno) e `cor` (cor de destaque só desta animação, ex.: `"#FF3B30"` ou `"vermelho"`).
|
|
419
|
+
|
|
420
|
+
**Campos de cada modelo** (padrão entre parênteses; textos com `*palavra*` saem na cor de destaque)
|
|
421
|
+
|
|
422
|
+
| `template` | `params` |
|
|
423
|
+
|---|---|
|
|
424
|
+
| `checklist` | `items` (1 a 6 textos, até 32 letras), `title` (""; até 36), `delay` (0.25), `stagger` (0.45), `times` (null; um por item), `mode` (`circulo` ou `caixa`), `size` (`normal` ou `grande`), `card` (true) |
|
|
425
|
+
| `riscado` | `items` (1 a 6, até 32 letras), `title` ("Você \*não\* precisa de:"), `mode` (`linha` ou `x`), `delay` (0.2), `stagger` (0.3), `times` (null), `cross_delay` (0.55), `cross_stagger` (0.4), `cross_times` (null; cada risco depois do item aparecer), `size`, `card` |
|
|
426
|
+
| `carimbo` | `texto` (até 22 letras, "APROVADO"), `subtexto` (""; linha menor dentro da moldura), `delay` (0.12), `angulo` (-7), `estilo` (`moldura` ou `cheio`), `tremer` (true) |
|
|
427
|
+
| `selo_garantia` | `numero` ("7"), `unidade` ("dias"), `titulo` ("GARANTIA"), `legenda` (""; \*palavra\* entre asteriscos na cor de destaque), `delay` (0.15), `fita` (true) |
|
|
428
|
+
| `passos` | `items` (2 a 4, até 20 letras), `title` (""), `direction` (`horizontal` ou `vertical`), `icon` (`numero` ou `check`), `delay` (0.1), `stagger` (0.6), `times` (null), `size`, `card` |
|
|
429
|
+
| `etiqueta_preco` | `price` (37; centavos com ponto: 37.90), `old_price` (null), `prefix` ("R$"), `decimals` (null), `label` ("por apenas"), `note` (""; até 26), `old_label` ("de"), `mode` (`etiqueta` ou `selo`), `tilt` (-4; -12 a 12), `shine` (true), `tag_delay` (0.62; com preço antigo, segundos até a etiqueta pular) |
|
|
430
|
+
| `contador` | `value` (1000), `start_value` (0), `prefix` (""; ex.: "R$" ou "+"), `suffix` (""; ex.: "%", "alunos"), `decimals` (null), `label` (""; até 40), `duration` (1.4), `delay` (0.15), `ease` (`suave` ou `linear`), `size`, `card` (true), `bar` (true) |
|
|
431
|
+
| `barra_progresso` | `value` (75; 0 a 100), `start_value` (0), `label` ("Concluído"), `note` (""), `decimals` (null), `mode` (`barra` ou `anel`), `segments` (null; 2 a 10 etapas), `show_value` (true), `duration` (1.4), `delay` (0.15), `ease`, `card` |
|
|
432
|
+
| `grafico_barras` | `bars` (2 a 6 de `{"label", "value", "highlight"}`; `value` obrigatório), `title`, `prefix`, `suffix`, `decimals`, `mode` (`colunas` ou `barras`), `highlight` (`maior`, `ultima`, `todas`, `nenhuma`), `show_values` (true), `duration` (0.9), `stagger` (0.18), `delay` (0.15), `card` |
|
|
433
|
+
| `grafico_linha` | `values` (2 a 24 números), `labels` ([]; 2 ou um por valor), `title`, `prefix`, `suffix`, `decimals`, `label` (""; ao lado do número), `badge` (""; ex.: "+40%"), `zero` (true), `dots` (true), `area` (true), `duration` (1.6), `delay` (0.2), `card` |
|
|
434
|
+
| `palavra_impacto` | `text` ("\*ATENÇÃO\*"; até 4 palavras, `\|` quebra a linha), `style` (`contorno` ou `tarja`), `font` (`condensada` ou `redonda`), `size`, `flash` (`tela`, `local`, `nenhum`), `flash_color` (`branco` ou `destaque`), `shake` (true), `burst` (true), `stagger` (0.24), `upper` (true), `sound` (`metal`, `grave`, `batida`) |
|
|
435
|
+
| `comentario_cta` | `keyword` ("IDEIA"; até 20), `prompt_text` ("Comente a palavra"; `{palavra}` vira a palavra-chave), `placeholder`, `user_name` ("você"), `upper` (true), `delay` (0.7; segundos até digitar), `typing_speed` (7), `button` (`icone` ou `texto`), `show_sent` (true), `size` |
|
|
436
|
+
| `notificacao` | `app_name` ("Mensagens"; nome genérico), `title` (obrigatório), `text` (até 120), `time_label` ("agora"), `icon` (`mensagem`, `sino`, `check`, `coracao`, `letra`), `exit_mode` (`subir` ou `apagar`), `stack` (false) |
|
|
437
|
+
| `destaque` | `target` ([x, y, largura, altura] em pixels da tela 1080x1920, medido num quadro), `mode` (`circulo`, `sublinhado`, `seta`), `side` (`auto`, `baixo`, `cima`, `esquerda`, `direita`), `label` (""; letra de mão), `thickness` (12), `duration` (0.6), `shadow` (true) |
|
|
438
|
+
|
|
439
|
+
**Exemplo** (a fala: "Você não precisa ter estoque, nem aparecer... por apenas 37 reais... comenta IDEIA"):
|
|
440
|
+
|
|
441
|
+
```json
|
|
442
|
+
"motion": [
|
|
443
|
+
{"template": "riscado", "start": 4.2, "end": 7.9,
|
|
444
|
+
"params": {"items": ["Ter estoque", "Aparecer"], "times": [0.4, 1.3], "cross_times": [0.85, 1.75]}},
|
|
445
|
+
{"template": "etiqueta_preco", "start": 11.0,
|
|
446
|
+
"params": {"price": 37, "old_price": 97, "note": "à vista no PIX", "tag_delay": 0.9}},
|
|
447
|
+
{"template": "passos", "start": 17.5, "end": 20.5, "region": "top",
|
|
448
|
+
"params": {"items": ["Compra", "Conecta", "Usa"], "times": [0.2, 0.8, 1.4]}},
|
|
449
|
+
{"template": "comentario_cta", "start": 23.1, "params": {"keyword": "IDEIA",
|
|
450
|
+
"prompt_text": "Comente *{palavra}* que eu te mando"}, "sfx": true}
|
|
451
|
+
]
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
**Como o compose monta**
|
|
455
|
+
- Cada animação vira um clipe transparente em `renders/full/motion/` (na prévia, `renders/preview/motion/`,
|
|
456
|
+
em meia resolução), guardado para o próximo render. O clipe entra no quadro exato do `start`.
|
|
457
|
+
- Ordem das camadas: vídeo e inserts, animações, gancho, legenda, aviso, chamada e flash.
|
|
458
|
+
- Prioridade quando se encostam: chamada > gancho > animação > legenda > aviso. A legenda muda de altura
|
|
459
|
+
enquanto a animação está no lugar dela (com `center_y` em auto) ou some nesse trecho (com número fixo).
|
|
460
|
+
A animação some onde encosta na chamada ou no gancho (sobra de menos de 0,5 s some junto) e o compose
|
|
461
|
+
avisa. Sem lugar livre de tudo, ela ainda fica fora do rosto e some onde encostar na chamada ou no gancho.
|
|
462
|
+
A legenda e o aviso de resultado só desviam dela enquanto ela aparece.
|
|
463
|
+
- Os sons do modelo entram pela mesma regra do `sfx.events`: o ponto forte cai no quadro do som,
|
|
464
|
+
com o volume de `sfx.volume` vezes o volume do modelo. O som de digitação acaba junto com a digitação.
|
|
465
|
+
- `final_report.json`: `layers` com `"type": "motion"` (`template`, `frames`, `shown`, `region`,
|
|
466
|
+
`moved_by`, `rect`, `ink`, `clip`, `cached`, `params`, `sfx`); os sons em `layers` com `"type": "sfx"`,
|
|
467
|
+
`"why": "animação N"`; em `adjustments`, `"layer": "motion N"` (mudou de lugar ou sumiu) e a legenda com
|
|
468
|
+
`"because": "motion"`; em `face_checks`, `"layer": "motion N"` quando ela ficou no rosto.
|
|
469
|
+
|
|
470
|
+
### `cta` (chamada)
|
|
471
|
+
|
|
472
|
+
| Campo | Padrão | O que faz |
|
|
473
|
+
|---|---|---|
|
|
474
|
+
| `enabled` | true | Liga a chamada. |
|
|
475
|
+
| `text` | `"Toque em Saiba Mais"` | Texto do botão. |
|
|
476
|
+
| `sub` | null | Linha de apoio embaixo do botão. |
|
|
477
|
+
| `start` | null | `null` = últimos `duration` segundos. A chamada fica por cima do fim, não aumenta o vídeo. |
|
|
478
|
+
| `duration` | 2.5 | Duração. Entre 2,5 e 4 s. |
|
|
479
|
+
| `center_y` | 1110 com legenda, 1180 sem | Centro vertical em pixels. |
|
|
480
|
+
| `sfx` | nenhum | Som da chamada, ex.: `"rise"`: a subida começa antes (pelo ponto forte dela, veja `sfx`) e chega no máximo quando a chamada aparece. |
|
|
481
|
+
|
|
482
|
+
Com `center_y` em auto, a chamada sai de cima do rosto sozinha (ex.: sobe para perto de 430 num
|
|
483
|
+
rosto baixo) e a legenda abre espaço para ela.
|
|
484
|
+
|
|
485
|
+
### `disclaimer` (aviso de resultado)
|
|
486
|
+
|
|
487
|
+
Opcional. Desligado por padrão: sem a seção no arquivo, o vídeo sai sem aviso. Só escreva a seção se a
|
|
488
|
+
pessoa pedir um aviso na tela.
|
|
489
|
+
|
|
490
|
+
| Campo | Padrão | O que faz |
|
|
491
|
+
|---|---|---|
|
|
492
|
+
| `enabled` | true | Com a seção escrita, liga o aviso (pílula escura, letra pequena). `false` desliga. |
|
|
493
|
+
| `text` | "Resultado individual. Depende de execução. Não é promessa de ganho." | Até 2 linhas. Use o texto que a pessoa pedir. |
|
|
494
|
+
| `start` | 0.0 | Entrada. |
|
|
495
|
+
| `end` | null | `null` = até o fim. |
|
|
496
|
+
| `center_y` | `"auto"` | Centro vertical em pixels. Auto: perto de 1548, fora do rosto e dos outros textos. |
|
|
497
|
+
|
|
498
|
+
Uma seção `disclaimer` escrita sem `enabled` conta como ligada. Sem `text`, usa o texto padrão. Se o
|
|
499
|
+
aviso ficar escondido mais de 20% do tempo (atrás da chamada, do gancho e da legenda), o compose avisa:
|
|
500
|
+
deixe `center_y` em auto ou escolha outra altura.
|
|
501
|
+
|
|
502
|
+
### `sfx` (efeitos sonoros)
|
|
503
|
+
|
|
504
|
+
| Campo | Padrão | O que faz |
|
|
505
|
+
|---|---|---|
|
|
506
|
+
| `enabled` | true | Liga os efeitos. Sem `sfx` ligado, nenhum som toca (insert, gancho, flash, chamada ou `events`). |
|
|
507
|
+
| `volume` | 0.6 | Volume de todos os efeitos. Com 1.0 um whoosh fica uns 6 dB abaixo da voz. |
|
|
508
|
+
| `events` | nenhum | Sons soltos, cada um num segundo escolhido (veja abaixo). |
|
|
509
|
+
|
|
510
|
+
Efeitos prontos. Todos são CC0 / domínio público ou feitos pelo código do editor, então podem ir
|
|
511
|
+
junto com o produto e não precisam de crédito (`THIRD_PARTY_NOTICES.md`, seção 4; o comprovante de
|
|
512
|
+
cada um fica em `assets/sfx/licencas/` da skill):
|
|
513
|
+
|
|
514
|
+
| Nome | Em português | Som | Duração | Ponto forte | Volume com `volume` 1.0 | Bom para |
|
|
515
|
+
|---|---|---|---|---|---|---|
|
|
516
|
+
| `whoosh` | `swoosh` | Swoosh de ar que sobe e passa | 0,85 s | 0,15 s | -10,0 LUFS | Entrada de imagem (padrão dos inserts), troca de assunto. |
|
|
517
|
+
| `pop` | `bolha` | Pop curto e macio de bolha | 0,25 s | 0 s | -14,0 | Entrada do gancho (padrão), texto que aparece. |
|
|
518
|
+
| `click` | `clique`, `foto` | Clique seco e brilhante, tipo obturador de câmera | 0,3 s | 0,02 s | -14,0 | Flash (padrão), print, foto na tela. |
|
|
519
|
+
| `tick` | `toque` | Toque seco e curto de madeira | 0,07 s | 0 s | -16,7 | Item de lista. |
|
|
520
|
+
| `rise` | `subida` | Subida que cresce, chega no máximo e segue | 2,6 s | 1,23 s | -20,0 (3 s) | Chamada (`cta.sfx`). |
|
|
521
|
+
| `cash` | `caixa`, `dinheiro`, `venda` | Caixa registradora: gaveta e sino ("ching") logo no começo | 1,4 s | 0,07 s | -9,1 | Fala de venda, pix, preço ou oferta. |
|
|
522
|
+
| `coin` | `moeda` | Moeda caindo num copo e tilintando | 0,7 s | 0,02 s | -12,0 | Desconto, bônus, "de graça". |
|
|
523
|
+
| `notification` | `notificação`, `ding` | Ding curto e brilhante de vidro, tipo notificação | 1,2 s | 0,01 s | -14,0 | Venda que caiu, mensagem, pix recebido. |
|
|
524
|
+
| `success` | `sucesso` | Três notas subindo e o acorde soando | 0,93 s | 0,02 s | -14,0 | Deu certo, meta batida, resultado alcançado. |
|
|
525
|
+
| `error` | `erro` | Buzina de "errado": nota curta e outra mais grave | 0,66 s | 0,19 s | -14,0 | "O erro que...", o que não fazer. |
|
|
526
|
+
| `count` | `contagem` | Tique-tique agudo e rápido de contador | 0,64 s | 0 s | -14,0 | Número subindo na tela, valores, placar. |
|
|
527
|
+
| `keyboard` | `teclado`, `digitando` | Rajada de digitação | 1,5 s | 0,11 s | -14,0 | Alguém escrevendo, mensagem, pesquisa. |
|
|
528
|
+
| `snap` | `estalo de dedo`, `estalo` | Estalo de dedo com cauda curta de sala | 0,97 s | 0 s | -14,0 | "Simples assim", algo que aparece do nada. |
|
|
529
|
+
| `mouse_click` | `clique de mouse`, `mouse` | Clique de mouse: aperta e solta | 0,24 s | 0 s | -16,9 | "É só clicar", botão na tela, compra no site. |
|
|
530
|
+
| `bass_drop` | `grave`, `boom` | Grave forte que cai | 1,05 s | 0,02 s | -10,0 | Revelação grande, número importante. |
|
|
531
|
+
| `metal_hit` | `impacto metálico`, `metal` | Pancada de bigorna sobre um grave | 1,45 s | 0,16 s | -20,0 (3 s) | Frase de impacto, título forte. |
|
|
532
|
+
| `synth_hit` | `batida sintética`, `808` | Zap que cai num grave 808 | 1,5 s | 0,34 s | -20,0 (3 s) | Entrada de título, virada, corte seco. |
|
|
533
|
+
| `flash` | `clarão`, `brilho` | Ar subindo, estouro brilhante e baque grave | 1,4 s | 0,28 s | -10,0 | Troca de cena, antes e depois. |
|
|
534
|
+
| `charge` | `carga`, `energia` | Estalo elétrico e apito que sobe e some | 2,4 s | 0 s | -20,0 (3 s) | "Prepare-se", logo antes de mostrar um resultado. |
|
|
535
|
+
| `metal_riser` | `subida metálica`, `tensão` | Prato de trás para frente que cresce e para seco | 1,9 s | 1,65 s | -20,0 (3 s) | Suspense antes de uma revelação. |
|
|
536
|
+
| `wind` | `vento` | Vento grave e suave que passa | 1,3 s | 0,36 s | -12,0 | Passagem de tempo, troca de lugar, respiro. |
|
|
537
|
+
| `rewind` | `rebobinar`, `voltar no tempo` | Fita que acelera, sobe de tom e para | 1,5 s | 1,15 s | -20,0 (3 s) | "Voltando no tempo", "lá atrás". |
|
|
538
|
+
| `gears` | `engrenagens`, `mecanismo` | Catraca girando e um baque grave no meio | 1,18 s | 0,36 s | -14,0 | Método, processo, sistema funcionando. |
|
|
539
|
+
| `data` | `dados`, `processando` | Bipes agudos e rápidos de computador | 2,0 s | 0,03 s | -20,0 (3 s) | IA, dados, sistema trabalhando. |
|
|
540
|
+
|
|
541
|
+
- **Escolha pelo sentido da fala**, não por enfeite: `notification` quando falam de venda ou
|
|
542
|
+
mensagem, `error` em "o erro que...", `count` quando aparece um número, `bass_drop` na revelação
|
|
543
|
+
grande, `rewind` em "lá atrás". No `name` vale o nome em inglês ou o nome em português da tabela
|
|
544
|
+
(com ou sem acento, com espaço ou `_`, maiúscula ou minúscula: `"grave"`, `"estalo de dedo"`,
|
|
545
|
+
`"notificacao"`). Os outros apelidos de cada um estão em `assets/sfx/sfx.json` (`label` e
|
|
546
|
+
`aliases`).
|
|
547
|
+
- **Ponto forte** é o momento em que o som chega na força total: o ching da caixa, o primeiro toque
|
|
548
|
+
da moeda, o meio do swoosh, o topo da subida. O compose põe o ponto forte no quadro do evento
|
|
549
|
+
(entrada do gancho, entrada da imagem, flash, entrada da chamada, `at` de `sfx.events`), então o
|
|
550
|
+
som começa um pouco antes. Ex.: a `rise` na chamada começa 1,23 s antes e chega no máximo quando a
|
|
551
|
+
chamada aparece.
|
|
552
|
+
- Se o evento está tão perto do começo do vídeo que o som teria que começar antes dele, o som começa
|
|
553
|
+
no 0 e o ponto forte chega atrasado. Quando isso passa de um quadro sai um `aviso:` (veja
|
|
554
|
+
"Problemas comuns").
|
|
555
|
+
- **Volume** é medido na janela de 200 ms mais forte de cada som, numa voz em -14 LUFS: marcas curtas
|
|
556
|
+
em -14, o `wind` em -12, impactos em -10. Nenhum som passa de -20 LUFS na janela de 3 s (6 dB abaixo
|
|
557
|
+
da voz), então os sons longos, marcados "(3 s)", são acertados por essa janela: na de 200 ms eles
|
|
558
|
+
ficam entre -16 e -11 (`rise` -13,8, `metal_hit` -10,8, `synth_hit` -11,8, `charge` -11,1,
|
|
559
|
+
`metal_riser` -11,9, `rewind` -12,5, `data` -16,0). O `mouse_click` para no teto de pico antes de
|
|
560
|
+
chegar em -14. Com o padrão 0.6 tudo fica 4,4 dB mais baixo. Os números de cada arquivo estão em
|
|
561
|
+
`assets/sfx/sfx.json` da skill, e `helpers/make_sfx.py --measure` mede de novo.
|
|
562
|
+
- `count` e `data` são bem agudos (perto de 12 kHz): soam mais baixos do que o número diz e somem em
|
|
563
|
+
caixinha de celular ruim. Se ficarem fracos, use `"volume": 1.5` no item. Os graves (`bass_drop`,
|
|
564
|
+
quase todo o `wind` e o fundo de `metal_hit`, `synth_hit` e `flash`) quase não aparecem em caixinha
|
|
565
|
+
de celular (no fone de ouvido, sim).
|
|
566
|
+
- **Arquivo próprio** (`"assets/meu_som.wav"`; wav, mp3, m4a, aac, ogg ou flac) toca como antes: o
|
|
567
|
+
começo do arquivo cai no quadro do evento, sem ajuste de volume.
|
|
568
|
+
- Os efeitos feitos por código ficam em `assets/sfx/sinteticos/` da skill. Nove da tabela já são de
|
|
569
|
+
lá (`tick`, `error`, `bass_drop`, `synth_hit`, `flash`, `charge`, `wind`, `rewind`, `data`). Os
|
|
570
|
+
outros seis de lá (versões por código de `whoosh`, `pop`, `click`, `rise`, `cash` e `coin`) servem
|
|
571
|
+
como arquivo: copie para `<EDIT>/assets/` e use o caminho (ex.: `"assets/cash.wav"`).
|
|
572
|
+
|
|
573
|
+
#### `sfx.events` (som num segundo escolhido)
|
|
574
|
+
|
|
575
|
+
Para um som que não está preso a gancho, insert, flash ou chamada:
|
|
576
|
+
|
|
577
|
+
```json
|
|
578
|
+
"sfx": {"enabled": true, "volume": 0.6, "events": [
|
|
579
|
+
{"at": 5.07, "name": "cash"},
|
|
580
|
+
{"at": 12.4, "name": "coin", "volume": 0.8}
|
|
581
|
+
]}
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
| Campo | Padrão | O que faz |
|
|
585
|
+
|---|---|---|
|
|
586
|
+
| `at` | obrigatório | Segundo no corte (número com ponto, 0 ou mais). O ponto forte do som cai no quadro mais perto desse segundo. |
|
|
587
|
+
| `name` | obrigatório | Efeito pronto ou arquivo, igual ao `sfx` dos inserts. |
|
|
588
|
+
| `volume` | 1.0 | Multiplica o `sfx.volume` só neste som (de 0.0 a 2.0; acima de 2.0 fica em 2.0, com aviso). |
|
|
589
|
+
| `anchor_s` | o do efeito | Em que segundo do som fica o ponto forte. Efeito pronto já tem o seu (tabela acima); arquivo próprio usa 0 (o começo do arquivo cai no `at`). Com `anchor_s`, o som começa esse tanto antes do `at`. `0` num efeito pronto faz ele começar no `at`. |
|
|
590
|
+
|
|
591
|
+
- Para cair em cima da palavra, use o `start` dela no `captions.json`. No `cash` o ponto forte é o
|
|
592
|
+
sino (ching): é ele que cai nesse quadro.
|
|
593
|
+
- Arquivo próprio com o ponto forte no meio (ex.: um swoosh seu com o pico em 0,3 s):
|
|
594
|
+
`{"at": 9.2, "name": "assets/meu_swoosh.wav", "anchor_s": 0.3}`.
|
|
595
|
+
- Som que os 24 prontos não têm (virar página, porta, chuva): dá para gerar um com
|
|
596
|
+
`helpers/gen_sfx.py` (opcional e pago, na conta da pessoa; veja "Trilha" mais abaixo). Ele sai em
|
|
597
|
+
`assets/sfx_<nome>.mp3` e entra pelo caminho: `{"at": 7.3, "name": "assets/sfx_papel.mp3"}`.
|
|
598
|
+
- No máximo 2 ou 3 por vídeo, nos momentos mais fortes. Som em toda frase cansa.
|
|
599
|
+
- Sons com ponto forte no fim (`rise`, `metal_riser`, `rewind`) começam bem antes do `at`: deixe pelo
|
|
600
|
+
menos 1,7 s de vídeo antes do `at`.
|
|
601
|
+
- O `cash` soa um pouco mais forte que o `whoosh` (veja os volumes acima). Se ele brigar com a fala,
|
|
602
|
+
use `"volume": 0.7` nele.
|
|
603
|
+
- `at` no fim do vídeo ou depois é ignorado com aviso. Som que começa perto do fim toca cortado; se
|
|
604
|
+
perder mais de 10% do som, sai o aviso `é cortado pelo fim do vídeo`. Deixe pelo menos 1 s depois do
|
|
605
|
+
`at` para o `cash` e a `rise`.
|
|
606
|
+
- Cada som que tocou aparece em `verify/final_report.json`, em `layers`, com `"type": "sfx"` e
|
|
607
|
+
`"why": "efeito"`. `sample` é onde o som começa; `anchor_s` mostra o ponto forte usado e `late_s`
|
|
608
|
+
aparece quando o som teve que começar no 0.
|
|
609
|
+
|
|
610
|
+
#### Biblioteca de efeitos (`helpers/efeitos.py`)
|
|
611
|
+
|
|
612
|
+
Fica fora da skill (`~/.editor-video/efeitos`, ou a pasta em `EDITOR_VIDEO_EFEITOS`), com cada som cortado,
|
|
613
|
+
no nível do kit e com a licença anotada em `efeitos.json`. No `name` de `sfx.events` (e no `sfx` de insert):
|
|
614
|
+
|
|
615
|
+
| Nome | O que toca |
|
|
616
|
+
|---|---|
|
|
617
|
+
| `transicao`, `impacto`, `revelacao`, `interface`, `tecnologia`, `sucesso`, `erro`, `humor` | Uma versão da categoria por evento, numa ordem fixa por edição (a mesma categoria 5 vezes = 5 sons diferentes). |
|
|
618
|
+
| `categoria:tipo` (ex.: `impacto:boom`) | Só as versões cujo nome de origem tem o tipo: `boom`, `punch`, `metal`, `glass`, `plate`, `explosion` (impacto); `swish`, `swipe`, `whoosh`, `door`, `fireball` (transição); `riser`, `swell`, `magic` (revelação); `boing`, `cartoon`, `karate`, `stretching`, `boom808`, `whistle`, `scratch` (humor); `laser`, `glitch`, `zap`, `8-bit`, `forcefield` (tecnologia); `powerup`, `confirmation` (sucesso). |
|
|
619
|
+
| `humor-077` | Aquele som exato. |
|
|
620
|
+
|
|
621
|
+
Uma categoria ganha de apelido de efeito pronto com o mesmo nome (`impacto` é da biblioteca, não o
|
|
622
|
+
`metal_hit`). Comandos: `efeitos.py listar [--categoria C]`, `amostra --categoria C` (mp3 com todos e a lista
|
|
623
|
+
de tempos em `_amostras/`), `remover ID`, `restaurar ID`, `importar PASTA --origem kenney|sse|sintetico|arquivos`
|
|
624
|
+
e `efeitos_gerar.py PASTA` (whoosh, swipe, riser, swell, boom, boom808 e glitch feitos por código).
|
|
625
|
+
|
|
626
|
+
### `music` (trilha)
|
|
627
|
+
|
|
628
|
+
| Campo | Padrão | O que faz |
|
|
629
|
+
|---|---|---|
|
|
630
|
+
| `enabled` | true | Liga a trilha. |
|
|
631
|
+
| `file` | `file` ou `mood` | Ex.: `"assets/trilha_1.mp3"` (arquivo da pessoa ou feito com `gen_music.py`). Repete se for curta. Se vierem `file` e `mood`, vale o `file`. |
|
|
632
|
+
| `mood` | `file` ou `mood` | Um humor da biblioteca de trilhas da pessoa (`"triste"`, `"animada"`, `"Épica"`...). O compose escolhe a música (abaixo). |
|
|
633
|
+
| `track` | nenhum | Só com `mood`: o id de uma trilha certa da biblioteca (ex.: `"triste-2"`). |
|
|
634
|
+
| `volume_db` | -15 | Relativo à voz medida. Com fala o tempo todo, -15 fica uns 19 dB abaixo da voz (dá para ouvir sem brigar). -12 fica mais presente, -18 mais baixa, -22 quase some. |
|
|
635
|
+
| `duck` | true | Abaixa a trilha enquanto a pessoa fala (cerca de 4 dB a mais com fala contínua). |
|
|
636
|
+
| `fade_out` | 1.5 | Segundos de saída suave no fim. |
|
|
637
|
+
|
|
638
|
+
**Como o `mood` escolhe a música.** A biblioteca fica fora da skill (`~/.editor-video/trilhas` no Mac,
|
|
639
|
+
`%USERPROFILE%\.editor-video\trilhas` no Windows), com uma pasta por humor e o índice `trilhas.json`.
|
|
640
|
+
- Vale a favorita do humor. Sem favorita, vale a que cobre o corte sem repetir, tem menos energia na
|
|
641
|
+
faixa da voz (300 a 3400 Hz) e já começa cheia.
|
|
642
|
+
- A música escolhida é copiada para `<EDIT>/assets/trilha_<humor>.<ext>` (nunca por cima de um arquivo
|
|
643
|
+
da pessoa com o mesmo nome) e a escolha fica em `assets/trilhas_escolhidas.json`. As próximas
|
|
644
|
+
montagens desta edição usam a mesma música, mesmo que a biblioteca mude ou suma. Para trocar:
|
|
645
|
+
`trilhas.py escolher --humor triste --edit-dir '<EDIT>' --trocar` (ou `"track"`).
|
|
646
|
+
- O `edit_data.json` não é reescrito. O `verify/final_report.json` mostra em `music` o `file` usado,
|
|
647
|
+
`mood`, `track_id`, `title`, `why` (por que ela), `chosen_from` (`biblioteca` ou `escolha anterior`),
|
|
648
|
+
`source` e `license`. O compose imprime `trilha do humor triste: triste-2 "Piano" em assets/...`.
|
|
649
|
+
- Sem `mood`, a trilha sai exatamente como com um `file` comum.
|
|
650
|
+
|
|
651
|
+
Os números do volume: medidos em 16/09/2026 em dois cortes reais com fala contínua, com uma trilha
|
|
652
|
+
pop e uma de piano. O duck tira cerca de 4 dB durante a fala, então `volume_db` -22 deixava a trilha
|
|
653
|
+
uns 26 dB abaixo da voz (quase inaudível) e -15 deixa uns 19 dB abaixo. O -15 foi aprovado de ouvido
|
|
654
|
+
num anúncio real.
|
|
655
|
+
|
|
656
|
+
### `audio` (limpeza de ruído da voz)
|
|
657
|
+
|
|
658
|
+
| Campo | Padrão | O que faz |
|
|
659
|
+
|---|---|---|
|
|
660
|
+
| `denoise` | `"off"` | Tira o ruído de fundo da voz: `"off"` (desligado), `"leve"` ou `"forte"`. |
|
|
661
|
+
|
|
662
|
+
```json
|
|
663
|
+
"audio": {"denoise": "leve"}
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
- **Leve:** tira chiado, zumbido e ruído de ambiente sem mexer na voz. Em fala já limpa quase não
|
|
667
|
+
muda nada. Comece por ele.
|
|
668
|
+
- **Forte:** para barulho alto e constante (rua, ventilador, ar-condicionado). Tira mais, mas pode
|
|
669
|
+
deixar um leve "chiado de água" no fundo. Ouça o final antes de entregar.
|
|
670
|
+
- Não resolve eco de sala, cachorro, pássaro ou vozes ao fundo. Vento forte some só em parte.
|
|
671
|
+
- **Quando usar:** o `noise_check.py` da Fase 1 diz `ruído leve` (ofereça Leve) ou `ruído forte`
|
|
672
|
+
(ofereça Forte). Com `limpo, não precisa`, deixe desligado, a não ser que a pessoa peça.
|
|
673
|
+
- **Como funciona:** o compose aprende o ruído de cada vídeo bruto nas pausas dele
|
|
674
|
+
(`regions/<nome>.json`), limpa cada trecho do corte com o ruído do vídeo de onde ele veio e põe a
|
|
675
|
+
voz limpa exatamente nas mesmas amostras do `cut.mp4`. Duração, sincronia e volume final (-14 LUFS)
|
|
676
|
+
não mudam. O `cut.mp4` e a aprovação dele também não mudam: dá para ligar ou trocar a limpeza sem
|
|
677
|
+
aprovar o corte de novo.
|
|
678
|
+
- **Pouca pausa:** vídeo com menos de 0,3 s de pausa usa as partes mais quietas para medir o ruído e
|
|
679
|
+
o Forte vira Leve, com um aviso. Vídeo sem nenhuma parte quieta fica sem limpeza (aviso).
|
|
680
|
+
- **Sem os vídeos brutos** (pasta movida, arquivo apagado) ou corte mudado depois do timeline: o
|
|
681
|
+
compose limpa o próprio som do corte, sempre em Leve, com um aviso. Funciona, mas limpa menos.
|
|
682
|
+
- O resultado fica em `verify/final_report.json`, na chave `denoise` (`noise_floor_before_db` e
|
|
683
|
+
`noise_floor_after_db`: o nível dos momentos mais quietos, antes e depois), e numa linha do compose:
|
|
684
|
+
`ruído de fundo: forte (fundo de -50 dB para -60 dB)`. Em fala sem pausa esse número muda pouco
|
|
685
|
+
(os momentos mais quietos ainda têm voz), mesmo com o chiado bem mais baixo.
|
|
686
|
+
|
|
687
|
+
### `loudness`
|
|
688
|
+
|
|
689
|
+
`{"i": -14, "tp": -1.0}` (padrão). Não mude para Reels e TikTok.
|
|
690
|
+
|
|
691
|
+
## Da tela de estilo para o `edit_data.json`
|
|
692
|
+
|
|
693
|
+
A linha `[preview] estilo salvo` (ou o `preview_style.json`) traz as escolhas. Assim cada uma
|
|
694
|
+
vira campo:
|
|
695
|
+
|
|
696
|
+
| Escolha | Campo |
|
|
697
|
+
|---|---|
|
|
698
|
+
| `edit_type: clean` | Sem `split_top`/`split_bottom`. `full` ou `pip` só se a pessoa pedir. |
|
|
699
|
+
| `edit_type: split_top` | Inserts `split_top` nos trechos de PROVA, VIRADA ou PASSO. |
|
|
700
|
+
| `edit_type: split_bottom` | Inserts `split_bottom` nesses trechos. |
|
|
701
|
+
| `edit_type: tela_verde` (linha `tela_verde (canto direito: tela_verde.posicao "direita"; ...)`) | `"edit_type": "tela_verde"` e `tela_verde.posicao` com o valor da linha (`tela_verde_posicao` no `preview_style.json`). Mantenha os inserts já planejados: `split_top`/`split_bottom` vão para o fundo sozinhos. Faltando imagens, planeje inserts `split_top` como na tela dividida e pergunte de onde vêm (seção `tela_verde`). Sem `split_*` junto de outro tipo. |
|
|
702
|
+
| `caption_style` | `captions.style` (e `captions.py --style` com o mesmo id). |
|
|
703
|
+
| `hook_style`, `hook_text` | `hook.style`, `hook.text`. Texto vazio: escreva um e confirme. |
|
|
704
|
+
| `accent` | `accent`. |
|
|
705
|
+
| `cta_text` | `cta.text`. |
|
|
706
|
+
| `elements.zoom_cuts` | `camera.zoom_cuts`. |
|
|
707
|
+
| `elements.push_in` | `camera.push_in`. |
|
|
708
|
+
| `elements.flash` | Itens em `transitions` na entrada dos inserts `full` e das trocas mais fortes (no máximo 3). |
|
|
709
|
+
| `elements.motion` (linha `animações: …`) | `ligadas, poucas (motion.quantidade 3), visual papelaria (motion.tema "papelaria")`: escreva `"motion": {"tema": ..., "quantidade": ..., "items": [...]}` com os números da linha, rode o `motion_sugerir.py` e ponha em `items` o que a pessoa aprovar (seção `motion`). `desligadas`: sem `motion` (ou `"motion": {"enabled": false, "items": [...]}` para guardar os itens). |
|
|
710
|
+
| `elements.sfx` | `sfx.enabled`. Em `sfx.events`, som pelo sentido da fala: venda ou pix `cash` ou `notification`, erro `error`, número `count`, revelação `bass_drop` (tabela de efeitos). |
|
|
711
|
+
| `music_mood` (linha `trilha: …`) | Um humor (`trilha: triste`): `"music": {"enabled": true, "mood": "triste"}`. `arquivo` (`trilha: arquivo da pasta (assets/x.mp3)`): `"file"` com o `music_file`. `off` (`trilha: sem`): `"music": {"enabled": false}`. |
|
|
712
|
+
| `elements.music` | Só quando não veio `music_mood`: `music.enabled`. Pergunte de onde vem a trilha: da biblioteca (humor), arquivo dela, gerada na conta dela ou nenhuma (seção "Trilha"). |
|
|
713
|
+
| `elements.cta` | `cta.enabled`. |
|
|
714
|
+
| `elements.disclaimer` | `disclaimer.enabled`. |
|
|
715
|
+
| `denoise` (linha `ruído: …`) | `audio.denoise` com o mesmo valor (`off`, `leve` ou `forte`). Sem `denoise` no arquivo, siga o que foi combinado no chat. |
|
|
716
|
+
| `note` | Leia e aplique. Na dúvida, pergunte. |
|
|
717
|
+
|
|
718
|
+
## Estilos de legenda (`captions.style`)
|
|
719
|
+
|
|
720
|
+
| Id | Visual | Quando usar |
|
|
721
|
+
|---|---|---|
|
|
722
|
+
| `impacto` | Letra alta e condensada com contorno preto; a palavra falada acende na cor de destaque; entra com um pulinho. | Padrão. Anúncio direto, qualquer fundo. |
|
|
723
|
+
| `caixa_viva` | Letra reta e forte; uma caixa colorida corre de palavra em palavra. | Tutorial, fala rápida, fundo claro. |
|
|
724
|
+
| `palavra_gigante` | Uma palavra por vez, enorme, com sombra 3D colorida. | Vídeo curto e acelerado, gancho com energia. Cansa em vídeo longo. |
|
|
725
|
+
| `pulso` | Letra redonda e grossa; a palavra falada cresce e ganha cor. | UGC e depoimento, tom leve. |
|
|
726
|
+
| `fita` | Frase numa fita preta inclinada que abre da esquerda. | Fundo muito poluído ou colorido. |
|
|
727
|
+
| `legenda_limpa` | Legenda de TV em até 2 linhas sobre fundo escuro, sem animação. | Conteúdo sério, aula, público mais velho. |
|
|
728
|
+
|
|
729
|
+
## Estilos de gancho (`hook.style`)
|
|
730
|
+
|
|
731
|
+
| Id | Visual | Quando usar |
|
|
732
|
+
|---|---|---|
|
|
733
|
+
| `manchete` | Título grande e condensado com contorno; segunda linha na cor de destaque. | Padrão. Combina com `impacto`. |
|
|
734
|
+
| `tarja` | Cada linha numa tarja sólida (branca e colorida), levemente inclinada. | Chama muita atenção, bom para oferta. |
|
|
735
|
+
| `balao` | Balão branco de conversa com texto escuro. | Pergunta que o público faria. |
|
|
736
|
+
| `marcador` | Letra de pincel sobre marca-texto colorido. | Tom pessoal, feito à mão. |
|
|
737
|
+
| `vidro` | Painel escuro translúcido com detalhe colorido. | Visual limpo e premium. |
|
|
738
|
+
|
|
739
|
+
Para testar um texto antes do render:
|
|
740
|
+
`uv run --directory "<SKILL>" python helpers/text_render.py hook "Seu *gancho* aqui" --style manchete --bg "<EDIT>/verify/quadro.png" -o "<EDIT>/verify/gancho.png"`
|
|
741
|
+
(o fundo `--bg` é opcional; o comando avisa quando o texto está longo demais).
|
|
742
|
+
|
|
743
|
+
## Quando colocar inserts
|
|
744
|
+
|
|
745
|
+
- **Onde:** nos trechos em que a fala cita algo que dá para mostrar ("essa bolsa", "o painel",
|
|
746
|
+
"o site"). Veja os `beat` e `quote` em `cut_timeline.json` e, para o tempo exato de uma
|
|
747
|
+
palavra, o `start` das legendas em `captions.json`.
|
|
748
|
+
- **Encaixe no tempo:** comece e termine num corte (`out_start`/`out_end` do `cut_timeline.json`)
|
|
749
|
+
ou no início de uma legenda. Um `full` que começa pouco antes de um corte e termina depois
|
|
750
|
+
esconde o pulo desse corte.
|
|
751
|
+
- **Duração:** de 2,5 a 6 s por imagem. `full` até 2,5 s. Vídeo até o tamanho do clipe.
|
|
752
|
+
- **Não cubra:** o gancho (comece depois de `hook.end`) nem a chamada (termine antes dos últimos
|
|
753
|
+
`cta.duration` segundos).
|
|
754
|
+
- **Respiro:** pelo menos 1 s entre dois inserts. A pessoa deve aparecer inteira na maior parte do
|
|
755
|
+
vídeo; em anúncio, o rosto vende.
|
|
756
|
+
- **Rosto livre:** confira na folha de quadros. `pip` no canto oposto ao rosto. Se a tela dividida
|
|
757
|
+
cortar a cabeça, troque `split_top` por `split_bottom`.
|
|
758
|
+
- **Tela verde:** os mesmos trechos e a mesma lista; as imagens entram no fundo, atrás da pessoa.
|
|
759
|
+
- **Imagem boa:** sem marca d'água, texto, logo de terceiro ou pessoa famosa. Horizontal para split
|
|
760
|
+
e pip, vertical para `full`.
|
|
761
|
+
- **Cobrir um trecho da tela:** um `full` com imagem neutra por cima esconde a imagem do trecho (a voz
|
|
762
|
+
continua). Só faça com o ok da pessoa.
|
|
763
|
+
- **Dado pessoal** (nome, telefone, e-mail, documento de outra pessoa) não passa sem borrão: borre a
|
|
764
|
+
imagem antes de usar como insert; se estiver no próprio vídeo, cubra o trecho com um `full` ou corte.
|
|
765
|
+
|
|
766
|
+
## Flash
|
|
767
|
+
|
|
768
|
+
- Use no começo de um `full` ou numa virada forte de assunto. No máximo 2 ou 3 por vídeo.
|
|
769
|
+
- Não ponha flash em todo corte: o zoom nos cortes já marca o ritmo.
|
|
770
|
+
- Mesmo tempo do insert: `"at"` igual ao `start` dele.
|
|
771
|
+
|
|
772
|
+
## Trilha
|
|
773
|
+
|
|
774
|
+
- Só com arquivo que a pessoa tem direito de usar: dela, com licença comercial, ou gerado na conta
|
|
775
|
+
ElevenLabs dela. Arquivo dela: copie para `<EDIT>/assets/`. Música da biblioteca do próprio
|
|
776
|
+
Gerenciador de Anúncios é outro caminho: nesse caso deixe `music` desligado aqui.
|
|
777
|
+
- Sem letra por baixo da fala. Animada para UGC e oferta, calma para depoimento e aula.
|
|
778
|
+
- Comece com `volume_db` -15 e `duck` ligado. Se a pessoa pedir mais presença, -12; mais baixa, -18.
|
|
779
|
+
|
|
780
|
+
**Biblioteca de trilhas por humor** (`helpers/trilhas.py`). A pessoa guarda músicas prontas por
|
|
781
|
+
clima e, na edição, só diz "trilha triste" ou escolhe o humor na aba Estilo:
|
|
782
|
+
|
|
783
|
+
| Humor | Nome | Quando usar no anúncio |
|
|
784
|
+
|---|---|---|
|
|
785
|
+
| `animada` | Animada | energia, oferta, novidade |
|
|
786
|
+
| `inspiradora` | Inspiradora | conquista, virada de vida, motivação |
|
|
787
|
+
| `triste` | Triste | dor, problema, desabafo |
|
|
788
|
+
| `tensa` | Tensa | segredo, alerta, erro que as pessoas cometem |
|
|
789
|
+
| `calma` | Calma | explicação, tutorial, confiança |
|
|
790
|
+
| `epica` | Épica | revelação, resultado, grande virada |
|
|
791
|
+
| `divertida` | Divertida | humor, bastidor, conteúdo leve |
|
|
792
|
+
| `luxo` | Luxo | produto premium, sofisticação |
|
|
793
|
+
|
|
794
|
+
Pelo trecho mais forte: PROBLEMA triste ou tensa, VIRADA inspiradora ou épica, PROVA e RESULTADO
|
|
795
|
+
épica ou calma, PASSO calma, CHAMADA animada ou inspiradora.
|
|
796
|
+
|
|
797
|
+
```
|
|
798
|
+
uv run --directory '<SKILL>' python helpers/trilhas.py humores
|
|
799
|
+
uv run --directory '<SKILL>' python helpers/trilhas.py listar
|
|
800
|
+
uv run --directory '<SKILL>' python helpers/trilhas.py adicionar '/caminho/musica.mp3' --humor animada --titulo 'Pop da oferta' --favorita
|
|
801
|
+
uv run --directory '<SKILL>' python helpers/trilhas.py escolher --humor animada --edit-dir '<EDIT>'
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
- `adicionar` copia o arquivo (mp3, m4a, aac, ogg e opus vão como estão; wav, flac, aiff e o som de
|
|
805
|
+
um vídeo viram WAV 48 kHz estéreo) e anota duração, volume (LUFS), energia ("cheia desde o
|
|
806
|
+
início" ou "começa baixa e cresce aos N s"), a parte da energia na faixa da voz, origem, regra de
|
|
807
|
+
uso, pedido (se veio de IA), data e favorita. `--fonte` e `--licenca` dizem de onde veio e como pode
|
|
808
|
+
usar. Humor com outro nome cria um humor da pessoa.
|
|
809
|
+
- `escolher` faz o mesmo que o compose com `mood` e imprime qual entrou e por quê. `--trocar` pega
|
|
810
|
+
outra, `--trilha ID` pega uma certa, `--duracao S` troca a duração do corte.
|
|
811
|
+
- `favorita ID` (`--tirar` desmarca), `remover ID` (vai para `_lixeira`, nada é apagado),
|
|
812
|
+
`restaurar ID`, `onde`. Uma música que está na lixeira não entra de novo: a mensagem traz o
|
|
813
|
+
`restaurar`.
|
|
814
|
+
- Uma trilha gerada (em `assets/` com `credits.json`, ou esperando em `_recebidas`) entra com a
|
|
815
|
+
origem, o pedido e a regra de uso anotados, sem precisar de `--fonte` nem `--licenca`.
|
|
816
|
+
|
|
817
|
+
**Gerar com `gen_music.py`** (opcional e pago, com a chave e o plano da própria pessoa; para anúncio,
|
|
818
|
+
só com plano pago da ElevenLabs: pessoa física do Starter para cima, empresa no Scale, Business ou
|
|
819
|
+
Enterprise; vale para internet, não para TV, rádio ou cinema; o arquivo não pode ser repassado nem
|
|
820
|
+
vendido):
|
|
821
|
+
|
|
822
|
+
```
|
|
823
|
+
uv run --directory '<SKILL>' python helpers/gen_music.py 'upbeat modern pop instrumental, 110-120 bpm, positive and confident, light drums, no vocals, leaves room for voice' --edit-dir '<EDIT>' --dry-run
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
- Pedido em inglês: instrumental, gênero, clima, faixa de bpm, `no vocals`, `leaves room for voice`.
|
|
827
|
+
Para depoimento ou aula: `calm warm acoustic instrumental, 80-90 bpm, soft piano and guitar,
|
|
828
|
+
hopeful, no vocals, leaves room for voice`.
|
|
829
|
+
- Nada de artista, banda, compositor, música, álbum, gravadora, filme, marca ou trecho de letra no
|
|
830
|
+
pedido: o helper recusa os nomes mais conhecidos antes de gastar e a ElevenLabs recusa o resto.
|
|
831
|
+
- O `--dry-run` mostra a duração (a do corte arredondada para cima + 2 s), o arquivo e o custo em
|
|
832
|
+
créditos. Conte o custo, peça o ok e rode de novo sem `--dry-run`. `--variations 2` faz duas
|
|
833
|
+
versões para a pessoa escolher (cada uma é cobrada). A trilha sai instrumental por padrão.
|
|
834
|
+
- O arquivo fica em `assets/trilha_1.mp3` (a próxima vira `trilha_2.mp3`), com a origem anotada em
|
|
835
|
+
`assets/credits.json`. Com 2 s a mais que o corte, a trilha nunca recomeça antes do fim: o compose
|
|
836
|
+
corta a sobra e faz o `fade_out`.
|
|
837
|
+
- Use igual a um arquivo da pessoa:
|
|
838
|
+
`"music": {"enabled": true, "file": "assets/trilha_1.mp3", "volume_db": -15, "duck": true, "fade_out": 1.5}`
|
|
839
|
+
- **Por humor:** `gen_music.py --humor triste --edit-dir '<EDIT>' --dry-run` usa o pedido pronto do humor
|
|
840
|
+
(palavras a mais vão antes das opções). `--biblioteca` guarda cada versão na biblioteca, no humor,
|
|
841
|
+
com a origem e o pedido anotados. Sem `--edit-dir`, a trilha tem 60 s e vai só para a biblioteca;
|
|
842
|
+
com `--edit-dir`, tem pelo menos 60 s e também fica em `assets/`. A trilha gerada é só da pessoa:
|
|
843
|
+
não repasse nem junte em pacote.
|
|
844
|
+
|
|
845
|
+
## Exemplos por tipo
|
|
846
|
+
|
|
847
|
+
**Limpa** (só a pessoa, legenda, gancho, zoom e chamada):
|
|
848
|
+
|
|
849
|
+
```json
|
|
850
|
+
{
|
|
851
|
+
"version": 1, "base": "cut.mp4", "timeline": "cut_timeline.json", "accent": "#FFC400",
|
|
852
|
+
"camera": {"zoom_cuts": true, "zoom_levels": [1.0, 1.12]},
|
|
853
|
+
"hook": {"enabled": true, "style": "manchete", "text": "O erro que *trava suas vendas*", "start": 0, "end": 2.6},
|
|
854
|
+
"captions": {"enabled": true, "style": "impacto", "file": "captions.json", "hide_during_hook": true},
|
|
855
|
+
"cta": {"enabled": true, "text": "Toque em Saiba Mais", "sub": "Aula gratuita", "start": null, "duration": 3},
|
|
856
|
+
"sfx": {"enabled": true, "volume": 0.6}
|
|
857
|
+
}
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
**Tela dividida com imagem em cima** (provas com foto, flash no `full`):
|
|
861
|
+
|
|
862
|
+
```json
|
|
863
|
+
{
|
|
864
|
+
"version": 1, "base": "cut.mp4", "timeline": "cut_timeline.json", "accent": "#FF3B30",
|
|
865
|
+
"camera": {"zoom_cuts": true, "zoom_levels": [1.0, 1.14], "push_in": true, "push_in_amount": 0.04},
|
|
866
|
+
"hook": {"enabled": true, "style": "tarja", "text": "Olha o que eu *achei pra revender*", "start": 0, "end": 2.8},
|
|
867
|
+
"captions": {"enabled": true, "style": "caixa_viva", "file": "captions.json", "hide_during_hook": true},
|
|
868
|
+
"inserts": [
|
|
869
|
+
{"type": "split_top", "src": "assets/bolsa1.jpg", "start": 4.2, "end": 8.9},
|
|
870
|
+
{"type": "split_top", "src": "assets/bolsa2.jpg", "start": 12.1, "end": 16.0},
|
|
871
|
+
{"type": "full", "src": "assets/vitrine.jpg", "start": 19.4, "end": 21.4}
|
|
872
|
+
],
|
|
873
|
+
"transitions": [{"at": 19.4, "type": "flash"}],
|
|
874
|
+
"cta": {"enabled": true, "text": "Clique no botão abaixo", "sub": "Acesso na hora", "start": null, "duration": 3},
|
|
875
|
+
"sfx": {"enabled": true, "volume": 0.6}
|
|
876
|
+
}
|
|
877
|
+
```
|
|
878
|
+
|
|
879
|
+
**Tela verde** (comentando uma página, pessoa no canto direito, legenda acima dela; as imagens são inserts
|
|
880
|
+
`split_top` e vão para o fundo, sem tela dividida):
|
|
881
|
+
|
|
882
|
+
```json
|
|
883
|
+
{
|
|
884
|
+
"version": 1, "base": "cut.mp4", "timeline": "cut_timeline.json", "accent": "#FFC400",
|
|
885
|
+
"edit_type": "tela_verde",
|
|
886
|
+
"tela_verde": {"posicao": "direita"},
|
|
887
|
+
"inserts": [
|
|
888
|
+
{"type": "split_top", "src": "assets/print_pagina.png", "start": 2.6, "end": 12.0},
|
|
889
|
+
{"type": "split_top", "src": "assets/produto.mp4", "start": 12.0, "end": 18.5}
|
|
890
|
+
],
|
|
891
|
+
"camera": {"zoom_cuts": true, "zoom_levels": [1.0, 1.12]},
|
|
892
|
+
"hook": {"enabled": true, "style": "manchete", "text": "Olha essa *página*", "start": 0, "end": 2.6},
|
|
893
|
+
"captions": {"enabled": true, "style": "impacto", "file": "captions.json", "hide_during_hook": true},
|
|
894
|
+
"cta": {"enabled": true, "text": "Toque em Saiba Mais", "start": null, "duration": 3},
|
|
895
|
+
"sfx": {"enabled": true, "volume": 0.6}
|
|
896
|
+
}
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
**Imagem embaixo, cartão e trilha** (tutorial com print no cartão):
|
|
900
|
+
|
|
901
|
+
```json
|
|
902
|
+
{
|
|
903
|
+
"version": 1, "base": "cut.mp4", "timeline": "cut_timeline.json", "accent": "#00C2FF",
|
|
904
|
+
"camera": {"zoom_cuts": true, "zoom_levels": [1.0, 1.1]},
|
|
905
|
+
"hook": {"enabled": true, "style": "vidro", "text": "Como eu organizo *meus pedidos*", "start": 0, "end": 3.0},
|
|
906
|
+
"captions": {"enabled": true, "style": "pulso", "file": "captions.json", "hide_during_hook": true},
|
|
907
|
+
"inserts": [
|
|
908
|
+
{"type": "split_bottom", "src": "assets/planilha.png", "start": 6.0, "end": 11.5, "split": 0.5},
|
|
909
|
+
{"type": "pip", "src": "assets/tela_app.mp4", "start": 14.0, "end": 18.0, "corner": "top_left"}
|
|
910
|
+
],
|
|
911
|
+
"cta": {"enabled": true, "text": "Veja como funciona", "start": null, "duration": 2.5, "sfx": "rise"},
|
|
912
|
+
"sfx": {"enabled": true, "volume": 0.5},
|
|
913
|
+
"music": {"enabled": true, "mood": "calma", "volume_db": -15, "duck": true, "fade_out": 1.5}
|
|
914
|
+
}
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
## Conferir antes de entregar
|
|
918
|
+
|
|
919
|
+
1. `compose_final.py ... --preview` e uma folha de quadros com `contact_sheet.py --times` em:
|
|
920
|
+
0.3, o meio do gancho, a entrada e o meio de cada insert, um trecho só com legenda e o último
|
|
921
|
+
segundo. Olhe a imagem.
|
|
922
|
+
2. Leia as linhas `aviso:` do compose.
|
|
923
|
+
3. Na folha de quadros, confira também:
|
|
924
|
+
- texto que já estava no vídeo não aparece junto com a legenda ou o gancho novos;
|
|
925
|
+
- nenhum dado pessoal sem borrar (nome, telefone, e-mail, documento) e nada na tela que a pessoa não
|
|
926
|
+
aprovou;
|
|
927
|
+
- cada animação no meio dela: texto certo, legível, fora do rosto, com o número igual ao da fala.
|
|
928
|
+
4. Depois do final, abra `<EDIT>/verify/final_report.json`: `duration` igual à do `cut.mp4`,
|
|
929
|
+
`loudness.i` perto de -14, `loudness.tp` até -1, `warnings` vazio ou explicado, `face_checks`
|
|
930
|
+
vazio, `layers` com o que você pediu nos tempos certos. Com limpeza de ruído, `denoise.applied`
|
|
931
|
+
igual ao pedido (ou o aviso que explica) e o fundo mais baixo em `noise_floor_after_db`.
|
|
932
|
+
`adjustments` lista cada texto que mudou de lugar ou sumiu por um tempo para não encostar em outro.
|
|
933
|
+
|
|
934
|
+
## Problemas comuns
|
|
935
|
+
|
|
936
|
+
| Mensagem | O que fazer |
|
|
937
|
+
|---|---|
|
|
938
|
+
| `estilo de gancho 'x' não existe` | Use um id da tabela de ganchos. |
|
|
939
|
+
| `estilo de legenda 'x' não existe` | Use um id da tabela de legendas. |
|
|
940
|
+
| `inserts[N].src: arquivo não encontrado` | Caminho relativo a `<EDIT>`. Confira o nome em `assets/`. |
|
|
941
|
+
| `inserts[N].type inválido` | Só `split_top`, `split_bottom`, `full`, `pip`. |
|
|
942
|
+
| `edit_type "x" não existe` | Use `clean`, `split_top`, `split_bottom` ou `tela_verde`. |
|
|
943
|
+
| `tela_verde.posicao precisa ser ...` | `"direita"`, `"esquerda"` ou `"centro"`. |
|
|
944
|
+
| `tela_verde.fundo[N].src: arquivo não encontrado` | Caminho relativo a `<EDIT>`. Confira o nome em `assets/`. |
|
|
945
|
+
| `tela_verde.fundo[N].x não existe` | Campos do item: `src`, `start`, `end`, `ken_burns`, `escurecer`, `desfocar`, `encaixe`. |
|
|
946
|
+
| `tela_verde.fundo[N].encaixe precisa ser ...` ou `inserts[N].encaixe precisa ser ...` | `"auto"`, `"cobrir"` ou `"inteiro"`. |
|
|
947
|
+
| aviso `inserts[N].encaixe só vale para imagem em cima ou embaixo na tela verde` | `encaixe`, `escurecer` e `desfocar` só mudam os inserts que viram fundo. Tire do `full` ou do `pip`. |
|
|
948
|
+
| aviso `captions.center_y N cairia no rosto na tela verde` | A pessoa mudou de lugar. A legenda já foi para a altura livre mais perto; tire o `center_y` para ela se ajustar sozinha. |
|
|
949
|
+
| aviso `o cartão do insert N (pip) foi para o canto ...` | O canto pedido cairia no rosto. Nada a fazer, ou mude o tempo do `pip`. |
|
|
950
|
+
| Tela dividida aparecendo na tela verde | Não acontece mais: com `"edit_type": "tela_verde"` os `split_top`/`split_bottom` viram fundo. Confira o `edit_type`. |
|
|
951
|
+
| `a tela verde precisa da biblioteca onnxruntime` ou `o modelo do recorte da pessoa não foi encontrado` | A instalação está incompleta: rode o instalador de novo. |
|
|
952
|
+
| aviso `tela_verde sem fundo: usei um fundo escuro` | Planeje as imagens e vídeos como inserts `split_top` (vão para o fundo), ou use `tela_verde.fundo` ou `"fundo_original_desfocado": true`. |
|
|
953
|
+
| aviso `a seção tela_verde ficou de fora` | Falta `"edit_type": "tela_verde"`. |
|
|
954
|
+
| aviso `tela verde, trecho ...: não achei a pessoa neste trecho` | O recorte não achou ninguém ali: só o fundo aparece. Use `"sem_rosto": "original"` (padrão) ou corte o trecho. |
|
|
955
|
+
| aviso `recorte feito a partir do cut.mp4 em vez do vídeo bruto` | O vídeo bruto sumiu ou o corte é de uma versão antiga. O recorte funciona igual, com um pouco menos de detalhe. |
|
|
956
|
+
| Pedaço do cenário grudado na pessoa ou mão cortada | Recorte difícil nesse trecho (fundo da mesma cor da roupa, mão muito rápida). Troque o fundo por uma cor parecida com a gravação ou use outro tipo de edição. |
|
|
957
|
+
| `music está ligado mas sem 'file' nem 'mood'` | Coloque `mood` (um humor) ou `file`, ou desligue a trilha. |
|
|
958
|
+
| `music.mood: a biblioteca de trilhas ainda não existe` | A pessoa ainda não guardou música. Use `trilhas.py adicionar` (arquivo dela) ou `gen_music.py --humor X --biblioteca` (pago), ou um `file`. |
|
|
959
|
+
| `music.mood: o humor 'x' ainda não tem trilha` | Encha esse humor (a mensagem traz os comandos) ou escolha outro com `trilhas.py humores`. |
|
|
960
|
+
| `music.mood: o humor 'x' não existe` | Use um humor da lista (`trilhas.py humores`). |
|
|
961
|
+
| `music.mood: não achei a trilha 'x'` | O `track` não está na biblioteca. Veja os ids com `trilhas.py listar`. |
|
|
962
|
+
| `cor de destaque inválida` | Use `#RRGGBB`. |
|
|
963
|
+
| aviso `gancho longo demais` | Encurte o texto do gancho. |
|
|
964
|
+
| aviso `captions.json foi agrupado para 'x' e o vídeo usa 'y'` | Rode `captions.py --style y` de novo. |
|
|
965
|
+
| aviso `cut_timeline.json diz ...` | O corte mudou depois do timeline. Renderize o corte de novo. |
|
|
966
|
+
| aviso `insert N passava do fim do vídeo` | Ajuste `end` para antes do fim. |
|
|
967
|
+
| aviso `inserts N e M se sobrepõem` | Separe os tempos. |
|
|
968
|
+
| aviso `efeito sonoro 'x' não existe` | Use um nome da tabela de efeitos (em inglês ou em português) ou um arquivo. |
|
|
969
|
+
| `sfx.events[N].at precisa ser um número de segundos` | Escreva o segundo do corte como número, com ponto, sem aspas e sem sinal de menos (ex.: `5.07`). |
|
|
970
|
+
| `sfx.events[N] precisa de "at"` ou `precisa de "name"` | Cada item leva os dois: `{"at": 5.07, "name": "cash"}`. |
|
|
971
|
+
| `sfx.events[N].name: arquivo não encontrado` | Caminho relativo a `<EDIT>`. Confira o nome em `assets/`. |
|
|
972
|
+
| aviso `sfx.events[N] (...) passa do fim do vídeo` | O tempo é do corte. Veja `duration` em `cut_timeline.json` e ajuste o `at`. |
|
|
973
|
+
| aviso `sfx.events[N] (...) é cortado pelo fim do vídeo` | O som começa tão perto do fim que parte dele não toca. Adiante o `at` ou use um som mais curto (`coin`). |
|
|
974
|
+
| aviso `... o ponto forte chega N s atrasado` | O evento está perto demais do começo do vídeo para o som começar antes dele (comum com `rise`, que tem o ponto forte mais para dentro do som). Mude o tempo, troque o efeito ou, em `sfx.events`, use `"anchor_s": 0`. |
|
|
975
|
+
| `sfx.events[N].anchor_s precisa ser um número` | Segundos com ponto, 0 ou mais (ex.: `0.3`). |
|
|
976
|
+
| aviso `o arquivo do efeito sonoro 'x' está faltando` | A instalação da skill está incompleta. Instale de novo (`install.py`). |
|
|
977
|
+
| Som de caixa registradora não toca | Confira `sfx.enabled` e o `at`; procure o item em `layers` do `final_report.json`. |
|
|
978
|
+
| Legenda com palavra de marca errada | `captions.py --edit-dir '<EDIT>' --replace 'Cacto=Cakto'` (ou transcreva as fontes de novo com `--prompt`). |
|
|
979
|
+
| Linhas `confira:` no `captions.py` | As fontes e o corte ouviram palavras diferentes. Veja qual está certa e use `--replace`. |
|
|
980
|
+
| aviso `cut.json é de outro corte` no `captions.py` | Transcreva o `cut.mp4` de novo com `--edit-dir`. |
|
|
981
|
+
| `motion[N] precisa de "template"` ou `modelo de animação 'x' não existe` | Use um id da tabela de modelos (`motion_render.py --list`). |
|
|
982
|
+
| `motion[N]: <modelo>.params.<campo> ...` | O campo está errado para aquele modelo. Veja `motion_render.py --describe <modelo>`. |
|
|
983
|
+
| `motion[N].region "x" não existe` | Use `"auto"`, `"top"`, `"middle"`, `"bottom"` ou `{"x", "y", "w", "h"}`. |
|
|
984
|
+
| `motion[N]: use "end" ou "duration"` | Escreva só um dos dois. |
|
|
985
|
+
| aviso `a animação N (...) aparece junto com o gancho` ou `com a chamada` | Mude o `start` para depois do gancho ou o `end` para antes da chamada. |
|
|
986
|
+
| aviso `a animação N (...) ficou escondida de ... a ...` | Ela encostou na chamada ou no gancho. Mude o tempo ou a `region`. |
|
|
987
|
+
| aviso `a animação N (...) cobre o rosto` | Deixe `region` em `"auto"`. Com auto, use menos itens, outro modelo ou outro trecho. |
|
|
988
|
+
| aviso `a animação N (...) não achou lugar livre` | O rosto e os textos ocupam a tela nesse trecho. Troque o tempo ou use um modelo menor. |
|
|
989
|
+
| aviso `a animação N (...) não achou lugar livre de tudo` | Ela ficou fora do rosto, mas divide a tela com a chamada, o gancho ou outra animação. Mude o tempo. |
|
|
990
|
+
| aviso `animação N (...) acaba antes de terminar o desenho` | O `end` corta a animação antes do último item. Aumente o `end` ou tire o `end` para usar a duração sugerida. |
|
|
991
|
+
| aviso `as animações N e M aparecem juntas` | Uma animação por vez: separe os tempos. |
|
|
992
|
+
| aviso `... cobre o rosto ...` | O texto não achou lugar livre. Use a altura sugerida na própria linha ou deixe o `center_y` em auto. |
|
|
993
|
+
| aviso `o aviso ficou escondido em N% do tempo` | Deixe `disclaimer.center_y` em auto ou escolha outra altura. |
|
|
994
|
+
| Rosto cortado na tela dividida | Troque `split_top` por `split_bottom` (ou o contrário). |
|
|
995
|
+
| Legenda do vídeo original aparecendo junto com a nova | Desligue `captions` (`"enabled": false`) e afaste o gancho do texto antigo. |
|
|
996
|
+
| Dado pessoal na tela (nome, telefone, e-mail, documento) | Na imagem de um insert: borre a imagem. No próprio vídeo: cubra com um `full` ou corte o trecho (volta à Fase 1), com o ok da pessoa. |
|
|
997
|
+
| Palavra cortada no fim de um trecho (legenda com palavra estranha, ex.: "matrão") | O `end` do range cortou a palavra: volte ao EDL, veja no `timeline_view.py` e aumente o `end`. |
|
|
998
|
+
| Trilha alta demais | Diminua `volume_db` (ex.: -18 ou -20). |
|
|
999
|
+
| Trilha baixa demais, quase não se ouve | Suba `volume_db` (ex.: -12). Confira se não ficou um -22 antigo. |
|
|
1000
|
+
| Mudou a favorita e a edição continua com a trilha antiga | É de propósito: a edição guarda a escolha. Rode `trilhas.py escolher --humor X --edit-dir '<EDIT>'` e monte de novo. |
|
|
1001
|
+
| `audio.denoise precisa ser "off", "leve" ou "forte"` | Use um desses três textos, entre aspas. |
|
|
1002
|
+
| aviso `X quase não tem pausa ... a limpeza ficou em leve` | Normal em fala sem pausa. Ouça o final; se a voz ficou abafada, desligue. |
|
|
1003
|
+
| aviso `X: não há trecho só de ruído ... ficou sem limpeza de ruído` | O vídeo não tem um momento só de fundo. Nada a fazer; o som fica como está. |
|
|
1004
|
+
| aviso `limpeza de ruído feita no som do corte` | Os vídeos brutos sumiram ou o corte mudou. Confira os caminhos em `sources` do EDL ou renderize o corte de novo. |
|
|
1005
|
+
| aviso `a limpeza de ruído foi pulada: o teste do ffmpeg falhou` | O motivo vem entre parênteses (ex.: `não tem o filtro afftdn`). O ffmpeg instalado é incompleto ou antigo: peça para instalar o ffmpeg completo. O vídeo sai com o som original. |
|
|
1006
|
+
| aviso `a limpeza de ruído foi pulada: os vídeos do corte não têm áudio` | Não há voz para limpar. Deixe `audio.denoise` em `off`. |
|
|
1007
|
+
| Voz abafada ou com "chiado de água" depois da limpeza | Troque `forte` por `leve` (ou `off`). |
|