Engenharia Reversa de Script de Vídeo de Alta Precisão
Transformar um vídeo dinâmico num script de texto estático que pode ser reproduzido em filmagens. Critério central: o leitor deve ser capaz de "ver" o vídeo mesmo sem o assistir — o que é dito, como é dito, como o rosto muda, para quem o olhar se dirige e por que é dito dessa maneira.
Quando Utilizar
- O utilizador fornece um ficheiro de vídeo e solicita "extrair o script / analisar quadro a quadro / converter para script de texto / como este vídeo foi feito"
- Necessidade de extrair estrutura de discurso de vendas a partir de um vídeo de referência (problema → empatia → prova → preço → chamada para ação)
- Necessidade de fornecer a atores/diretores uma ficha de instruções de atuação (tom, expressões, direção do olhar)
- Necessidade de reverter a divisão de cenas e ritmo de edição a partir de um vídeo de referência
Não aplicável a: extração simples de legendas (basta usar ASR), edição de vídeo propriamente dita, transcrição musical.
Regras de Ferro (Leia estas cinco primeiro)
- Limpeza zero das falas: Mantenha "éh / ah / hum / ia / xi / oh / hm" — são evidências chave para autenticidade e atribuição de personagens; não os embeleze ou remova.
- O olhar deve ser nomeado: Escreva "【A】dirige o olhar para 【identidade específica/parte do corpo de B】+ duração da fixação". Proibido usar descrições vagas como "olha para o outro" ou "olhar profundo".
- Expressões devem descrever uma trajetória de mudança: Siga o formato
[início] → [meio] → [fim]em etapas (exemplo: arregalar os olhos → pupilas dilatarem → sobrancelhas relaxarem, lábios franzidos). Proibido usar apenas um adjetivo estático. - Tom deve descrever a textura da voz: Tom, volume, velocidade, respiração (sussurro/descontrole/sopro/suspiro), acento tónico, duração da pausa — pelo menos três destes cinco itens.
- O falante deve passar por uma cadeia de verificação: A ATRIBUIÇÃO de falantes pelo ASR está sempre errada → re-transcrição segmentada e comparação (P6) → tabela de referência de legendas segundo a segundo (P3.5) → decisão com base nos quadros dos lábios. Só após passar por todas as quatro camadas de evidência é permitido escrever 【Falante】.
Fluxo de Execução (P0–P7)
P0 Sonda de Material
ffprobe -v error -show_entries format=duration,size:stream=codec_type,codec_name,width,height,r_frame_rate \
-of default=noprint_wrappers=1 "<video>"
Com base nisto, determinar a densidade de amostragem (ver tabela abaixo) e confirmar se a faixa de áudio existe (se não, saltar P1 e inferir a partir das imagens).
| Duração | Estratégia de Extração de Quadros | Limite de Quadros | Descrição |
|---|---|---|---|
| ≤2 min | 1 quadro/2s + segmentos chave a 1 quadro/s | 60–80 | Vídeos curtos/anúncios, todos os detalhes necessários |
| 2–10 min | 1 quadro/5s | 60–100 | Curtas-metragens |
| 10–30 min | 1 quadro/10s + segmentos de gancho mais densos | 80–120 | Curtas-metragens/narrações longas, primeiros e últimos 90s a 1 quadro/3s |
| >30 min | 1 quadro/20s + amostragem segmentada | 100–150 | Apenas reconstrução a nível de capítulo, primeiro um esboço, depois aprofundamento |
Regra de Custo: O número total de chamadas ViewImage por tarefa deve ser controlado em 60 vezes, com 8 imagens em paralelo por lote; quando o número de quadros for insuficiente, dar prioridade a "pontos de viragem de expressão, close-ups de produto, close-ups de adereços, cartões de legenda".
P1 Transcrição Completa do Áudio
ffmpeg -y -v error -i "<video>" -vn -ac 1 -ar 16000 -b:a 96k audio.mp3
Usar AudioTranscribe (suporta mp3/wav/m4a/mp4, etc., ≤1GB ou 5 horas) para transcrição. Produzir texto com carimbos de tempo [início, fim, ID do falante] — será o esqueleto de todas as linhas temporais subsequentes.
Nota: Os IDs de falante devolvidos são apenas números de clusters, não são personagens; devem ser determinados em conjunto por semântica + tom + imagem.
P2 Extração de Quadros
# Primeiro, tentar deteção de mudança de cena (para vídeos com muitas transições)
ffmpeg -y -v error -i "<video>" -vf "select='gt(scene,0.15)',showinfo" -vsync vfr -q:v 3 kf_%03d.jpg 2> scene_log.txt
grep -o "pts_time:[0-9.]*" scene_log.txt | head -100
- Se menos de 10 quadros forem detetados → significa que é uma filmagem contínua com uma única câmara (narração/ato), usar extração uniforme:
-vf "fps=1/10,scale=576:-1" - O limiar pode ser reduzido para
0.08e tentar novamente; se ainda não houver transições, abandonar a deteção de cenas - Para vídeos verticais curtos, usar uniformemente
scale=576:-1, suficiente para ver expressões sem desperdiçar tokens
P3 Visualização em Lote de Quadros
Visualizar 8 quadros em paralelo por lote com ViewImage, template de consulta uniforme (para garantir comparabilidade):
Descreve este quadro de vídeo vertical: aparência da pessoa, expressão, ação, cenário, vestuário, texto da legenda, composição
Pontos importantes na leitura dos quadros:
- Direção das relações entre personagens (quem puxa quem, quem persegue quem, quem é levado, quem entra em que carro) deve ser confirmada pelos quadros — o ASR nunca te dirá isto; quando dois adultos do mesmo sexo aparecem na mesma cena, o ID do cluster não pode ser usado diretamente como personagem
- Texto da legenda é uma informação de alto valor gratuita (marca de água do título, nome da marca, legenda do produto, preço, aviso legal, nome de personagem na fala) — copiar quadro a quadro; os nomes que aparecem na legenda (ex.: «Gu Chuan, não demores») combinados com "quem está a ser puxado" na imagem são provas irrefutáveis de atribuição de fala
- Notar elementos constantes (marca de água, legenda de aviso, logótipo) — colocá-los no cabeçalho do documento
- Lembrar os segundos correspondentes a cada quadro (kf_001 = 0s, kf_002 = 10s…) — serão necessários mais tarde para as descrições de cena
P3.5 Grelha de Legendas do Vídeo Inteiro: Criar Tabela de Referência de Fala Segundo a Segundo (Primeira Evidência de Atribuição de Falante)
Para vídeos com legendas incorporadas (curtas-metragens/vídeos de vendas quase sempre têm), obter primeiro a "resposta oficial" das falas:
# Cortar uma faixa de legenda por segundo (primeiro extrair um quadro completo para confirmar a posição vertical da legenda, neste exemplo y=710 altura 140)
ffmpeg -y -v error -i "<video>" -vf "fps=1,crop=576:140:0:710,drawtext=fontfile='<font>':text='%{pts\:hms}':x=8:y=6:fontsize=24:fontcolor=white:box=1:[email protected],tile=3x10" -q:v 3 sub/grid%02d.jpg
- 30 quadros/imagem → para um vídeo de 14 minutos, cerca de 29 imagens, ler cada uma com
ViewImagepara extrair «carimbo de tempo → texto da legenda» - Legendas com borda azul/branca são geralmente legendas de transição de narração (ex.: «Os dois foram forçados a separar-se»), categorizar separadamente, não misturar com falas
- Legendas de duas linhas podem ser cortadas, perdendo a metade superior — em caso de dúvida, voltar ao quadro completo desse segundo
Esta tabela de referência segundo a segundo resolve de uma só vez quatro tipos de problemas: frases em falta, frases a mais, erros de texto (ele/ela), atribuição de partículas de fala — quando ASR e legenda entram em conflito, confiar primeiro no texto da legenda e depois usar os quadros dos lábios para decidir o falante (a legenda não indica quem fala).
P4 Construir o Esqueleto: Dividir o Fluxo de Fala em Segmentos de Cena
- Usar os carimbos de tempo do ASR como eixo, cortar por mudança de cena/espaço (mudança de local, mudança de interlocutor, mudança de tom emocional)
- Formato de nome de cada segmento:
⏱️ [mm:ss - mm:ss] Nome do Evento (Anotação Funcional), ex.:[04:15 - 05:10] A Tentativa na Mesa de Cuidados · Primeira Aparição do Bálsamo Labial - No início do segmento, escrever
> Descrição da Cena:(luz, composição, posição dos objetos principais, posição das personagens) - As falas dentro do segmento são organizadas linha por linha por ordem cronológica; quando várias pessoas falam ao mesmo tempo, colocar em linhas separadas e anotar "(aqui, a falar simultaneamente com X)"
P5 Preenchimento das Cinco Dimensões (Cinco Etiquetas Abaixo de Cada Linha de Fala)
| Etiqueta | Conteúdo Obrigatório |
|---|---|
| 🎙️ Textura da Voz | Direção do tom / Volume / Velocidade / Respiração (sussurro·descontrole·sopro·suspiro) / Acento tónico em que palavra / Pausa de quantos segundos |
| 😐 Trajetória da Mudança de Expressão | Três fases [início]→[meio]→[fim], escrevendo movimentos específicos de sobrancelhas, olhos, boca, asas do nariz, mandíbula |
| 👀 Interação Visual | O olhar de 【sujeito】 dirige-se para 【objeto nomeado】, duração da fixação; o movimento do olhar deve descrever o percurso |
| 🙌 Detalhes da Ação | Postura das mãos, orientação do corpo, trajetória de movimento, interação com adereços (dar prioridade a microações como nós dos dedos a branquear/cerrar/pontas dos dedos a tremer) |
| 🫧 Aura e Atitude | Uma frase para定性 o estado psicológico da pessoa naquele momento (perspetiva do realizador, não repetir a expressão) |
As partículas de fala devem ser analisadas como frases separadas: um "hm" deve ser descrito se é um som nasal ou gutural, se é um riso de desprezo ou uma rendição, e o intervalo até à próxima frase — isto determina de quem é a fala.
P6 Segunda Ronda de Verificação Cruzada (Valor Central desta Skill, Não Pode Ser Ignorada)
Problema: A transcrição do vídeo inteiro de uma só vez pode juntar as falas de duas pessoas adjacentes, escrever "ele" e "ela" como o mesmo caractere, transformar perguntas em afirmações.
Procedimento: Selecionar 4–6 "segmentos de alto risco" para re-transcrição e comparar linha a linha com o texto completo.
Características de segmento de alto risco (se alguma for encontrada, cortar o segmento):
- Um segmento com ≥2 personagens a dialogar (especialmente segmentos sussurrados, discussões, cenas de multidão)
- Dois adultos do mesmo sexo na mesma cena (tons de voz semelhantes, a clusterização facilmente funde-os num único ID)
- Aparecimento de "ele/ela" com possível ambiguidade de referência
- Sobreposição de frases, interrupções, fala simultânea
- Partículas de fala isoladas como frases (hm/oh/éh/ah)
- Cenas de despedida, luta, perseguição, estação de comboio ("quem é levado, quem persegue" é muito fácil de inverter)
- Intervalo de carimbo de tempo >20 segundos com ID de falante inalterado (indica que foi fundido)
# Cortar segmento de 70–90 segundos (evitar limites de silêncio, deixar 1s de margem antes e depois)
ffmpeg -y -v error -ss 15 -t 75 -i "<video>" -vn -ac 1 -ar 16000 -b:a 96k seg1.mp3
Executar AudioTranscribe para cada segmento e depois julgar segundo a tabela:
| Tipo de Diferença | Método de Julgamento | Tratamento |
|---|---|---|
| Inversão de falantes | Ver no segmento se as posições de fala alternam (A/B/A/B); combinar com movimento dos lábios e causalidade da trama | Seguir o padrão de alternância + lógica da trama, adicionar 📌 Nota de Revisão no texto |
| Confusão ele/ela | Homófonos estão sempre errados, reescrever de acordo com o género real da pessoa referida | Corrigir diretamente, não manter o caractere original |
| Frase em falta (ausente no texto completo) | Frase que aparece no segmento mas não no texto principal | Adicionar de volta, ajustando simultaneamente a linha temporal dentro do segmento |
| Frase fundida que precisa de ser dividida | Sujeito e verbo inconsistentes numa frase ("Vai rápido não demores eu espero") | Dividir em 2–3 linhas por semântica, atribuir cada uma ao seu falante |
| Erro de julgamento pergunta/afirmação | Ver se o tom sobe no final, se há semântica de "?" | Frases de acusação usar "!", perguntas de investigação usar "?" |
| Voz off vs. sussurro audível | Ver no segmento se a posição de fala é contínua com as anteriores, se há mudança de faixa de áudio | Posição contínua = sussurro audível, anotar "o outro não ouviu" em vez de "monólogo interior" |
| Inversão de direção da ação | Ver nos quadros: quem está a puxar quem, quem entra em que carro, a quem a legenda se dirige | Inverter e reescrever todo o segmento, adicionar 📌 Nota de Revisão com evidência dos quadros |
Terceira ronda de verificação visual: Para conclusões que envolvam direção da ação, relação entre personagens (quem é levado/quem persegue/quem puxa quem), a comparação puramente textual da segunda ronda não é suficiente para decidir — é necessário voltar à extração densa de quadros (1 quadro/s) para verificar e usar falas posteriores que referenciam o passado (ex.: "Há 15 anos, afastaste-me") para inferir e travar. Ver caso real em references/pitfalls.md #9.
Quarta ronda de verificação com tabela de referência de legendas: Antes da entrega, usar a tabela de referência de legendas segundo a segundo do P3.5 para alinhar uma a uma com o script — sempre que o texto do script não corresponder ao texto da legenda, ou houver uma frase na legenda que não está no script, corrigir/adicionar uma a uma; para pontos com dúvidas de atribuição, extrair quadro completo para ver o movimento dos lábios para decidir (momento de extração = segundo em que a legenda aparece). Duas regras especiais:
- Flashback com áudio a transbordar: Após o fim da cena de flashback, o áudio original pode continuar na cena real (ex.: na cena real, a mãe está de lábios fechados, mas a legenda mostra um "xiu" de infância) — a atribuição segue a faixa de áudio, não a imagem;
- O "ela" na legenda pode não ser feminino: As legendas originais muitas vezes confundem ele/ela, julgar pelo semântico e por referências posteriores para determinar a referência real, mas ao citar a legenda original, manter o texto original e anotar.
O registo de verificação deve ser incluído no entregável (tabela: ponto temporal / texto original / texto após verificação / base de julgamento + grau de coincidência + itens de incerteza restantes) — é o certificado de credibilidade do script.
P7 Entrega e Auto-Verificação
Produzir um único ficheiro Markdown, estrutura conforme references/script-template.md; antes da entrega, verificar item por item em references/qc-checklist.md.
Finalmente, usar present_files para apresentar e incluir na resposta: conclusão de identificação do vídeo (nome do programa/categoria/duração), resumo da trama principal numa frase, estrutura de vendas, número de correções feitas nesta verificação.
Ferramentas de Script
scripts/extract_assets.sh executa de uma só vez: sonda → áudio → deteção de cena → extração uniforme de quadros → corte de segmentos de alto risco:
bash scripts/extract_assets.sh "<video>" "<outdir>" [intervalo de quadros em segundos]
# Exemplo: bash scripts/extract_assets.sh ./v.mp4 ./frames 10
O script produz probe.txt, audio.mp3, kf_*.jpg (com tabela de correspondência número de quadro↔segundo), scene_log.txt, e imprime o número de quadros/duração como uma tabela de carga de trabalho.
Ficheiros de Referência
references/script-template.md— Esqueleto completo do entregável (perfil do personagem / tabela geral de tom e expressão / cinco dimensões por segmento / metodologia de vendas / ficha de instruções de atuação / registo de verificação)references/qc-checklist.md— Lista de 16 itens de auto-verificação antes da entregareferences/pitfalls.md— 10 tipos de erros frequentes e contramedidas (com casos reais)
Convenções de Saída
- Formato de tempo uniforme
mm:ss(acima de 1 hora usarhh:mm:ss), no título do parágrafo escrever o intervalo, nos blocos de fala pode-se marcar segundos individuais - Nome do personagem uniforme: escrever o nome completo na primeira ocorrência, no texto principal usar 【】, ex.:
【Mãe Gu】 - O mesmo personagem com identidades diferentes (pseudónimo/infância/adulto) deve ser arquivado separadamente, e no arquivo escrever a correspondência
- Nome do produto, nome da marca, preço devem ser verificados quadro a quadro nas legendas (o ASR frequentemente ouve mal os nomes de marcas, ex.: "Suco de cenoura húmido" → "Beta-caroteno")