primocode 8.42.2 → 9.1.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/README.md +41 -37
- package/bin/primocode.js +598 -360
- package/lib/acervo.js +8 -1
- package/lib/act.js +205 -114
- package/lib/api.js +35 -4
- package/lib/boas-vindas.js +42 -195
- package/lib/catalogo.js +100 -61
- package/lib/config.js +1 -1
- package/lib/conta.js +3 -24
- package/lib/diff.js +161 -0
- package/lib/diretor.js +37 -47
- package/lib/entrada.js +576 -0
- package/lib/especialistas.js +2 -2
- package/lib/estudio/assets.js +343 -0
- package/lib/estudio/identidade.js +560 -0
- package/lib/estudio/index.js +565 -0
- package/lib/estudio/plano.js +327 -0
- package/lib/estudio/projeto.js +246 -0
- package/lib/estudio/remotion.js +644 -0
- package/lib/estudio/slides.js +190 -0
- package/lib/estudio/video.js +296 -0
- package/lib/fala.js +49 -6
- package/lib/marca.js +4 -1
- package/lib/markdown.js +376 -0
- package/lib/marketplace.js +189 -0
- package/lib/pasta.js +15 -4
- package/lib/permissao.js +137 -0
- package/lib/registro.js +229 -0
- package/lib/skills.js +329 -0
- package/lib/tools.js +106 -187
- package/lib/ui.js +7 -3
- package/lib/voz.js +239 -0
- package/package.json +12 -3
- package/skills/acessibilidade/SKILL.md +28 -0
- package/skills/api-que-nao-quebra/SKILL.md +27 -0
- package/skills/depurar-de-verdade/SKILL.md +29 -0
- package/skills/editar-meu-video/SKILL.md +59 -0
- package/skills/escrever-em-portugues/SKILL.md +28 -0
- package/skills/git-limpo/SKILL.md +28 -0
- package/skills/motion-de-primeira/SKILL.md +62 -0
- package/skills/pagina-que-converte/SKILL.md +28 -0
- package/skills/performance-web/SKILL.md +28 -0
- package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
- package/skills/slides-que-prendem/SKILL.md +40 -0
- package/studio/edge.py +16 -66
- package/studio/narrar.py +274 -0
- package/studio/pessoa.py +199 -0
- package/voz/primo_voz/__init__.py +0 -0
- package/voz/primo_voz/__main__.py +383 -0
- package/voz/primo_voz/escuta.py +235 -0
- package/voz/primo_voz/orbe.py +216 -0
- package/lib/audio-livre.js +0 -177
- package/lib/chaves.js +0 -149
- package/lib/claude-engine.js +0 -631
- package/lib/codex-engine.js +0 -208
- package/lib/remotion.js +0 -663
- package/lib/studio.js +0 -960
- package/studio/PRIMOCODE.md +0 -58
- package/studio/README.md +0 -154
- package/studio/__pycache__/edge.cpython-311.pyc +0 -0
- package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
- package/studio/__pycache__/voz.cpython-311.pyc +0 -0
- package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
- package/studio/ferramentas/00-protocolo.md +0 -125
- package/studio/ferramentas/01-modelos.md +0 -270
- package/studio/ferramentas/README.md +0 -32
- package/studio/ferramentas/corte.md +0 -919
- package/studio/ferramentas/grade.md +0 -92
- package/studio/ferramentas/prisma.md +0 -107
- package/studio/ferramentas/prosa.md +0 -86
- package/studio/ferramentas/tela.md +0 -93
- package/studio/ferramentas/traco.md +0 -79
- package/studio/server.py +0 -2254
- package/studio/studio.log +0 -57
- package/studio/voz.py +0 -388
- package/studio/web/analise.html +0 -52
- package/studio/web/core.css +0 -1167
- package/studio/web/fontes/bebas.woff2 +0 -0
- package/studio/web/fontes/grotesk-700.woff2 +0 -0
- package/studio/web/fontes/inter-400.woff2 +0 -0
- package/studio/web/fontes/inter-700.woff2 +0 -0
- package/studio/web/fontes/jetbrains-400.woff2 +0 -0
- package/studio/web/fontes/playfair-700.woff2 +0 -0
- package/studio/web/fontes.css +0 -23
- package/studio/web/home.html +0 -217
- package/studio/web/js/analise.js +0 -510
- package/studio/web/js/audio.js +0 -607
- package/studio/web/js/editor.js +0 -1802
- package/studio/web/js/exportar.js +0 -222
- package/studio/web/js/ferramentas.js +0 -108
- package/studio/web/js/icones.js +0 -120
- package/studio/web/js/midia.js +0 -157
- package/studio/web/js/narracao.js +0 -325
- package/studio/web/js/player.js +0 -903
- package/studio/web/js/render-grade.js +0 -243
- package/studio/web/js/render-prosa.js +0 -104
- package/studio/web/js/render.js +0 -1852
- package/studio/web/js/sfx.js +0 -233
- package/studio/web/js/video.js +0 -464
- package/studio/web/js/voz-neural.js +0 -152
- package/studio/web/render.css +0 -1352
- package/studio/web/tf.html +0 -15
- package/studio/web/tool.html +0 -78
- package/studio/web/view.html +0 -27
|
@@ -1,919 +0,0 @@
|
|
|
1
|
-
# CORTE — vídeo
|
|
2
|
-
|
|
3
|
-
No lugar de CapCut, Premiere e After Effects. Modelo `cena`, com `duracao` em cada
|
|
4
|
-
cena, trilha sonora, transições e download em `.mp4`.
|
|
5
|
-
|
|
6
|
-
<!-- O EXEMPLO FICA NO COMEÇO DE PROPÓSITO: quando o plano de tokens é
|
|
7
|
-
apertado, o agente recebe só os primeiros ~3500 caracteres desta spec. Um
|
|
8
|
-
vídeo inteiro saiu PRETO porque o formato do documento estava depois do
|
|
9
|
-
corte e o agente inventou a estrutura. Formato primeiro; detalhe depois. -->
|
|
10
|
-
|
|
11
|
-
## Exemplo completo
|
|
12
|
-
|
|
13
|
-
**ATENÇÃO — este exemplo ensina o FORMATO, não o conteúdo.** O assunto dele
|
|
14
|
-
(conta de luz, bandeira tarifária) é inventado para a demonstração. Copiar
|
|
15
|
-
qualquer frase dele para o SEU documento é ERRO: escreva cada cena com os
|
|
16
|
-
fatos da SUA tarefa. O servidor recusa documento que venha com estas frases.
|
|
17
|
-
|
|
18
|
-
```json
|
|
19
|
-
{
|
|
20
|
-
"ferramenta": "corte",
|
|
21
|
-
"titulo": "Reels — por que sua conta de luz subiu",
|
|
22
|
-
"doc": {
|
|
23
|
-
"tema": "brasa",
|
|
24
|
-
"largura": 1080, "altura": 1920,
|
|
25
|
-
"acabamento": "grao",
|
|
26
|
-
"trilha": { "tipo": "gerada", "estilo": "pulso", "volume": 0.7 },
|
|
27
|
-
"cenas": [
|
|
28
|
-
{ "layout": "centro", "duracao": 3, "fundo": "aurora", "transicao": "flash",
|
|
29
|
-
"elementos": [
|
|
30
|
-
{ "tipo": "texto", "papel": "titulo", "texto": "Sua conta subiu\nde novo.",
|
|
31
|
-
"tamanho": 124, "estilo": "gradiente", "anim": "desfoque" }]},
|
|
32
|
-
|
|
33
|
-
{ "layout": "centro", "duracao": 3, "fundo": "vinheta", "transicao": "limpar",
|
|
34
|
-
"elementos": [
|
|
35
|
-
{ "tipo": "texto", "papel": "titulo", "texto": "E não foi o seu chuveiro.",
|
|
36
|
-
"tamanho": 78, "estilo": "marcador", "anim": "palavra" }]},
|
|
37
|
-
|
|
38
|
-
{ "layout": "centro", "duracao": 4, "transicao": "zoom", "acabamento": "vinheta",
|
|
39
|
-
"fundo": { "imagem": "/midia/torre.jpg", "escurecer": 0.5 },
|
|
40
|
-
"elementos": [
|
|
41
|
-
{ "tipo": "numeros", "contar": true, "anim": "saltar", "tamanho": 180,
|
|
42
|
-
"itens": ["+38% | bandeira tarifária em 12 meses"] }]},
|
|
43
|
-
|
|
44
|
-
{ "layout": "livre", "duracao": 4, "transicao": "deslizar",
|
|
45
|
-
"elementos": [
|
|
46
|
-
{ "tipo": "imagem", "src": "/midia/campo.jpg", "x": 0, "y": 0,
|
|
47
|
-
"l": 1080, "a": 1920, "raio": 0, "movimento": "aproximar", "filtro": "contraste" },
|
|
48
|
-
{ "tipo": "forma", "forma": "retangulo", "x": 0, "y": 1180, "l": 1080, "a": 740,
|
|
49
|
-
"preenchimento": "rgba(10,5,6,.72)" },
|
|
50
|
-
{ "tipo": "texto", "x": 90, "y": 1320, "l": 900, "a": 420,
|
|
51
|
-
"texto": "O custo está\nna transmissão", "tamanho": 104, "peso": 750,
|
|
52
|
-
"estilo": "sombra", "anim": "cortina" }]},
|
|
53
|
-
|
|
54
|
-
{ "layout": "centro", "duracao": 5, "fundo": "raios", "transicao": "subir",
|
|
55
|
-
"elementos": [
|
|
56
|
-
{ "tipo": "lista", "revelar": true, "tamanho": 52, "intervalo": 0.9,
|
|
57
|
-
"itens": ["Linhas saturadas no Nordeste",
|
|
58
|
-
"Usina gerando sem escoar",
|
|
59
|
-
"A conta chega em quem consome"] }]},
|
|
60
|
-
|
|
61
|
-
{ "layout": "centro", "duracao": 3, "fundo": "brilho", "transicao": "fade",
|
|
62
|
-
"acabamento": "luz",
|
|
63
|
-
"elementos": [
|
|
64
|
-
{ "tipo": "texto", "papel": "titulo", "texto": "Segue para\nentender a próxima.",
|
|
65
|
-
"tamanho": 96, "estilo": "contorno-tom", "anim": "elastico" }]}
|
|
66
|
-
]
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## ANTES DE ESCREVER: escolha, não repita
|
|
74
|
-
|
|
75
|
-
O exemplo acima é UMA receita. Usar sempre ela — `brasa`, `pulso`, gancho →
|
|
76
|
-
problema → virada — é o que faz todo vídeo sair com a mesma cara. O dono já
|
|
77
|
-
reclamou disso: *"ele não alterna entre os temas, usa um tema só pra todos os
|
|
78
|
-
vídeos, e o vídeo sempre tem a mesma estrutura, fica tudo genérico"*.
|
|
79
|
-
|
|
80
|
-
Escolha as quatro coisas abaixo **pelo assunto**, antes de escrever a primeira
|
|
81
|
-
cena. Se o assunto não empurrar para nenhuma, escolha a que você NÃO usou da
|
|
82
|
-
última vez — nunca a primeira da lista por comodidade.
|
|
83
|
-
|
|
84
|
-
| Assunto | `tema` | `trilha` | Estrutura |
|
|
85
|
-
|---|---|---|---|
|
|
86
|
-
| produto, tecnologia, lançamento | `meia-noite` ou `neon` | `pulso` | **Gancho** |
|
|
87
|
-
| institucional, quem somos, serviço | `oceano` ou `floresta` | `foco` | **Retrato** |
|
|
88
|
-
| urgência, notícia, alerta, dado duro | `brasa` | `tenso` | **Manchete** |
|
|
89
|
-
| explicação, tutorial, passo a passo | `papel` ou `claro` | `foco` | **Aula** |
|
|
90
|
-
| conquista, agradecimento, celebração | `doce` ou `neon` | `alegre` | **Brinde** |
|
|
91
|
-
| memória, história, retrospectiva | `retro` ou `mono` | `lofi` | **Linha** |
|
|
92
|
-
| curso, aula, treinamento, método | `ambar` | `suave` | **Aula** |
|
|
93
|
-
| relatório, número, análise técnica | `grafite` | `ambiente` | **Manchete** |
|
|
94
|
-
|
|
95
|
-
### As seis estruturas
|
|
96
|
-
|
|
97
|
-
Cada uma tem ritmo próprio. Não misture, e não use "Gancho" para tudo.
|
|
98
|
-
|
|
99
|
-
**Gancho** (vender algo) — 7 a 9 cenas de 3 a 5 s
|
|
100
|
-
frase que segura o dedo · o problema, concreto · a virada, um argumento por
|
|
101
|
-
cena · número ou prova · chamada.
|
|
102
|
-
|
|
103
|
-
**Retrato** (apresentar quem faz) — 5 a 6 cenas de 4 a 6 s, mais calmo
|
|
104
|
-
o nome e o que faz · para quem · como trabalha · uma prova (número, cliente,
|
|
105
|
-
tempo de casa) · convite. Transições suaves (`fade`, `limpar`), sem `flash`.
|
|
106
|
-
|
|
107
|
-
**Manchete** (informar rápido) — 4 a 6 cenas de 2 a 4 s, seco
|
|
108
|
-
o fato em uma linha · o número que dói · por que aconteceu · o que muda para
|
|
109
|
-
você. Corte duro entre cenas (`corte`, `flash`), texto grande, pouca palavra.
|
|
110
|
-
|
|
111
|
-
**Aula** (ensinar) — 6 a 10 cenas de 4 a 7 s
|
|
112
|
-
a pergunta · por que importa · passo 1, 2, 3 (uma cena cada, com `lista`
|
|
113
|
-
revelando) · o resumo · o erro comum a evitar. Fundo calmo, sem fogos.
|
|
114
|
-
|
|
115
|
-
**Brinde** (celebrar) — 4 a 6 cenas de 3 a 4 s
|
|
116
|
-
a conquista · os números dela · quem fez acontecer · agradecimento.
|
|
117
|
-
Animações vivas (`saltar`, `elastico`), fundo com brilho.
|
|
118
|
-
|
|
119
|
-
**Linha** (contar uma história no tempo) — 6 a 8 cenas de 4 a 5 s
|
|
120
|
-
o começo · o que mudou em cada etapa (uma cena por marco, com o ano no
|
|
121
|
-
`chapeu`) · onde chegou · o que vem. Um `tema` por época, se fizer sentido.
|
|
122
|
-
|
|
123
|
-
### Regras que matam o genérico
|
|
124
|
-
|
|
125
|
-
- **O `fundo` muda a cena a cena.** Onze existem. Dez cenas com o mesmo fundo
|
|
126
|
-
é o que faz parecer template. Repetir um fundo tudo bem; repetir TODOS não.
|
|
127
|
-
- **A `transicao` muda também.** Tudo em `fade` parece slide, não vídeo.
|
|
128
|
-
- **A `trilha` combina com o assunto.** Seis estilos existem; `pulso` não é o
|
|
129
|
-
padrão de nada — é o de vídeo de produto.
|
|
130
|
-
- **Cor de destaque.** Se o usuário tem marca, `marca.cor` pinta números,
|
|
131
|
-
gráficos e detalhes. Sem marca, escolha `tom` na cena que mais importa.
|
|
132
|
-
- **Uma cena fora do tom.** Uma citação em `papel` no meio de um deck escuro,
|
|
133
|
-
ou uma cena `mono` antes do fecho, vale mais que dez efeitos.
|
|
134
|
-
|
|
135
|
-
Um Reels de 30 s é 7 a 9 cenas de 3 a 5 segundos. A regra é dura:
|
|
136
|
-
**uma frase por cena**. Se não dá para ler em voz alta dentro da duração,
|
|
137
|
-
corte texto.
|
|
138
|
-
|
|
139
|
-
Vertical é `1080 × 1920`. Horizontal (`1920 × 1080`) só quando o destino for YouTube
|
|
140
|
-
ou tela grande. Em vertical, os tamanhos padrão de texto já crescem sozinhos.
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Trilha sonora
|
|
145
|
-
|
|
146
|
-
Vai no **documento**, não na cena:
|
|
147
|
-
|
|
148
|
-
```json
|
|
149
|
-
"trilha": { "tipo": "gerada", "estilo": "pulso", "volume": 0.7 }
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Geradas pelo estúdio
|
|
153
|
-
|
|
154
|
-
Música sintetizada na hora, sem arquivo e sem licença de terceiro.
|
|
155
|
-
|
|
156
|
-
| `estilo` | Cara | BPM |
|
|
157
|
-
|---|---|---|
|
|
158
|
-
| `pulso` | eletrônico, batida marcada | 112 |
|
|
159
|
-
| `ambiente` | pads longos, sem bateria | 68 |
|
|
160
|
-
| `lofi` | levada atrasada, acordes soltos | 76 |
|
|
161
|
-
| `epico` | grave, crescendo | 88 |
|
|
162
|
-
| `alegre` | maior, arpejo rápido | 124 |
|
|
163
|
-
| `tenso` | menor, suspense | 100 |
|
|
164
|
-
| `suave` | cama grave, sem bateria, quase não se nota | 60 |
|
|
165
|
-
| `foco` | pulso leve, sem caixa, para tutorial e institucional | 96 |
|
|
166
|
-
|
|
167
|
-
A trilha gerada não acaba — acompanha o vídeo até a última cena.
|
|
168
|
-
|
|
169
|
-
**Vídeo de alguém falando pede `suave` ou `foco`.** As duas foram feitas para
|
|
170
|
-
ficar EMBAIXO de uma voz: moram fora da faixa da fala e não têm caixa batendo
|
|
171
|
-
em cima dela. `epico` e `tenso` são faixas grandes — bonitas num teaser sem
|
|
172
|
-
narração, e uma disputa com quem fala em qualquer outro caso.
|
|
173
|
-
|
|
174
|
-
### Arquivo do usuário
|
|
175
|
-
|
|
176
|
-
```json
|
|
177
|
-
"trilha": { "tipo": "arquivo", "src": "/midia/minha-faixa.mp3",
|
|
178
|
-
"volume": 0.7, "inicio": 0, "repetir": true }
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
`src` vem de `POST /api/midia` (upload) ou é uma URL direta de áudio.
|
|
182
|
-
`inicio` pula os primeiros segundos da faixa.
|
|
183
|
-
|
|
184
|
-
### Música da internet, com licença (`buscar_audio`)
|
|
185
|
-
|
|
186
|
-
Uma faixa de verdade, tocada por gente, sem o usuário ter arquivo nenhum:
|
|
187
|
-
`buscar_audio` procura no Openverse (Jamendo, Freesound, Wikimedia — licenças
|
|
188
|
-
Creative Commons que permitem uso, inclusive comercial), **baixa** a melhor e
|
|
189
|
-
devolve a URL `/midia/…` pronta:
|
|
190
|
-
|
|
191
|
-
```
|
|
192
|
-
buscar_audio { "consulta": "upbeat corporate", "duracao": 30 }
|
|
193
|
-
→ url "/midia/corporate-succes-8c2911.mp3", licenca "CC BY-SA",
|
|
194
|
-
credito "Corporate Succes — Arkadii Kaplan (CC BY-SA 3.0, via jamendo)"
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
```json
|
|
198
|
-
"trilha": { "tipo": "arquivo", "src": "/midia/corporate-succes-8c2911.mp3", "volume": 0.55, "repetir": true }
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
Consulta **em inglês**, pelo clima: `upbeat corporate`, `calm piano`, `epic
|
|
202
|
-
cinematic`, `lofi chill`, `acoustic warm`. `duracao` é a do vídeo, para a faixa
|
|
203
|
-
combinar. Para efeitos, `"tipo": "efeito"` (`whoosh`, `click`, `ding`,
|
|
204
|
-
`swoosh`, `pop`) — a URL vai em `som: {"arquivo": …}`.
|
|
205
|
-
|
|
206
|
-
**O crédito faz parte da peça.** Licença `CC BY`/`BY-SA` pede o crédito: ponha
|
|
207
|
-
a linha `credito` da resposta na assinatura ou numa legenda pequena da última
|
|
208
|
-
cena. `CC0` e domínio público não pedem nada. A resposta diz qual é o caso.
|
|
209
|
-
Quando a busca não acha nada, use a trilha **gerada** — nunca um "parecido"
|
|
210
|
-
de YouTube.
|
|
211
|
-
|
|
212
|
-
**Não baixe áudio de YouTube, Spotify ou similares** — quebra os termos dessas
|
|
213
|
-
plataformas e o direito autoral da faixa. Use `buscar_audio`, música do próprio
|
|
214
|
-
usuário ou uma das trilhas geradas acima.
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## Studio E Remotion — os dois, mesclados
|
|
219
|
-
|
|
220
|
-
**Não é uma escolha.** O Studio é quem AUTORA e mostra: a cena, o motion, a
|
|
221
|
-
narração, a trilha gerada, os efeitos — o link "ver" é o vídeo, na hora. Quando
|
|
222
|
-
o usuário pede o ARQUIVO (`studio_exportar`), o PrimoCode renderiza a mesma
|
|
223
|
-
peça quadro a quadro pelo **Remotion** (instalado uma vez, sozinho, em
|
|
224
|
-
`~/.primocode/remotion`) — determinístico, sem perder quadro, com todas as
|
|
225
|
-
animações, chaves 3D, contagem e clipes no instante certo — e **mistura o
|
|
226
|
-
áudio do Studio** (narração, trilha, efeitos sintetizados) no MP4 final. Você
|
|
227
|
-
não escolhe motor: chama `studio_exportar` e recebe o arquivo.
|
|
228
|
-
|
|
229
|
-
O primeiro vídeo que saiu só do Remotion estava **mudo e parado** — animações
|
|
230
|
-
desligadas, só `trilha.src` como som. Foi por isso que a mescla existe: o
|
|
231
|
-
Remotion sozinho não tem a narração nem a trilha gerada; o Studio sozinho
|
|
232
|
-
grava em tempo real. Juntos, o arquivo sai como a prévia.
|
|
233
|
-
|
|
234
|
-
`remotion_projeto` (com o `id` da peça) é OUTRA coisa: gera o **projeto React**
|
|
235
|
-
na pasta do usuário, com as cenas, a mídia e o motion, para quem quer mexer no
|
|
236
|
-
código, versionar no git ou renderizar em servidor. Só quando o usuário pedir
|
|
237
|
-
isso — não é o jeito de gerar o arquivo. O projeto nasce sem `node_modules`;
|
|
238
|
-
diga os dois comandos (`npm install`, `npm run render`) e deixe ele decidir. A
|
|
239
|
-
trilha **gerada** e os sons **sintetizados** não existem no projeto solto
|
|
240
|
-
(são WebAudio ao vivo): lá, use `buscar_audio` para ter a trilha em arquivo.
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
## Elementos que dão cara de produção
|
|
245
|
-
|
|
246
|
-
Estes existem porque um vídeo genérico é feito só de título + texto. São
|
|
247
|
-
baratos de escrever e mudam completamente o resultado.
|
|
248
|
-
|
|
249
|
-
**Todo vídeo leva pelo menos um.** Texto sobre fundo, do primeiro segundo ao
|
|
250
|
-
último, é o vídeo que o usuário chamou de "sem efeito nenhum" — e não é falta
|
|
251
|
-
de recurso: é este bloco não ter sido lido.
|
|
252
|
-
|
|
253
|
-
## Anúncio de marca — o kit
|
|
254
|
-
|
|
255
|
-
Quando o pedido é o COMERCIAL de um produto (um cartão, um app, um plano), o
|
|
256
|
-
que separa uma peça de agência de um slide com música são quatro coisas, e as
|
|
257
|
-
quatro têm elemento próprio. Uma peça de marca sem elas sai genérica por mais
|
|
258
|
-
bonito que esteja o texto.
|
|
259
|
-
|
|
260
|
-
**Primeiro, declare a marca no documento.** Ela pinta o destaque de tudo —
|
|
261
|
-
número, botão, detalhe, o cartão — e libera o fundo `"marca"`:
|
|
262
|
-
|
|
263
|
-
```json
|
|
264
|
-
"marca": { "cor": "#21C25E", "logo": "/midia/logo.svg" },
|
|
265
|
-
"tema": "claro"
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
**De onde vêm a cor e a logo: do site da empresa.** Antes de escrever a peça,
|
|
269
|
-
chame `marca_da_empresa { "nome": "PicPay" }` (ou `"site": "https://…"`). Ela
|
|
270
|
-
lê o site, baixa a logo para o estúdio e devolve `marca: {cor, logo}` pronta
|
|
271
|
-
para colar, mais a paleta, as fontes e a frase da empresa. Não chute cor de
|
|
272
|
-
marca nem peça o arquivo ao usuário antes de tentar isso — a logo está no
|
|
273
|
-
site. Só quando a tool não achar (site montado por JavaScript, sem logo
|
|
274
|
-
baixável) é que se pede o arquivo (`studio_midia`) ou se assina com o nome em
|
|
275
|
-
texto.
|
|
276
|
-
|
|
277
|
-
Tema CLARO na maioria dos anúncios de marca. O escuro é para a cena de
|
|
278
|
-
produto e para a vitrine; o resto da peça respira no branco.
|
|
279
|
-
|
|
280
|
-
### `cartao` — o produto
|
|
281
|
-
|
|
282
|
-
```json
|
|
283
|
-
{ "tipo": "cartao", "nome": "PicPay", "variante": "Gold", "movimento": "flutuar" }
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
Sai um cartão desenhado: chip, símbolo de aproximação, numeração mascarada,
|
|
287
|
-
nome e validade, com luz e sombra. `cor` (sem ela, a da marca), `largura`,
|
|
288
|
-
`numero` (só os 4 últimos aparecem), `titular`, `validade`, `face: "verso"`,
|
|
289
|
-
`movimento`: `flutuar` | `girar`.
|
|
290
|
-
|
|
291
|
-
**Mostre o produto antes de falar dele.** Um anúncio de cartão que só tem
|
|
292
|
-
frases é um anúncio sem produto.
|
|
293
|
-
|
|
294
|
-
### `app` — a tela do aplicativo
|
|
295
|
-
|
|
296
|
-
```json
|
|
297
|
-
{ "tipo": "app", "topo": "Minha conta", "rotulo": "saldo disponível",
|
|
298
|
-
"valor": "R$ 1.284,90",
|
|
299
|
-
"linhas": [["Café da manhã", "R$ 18,90"], ["Mercado", "R$ 92,40"]],
|
|
300
|
-
"botao": "Pagar com o cartão" }
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
Cabeçalho, um número grande, linhas com o nome à esquerda e o valor à direita
|
|
304
|
-
separadas por fio, e o botão cheio embaixo — que é o que faz o olho ler
|
|
305
|
-
"aplicativo". Aceita `["nome", "valor"]` e `"nome|valor"`. `escuro: true` para
|
|
306
|
-
a versão noturna.
|
|
307
|
-
|
|
308
|
-
**Ele vai DENTRO do `dispositivo`**, e aí ocupa a tela inteira do aparelho:
|
|
309
|
-
|
|
310
|
-
```json
|
|
311
|
-
{ "tipo": "dispositivo", "forma": "celular", "dentro": [ { "tipo": "app", ... } ] }
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
Solto na cena ele vira o print da campanha. É o mesmo elemento de propósito:
|
|
315
|
-
com dois, a tela do celular e o print divergiriam na primeira mudança.
|
|
316
|
-
|
|
317
|
-
### `vitrine` — a linha de produtos
|
|
318
|
-
|
|
319
|
-
```json
|
|
320
|
-
{ "tipo": "vitrine", "titulo": "Escolha seu cartão", "atual": 1, "nome": "PicPay",
|
|
321
|
-
"itens": [ { "nome": "Gold", "cor": "#C9A227", "detalhe": "sem anuidade" },
|
|
322
|
-
{ "nome": "Verde", "detalhe": "cashback" },
|
|
323
|
-
{ "nome": "Black", "cor": "#181B1F", "detalhe": "sala VIP" } ] }
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Os cartões numa fila, o `atual` à frente e os outros recuados. Vai bem sobre
|
|
327
|
-
fundo escuro (`"fundo": "#0b0f0c"`), que é como toda tela de "escolha o seu" é
|
|
328
|
-
desenhada.
|
|
329
|
-
|
|
330
|
-
### `assinatura` — o ponto final
|
|
331
|
-
|
|
332
|
-
```json
|
|
333
|
-
{ "tipo": "assinatura", "nome": "PicPay", "frase": "o jeito fácil de pagar", "sobre": "marca" }
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
Ela toma a CENA INTEIRA: o logo sozinho, grande, sobre a cor da casa. `sobre`:
|
|
337
|
-
`marca` | `claro` | `escuro`. Com `logo` ela usa a imagem; sem, o `nome`.
|
|
338
|
-
|
|
339
|
-
**Todo anúncio termina assim.** Sem a assinatura a peça acaba numa frase, e
|
|
340
|
-
ninguém fica sabendo quem falou.
|
|
341
|
-
|
|
342
|
-
### A ordem que funciona
|
|
343
|
-
|
|
344
|
-
Uma peça de marca de 20 a 30 segundos, com 8 a 10 cenas:
|
|
345
|
-
|
|
346
|
-
| # | cena | o que entra |
|
|
347
|
-
|---|---|---|
|
|
348
|
-
| 1 | a promessa, em uma frase curta | `texto` pequeno, muito ar, fundo claro |
|
|
349
|
-
| 2 | o produto | `cartao` com `movimento` |
|
|
350
|
-
| 3 | o mote, na cor da casa | `fundo: "marca"`, `texto` branco, `anim: "palavra"` |
|
|
351
|
-
| 4 | funcionando | `dispositivo` + `app` |
|
|
352
|
-
| 5 | o benefício | `texto` |
|
|
353
|
-
| 6 | a linha | `vitrine` sobre fundo escuro |
|
|
354
|
-
| 7 | a última razão | `texto` |
|
|
355
|
-
| 8 | assinatura | `assinatura` |
|
|
356
|
-
|
|
357
|
-
E o rosto de quem fala, quando houver, entra por `clipe` entre a 4 e a 5 — o
|
|
358
|
-
depoimento é o que dá confiança, e nenhum desenho substitui.
|
|
359
|
-
|
|
360
|
-
---
|
|
361
|
-
|
|
362
|
-
### `icone` — o desenho ao lado do argumento
|
|
363
|
-
|
|
364
|
-
```json
|
|
365
|
-
{ "tipo": "icone", "nome": "raio", "tamanho": 120 }
|
|
366
|
-
{ "tipo": "icone", "nome": "crescimento", "tamanho": 90, "cor": "#22d3ee", "traco": 2 }
|
|
367
|
-
{ "tipo": "icone", "caminho": "M4 7h16M4 12h10M4 17h7", "tamanho": 100 }
|
|
368
|
-
{ "tipo": "icone", "caminho": ["M12 3a9 9 0 100 18 9 9 0 000-18z", "M9 12l2 2 4-4"], "preenchido": false }
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
O jeito mais barato de uma cena deixar de ser um slide. Um ícone grande acima
|
|
372
|
-
do título, ou um por item de uma lista de três, e a mesma frase passa a ter
|
|
373
|
-
imagem.
|
|
374
|
-
|
|
375
|
-
**O ícone que a lista não tem, você DESENHA** — `caminho` é o path SVG numa
|
|
376
|
-
caixa de 24×24 (uma string, ou uma lista com um traço por peça). Ele sai no
|
|
377
|
-
mesmo traço dos ícones prontos, na cor do tema, então o seu não destoa. Um
|
|
378
|
-
carrinho de compras, uma xícara, o símbolo do produto do cliente: três ou
|
|
379
|
-
quatro comandos `M`/`L`/`A`/`C` resolvem. Nunca emoji no lugar de ícone.
|
|
380
|
-
|
|
381
|
-
Os nomes que existem (traço, no tom do tema):
|
|
382
|
-
|
|
383
|
-
`raio` `alvo` `foguete` `escudo` `relogio` `usuario` `pessoas` `coracao`
|
|
384
|
-
`estrela` `nuvem` `engrenagem` `lampada` `cadeado` `chave` `casa` `email`
|
|
385
|
-
`telefone` `camera` `fogo` `globo` `presente` `sino` `mapa` `dinheiro`
|
|
386
|
-
`crescimento` `balao` `pasta` `livro` `check` `grafico` `codigo` `video`
|
|
387
|
-
`play` `olho` `baixar` `tela` `cartao` `numero` `tabela` `imagem` `lista`
|
|
388
|
-
|
|
389
|
-
Nome que não existe desenha a estrela — então use os daqui, e não o que
|
|
390
|
-
parecer natural.
|
|
391
|
-
|
|
392
|
-
### `selo` — a pílula de estado
|
|
393
|
-
|
|
394
|
-
```json
|
|
395
|
-
{ "tipo": "selo", "texto": "Módulo 2 de 5" }
|
|
396
|
-
{ "tipo": "selo", "texto": "Resultado 4", "icone": "★", "estilo": "vivo" }
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
`estilo`: sem nada (contorno), `"vivo"` (preenchido) ou `"solto"` (só o texto
|
|
400
|
-
em versalete). Vai sozinho para cima do título.
|
|
401
|
-
|
|
402
|
-
### `progresso` — onde estamos no caminho
|
|
403
|
-
|
|
404
|
-
```json
|
|
405
|
-
{ "tipo": "progresso", "atual": 4, "total": 15 }
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
Mostra "4/15" e os pontinhos. Use em série de cenas: diz ao espectador que
|
|
409
|
-
existe um percurso, e isso segura ele até o fim. `"numero": false` deixa só
|
|
410
|
-
os pontos.
|
|
411
|
-
|
|
412
|
-
### `avatar` — a pessoa
|
|
413
|
-
|
|
414
|
-
```json
|
|
415
|
-
{ "tipo": "avatar", "src": "/midia/foto.jpg", "nome": "Cleiton Paris", "tamanho": 280 }
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
Círculo com anel aceso. Sem `src`, mostra as iniciais do `nome` — melhor que
|
|
419
|
-
um buraco cinza. Vai para cima do nome sozinho.
|
|
420
|
-
|
|
421
|
-
### `dispositivo` — celular, notebook ou navegador com conteúdo dentro
|
|
422
|
-
|
|
423
|
-
```json
|
|
424
|
-
{ "tipo": "dispositivo", "forma": "celular", "dentro": [ ...elementos... ] }
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
`forma`: `celular` | `notebook` | `tablet` | `navegador` (este aceita
|
|
428
|
-
`"endereco": "primocode.dev"`). `dentro` é uma lista de elementos comuns — o
|
|
429
|
-
que couber. Nos layouts `imagem-direita` / `imagem-esquerda` o aparelho vai
|
|
430
|
-
para o lado sozinho, com o texto do outro. É o enquadramento mais forte que
|
|
431
|
-
existe aqui: use quando estiver mostrando uma tela.
|
|
432
|
-
|
|
433
|
-
### `conversa` — balões de pergunta e resposta
|
|
434
|
-
|
|
435
|
-
```json
|
|
436
|
-
{ "tipo": "conversa", "itens": [
|
|
437
|
-
{ "de": "eu", "texto": "Como acelero meu workflow?" },
|
|
438
|
-
{ "de": "ela", "texto": "Peça o storyboard em seis quadros." } ] }
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
Entram um de cada vez, como diálogo. `de: "eu"` à esquerda; qualquer outra
|
|
442
|
-
coisa à direita, com a cor do tema. Combina com `dispositivo` — a conversa
|
|
443
|
-
dentro do celular é a cena mais usada em vídeo de IA.
|
|
444
|
-
|
|
445
|
-
### `passos` e `opcoes`
|
|
446
|
-
|
|
447
|
-
```json
|
|
448
|
-
{ "tipo": "passos", "atual": 2, "itens": ["Passo 1|roteiro", "Passo 2|storyboard", "Passo 3|corte"] }
|
|
449
|
-
{ "tipo": "opcoes", "pergunta": "O que garante o look?", "certa": 1,
|
|
450
|
-
"itens": ["LUT uniforme", "Saturação aleatória", "Espaços de cor diferentes"] }
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
`passos` acende a etapa `atual` e apaga as outras — mude o `atual` a cada
|
|
454
|
-
cena e a série ganha movimento sem esforço. `opcoes` marca a alternativa
|
|
455
|
-
`certa` com ✓ (não escreva o ✓ no texto: ele vem sozinho). Alternativa faz o
|
|
456
|
-
espectador pensar antes da resposta, e pensar é o que segura alguém no vídeo.
|
|
457
|
-
|
|
458
|
-
### Vidro — o liquid glass, em qualquer elemento
|
|
459
|
-
|
|
460
|
-
`"material": "vidro"` em **qualquer** elemento: texto vira pílula de vidro,
|
|
461
|
-
`forma` vira painel, `imagem` ganha moldura, `lista`/`cartoes`/`numeros`
|
|
462
|
-
ganham fundo. É vidro de verdade: **desfoca o que está atrás** (o fundo
|
|
463
|
-
`aurora`, a foto, o círculo colorido), tem o bisel de luz em cima e a sombra
|
|
464
|
-
embaixo, e o reflexo diagonal atravessa devagar durante a cena.
|
|
465
|
-
|
|
466
|
-
```json
|
|
467
|
-
{ "tipo": "forma", "forma": "retangulo", "material": "vidro", "raio": 36,
|
|
468
|
-
"x": 120, "y": 140, "l": 860, "a": 420, "preenchimento": "#22d3ee" }
|
|
469
|
-
{ "tipo": "texto", "material": "vidro", "texto": "pílula de vidro", "tamanho": 32 }
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
Na forma, `preenchimento` vira a **tinta** do vidro (fraca) — não pinta o
|
|
473
|
-
fundo. `raio` arredonda (padrão 28). **Ponha algo atrás**: vidro sobre fundo
|
|
474
|
-
liso é só um retângulo claro; sobre `aurora`, `brilho`, uma foto ou uma forma
|
|
475
|
-
colorida, é o efeito. `"estilo": "vidro"` em `cartoes` continua valendo.
|
|
476
|
-
|
|
477
|
-
### Ícone como objeto (`estilo: "app"` / `"vidro"`)
|
|
478
|
-
|
|
479
|
-
```json
|
|
480
|
-
{ "tipo": "icone", "nome": "foguete", "estilo": "app", "tamanho": 220, "fundo": "#8b5cf6" }
|
|
481
|
-
{ "tipo": "icone", "nome": "raio", "estilo": "vidro", "tamanho": 220, "cor": "#ffb03a" }
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
`app` é o azulejo de aplicativo: gradiente da cor, brilho na metade de cima,
|
|
485
|
-
sombra colorida embaixo, o traço branco. `vidro` é o mesmo azulejo em liquid
|
|
486
|
-
glass. `fundo` pinta o azulejo (sem ele, a cor do tema). Um ícone de traço
|
|
487
|
-
sozinho é sinal; no azulejo vira **coisa** — é o que se usa para "o app", "o
|
|
488
|
-
produto", "o recurso" numa cena de lançamento. Combina com `som: "pop"` na
|
|
489
|
-
entrada e com `chaves` de `giroY` para ele virar ao pousar.
|
|
490
|
-
|
|
491
|
-
---
|
|
492
|
-
|
|
493
|
-
## Editar o vídeo do usuário (`clipe`)
|
|
494
|
-
|
|
495
|
-
Quando a pessoa manda uma gravação dela — o rosto falando, uma tela gravada,
|
|
496
|
-
uma cena de celular — o trabalho é EDITAR, não ilustrar. O elemento `clipe`
|
|
497
|
-
põe um trecho dessa gravação dentro de uma cena.
|
|
498
|
-
|
|
499
|
-
**Primeiro passo, sempre:** `studio_midia` com o caminho do arquivo. Ele
|
|
500
|
-
devolve uma URL `/midia/...`. Um caminho do disco (`/Users/...`, `C:\...`)
|
|
501
|
-
não funciona — o navegador não abre arquivo local.
|
|
502
|
-
|
|
503
|
-
```json
|
|
504
|
-
{ "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 12.4, "ate": 19.8 }
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
| campo | o que faz |
|
|
508
|
-
|---|---|
|
|
509
|
-
| `src` | a URL que `studio_midia` devolveu — obrigatório |
|
|
510
|
-
| `de` / `ate` | segundos **no arquivo original**. O trecho, não a cena |
|
|
511
|
-
| `mudo` | `true` deixa só a imagem (quando quem fala é a narração) |
|
|
512
|
-
| `volume` | 0 a 1, para misturar a voz da gravação com a trilha |
|
|
513
|
-
| `ajuste` | `"cobrir"` (padrão, enche o quadro) ou `"conter"` |
|
|
514
|
-
| `filtro` | `"cinza"`, `"sepia"`, `"contraste"`, `"desbotado"` |
|
|
515
|
-
| `x`/`y` | só se quiser quadro-dentro-do-quadro; sem eles ocupa a cena inteira |
|
|
516
|
-
|
|
517
|
-
Sem `x`/`y` o clipe é o CHÃO da cena: a imagem enche o quadro e o texto fica
|
|
518
|
-
por cima. É o que se quer quase sempre.
|
|
519
|
-
|
|
520
|
-
**Não escreva `duracao` numa cena com clipe.** A cena passa a durar o trecho
|
|
521
|
-
(`ate` − `de`) sozinha. Escrever `duracao` por cima é o que faz o corte não
|
|
522
|
-
cortar: o trecho de 1,2s fica congelado até completar os 4s.
|
|
523
|
-
|
|
524
|
-
### Cortar as pausas
|
|
525
|
-
|
|
526
|
-
**Não adivinhe onde estão.** Chame `studio_analisar` com a URL do vídeo: ele
|
|
527
|
-
ouve o arquivo e devolve `trechos`, a lista de `[início, fim]` já sem os
|
|
528
|
-
silêncios. Cada trecho vira uma cena.
|
|
529
|
-
|
|
530
|
-
```
|
|
531
|
-
studio_analisar arquivo: "/midia/gravacao.mp4"
|
|
532
|
-
→ { trechos: [[0.8, 6.2], [9.5, 17.1], [19.0, 24.3]], cortado: 4.6 }
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
`pausa` (padrão 0,6s) é a partir de quantos segundos de silêncio conta como
|
|
536
|
-
pausa. Suba para 1.0 se a pessoa fala pausado e o corte ficou ofegante.
|
|
537
|
-
|
|
538
|
-
A análise leva alguns segundos e abre uma aba que se fecha sozinha — é o
|
|
539
|
-
navegador que sabe ler o áudio de um .mp4. Se ela não responder, siga com o
|
|
540
|
-
vídeo inteiro num clipe só; não invente tempos.
|
|
541
|
-
|
|
542
|
-
Cortar as pausas é escrever VÁRIOS clipes do mesmo `src`, com os silêncios de
|
|
543
|
-
fora. Uma cena por trecho aproveitado:
|
|
544
|
-
|
|
545
|
-
```json
|
|
546
|
-
"cenas": [
|
|
547
|
-
{ "layout": "capa", "transicao": "fade",
|
|
548
|
-
"elementos": [{ "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 0.8, "ate": 6.2 },
|
|
549
|
-
{ "tipo": "texto", "papel": "titulo", "texto": "O que ninguém te conta" }] },
|
|
550
|
-
{ "layout": "capa", "transicao": "corte",
|
|
551
|
-
"elementos": [{ "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 9.5, "ate": 17.1 }] }
|
|
552
|
-
]
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
Entre 6.2 e 9.5 havia uma pausa: ela simplesmente não entra. Use `"transicao":
|
|
556
|
-
"corte"` entre trechos da mesma fala — fade entre dois pedaços da mesma frase
|
|
557
|
-
parece defeito.
|
|
558
|
-
|
|
559
|
-
### Legendar
|
|
560
|
-
|
|
561
|
-
A legenda é um `texto` com `"papel": "fala"` na mesma cena do clipe:
|
|
562
|
-
|
|
563
|
-
```json
|
|
564
|
-
{ "tipo": "texto", "papel": "fala", "texto": "isso mudou tudo pra mim" }
|
|
565
|
-
```
|
|
566
|
-
|
|
567
|
-
Ela já vai sozinha para o terço de baixo, branca, com chapa escura atrás —
|
|
568
|
-
legível sobre qualquer imagem. Não use `papel: "legenda"` para isso: aquele é
|
|
569
|
-
o rodapé de um slide, com 18px, ilegível num vídeo.
|
|
570
|
-
|
|
571
|
-
Uma frase curta por cena, no ritmo da fala — nunca o parágrafo inteiro. Se o
|
|
572
|
-
trecho é longo, quebre em mais cenas do mesmo `src` em vez de encher a tela.
|
|
573
|
-
|
|
574
|
-
### Só a voz dele
|
|
575
|
-
|
|
576
|
-
Três combinações, e elas resolvem coisas diferentes:
|
|
577
|
-
|
|
578
|
-
**A voz dele com a imagem dele** (o padrão) — `"mudo": false` no clipe e a
|
|
579
|
-
trilha em volume baixo (`"volume": 0.15`) ou `"trilha": {"tipo": "nenhuma"}`.
|
|
580
|
-
|
|
581
|
-
**A imagem dele com a sua narração por cima** — `"mudo": true` no clipe e
|
|
582
|
-
`narracao` na cena.
|
|
583
|
-
|
|
584
|
-
**A VOZ DELE COM A SUA TELA POR CIMA** — `"apenas": "som"` no clipe:
|
|
585
|
-
|
|
586
|
-
```json
|
|
587
|
-
{ "layout": "centro", "elementos": [
|
|
588
|
-
{ "tipo": "clipe", "src": "/midia/gravacao.mp4", "de": 9.5, "ate": 17.1, "apenas": "som" },
|
|
589
|
-
{ "tipo": "icone", "nome": "crescimento", "tamanho": 120 },
|
|
590
|
-
{ "tipo": "texto", "papel": "titulo", "texto": "Três vezes mais rápido" },
|
|
591
|
-
{ "tipo": "numeros", "itens": ["3x|velocidade", "0|instalação"], "contar": true } ] }
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
O clipe some do quadro e continua tocando: a cena dura o trecho, o áudio dele
|
|
595
|
-
entra no arquivo exportado, e o que se VÊ é o que você montou. É assim que se
|
|
596
|
-
entrega "só a voz, com uma tela de exemplos" — a gravação vira a narração da
|
|
597
|
-
sua peça.
|
|
598
|
-
|
|
599
|
-
Use na parte em que ele EXPLICA, e não na em que ele aparece: o rosto de quem
|
|
600
|
-
fala é o que dá confiança, e escondê-lo o vídeo inteiro joga isso fora. O
|
|
601
|
-
desenho que costuma funcionar é alternar — ele na tela quando se apresenta e
|
|
602
|
-
quando conclui, a tela montada enquanto ele explica.
|
|
603
|
-
|
|
604
|
-
Não junte `"apenas": "som"` com `"mudo": true`: um cancela o outro e a cena
|
|
605
|
-
vira um silêncio do tamanho do trecho.
|
|
606
|
-
|
|
607
|
-
### A música que combina
|
|
608
|
-
|
|
609
|
-
Não repita a mesma trilha em todo vídeo do usuário.
|
|
610
|
-
|
|
611
|
-
A primeira pergunta é se **alguém fala** no vídeo — narração ou o áudio da
|
|
612
|
-
gravação. Se fala, a trilha é cama: `suave` (mais discreta) ou `foco` (com
|
|
613
|
-
andamento). Só depois vem o assunto: depoimento e história pessoal pedem `lofi`
|
|
614
|
-
ou `ambiente`; anúncio e lançamento pedem `pulso` ou `epico`; algo leve pede
|
|
615
|
-
`alegre`. A tabela de estilos está acima.
|
|
616
|
-
|
|
617
|
-
---
|
|
618
|
-
|
|
619
|
-
## Narração
|
|
620
|
-
|
|
621
|
-
A voz que fala por cima do vídeo. Vai **na cena**, e o estúdio narra sozinho
|
|
622
|
-
na hora de tocar — sem gravar nada, sem arquivo:
|
|
623
|
-
|
|
624
|
-
```json
|
|
625
|
-
{ "layout": "centro", "duracao": 6,
|
|
626
|
-
"narracao": "O texto que a voz vai falar nesta cena.",
|
|
627
|
-
"elementos": [ ... ] }
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
Escolha da voz no **documento** (opcional):
|
|
631
|
-
|
|
632
|
-
```json
|
|
633
|
-
"voz": { "voz": "brian", "grave": true, "velocidade": 1 }
|
|
634
|
-
```
|
|
635
|
-
|
|
636
|
-
**Com o ElevenLabs configurado** (chave em `POST /api/voz/elevenlabs` ou na
|
|
637
|
-
variável `ELEVENLABS_API_KEY`), a narração inteira sobe de nível e as vozes
|
|
638
|
-
passam a ser: `brian` (grave, de locução — padrão) · `daniel` (grave, de
|
|
639
|
-
noticiário) · `adam` (firme) · `bill` (maduro) · `liam` (jovem, redes
|
|
640
|
-
sociais) · `sarah` e `alice` (femininas). Também aceita um voice_id cru do
|
|
641
|
-
ElevenLabs — é assim que a voz clonada do próprio usuário entra. Consulte
|
|
642
|
-
`GET /api/voz/status` para saber o que está ativo nesta máquina.
|
|
643
|
-
|
|
644
|
-
**A corrente de voz, em ordem de qualidade** (cada motor cai no seguinte
|
|
645
|
-
quando não responde — a narração nunca fica muda):
|
|
646
|
-
|
|
647
|
-
1. **ElevenLabs** — premium, se houver chave com crédito.
|
|
648
|
-
2. **Edge TTS** — vozes neurais da Microsoft, **grátis e sem chave**, só
|
|
649
|
-
pede internet. É a melhor voz gratuita: `antonio` (masculina, de locução
|
|
650
|
-
— **a padrão gratuita**), `francisca` e `thalita` (femininas). Instala-se
|
|
651
|
-
sozinho na primeira vez (`pip install edge-tts`, ~1 min) e, enquanto isso,
|
|
652
|
-
a narração sai por outro motor. Não há por que citar "voz de robô": com
|
|
653
|
-
internet, o padrão já é voz neural de gente.
|
|
654
|
-
3. **Piper** — neural e **offline**, sem limite (detalhado abaixo).
|
|
655
|
-
4. **Voicebox** — se o app estiver instalado (voz clonável).
|
|
656
|
-
5. **Google** — última reserva, robótica, mas responde sempre.
|
|
657
|
-
|
|
658
|
-
O **Piper** roda na máquina do usuário — offline, sem limite. As vozes
|
|
659
|
-
pt-BR, com a frequência de cada uma medida (menor = mais grave):
|
|
660
|
-
|
|
661
|
-
| id | timbre | Hz |
|
|
662
|
-
|---|---|---|
|
|
663
|
-
| `jeff` | grave, de locução — **é a padrão** | 139 |
|
|
664
|
-
| `cadu` | grave, mais solta | 140 |
|
|
665
|
-
| `edresson` | média, mais leve de baixar | 151 |
|
|
666
|
-
| `faber` | clara, de leitura | 167 |
|
|
667
|
-
| `tugao` | português de Portugal | — |
|
|
668
|
-
|
|
669
|
-
`"grave": true` abaixa mais uns 10% — é o registro de abertura de vídeo. Não
|
|
670
|
-
há voz feminina em pt-BR neste motor; se pedirem uma, diga isso em vez de
|
|
671
|
-
prometer. Na primeira vez o motor é baixado sozinho (~90 MB); enquanto isso
|
|
672
|
-
a narração sai por uma voz de reserva, e o vídeo nunca fica mudo.
|
|
673
|
-
|
|
674
|
-
Regras que fazem diferença:
|
|
675
|
-
|
|
676
|
-
- **Escreva para o ouvido, não para o olho.** A narração NÃO repete o texto da
|
|
677
|
-
tela: a tela dá o título, a voz dá o argumento. Repetir os dois é o erro mais
|
|
678
|
-
comum, e soa a leitura de slide.
|
|
679
|
-
- **Caiba na duração.** Fale ~2,5 palavras por segundo: uma cena de 6s aguenta
|
|
680
|
-
~15 palavras. Texto mais longo que a cena é cortado no meio.
|
|
681
|
-
- **Uma ideia por cena**, em uma ou duas frases curtas. Ponto final ajuda a voz
|
|
682
|
-
a respirar.
|
|
683
|
-
- Para o vídeo ficar mudo de propósito, é só não pôr `narracao` em cena nenhuma.
|
|
684
|
-
|
|
685
|
-
O usuário também pode gravar a própria voz pelo editor; aí a cena ganha
|
|
686
|
-
`narracaoAudio` com o arquivo, e ela tem prioridade sobre a voz sintetizada.
|
|
687
|
-
|
|
688
|
-
**Sincronia é automática.** Quando o estúdio gera a narração em arquivo, ele
|
|
689
|
-
mede o áudio e grava `narracaoDur` na cena; a cena então dura o que for maior —
|
|
690
|
-
a `duracao` pedida ou a fala inteira mais um respiro. Não calcule isso à mão,
|
|
691
|
-
e não apague `narracaoDur` ao ajustar um documento.
|
|
692
|
-
|
|
693
|
-
**Mixagem é automática.** A música abaixa sozinha enquanto a voz fala (ducking)
|
|
694
|
-
e volta no intervalo entre as falas. Não compense baixando o `volume` da trilha:
|
|
695
|
-
deixe em 0.6–0.8 e o duck cuida do resto.
|
|
696
|
-
|
|
697
|
-
---
|
|
698
|
-
|
|
699
|
-
## Efeitos sonoros
|
|
700
|
-
|
|
701
|
-
Cada troca de cena ganha um efeito sintetizado na hora, sem arquivo e sem
|
|
702
|
-
licença: transição `flash` e `zoom` soam um **impacto** grave; as demais, um
|
|
703
|
-
**whoosh** (variado, para não repetir); `corte` fica em silêncio.
|
|
704
|
-
|
|
705
|
-
Para controlar:
|
|
706
|
-
|
|
707
|
-
```json
|
|
708
|
-
"sfx": false // no documento: desliga todos os efeitos
|
|
709
|
-
{ "transicao": "deslizar", "som": "impacto" } // na cena: força um efeito
|
|
710
|
-
```
|
|
711
|
-
|
|
712
|
-
Valores: `"whoosh"` · `"impacto"` · `"click"` · `"pop"` · `"ding"` ·
|
|
713
|
-
`"subida"` · `"tique"` · `"brilho"` · `"nenhum"`. (`sfx` na cena ainda vale;
|
|
714
|
-
`som` é o nome novo, o mesmo dos elementos.)
|
|
715
|
-
|
|
716
|
-
### Som por elemento — o que faz motion soar motion
|
|
717
|
-
|
|
718
|
-
`"som"` num **elemento** toca no instante em que ele entra (o mesmo atraso da
|
|
719
|
-
animação de entrada). É a diferença entre um slide animado e uma peça de
|
|
720
|
-
motion: o número faz **ding** ao aparecer, o ícone faz **pop** ao pousar, a
|
|
721
|
-
barra sobe com a **subida** (o riser) e o texto final chega com **brilho**.
|
|
722
|
-
|
|
723
|
-
```json
|
|
724
|
-
{ "tipo": "numeros", "itens": ["+38% | em 12 meses"], "contar": true, "som": "ding" }
|
|
725
|
-
{ "tipo": "icone", "nome": "foguete", "estilo": "app", "som": "pop" }
|
|
726
|
-
{ "tipo": "texto", "texto": "Agora.", "som": { "arquivo": "/midia/little-whoosh-3.mp3", "volume": 0.8 } }
|
|
727
|
-
{ "tipo": "texto", "texto": "3, 2, 1", "som": { "nome": "tique", "em": 1.5 } }
|
|
728
|
-
```
|
|
729
|
-
|
|
730
|
-
`som` aceita o nome, ou `{ "arquivo": "/midia/…", "volume": 0–1 }` para um
|
|
731
|
-
efeito baixado com `buscar_audio` (tipo `"efeito"`) ou enviado pelo usuário;
|
|
732
|
-
`"em"` (segundos na cena) força o instante. O arquivo entra no mesmo grafo da
|
|
733
|
-
trilha, então vai junto para o MP4. Regra: **um som por ideia, não por
|
|
734
|
-
elemento** — três ou quatro por vídeo; tudo apitando é ruído, e a narração
|
|
735
|
-
tem de continuar por cima.
|
|
736
|
-
|
|
737
|
-
---
|
|
738
|
-
|
|
739
|
-
## Transições
|
|
740
|
-
|
|
741
|
-
Na cena, `transicao` define como ela **entra**:
|
|
742
|
-
|
|
743
|
-
`corte` (sem efeito) · `fade` · `deslizar` · `subir` · `zoom` · `limpar` ·
|
|
744
|
-
`persiana` · `flash`
|
|
745
|
-
|
|
746
|
-
Vale o mesmo conselho das animações: varie. Tudo em `fade` parece slide, não vídeo.
|
|
747
|
-
|
|
748
|
-
## Chaves de animação
|
|
749
|
-
|
|
750
|
-
`anim` faz o elemento **entrar** e parar por ali. Para ele se mexer ao longo da
|
|
751
|
-
cena — atravessar, crescer devagar, sumir no fim — use `chaves`: uma lista de
|
|
752
|
-
instantes, com `t` de 0 (começo da cena) a 1 (fim).
|
|
753
|
-
|
|
754
|
-
```json
|
|
755
|
-
{ "tipo": "texto", "texto": "Atravessa a tela",
|
|
756
|
-
"chaves": [
|
|
757
|
-
{ "t": 0, "x": -400, "opacidade": 0 },
|
|
758
|
-
{ "t": 0.25, "x": 0, "opacidade": 1 },
|
|
759
|
-
{ "t": 0.75, "x": 0, "opacidade": 1 },
|
|
760
|
-
{ "t": 1, "x": 400, "opacidade": 0 }
|
|
761
|
-
] }
|
|
762
|
-
```
|
|
763
|
-
|
|
764
|
-
Campos de uma chave, todos opcionais: `x` e `y` (**deslocamento** em pixels a
|
|
765
|
-
partir de onde o elemento está — não é posição absoluta), `escala` (1 = tamanho
|
|
766
|
-
normal), `giro` (graus), `opacidade` (0 a 1) e `desfoque` (pixels).
|
|
767
|
-
|
|
768
|
-
**Em 3D:** `giroY` e `giroX` (graus — o elemento vira em profundidade, como um
|
|
769
|
-
cartão girando na mão), `prof` (pixels — aproxima ou afasta da câmera) e
|
|
770
|
-
`escalaX`/`escalaY` (achatar num eixo só: a gota que pousa e se espalha).
|
|
771
|
-
|
|
772
|
-
```json
|
|
773
|
-
{ "tipo": "icone", "nome": "foguete", "estilo": "app", "tamanho": 220,
|
|
774
|
-
"chaves": [
|
|
775
|
-
{ "t": 0, "giroY": -90, "prof": -400, "opacidade": 0 },
|
|
776
|
-
{ "t": 0.35, "giroY": 0, "prof": 0, "opacidade": 1 },
|
|
777
|
-
{ "t": 1, "giroY": 12 }
|
|
778
|
-
], "suavizar": "elastico", "som": "pop" }
|
|
779
|
-
```
|
|
780
|
-
|
|
781
|
-
**A curva** (`suavizar`, no elemento): `"suave"` (padrão) · `"linear"` ·
|
|
782
|
-
`"entrada"` (acelera) · `"saida"` (freia) · `"elastico"` (passa do ponto e
|
|
783
|
-
volta — o pouso de app) · `"salto"` (recua, dispara e assenta) · `"degrau"`
|
|
784
|
-
(quadro a quadro, stop-motion). Aceita também um `cubic-bezier(…)` cru.
|
|
785
|
-
`"repetir": true` roda sem parar; com `"vaiEVolta": true` ele vai e volta em
|
|
786
|
-
vez de recomeçar — é a levitação de um objeto.
|
|
787
|
-
|
|
788
|
-
Um exemplo de cada coisa que motion pede — **entrar de lado, respirar, sair**:
|
|
789
|
-
|
|
790
|
-
```json
|
|
791
|
-
"chaves": [ { "t": 0, "x": -300, "opacidade": 0 }, { "t": 0.2, "x": 0, "opacidade": 1 },
|
|
792
|
-
{ "t": 0.85, "x": 0, "opacidade": 1 }, { "t": 1, "x": 120, "opacidade": 0 } ]
|
|
793
|
-
```
|
|
794
|
-
|
|
795
|
-
Duas chaves já bastam. Quem tem `chaves` ignora `anim` — as duas disputariam o
|
|
796
|
-
mesmo movimento, e a chave é mais específica. Use em **um ou dois** elementos
|
|
797
|
-
por vídeo: tudo se mexendo ao mesmo tempo cansa e esconde a mensagem.
|
|
798
|
-
|
|
799
|
-
## Câmera da cena — o quadro também se move
|
|
800
|
-
|
|
801
|
-
`chaves` move um elemento. `camera` move o **quadro inteiro**: é o que separa
|
|
802
|
-
motion de slide animado. Na cena:
|
|
803
|
-
|
|
804
|
-
```json
|
|
805
|
-
{ "layout": "capa", "duracao": 4, "camera": "aproximar" }
|
|
806
|
-
```
|
|
807
|
-
|
|
808
|
-
Movimentos com nome: `aproximar` · `afastar` · `pan-direita` · `pan-esquerda` ·
|
|
809
|
-
`subir` · `descer` · `empurrar` (zoom com um grau de giro — a mão humana) ·
|
|
810
|
-
`balanco`.
|
|
811
|
-
|
|
812
|
-
Para um movimento seu, as mesmas chaves dos elementos:
|
|
813
|
-
|
|
814
|
-
```json
|
|
815
|
-
"camera": { "chaves": [ { "t": 0, "escala": 1.15, "x": -40 },
|
|
816
|
-
{ "t": 1, "escala": 1, "x": 0 } ], "suavizar": "saida" }
|
|
817
|
-
```
|
|
818
|
-
|
|
819
|
-
O **fundo não anda junto** — é assim de propósito: o quadro passa sobre o
|
|
820
|
-
fundo, e é daí que vem a sensação de profundidade sem custo nenhum.
|
|
821
|
-
|
|
822
|
-
### Paralaxe — as camadas andam em velocidades diferentes
|
|
823
|
-
|
|
824
|
-
No elemento, `paralaxe` diz o quanto ele acompanha a câmera: `1` é o padrão
|
|
825
|
-
(anda com o quadro), acima de 1 vem à frente e anda **mais**, abaixo de 1 fica
|
|
826
|
-
ao fundo e anda **menos**.
|
|
827
|
-
|
|
828
|
-
```json
|
|
829
|
-
{ "tipo": "imagem", "src": "/midia/cidade.jpg", "paralaxe": 0.4 }
|
|
830
|
-
{ "tipo": "texto", "papel": "titulo", "texto": "São Paulo", "paralaxe": 1.25 }
|
|
831
|
-
```
|
|
832
|
-
|
|
833
|
-
Duas ou três camadas bastam: fundo em 0,3–0,5, conteúdo em 1, o que está na
|
|
834
|
-
frente em 1,2–1,4. Um elemento que já tem `chaves` próprias e está no fluxo
|
|
835
|
-
ignora a paralaxe — a animação dele é mais específica, e embrulhar mudaria o
|
|
836
|
-
espaçamento da cena.
|
|
837
|
-
|
|
838
|
-
**Um movimento de câmera por cena, e não em todas.** Câmera em tudo embrulha o
|
|
839
|
-
olho; o que dá ritmo é alternar cena parada e cena com movimento.
|
|
840
|
-
|
|
841
|
-
## Acabamento
|
|
842
|
-
|
|
843
|
-
Textura por cima da cena inteira — é o que tira a cara de template:
|
|
844
|
-
|
|
845
|
-
`grao` · `vinheta` · `scanlines` · `luz` · `brilho` · `moldura`
|
|
846
|
-
|
|
847
|
-
Pode ir no documento (vale para tudo) ou por cena. `grao` no documento inteiro
|
|
848
|
-
dá unidade de película ao vídeo.
|
|
849
|
-
|
|
850
|
-
## Fundos
|
|
851
|
-
|
|
852
|
-
`malha` `brilho` `grade` `pontos` `suave` `vinheta` `aurora` `raios` `ondas`
|
|
853
|
-
`nevoa` `xadrez`, ou cor, gradiente e foto:
|
|
854
|
-
|
|
855
|
-
```json
|
|
856
|
-
"fundo": { "imagem": "/midia/foto.jpg", "escurecer": 0.55 }
|
|
857
|
-
```
|
|
858
|
-
|
|
859
|
-
## Movimento de imagem (Ken Burns)
|
|
860
|
-
|
|
861
|
-
```json
|
|
862
|
-
{ "tipo": "imagem", "src": "/midia/foto.jpg", "x": 0, "y": 0, "l": 1080, "a": 1920,
|
|
863
|
-
"raio": 0, "movimento": "aproximar", "filtro": "contraste" }
|
|
864
|
-
```
|
|
865
|
-
|
|
866
|
-
`movimento`: `aproximar` `afastar` `esquerda` `direita` `cima` ·
|
|
867
|
-
`filtro`: `cinza` `sepia` `contraste` `desbotado`
|
|
868
|
-
|
|
869
|
-
Imagem parada em vídeo denuncia preguiça. Sempre dê movimento.
|
|
870
|
-
|
|
871
|
-
## Texto com estilo
|
|
872
|
-
|
|
873
|
-
`estilo` no elemento de texto:
|
|
874
|
-
|
|
875
|
-
`gradiente` · `contorno` · `contorno-tom` · `sombra` · `brilho` · `relevo` ·
|
|
876
|
-
`marcador` (fundo tipo caneta) · `fita` (tarja cheia) · `caixa`
|
|
877
|
-
|
|
878
|
-
## Animações de entrada
|
|
879
|
-
|
|
880
|
-
`subir` `surgir` `esquerda` `direita` `zoom` `desfoque` `cair` `girar` `saltar`
|
|
881
|
-
`revelar` `cortina` `elastico` `palavra` (palavra por palavra) `nenhuma`
|
|
882
|
-
|
|
883
|
-
Em `numeros`, `"contar": true` faz o número subir do zero — funciona muito bem
|
|
884
|
-
combinado com `saltar`.
|
|
885
|
-
|
|
886
|
-
Em `lista`, `"revelar": true` distribui os itens dentro da duração da cena;
|
|
887
|
-
`intervalo` (segundos) controla o espaçamento entre eles.
|
|
888
|
-
|
|
889
|
-
---
|
|
890
|
-
|
|
891
|
-
## No modo Abrir
|
|
892
|
-
|
|
893
|
-
Toca sozinho ao carregar, com barra de transporte embaixo:
|
|
894
|
-
play/pausa, linha do tempo clicável com marca por cena, tempo, volume e **Gravar**.
|
|
895
|
-
|
|
896
|
-
`K` toca e pausa · `M` corta o som · `→` `←` pulam cena · `F` tela cheia · `Escape` para.
|
|
897
|
-
|
|
898
|
-
## Baixar o vídeo como arquivo
|
|
899
|
-
|
|
900
|
-
O botão **Baixar MP4** no player faz tudo sozinho: pede a permissão de captura, toca
|
|
901
|
-
do começo, para no fim e baixa. Sai `.mp4` (H.264/AAC, que toca em qualquer lugar) nos
|
|
902
|
-
navegadores que sabem gravar MP4; onde não sabem, sai `.webm`.
|
|
903
|
-
|
|
904
|
-
**Se o usuário pedir o arquivo do vídeo** — "baixa", "exporta", "me manda em mp4",
|
|
905
|
-
"quero mandar no WhatsApp" — abra o player já em modo de gravação:
|
|
906
|
-
|
|
907
|
-
```
|
|
908
|
-
open_in_browser → http://localhost:7777/v/<id>#gravar
|
|
909
|
-
```
|
|
910
|
-
|
|
911
|
-
A âncora `#gravar` dispara o download assim que a página abre; o usuário só confirma a
|
|
912
|
-
permissão de captura. **Não** use `write_file` para criar `.mp4`, e **nunca** chame
|
|
913
|
-
ffmpeg: o vídeo já nasce pronto aqui, e escrever um `.mp4` com write_file produz um
|
|
914
|
-
arquivo de texto com nome de vídeo — já aconteceu.
|
|
915
|
-
|
|
916
|
-
Para o melhor resultado, entre em tela cheia (`F`) antes de gravar.
|
|
917
|
-
|
|
918
|
-
O export normal (`/api/arquivos/<id>/export`) devolve um `.html` autônomo com a
|
|
919
|
-
mídia embutida — abre offline em qualquer navegador e toca igual.
|