feat: criado repositório jhonny-editor no Gitea
criado repositório jhonny-editor no Gitea adicionado script admin/deploy.command com commit automático atualizado admin/DEV-NOTES.md com template limpo Resumo: - 48 arquivos alterados - 26 novos - 19 modificados - 3 removidos 22 files changed, 658 insertions(+), 568 deletions(-) Arquivos: - AGENTS.md - admin/DEV-NOTES.md - admin/OpenCut.command - admin/commit.command - admin/deploy.command - admin/update.command - code/cep-plugin/index.html - code/cep-plugin/main.js - code/cep-plugin/styles.css - code/engine/ARQUITETURA.md - code/engine/arquitetura/README.md - code/engine/gerar_relatorio_timeline.py - code/engine/integracoes/apple_speech/apple_speech_transcriber.swift - code/engine/integracoes/apple_speech/provider_de_transcricao_apple.py - code/engine/integracoes/midia/__init__.py - code/engine/integracoes/whisper/provider_de_transcricao_local.py - code/engine/scanner/__init__.py - code/engine/scanner/coordenacao/__init__.py - code/engine/scanner/descoberta/__init__.py - code/engine/scanner/modelos.py - code/engine/scanner/transcricao_da_timeline.py - code/src/tools/discovery.ts - :memory:.ses - admin/Jhonny.command - admin/inativos/OpenCut.command - admin/inativos/update.command - code/docs/glossario-analise-emocional.md - code/docs/levantamento-apple-vision-e-apple-intelligence.md - code/docs/levantamento-ferramentas-analise-visual-local.md - code/engine/arquitetura/biblioteca-inteligente-de-videos.md - code/engine/executar_scanner.py - code/engine/integracoes/huggingface/ - code/engine/integracoes/midia/extracao_de_metadados.py - code/engine/integracoes/visual/ - code/engine/requirements-visual.txt - code/engine/scanner/configuracao_visual.py - code/engine/scanner/descoberta/descoberta_de_arquivos.py - code/engine/scanner/metadados.py - code/engine/scanner/relatorio_visual.py - code/engine/scanner/retakes/ - code/engine/scanner/visual.py - code/engine/testes/test_analise_visual_local.py - code/engine/testes/test_arquivos_e_metadados.py - code/engine/testes/test_provider_de_transcricao_apple.py - code/relatorios/analise-brools/ - code/relatorios/analise-visual/ - code/relatorios/audio/arquivos/ - code/relatorios/transcricao-timeline.md
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
# Análise visual local
|
||||
|
||||
## Configuração no painel
|
||||
|
||||
A configuração do Scanner é apresentada na aba **Scanner** do painel CEP em
|
||||
`code/cep-plugin/`. O perfil salvo segue o contrato versionado de
|
||||
`ConfiguracaoVisualDoScanner`; ele define amostragem, faixas, recursos Vision,
|
||||
cenas, continuidade, reenquadramento e interpretação antes de montar os
|
||||
adapters.
|
||||
|
||||
## Acesso à timeline do Premiere
|
||||
|
||||
Quando a análise precisar ler a timeline, a sequência ativa, as faixas ou os
|
||||
clipes do Premiere, use sempre a classe existente
|
||||
`engine.integracoes.premiere.leitura.AcessoAoEditor`. O módulo visual não deve
|
||||
criar chamadas MCP, abrir processos do Premiere ou acessar o bridge diretamente.
|
||||
|
||||
O acesso deve seguir esta composição:
|
||||
|
||||
```python
|
||||
from engine.integracoes.premiere.leitura import AcessoAoEditor, AcessoATimeline
|
||||
from engine.scanner import DescobertaDaTimeline
|
||||
from engine.integracoes.premiere.conversores import ConversorDeTimeline
|
||||
|
||||
acesso_ao_editor = AcessoAoEditor(AcessoATimeline(cliente_mcp))
|
||||
descoberta = DescobertaDaTimeline(acesso_ao_editor, ConversorDeTimeline())
|
||||
```
|
||||
|
||||
Depois, a timeline convertida entra no `ContextoDeAnalise` e o Scanner executa
|
||||
`AnaliseVisualDaTimeline`. A classe de acesso isola o MCP e preserva a separação
|
||||
entre a integração com o Premiere e os analyzers locais.
|
||||
|
||||
Não duplicar esse acesso em novos adapters ou analyzers. Para testes, injetar um
|
||||
fake de `AcessoAoEditor`/`AcessoATimeline` ou usar uma timeline de domínio pronta.
|
||||
|
||||
## Captura para análise visual
|
||||
|
||||
A análise visual não exporta um frame renderizado pelo Premiere. Para cada clipe
|
||||
de vídeo, o fluxo usa os campos retornados pelo MCP em `get_active_sequence`:
|
||||
|
||||
1. `sourceFile` identifica o arquivo original do `projectItem`.
|
||||
2. `inPoint` e `outPoint` delimitam o trecho usado pelo clipe.
|
||||
3. O extrator abre `sourceFile` localmente e amostra o primeiro frame do trecho,
|
||||
usando `inPoint` como tempo inicial na origem.
|
||||
4. Vision/OpenCV/ONNX recebem esse frame persistido, mantendo o timestamp de
|
||||
origem; nenhum frame é exportado da timeline do Premiere.
|
||||
|
||||
Portanto, `start`/`end` são tempos da timeline e `inPoint`/`outPoint` são tempos
|
||||
do arquivo original. Não misturar esses relógios ao analisar um clipe.
|
||||
|
||||
O Scanner usa apenas as interfaces em `contratos.py`. As bibliotecas externas
|
||||
ficam em adapters concretos, para que possam ser habilitadas, substituídas ou
|
||||
testadas isoladamente.
|
||||
|
||||
| Papel | Adapter |
|
||||
| --- | --- |
|
||||
| Extrair frames | `ExtratorDeQuadrosOpenCV` |
|
||||
| Medir qualidade | `AnalisadorDeQualidadeOpenCV` |
|
||||
| Rosto e olhos visíveis | `AnalisadorDeRostosOpenCV` |
|
||||
| Composição e área para legendas | `AnalisadorDeComposicaoOpenCV` |
|
||||
| Tremor/movimento de câmera | `AnalisadorDeTremorOpenCV` |
|
||||
| Continuidade e frame congelado | `AnalisadorDeContinuidadeOpenCV` |
|
||||
| Detectar objetos | `AnalisadorDeObjetosONNX` |
|
||||
| Detectar pose e mãos | `AnalisadorDePoseMediaPipe` |
|
||||
| OCR e faces macOS | `AnalisadorAppleVision` |
|
||||
| Vision + Apple Intelligence (Swift isolado) | `AnalisadorAppleVisionNativo` |
|
||||
| Similaridade temporal por feature print | `AnalisadorSequenciaAppleVisionNativo` |
|
||||
| Extrair frames para Vision sem OpenCV | `ExtratorDeQuadrosFFmpeg` |
|
||||
| Detectar cenas | `DetectorDeCenasPySceneDetect` |
|
||||
|
||||
`AnalisadorDeObjetosONNX` exige dois adapters específicos do modelo:
|
||||
`preparar(imagem, entradas)` e `decodificar(saidas, quadro)`. Isso mantém os
|
||||
detalhes de cada arquivo ONNX fora do Scanner e permite trocar de modelo sem
|
||||
alterar a interface do domínio.
|
||||
|
||||
`AnalisadorDePoseMediaPipe` recebe caminhos explícitos para os arquivos `.task`
|
||||
de pose e mãos. Os modelos ficam em `/Volumes/Merongo/SISTEMAS/MODELOSIA/mediapipe/`
|
||||
e não são acoplados ao pacote Python. Ele executa em subprocesso: falhas nativas
|
||||
do MediaPipe são contidas e retornam como indisponibilidade do adapter, sem
|
||||
encerrar o processo do Scanner.
|
||||
|
||||
`AnalisadorDeRostosOpenCV` usa os arquivos locais
|
||||
`haarcascade_frontalface_default.xml` e `haarcascade_eye.xml`. Quando a
|
||||
distribuição do OpenCV não os incluir, forneça `diretorio_de_modelos` apontando
|
||||
para a pasta que os contém.
|
||||
|
||||
`AnalisadorAppleVisionNativo` é a opção Apple recomendada. Seu runner Swift
|
||||
executa faces/landmarks, qualidade facial, pessoas, pose, mãos, OCR,
|
||||
classificação e estética de forma independente. A interpretação editorial pelo
|
||||
`FoundationModels` só é criada a partir dessas evidências e é salva em separado.
|
||||
Falhas nativas por recurso viram `diagnostico_apple_vision`, sem derrubar o
|
||||
Scanner nem descartar os fatos que funcionaram.
|
||||
|
||||
Além de rostos, pessoas, pose, mãos, OCR, categorias e estética, o runner
|
||||
Apple retorna códigos/QR, horizonte, retângulos, densidade de contornos,
|
||||
ocupação da máscara de pessoas e similaridade visual entre frames. Os valores
|
||||
são fatos normalizados; descrição, contexto e ação devem ser derivados depois,
|
||||
a partir dessas evidências temporizadas.
|
||||
|
||||
## Montagem
|
||||
|
||||
```python
|
||||
from engine.integracoes.visual import (
|
||||
AnalisadorDeQualidadeOpenCV,
|
||||
AnalisadorDeRostosOpenCV,
|
||||
AnalisadorDeComposicaoOpenCV,
|
||||
AnalisadorDeTremorOpenCV,
|
||||
AnalisadorDeContinuidadeOpenCV,
|
||||
DetectorDeCenasPySceneDetect,
|
||||
ExtratorDeQuadrosOpenCV,
|
||||
)
|
||||
from engine.scanner.visual import DetectorDeCenas
|
||||
|
||||
detector = DetectorDeCenas(
|
||||
ExtratorDeQuadrosOpenCV(intervalo_em_segundos=1.0, diretorio_de_cache=".frames"),
|
||||
analisadores_de_frame=[
|
||||
AnalisadorDeQualidadeOpenCV(), AnalisadorDeRostosOpenCV(),
|
||||
AnalisadorDeComposicaoOpenCV(),
|
||||
],
|
||||
analisadores_de_sequencia=[
|
||||
AnalisadorDeTremorOpenCV(), AnalisadorDeContinuidadeOpenCV(),
|
||||
],
|
||||
detectores_de_intervalo=[DetectorDeCenasPySceneDetect()],
|
||||
)
|
||||
```
|
||||
|
||||
Depois, passe esse `DetectorDeCenas` para `AnaliseVisualDaTimeline` ao montar o
|
||||
`PipelineDoScanner`.
|
||||
|
||||
Para o caminho local padrão, a montagem pode ser reduzida a:
|
||||
|
||||
```python
|
||||
from engine.scanner import AnaliseVisualDaTimeline, PipelineDoScanner, criar_detector_visual_local
|
||||
|
||||
pipeline = PipelineDoScanner([AnaliseVisualDaTimeline(criar_detector_visual_local())])
|
||||
contexto = pipeline.executar(contexto)
|
||||
```
|
||||
|
||||
O resultado fica em `contexto.caracteristicas_visuais` (por clipe),
|
||||
`contexto.cenas_visuais` (cenas com observações) e `contexto.avisos`.
|
||||
Quando OpenCV/FFmpeg ou outro adapter opcional não estiver disponível, o clipe
|
||||
é marcado com `disponivel=False` e os demais continuam sendo processados.
|
||||
|
||||
## Montagem recomendada para Apple Vision
|
||||
|
||||
```python
|
||||
from engine.scanner import AnaliseVisualDaTimeline, PipelineDoScanner, criar_detector_apple_vision
|
||||
|
||||
pipeline = PipelineDoScanner([
|
||||
AnaliseVisualDaTimeline(criar_detector_apple_vision(intervalo_em_segundos=1.0)),
|
||||
])
|
||||
```
|
||||
|
||||
Esse detector extrai PNGs do arquivo original com FFmpeg, usando o intervalo
|
||||
`inPoint`/`outPoint` do clipe, e não exporta imagens renderizadas pelo Premiere.
|
||||
Ele também recua a amostra no fim de vídeos muito curtos quando não há um frame
|
||||
decodificável exatamente no timestamp solicitado.
|
||||
|
||||
Os analyzers de sequência não tentam concluir a intenção de uma pessoa. Eles
|
||||
retornam indícios temporais (`possivel_tremor`, `possivel_descontinuidade` e
|
||||
`possivel_frame_congelado`) para que a camada editorial decida como tratá-los.
|
||||
Reference in New Issue
Block a user