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,234 @@
|
|
|
1
|
+
# Variações e lote
|
|
2
|
+
|
|
3
|
+
Para fazer versões comparáveis de uma edição aprovada (outra abertura, outra primeira frase, outra ordem da
|
|
4
|
+
demonstração, outro enquadramento, outra chamada) e para liberar muitas versões de uma vez, com rastreio do que
|
|
5
|
+
mudou em cada uma.
|
|
6
|
+
|
|
7
|
+
## A base
|
|
8
|
+
|
|
9
|
+
1. Ache a versão aprovada e as fontes dela: o projeto, o corte, os arquivos de `assets/`, o render aprovado.
|
|
10
|
+
2. Mais de uma candidata e nenhuma claramente aprovada: resolva com a pessoa antes de fazer qualquer cópia.
|
|
11
|
+
3. Só chame de aprovada o que a pessoa aprovou, ou o que passou por um critério que ela já autorizou. Sua
|
|
12
|
+
conferência não é aprovação dela.
|
|
13
|
+
4. A base nunca é sobrescrita. Cada versão é uma pasta e um arquivo novos.
|
|
14
|
+
|
|
15
|
+
## Uma hipótese por versão
|
|
16
|
+
|
|
17
|
+
- Cada versão muda **uma** coisa, e você escreve por que essa mudança pode mudar o entendimento ou a resposta de
|
|
18
|
+
quem assiste. Hipótese não é previsão de desempenho.
|
|
19
|
+
- Se, para ficar coerente, a versão precisa mudar várias coisas, ela ganha o rótulo **combinação** (ou **direção
|
|
20
|
+
nova**), e o resultado dela, quando existir, não pode ser creditado a uma mudança só.
|
|
21
|
+
- Não cruze todas as opções. Priorize diferenças que se percebem e dá para comparar. Trocar um detalhe de animação
|
|
22
|
+
gera arquivo, não gera hipótese.
|
|
23
|
+
- **Mudou só o que está escrito?** Use a gravação da base; ninguém precisa regravar.
|
|
24
|
+
- **Mudou o que a pessoa diz?** Então tem que existir o som daquela frase: uma tomada nova que ela gravou, ou um
|
|
25
|
+
áudio que ela liberou com essas palavras exatas. Legenda nova por cima da fala velha não resolve, e a transcrição
|
|
26
|
+
da frase antiga não pode continuar valendo para a nova. É o caso do gancho que só existe no roteiro: enquanto a
|
|
27
|
+
tomada não chega, ele fica na planilha como `falta gravar` e não vira vídeo.
|
|
28
|
+
- Ajustes de corte, duração, legenda e sincronia que a fonte nova obriga são dependências técnicas, anotadas na
|
|
29
|
+
planilha. Não contam como segunda hipótese.
|
|
30
|
+
- Tudo que é igual entre as versões vem da base: o mesmo `projeto.json` copiado, as mesmas peças, os mesmos sons.
|
|
31
|
+
O que é da oferta (preço, condição, chamada) fica anotado à parte do que é visual.
|
|
32
|
+
- Duração nova atualiza os tempos: o cartão final nunca entra antes da última frase.
|
|
33
|
+
|
|
34
|
+
## Resultado de campanha
|
|
35
|
+
|
|
36
|
+
- Número de campanha só entra se vier de relatório de verdade (a pessoa mandou, ou você leu com permissão),
|
|
37
|
+
anotando de quando a quando e em que condições.
|
|
38
|
+
- Se público, verba ou entrega foram diferentes entre as versões, a comparação não prova causa.
|
|
39
|
+
- Sem medição, escreva "não medido" e não eleja vencedora. Entre versões, compare só o que dá para ver e entender.
|
|
40
|
+
|
|
41
|
+
## Como montar
|
|
42
|
+
|
|
43
|
+
1. Copie a pasta do projeto da base para uma pasta por versão, com o código no nome (`sala` para
|
|
44
|
+
`sala_V02_gancho-pergunta`).
|
|
45
|
+
2. Mude só a variável. Fala nova passa pelo mesmo caminho do corte da skill; o corpo aprovado fica igual.
|
|
46
|
+
3. Nome de arquivo que diz o que mudou: `[PRODUTO]_V02_gancho-pergunta.mp4`. Nunca "versao-certa", "final2" ou
|
|
47
|
+
"ultimo".
|
|
48
|
+
4. Preencha a planilha de versões (`fichas/planilha-de-versoes.csv`) e o registro de materiais
|
|
49
|
+
(`fichas/registro-de-materiais.json`).
|
|
50
|
+
|
|
51
|
+
## Primeiro a mais trabalhosa
|
|
52
|
+
|
|
53
|
+
Antes das outras, faça uma versão só: a que tem a mudança mais trabalhosa. Compare com a base, no mesmo trecho e
|
|
54
|
+
nas mesmas condições:
|
|
55
|
+
|
|
56
|
+
- só mudou o que estava planejado e o que dependia disso;
|
|
57
|
+
- a parte comum a todas as versões e as emendas dela continuam iguais: confira o meio e o fim, não só o começo (o
|
|
58
|
+
`comparar_versoes.py` de `references/revisao.md` compara dois renders fora de um trecho);
|
|
59
|
+
- oferta, valores e condições batem com a fonte usada;
|
|
60
|
+
- o arquivo exportado dela foi conferido por conta própria (formato, duração, som, legenda). A base ter passado
|
|
61
|
+
não prova nada sobre a versão.
|
|
62
|
+
|
|
63
|
+
Se a pessoa pediu para escolher ou aprovar antes, mostre e espere. Se não pediu, siga para as outras.
|
|
64
|
+
|
|
65
|
+
## Planilha de versões
|
|
66
|
+
|
|
67
|
+
Uma linha por versão, nas colunas de `fichas/planilha-de-versoes.csv`. A ficha já traz três exemplos: a base, uma
|
|
68
|
+
versão que troca só o texto escrito da abertura e uma que troca só a frase falada (em `falta gravar` até existir a
|
|
69
|
+
tomada).
|
|
70
|
+
|
|
71
|
+
A coluna `situacao` diz em que pé está a versão. Na ordem em que ela anda:
|
|
72
|
+
|
|
73
|
+
| situação | quer dizer |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `falta gravar` | depende de uma fala que ainda não foi gravada; nada se monta |
|
|
76
|
+
| `pode montar` | todo o material existe, só falta fazer |
|
|
77
|
+
| `exportada` | o arquivo saiu do render e ninguém olhou ainda |
|
|
78
|
+
| `conferida` | você passou a conferência da amostra no arquivo exportado |
|
|
79
|
+
| `fechada` | a pessoa deu o ok, ou a versão passou num critério que ela liberou |
|
|
80
|
+
|
|
81
|
+
Terminar o render ou a sua conferência não fecha versão nenhuma. Sem a origem do ok escrita em
|
|
82
|
+
`origem_da_aprovacao` (a pessoa, em tal mensagem; ou o critério que ela liberou), ela para em `conferida`.
|
|
83
|
+
|
|
84
|
+
## Registro de materiais
|
|
85
|
+
|
|
86
|
+
`fichas/registro-de-materiais.json`, junto da planilha:
|
|
87
|
+
|
|
88
|
+
- o projeto e a base preservada;
|
|
89
|
+
- cada fonte com código, caminho relativo, tipo (vídeo, áudio, imagem, fonte tipográfica), papel e origem;
|
|
90
|
+
material de terceiros com a licença ou autorização conhecida, sem presumir;
|
|
91
|
+
- o uso no tempo: o intervalo usado da origem e a posição na versão, em segundos (ou quadros com o fps), e
|
|
92
|
+
qualquer mudança de velocidade;
|
|
93
|
+
- cada versão com a hipótese, as mudanças, as fontes e onde o arquivo foi salvo;
|
|
94
|
+
- a situação de cada versão, com a origem da aprovação;
|
|
95
|
+
- sha256 quando há risco de o arquivo ser trocado mantendo o nome (`shasum -a 256 arquivo`).
|
|
96
|
+
|
|
97
|
+
Nada de senha, token, caminho pessoal absoluto ou dado de conta.
|
|
98
|
+
|
|
99
|
+
## Lote de ganchos
|
|
100
|
+
|
|
101
|
+
O caso mais comum: a pessoa grava o corpo uma vez e vários ganchos, para testar começos.
|
|
102
|
+
|
|
103
|
+
1. Um anúncio completo aprovado é o padrão (o corpo).
|
|
104
|
+
2. Cada gancho vira um vídeo: o gancho novo mais o mesmo corpo, com a mesma edição.
|
|
105
|
+
3. Só muda a abertura: a fala do gancho e o texto na tela que escreve essa fala. Se o texto na tela disser outra
|
|
106
|
+
coisa além da fala, a versão é combinação.
|
|
107
|
+
4. Nome pronto para subir: `[PRODUTO]_G01_[resumo do gancho].mp4`.
|
|
108
|
+
5. Planilha própria do lote: `fichas/matriz-de-ganchos.csv`.
|
|
109
|
+
6. O G01 é a versão mais trabalhosa: faça, confira e, se a pessoa pediu para ver, espere.
|
|
110
|
+
|
|
111
|
+
**Quem vence quando o índice, o roteiro e a fala discordam.** A fala gravada. O nome do arquivo, o
|
|
112
|
+
`INDICE.txt` ou o roteiro dizem "no editor" e a gravação diz "num editor": o `quote`, a legenda e o texto
|
|
113
|
+
na tela do gancho escrevem o que foi dito. Na dúvida entre o Whisper e o ouvido, ouça o trecho e anote em
|
|
114
|
+
`palavras-duvidosas.md`; na matriz, `gancho_falado` é a transcrição conferida, não o índice.
|
|
115
|
+
|
|
116
|
+
### Como montar: um corte e um projeto por versão
|
|
117
|
+
|
|
118
|
+
Nunca um corte só com os ganchos e o corpo repetidos um atrás do outro: o `verify_cut` não acusa a repetição e
|
|
119
|
+
a trilha corre por cima de todas as versões.
|
|
120
|
+
|
|
121
|
+
1. **Corte de cada versão.** Uma pasta `edit` por versão, ao lado da base (`<VIDEOS>/edit_G01`,
|
|
122
|
+
`<VIDEOS>/edit_G02`...), com a pasta `transcripts/` da base copiada (a transcrição das fontes é a mesma).
|
|
123
|
+
O `edl_manual.json` de cada uma é o trecho (ou trechos) do gancho seguido dos trechos do corpo **copiados
|
|
124
|
+
sem mudar nada** do `edl_manual.json` da base (mesma fonte, mesmo `start`, mesmo `end`, mesmo `beat` e
|
|
125
|
+
`quote`). Corte pela onda, render e `conferir_corte.py` em cada pasta, como em `references/corte.md`.
|
|
126
|
+
2. **Confira que o corpo ficou igual**, com a fala transcrita e a duração. Grave este script ao lado dos
|
|
127
|
+
projetos e rode com a base e cada versão:
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
# comparar_corpo.py uso: python3 comparar_corpo.py '<EDIT da base>' '<EDIT da versão>'
|
|
131
|
+
# O corpo é o fim comum dos dois cortes: os trechos do edl.json iguais (fonte, começo e fim), do último para trás.
|
|
132
|
+
import difflib, json, re, sys, unicodedata
|
|
133
|
+
from pathlib import Path
|
|
134
|
+
|
|
135
|
+
def norm(t):
|
|
136
|
+
t = unicodedata.normalize("NFKD", t.lower())
|
|
137
|
+
return re.findall(r"[a-z0-9]+", "".join(c for c in t if not unicodedata.combining(c)))
|
|
138
|
+
|
|
139
|
+
def ler(edit):
|
|
140
|
+
edit = Path(edit)
|
|
141
|
+
edl = json.loads((edit / "edl.json").read_text(encoding="utf-8"))["ranges"]
|
|
142
|
+
tl = json.loads((edit / "cut_timeline.json").read_text(encoding="utf-8"))["segments"]
|
|
143
|
+
words = json.loads((edit / "transcripts" / "cut.json").read_text(encoding="utf-8"))["words"]
|
|
144
|
+
return [(r["source"], round(r["start"], 3), round(r["end"], 3)) for r in edl], tl, words
|
|
145
|
+
|
|
146
|
+
(ea, ta, wa), (eb, tb, wb) = ler(sys.argv[1]), ler(sys.argv[2])
|
|
147
|
+
n = 0
|
|
148
|
+
while n < min(len(ea), len(eb)) and ea[-1 - n] == eb[-1 - n]:
|
|
149
|
+
n += 1
|
|
150
|
+
if n == 0:
|
|
151
|
+
sys.exit("o corpo não é o mesmo corte: o último trecho do edl.json é diferente nas duas pastas")
|
|
152
|
+
def corpo(tl, words):
|
|
153
|
+
seg = tl[len(tl) - n]
|
|
154
|
+
t0 = seg.get("audio_out_start", seg["out_start"]) - 0.02
|
|
155
|
+
return [w for w in words if w["start"] >= t0], tl[-1]["out_end"] - seg["out_start"], seg["out_start"]
|
|
156
|
+
(ca, da, ia), (cb, db, ib) = corpo(ta, wa), corpo(tb, wb)
|
|
157
|
+
print(f"corpo: {n} trechos iguais; começa em {ia:.2f} s na base e {ib:.2f} s na versão; "
|
|
158
|
+
f"dura {da:.2f} s e {db:.2f} s")
|
|
159
|
+
if abs(da - db) > 0.04:
|
|
160
|
+
print(" DIFERENTE: a duração do corpo mudou")
|
|
161
|
+
a, b = [x for w in ca for x in norm(w["text"])], [x for w in cb for x in norm(w["text"])]
|
|
162
|
+
dif = [op for op in difflib.SequenceMatcher(a=a, b=b, autojunk=False).get_opcodes() if op[0] != "equal"]
|
|
163
|
+
for op, i1, i2, j1, j2 in dif:
|
|
164
|
+
print(f" fala diferente: base \"{' '.join(a[i1:i2])}\" / versão \"{' '.join(b[j1:j2])}\"")
|
|
165
|
+
print("fala do corpo igual" if not dif else "ouça esses pontos: pode ser só a transcrição, ou o corpo mudou")
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Tem que sair `fala do corpo igual` e a mesma duração. Diferença na primeira palavra do corpo quase sempre é
|
|
169
|
+
o J-cut da emenda com o gancho novo (uns quadros) ou a transcrição: ouça a emenda antes de mexer. Anote o
|
|
170
|
+
resultado na coluna `corpo_conferido` da matriz.
|
|
171
|
+
3. **Projeto de cada versão.** Copie o projeto da base para `<PROJ>_G01` e troque `"edit"` no `projeto.json`
|
|
172
|
+
para a pasta da versão. Peças presas a uma palavra (`"em": "palavra"`) acompanham sozinhas; tempos escritos em
|
|
173
|
+
segundos no corpo mudam junto com a diferença de duração do gancho (o começo do corpo é o que o script
|
|
174
|
+
mostra): some a diferença, ou prenda a peça a uma palavra. Só as peças do gancho mudam.
|
|
175
|
+
4. **Trilha que recomeça em cada versão.** Mixe cada versão no próprio arquivo exportado, com o
|
|
176
|
+
`mixar_trilha.py` rodado uma vez por versão, com as mesmas opções (o mesmo `--entrada-em` contado do começo
|
|
177
|
+
do vídeo, ou do começo do corpo, conforme o combinado). Cada versão começa a música do início. Se a pessoa
|
|
178
|
+
quer um arquivo só para assistir o lote, junte as versões **depois** de mixadas (nunca mixe a trilha num
|
|
179
|
+
arquivo com as versões emendadas: ela correria contínua por todas).
|
|
180
|
+
5. **Conferência de cada arquivo:** o `checar_lote.py` abaixo e, se tem tela gravada ou borrão, o
|
|
181
|
+
`conferir_dados.py` em cada um (`references/revisao.md`).
|
|
182
|
+
|
|
183
|
+
**Pedido pronto**
|
|
184
|
+
```
|
|
185
|
+
Usa o anúncio aprovado da pasta [PASTA DO ANÚNCIO] como corpo.
|
|
186
|
+
Os ganchos estão na pasta [PASTA DOS GANCHOS], um por arquivo.
|
|
187
|
+
Monta um vídeo pra cada gancho, com a mesma edição do corpo. Só o gancho muda.
|
|
188
|
+
Me mostra primeiro o G01 pronto antes de fazer os outros.
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Liberar muitas versões de uma vez
|
|
192
|
+
|
|
193
|
+
1. Monte a relação (`lote.md` ou uma planilha): código, arquivo para assistir, o que difere da base, duração,
|
|
194
|
+
proporção e situação. No lote, cada item está em `falta ver`, `volta para ajuste`, `ok pelo critério` (passou
|
|
195
|
+
nos critérios que ela liberou) ou `ok da pessoa`.
|
|
196
|
+
2. Anote as autorizações que existem. Silêncio não é aprovação, e a sua conferência nunca vira `ok da pessoa`.
|
|
197
|
+
3. **A autorização cobre o lote e os critérios:** confira item a item e exporte os que passam, sem pedir
|
|
198
|
+
aprovação um por um.
|
|
199
|
+
4. **A pessoa pediu para revisar, ou há uma decisão que muda o vídeo:** entregue prévias que representem o lote,
|
|
200
|
+
junte as dúvidas numa mensagem só e não exporte os finais desses itens.
|
|
201
|
+
5. Confira cada arquivo exportado (grave no projeto e rode `python3 checar_lote.py 1080 1920 saida/*.mp4`):
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
import json, subprocess, sys
|
|
205
|
+
W, H, arquivos = int(sys.argv[1]), int(sys.argv[2]), sys.argv[3:]
|
|
206
|
+
for arq in arquivos:
|
|
207
|
+
try:
|
|
208
|
+
info = json.loads(subprocess.run(["ffprobe", "-v", "error", "-show_streams", "-show_format", "-of", "json", arq],
|
|
209
|
+
capture_output=True, text=True, check=True).stdout)
|
|
210
|
+
except (subprocess.CalledProcessError, json.JSONDecodeError):
|
|
211
|
+
print(f"{arq}: FALHOU (não abre)")
|
|
212
|
+
continue
|
|
213
|
+
v = [s for s in info["streams"] if s["codec_type"] == "video"]
|
|
214
|
+
a = [s for s in info["streams"] if s["codec_type"] == "audio"]
|
|
215
|
+
dur = float(info["format"].get("duration", 0))
|
|
216
|
+
erro = subprocess.run(["ffmpeg", "-v", "error", "-i", arq, "-f", "null", "-"], capture_output=True, text=True).stderr.strip()
|
|
217
|
+
problemas = []
|
|
218
|
+
if not v or (v[0]["width"], v[0]["height"]) != (W, H):
|
|
219
|
+
problemas.append(f"quadro {v[0]['width']}x{v[0]['height']}" if v else "sem vídeo")
|
|
220
|
+
if not a:
|
|
221
|
+
problemas.append("sem som")
|
|
222
|
+
if erro:
|
|
223
|
+
problemas.append("não toca até o fim: " + erro.splitlines()[0][:80])
|
|
224
|
+
print(f"{arq}: {dur:.2f} s · {'ok' if not problemas else 'FALHOU: ' + '; '.join(problemas)}")
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
O script diz se abre, se toca até o fim, o tamanho do quadro, se tem som e a duração. Compare a duração com a
|
|
228
|
+
da planilha. A legenda queimada ele não enxerga: olhe um quadro com fala de cada item (ou rode o
|
|
229
|
+
`helpers/texto_na_tela.py` nele).
|
|
230
|
+
6. Entregue os arquivos na pasta combinada, cada um com o seu nome, e a relação com a checagem de cada item: o que
|
|
231
|
+
passou, o que falhou e o que não deu para checar.
|
|
232
|
+
|
|
233
|
+
Não aumente a quantidade combinada. Não publique, não mande para terceiros, não compre mídia, fonte ou serviço, não
|
|
234
|
+
inicie teste de anúncio.
|