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:
João Henrique
2026-09-08 16:13:27 -04:00
parent b541f502ba
commit b9bf3b2863
76 changed files with 16147 additions and 322 deletions
+50
View File
@@ -0,0 +1,50 @@
# Glossário da análise emocional
## Modelo utilizado
O classificador local é `superb/wav2vec2-base-superb-er`, executado com
`transformers` e PyTorch. O modelo foi treinado para classificação de emoção
em fala e retorna quatro classes: `neu`, `hap`, `ang` e `sad`.
## Campos do JSON
### `emocao`
Classe emocional mais provável para o segmento de áudio.
### `confianca_emocao`
Probabilidade atribuída pelo classificador à classe escolhida, entre `0` e
`1`. Não é uma certeza nem uma medida de qualidade da transcrição. Um valor
de `0.58`, por exemplo, indica uma classificação fraca/moderada; valores
próximos de `1` indicam maior segurança relativa do modelo.
### `palavras`
Lista de palavras reconhecidas pelo Whisper, cada uma com seu intervalo de
tempo no arquivo original ou na timeline projetada.
### `caracteristicas_acusticas`
Campo reservado para medidas como pitch, energia, velocidade da fala e
pausas. Ainda não é preenchido pelo classificador atual.
## Glossário das classes
| Código | Significado | Interpretação editorial |
|---|---|---|
| `neu` | Neutral | Fala sem sinal emocional forte ou com expressão equilibrada. |
| `hap` | Happy | Sinal acústico associado a alegria, animação ou entusiasmo. |
| `ang` | Angry | Sinal acústico associado a irritação, tensão ou intensidade agressiva. |
| `sad` | Sad | Sinal acústico associado a tristeza, abatimento ou baixa energia. |
Os códigos são abreviações do modelo: `hap` significa *happy* e `ang`
significa *angry*. Eles não devem ser interpretados como diagnóstico do
estado emocional real da pessoa. Ruído, sotaque, idioma, contexto, atuação,
ironia e qualidade da gravação podem alterar a classificação.
## Decisão de uso no editor
A emoção é calculada por segmento/frase, enquanto as palavras mantêm seus
timestamps individuais. Isso permite usar a emoção como sinal editorial para
ordenar ou sugerir cortes sem atribuir uma emoção artificial a cada palavra.
@@ -0,0 +1,287 @@
# Levantamento: Apple Vision e Apple Intelligence para análise editorial de vídeo
Data: 2026-09-08
Escopo: analisar vídeos localmente, construir contexto confiável para o programa e, somente depois, pedir à IA uma seleção editorial revisável.
## Resumo executivo
A ideia é viável, mas a primeira entrega deve ser um **arquivo cronológico de contexto multimodal**, não um motor de decisão editorial. Esse arquivo será a fonte que posteriormente poderá ser lida pelo editor humano ou por uma IA de decisão.
O pipeline tem duas camadas:
1. **Apple Vision + AVFoundation** leem os frames e produzem fatos temporais: texto, rostos, pessoas, pose, códigos, saliência, qualidade, similaridade e movimento.
2. **Apple Intelligence via Foundation Models**, inicialmente opcional, pode transformar os fatos em descrições de cena e resumos. Mais adiante, outra chamada de IA poderá ler o arquivo completo e decidir cortes, permanências e ordem.
O arquivo de contexto não deve ser confundido com a decisão. A precisão temporal vem do nosso pipeline de frames e da transcrição; a IA pode interpretar e decidir depois. Toda decisão futura deverá apontar de volta para os intervalos e evidências do arquivo, para que o editor saiba “cortar ou manter” e por quê.
## O que cada tecnologia faz
### AVFoundation: acessar o vídeo com timestamp correto
AVFoundation deve ser a camada de decodificação. Ela lê o `AVAsset`, duração, taxa de frames, orientação, dimensões e amostras de vídeo (`CMSampleBuffer`/`CVPixelBuffer`). O ponto importante é preservar o timestamp do arquivo de origem e a transformação de orientação antes de entregar a imagem ao Vision.
O projeto hoje extrai uma amostra via OpenCV. Isso é suficiente para o primeiro protótipo, mas um helper Swift com AVFoundation será melhor quando precisarmos de timestamps exatos, inclusive VFR; leitura de frames próximos a cortes; orientação, HDR e color space explícitos; processamento em streaming; e `CVPixelBuffer` direto para Vision e Foundation Models.
`AVAssetReader` é a API oficial para ler dados de mídia de um `AVAsset`.
### Vision: fatos observáveis por frame
O Vision trabalha com o padrão “criar request → executar sobre imagem/frame → ler observations”. Também possui `VNSequenceRequestHandler` para requests que acompanham uma sequência de frames. As caixas usam coordenadas normalizadas; o adapter deve converter somente na borda do sistema e manter a convenção do domínio documentada.
| Capacidade | API Vision | Evidência útil para edição |
| --- | --- | --- |
| Texto em tela | `RecognizeTextRequest` / `VNRecognizeTextRequest` | texto, confiança, idioma e bounding box; localizar cartelas, placas, telas e erros de legenda |
| Regiões de texto | `DetectTextRectanglesRequest` | área de texto mesmo quando o OCR não consegue ler o conteúdo |
| Rostos | `DetectFaceRectanglesRequest` | quantidade, caixas e presença/posição de rosto |
| Landmarks faciais | `DetectFaceLandmarksRequest` | olhos, boca, sobrancelhas e contornos; útil para enquadramento e olhos fechados, não para inferir emoção |
| Qualidade facial | `DetectFaceCaptureQualityRequest` | sinal de nitidez/qualidade de captura do rosto |
| Pessoas | `DetectHumanRectanglesRequest` e requests de pessoa | presença, quantidade e ocupação aproximada |
| Pose corporal | `DetectHumanBodyPoseRequest` | juntas, posição e confiança; base para postura e ação simples |
| Mãos | `DetectHumanHandPoseRequest` | juntas da mão e confiança; base para gestos definidos por regras |
| Animais | `RecognizeAnimalsRequest` | presença de gato, cachorro e outros animais reconhecidos |
| Barcodes/QR | `DetectBarcodesRequest` | conteúdo, simbologia e localização |
| Classificação | `ClassifyImageRequest` / `VNClassifyImageRequest` | rótulos gerais e confiança; sinal de assunto, não verdade editorial |
| Similaridade visual | `GenerateImageFeaturePrintRequest` | distância entre frames; deduplicar quase-iguais e agrupar takes |
| Saliencia | `GenerateAttentionBasedSaliencyImageRequest` e `GenerateObjectnessBasedSaliencyImageRequest` | regiões que atraem atenção; apoiar crop e composição |
| Máscara de pessoa | `GeneratePersonInstanceMaskRequest` / segmentação | separar pessoa/fundo e medir ocupação |
| Estética | `CalculateImageAestheticsScoresRequest` | score auxiliar para escolher thumbnail ou frame representativo |
| Horizonte | `DetectHorizonRequest` | inclinação do horizonte; sinal técnico/compositivo |
| Movimento/tracking | `TrackObjectRequest`, `TrackRectangleRequest`, optical flow | continuidade de sujeito, deslocamento e movimento entre frames |
Essas APIs não entregam, sozinhas, “essa é a melhor tomada”, “a pessoa está nervosa” ou “este trecho deve entrar no corte”. Elas entregam observações e scores. Conceitos editoriais precisam ser derivados por regras, comparação temporal ou Foundation Models.
### Inventário ampliado da documentação
Além da tabela acima, o framework inclui estas famílias que podem entrar no Scanner conforme o caso:
| Família | O que pode ser extraído |
| --- | --- |
| Documentos | estrutura de documento, palavras, linhas, parágrafos, listas, tabelas, regiões de texto e códigos; útil para cenas com prontuário, formulário, receita ou tela organizada |
| Segmentação interativa | máscara a partir de pontos, retângulo ou rabisco; útil quando o usuário indicar manualmente o sujeito |
| Pose 3D | pontos do corpo humano em espaço 3D relativo à câmera; exige validar se o vídeo e o dispositivo fornecem resultado estável |
| Pose animal | pontos/partes do corpo de animais; útil para identificar ação em cenas com animais |
| Trajetórias | trajetória de formas em movimento parabólico; caso especializado, não um detector geral de ação |
| Contornos | linhas/arestas da imagem; útil para medir forma, desenho e mudanças bruscas, mas gera muitos dados |
| Retângulos | quadriláteros/regiões retangulares projetadas; útil para telas, documentos, quadros e superfícies |
| Mancha na lente | indício de smudge na lente em frame ou vídeo; alerta técnico |
| Registro de imagem | transformação translacional, homográfica ou alinhamento entre imagens; útil para comparar takes e estabilidade |
| Subject lifting | máscara de objetos perceptíveis ou pessoas para separar primeiro plano e fundo |
| Modelo customizado | `CoreMLRequest` executa um modelo Core ML escolhido pelo produto; as classes e atributos passam a depender do modelo distribuído por nós |
Os resultados normalmente são uma combinação de `confidence`, `boundingBox`/região normalizada, pontos/landmarks, rótulos, score, máscara, distância ou transformação. Para vídeo, cada resultado precisa receber o `timestamp` do frame; requests com estado devem usar o mesmo handler de sequência.
**O que o Vision não oferece pronto:** descrição livre de “o que está acontecendo”, emoção da fala, identidade da pessoa, intenção, qualidade narrativa, transcrição de áudio ou decisão de corte. Essas camadas vêm, respectivamente, de Foundation Models/VLM, análise de áudio, regras de privacidade, transcrição e um motor editorial posterior. O Vision pode fornecer os sinais que apoiam algumas dessas inferências, mas não deve receber esse significado como se fosse uma observação nativa.
Fontes: [Vision](https://developer.apple.com/documentation/vision), [VNSequenceRequestHandler](https://developer.apple.com/documentation/vision/vnsequencerequesthandler), [feature prints](https://developer.apple.com/documentation/vision/generateimagefeatureprintrequest) e [thumbnails de vídeo](https://developer.apple.com/documentation/vision/generating-thumbnails-from-videos).
### Foundation Models: interpretar evidências e gerar um plano
`FoundationModels` dá acesso ao `SystemLanguageModel`, o modelo de linguagem on-device que alimenta o Apple Intelligence, quando estiver disponível no dispositivo. Ele é bom para resumir transcrição e evidências; extrair entidades, assuntos e tags; classificar trechos segundo critérios fornecidos; comparar descrições de cenas; gerar JSON/Swift estruturado com `@Generable`; e propor títulos, capítulos, selects e versões para plataformas.
A documentação atual também descreve prompting multimodal: uma imagem pode ser anexada ao prompt e o modelo pode analisá-la. Isso permite enviar frames ou uma contact sheet, mas não transforma a sessão em um analisador de vídeo temporal. A orquestração de frames, timestamps e cenas continua sendo responsabilidade do nosso programa.
O desenho mais forte para nós é usar ferramentas: o modelo recebe contexto textual e pode chamar uma ferramenta controlada que consulta evidências Vision, OCR ou um índice local. A ferramenta retorna fatos; o modelo interpreta; o modelo não ganha permissão implícita para alterar o Premiere.
Limitações relevantes:
- verificar disponibilidade em runtime com `SystemLanguageModel.default.availability`;
- a janela on-device documentada é de 4096 tokens por sessão;
- registrar prompt e versão, pois o modelo muda com atualizações do sistema;
- validar respostas estruturadas; não usar texto livre como contrato de edição;
- limitar imagens por sessão, pois muitas imagens aumentam custo, latência e contexto;
- manter fallback quando o modelo local estiver indisponível.
Fontes: [Foundation Models](https://developer.apple.com/documentation/foundationmodels), [geração e tarefas](https://developer.apple.com/documentation/foundationmodels/generating-content-and-performing-tasks-with-foundation-models), [prompting multimodal](https://developer.apple.com/documentation/foundationmodels/analyzing-images-with-multimodal-prompting), [context window](https://developer.apple.com/documentation/technotes/tn3193-managing-the-on-device-foundation-model-s-context-window) e [SystemLanguageModel](https://developer.apple.com/documentation/foundationmodels/systemlanguagemodel).
## Como analisar frame a frame sem desperdiçar processamento
“Frame a frame” deve significar que cada frame escolhido tem timestamp e evidências próprias — não necessariamente processar todos os 24/30/60 frames por segundo na primeira passagem.
```text
Vídeo original
↓ AVFoundation / sampler
Frames de baixa cadência + frames ao redor de cortes
↓ Vision barato
Mapa temporal de cenas, movimento, qualidade, faces e similaridade
↓ seleção de candidatos
Frames representativos + contact sheet + transcrição por intervalo
↓ Foundation Models
Descrição, tags, ranking e plano editorial estruturado
↓ revisão
Operações Premiere com IDs e guards de revisão
```
**Passagem 1 — cobertura:** 1 frame por segundo, ou cadência ajustada à duração, mais frames imediatamente antes/depois de mudanças de cena. Usar qualidade, faces/pessoas, OCR curto, feature print e diferença entre frames.
**Passagem 2 — refinamento:** subdividir somente as cenas candidatas. Aumentar a cadência para localizar entrada/saída do sujeito, fala, gesto, olho fechado, blur, troca de enquadramento e continuidade.
**Passagem 3 — semântica:** enviar ao Foundation Models uma descrição compacta por cena e, quando necessário, uma contact sheet com poucos frames etiquetados por timestamp. A IA escolhe entre evidências já localizadas, não inventa intervalos.
O exemplo oficial da Apple para thumbnails combina score estético por amostra e feature prints para evitar frames visualmente semelhantes. É um bom ponto de partida para “melhor frame da cena”, mas o score estético deve continuar sendo somente um sinal auxiliar.
## Produto inicial: arquivo cronológico de contexto
O primeiro produto deve ser um arquivo único por projeto ou vídeo, ordenado cronologicamente. Ele funciona como um “roteiro técnico aumentado”: cada intervalo contém o que foi falado, o que aparece na imagem e os sinais que podem ajudar uma decisão futura.
Pode haver duas representações do mesmo conteúdo:
- `contexto-video.json`: formato completo, estável e consumível por máquina;
- `contexto-video.md` ou `.srt` enriquecido: leitura humana, com timestamp, transcrição e descrição da cena no mesmo bloco.
O JSON é a fonte de verdade. Markdown e SRT são visões derivadas e não devem substituir os IDs, timestamps, confiança e revisões do JSON.
Exemplo de unidade cronológica:
```json
{
"segment_id": "clip-07@42.100-49.800",
"source_id": "project-item-123",
"start": 42.1,
"end": 49.8,
"transcription": {
"text": "A frase falada neste intervalo.",
"speaker": "speaker-01",
"confidence": 0.93
},
"caption": {"text": "A frase falada neste intervalo."},
"visual": {
"description": "Pessoa em plano médio falando para a câmera.",
"objects": ["person", "microphone"],
"faces": 1,
"text_on_screen": [],
"composition": {"face_well_framed": true, "caption_area_available": true},
"technical_alerts": []
},
"speech_signals": {
"emotion": "calm",
"confidence": 0.61,
"provider": "speech_emotion_provider"
},
"representative_frames": [
{"frame_id": "clip-07@44.000", "timestamp": 44.0, "path": "frames/...jpg"}
],
"evidence_ids": ["clip-07@44.000:face-01"],
"status": "observed"
}
```
A descrição visual deve ser marcada como `observed`, `inferred` ou `unknown`. “Pessoa em plano médio” pode ser uma descrição apoiada por Vision; “parece confiante” é uma interpretação e deve carregar confiança e provider. Emoção de fala também é um sinal probabilístico, não um fato psicológico. Nunca esconder incerteza dentro de uma frase narrativa.
Esse arquivo permite ao editor navegar cronologicamente e responder, em uma etapa posterior:
- manter ou cortar este intervalo;
- escolher entre takes semelhantes;
- remover repetição, silêncio, erro técnico ou retake;
- preservar uma fala importante mesmo quando o frame não é o mais bonito;
- reorganizar trechos para uma intenção editorial específica.
## Contexto que o programa deve montar
Cada evidência deve ser persistida separadamente da interpretação:
```json
{
"evidence_id": "clip-07@12.480:face-01",
"clip_id": "clip-07",
"source_id": "project-item-123",
"timestamp": 12.48,
"interval": {"start": 12.0, "end": 13.0},
"kind": "face",
"value": {"bounding_box": {"x": 0.31, "y": 0.18, "width": 0.22, "height": 0.42}},
"confidence": 0.97,
"provider": "apple_vision",
"model_or_revision": "vision-revision-x",
"source_revision": "sha256:..."
}
```
O arquivo deve conter intenção opcional do usuário; metadados do clipe e da timeline; transcrição temporal; legenda correspondente; intervalos de cena; OCR consolidado; presença/posição de pessoas e rostos; qualidade e composição; movimento, similaridade e possíveis retakes; sinais de emoção da fala; frames representativos; limitações, falhas de provider e confiança.
Não enviar uma lista gigantesca de observações repetidas. Consolidar eventos contínuos, por exemplo `rosto presente de 12.0s a 18.4s`, mantendo os frames brutos para auditoria.
## Etapa posterior: decisão editorial por IA
Depois que o arquivo cronológico estiver validado, podemos entregá-lo a uma IA de decisão. Essa IA será complementar ao contexto, não parte obrigatória da primeira análise. Ela poderá receber:
1. o JSON completo, quando couber no contexto;
2. chunks cronológicos com estado resumido entre eles;
3. uma intenção editorial, como “vídeo de 60 segundos para apresentação”;
4. regras explícitas, como preservar falas sobre determinado assunto;
5. autorização para produzir somente uma decisão ou também um plano de edição.
Quando o arquivo for grande, não devemos simplesmente truncá-lo. O programa deve fazer chunking cronológico, consolidar o estado e gerar um resultado final com referências globais aos `segment_id` e `evidence_ids` originais.
## Contrato da saída editorial
A saída posterior da IA de decisão deve ser um artefato de planejamento, não uma edição aplicada:
```json
{
"scene_id": "scene-04",
"decision": "candidate",
"score": 0.84,
"reasons": ["fala cobre o tema", "rosto bem enquadrado", "sem alerta técnico"],
"selected_range": {"start": 42.1, "end": 49.8},
"evidence_ids": ["clip-07@42.1:...", "clip-07@47.0:..."],
"warnings": [],
"requires_review": true
}
```
Regras: `selected_range` só aponta para timestamps/evidências existentes; toda decisão tem `evidence_ids`; ausência de evidência vira `unknown`; a IA sugere trim, descarte, agrupamento e ordem, mas não escreve diretamente no projeto; o aplicador confere `source_revision` e `timeline_revision`; decisões de alto impacto exigem confirmação.
Isso encaixa no que já existe em `EditorialContextPack` e `EditorialPlan`: ambos são revision-aware, citáveis e read-only antes da aplicação.
## Situação atual do projeto
Já temos `QuadroDeVideo` com timestamp, índice, dimensões, imagem e caminho; `AnalisadorDeFrame` e `AnalisadorDeSequenciaDeQuadros`; `DetectorDeCenas`; análises OpenCV de qualidade, composição, movimento e continuidade; adapter inicial `AnalisadorAppleVision` para OCR e faces via PyObjC; adapters ONNX/Core ML e MediaPipe; e contexto editorial/plano com evidência, revisões e revisão obrigatória.
Gaps para a implementação Apple completa:
1. ampliar o adapter Vision para pose, mãos, qualidade facial, feature print, saliência, pessoa e estética;
2. adicionar runner Swift/AVFoundation para timestamps e `CVPixelBuffer`, mantendo PyObjC como protótipo;
3. consolidar evidências contínuas e gerar contact sheets etiquetadas;
4. criar `FoundationModelsProvider` separado, com disponibilidade, timeout, versão, token budget e saída tipada;
5. criar store de frames/evidências por hash do arquivo e revision;
6. testar orientação, VFR, HDR, vertical/horizontal e falha parcial de requests;
7. medir precisão editorial em fixtures reais antes de permitir aplicação automática.
## Ordem recomendada
### Fase 1 — Vision determinístico
Implementar OCR, faces, pessoas, qualidade, feature print e estética. O resultado deve ser JSON versionado por frame. Manter OpenCV para métricas existentes e comparar resultados, em vez de substituir tudo de uma vez.
### Fase 2 — cenas e selects
Combinar cortes, similaridade e qualidade para produzir cenas e frames representativos. Criar visualização de auditoria com timeline, thumbnail, timestamp, observações e confiança.
### Fase 3 — descrições de cena
Gerar descrições visuais sincronizadas com os intervalos da transcrição e produzir o JSON cronológico. Começar com descrições baseadas nos fatos Vision; usar Foundation Models somente para transformar evidências em linguagem curta, com marcação de confiança e origem.
### Fase 4 — Apple Intelligence como decisão complementar
Enviar o arquivo cronológico ou seus chunks para uma IA separada. Começar por resumo e tags; depois manter/cortar; por fim plano de edição com saída guiada e validação estrita. Se o modelo estiver indisponível, o Scanner continua entregando o arquivo completo de contexto.
### Fase 5 — Premiere
Usar o plano existente como camada de revisão. Somente depois da confirmação chamar operações de organização, stringout, rough cut, marcadores ou legendas, sempre com readback.
## Decisão
Devemos implementar **Vision como os olhos do Scanner** e um **arquivo cronológico multimodal como o produto central da primeira fase**. O Foundation Models pode ajudar a escrever as descrições de cena. Mais tarde, uma IA de decisão poderá ler esse arquivo e sugerir “corta/mantém/usa este take”, sempre apontando para os intervalos e evidências que justificam a escolha.
Essa arquitetura aproveita o Apple Silicon, preserva privacidade, funciona com o modelo local quando disponível e mantém fallback para OpenCV/ONNX/Whisper e outros hosts. Também evita confundir Apple Intelligence com Media Intelligence do Premiere: são produtos e APIs diferentes.
## Fontes oficiais
- [Apple Vision](https://developer.apple.com/documentation/vision)
- [Processar vídeo e gerar thumbnails](https://developer.apple.com/documentation/vision/generating-thumbnails-from-videos)
- [AVAssetReader](https://developer.apple.com/documentation/avfoundation/avassetreader)
- [Foundation Models](https://developer.apple.com/documentation/foundationmodels)
- [Analisar imagens com prompting multimodal](https://developer.apple.com/documentation/foundationmodels/analyzing-images-with-multimodal-prompting)
- [Gerar conteúdo e executar tarefas](https://developer.apple.com/documentation/foundationmodels/generating-content-and-performing-tasks-with-foundation-models)
- [Janela de contexto do modelo on-device](https://developer.apple.com/documentation/technotes/tn3193-managing-the-on-device-foundation-model-s-context-window)
- [SystemLanguageModel](https://developer.apple.com/documentation/foundationmodels/systemlanguagemodel)
- [Disponibilidade e dispositivos compatíveis com Apple Intelligence](https://support.apple.com/en-us/121115)
@@ -0,0 +1,217 @@
# Levantamento de ferramentas locais para análise visual
Data: 2026-09-08
Escopo: escolher a base para implementar um `ProviderDeAnaliseVisual` real no `engine/scanner`.
## Recomendação executiva
Adotar uma arquitetura em camadas:
1. **Apple Vision + Core ML** como provider principal para macOS: OCR, rostos, pessoas, poses, códigos, classificação, qualidade e similaridade visual.
2. **PySceneDetect** para detectar cortes e delimitar cenas no arquivo de origem.
3. **ONNX Runtime com CoreML Execution Provider** como runtime de modelos customizados, mantendo a possibilidade de usar os mesmos modelos em outras plataformas.
4. **MediaPipe Tasks** como alternativa especializada para pose, mãos, rosto e rastreamento quando o resultado do Vision não for suficiente.
5. **Modelo multimodal local** somente como uma etapa semântica opcional, posterior às análises determinísticas; não deve ser a fonte primária de eventos temporais.
Essa composição aproveita o Apple Silicon sem enviar mídia para a nuvem, separa fatos observáveis de interpretação e permite evoluir os modelos sem alterar o contrato do Scanner.
## Critérios usados
- execução local e offline;
- integração com macOS/Apple Silicon;
- possibilidade de obter intervalos temporais e confiança;
- suporte a frames, vídeo e processamento em lote;
- integração com Python ou bridge nativa pequeno;
- licença adequada para produto comercial;
- maturidade e manutenção do projeto;
- adequação ao nosso domínio: cenas, objetos, pessoas, OCR, qualidade e possíveis retakes.
## Candidatos
### 1. Apple Vision + Core ML — recomendação principal
O Vision oferece APIs pré-treinadas para análise de imagens e vídeo, incluindo texto, códigos, rostos, pessoas, poses, classificação, qualidade e similaridade visual. O processamento ocorre no dispositivo. Core ML executa modelos usando CPU, GPU e Neural Engine, também sem exigir conexão de rede.
**Pontos fortes**
- melhor alinhamento com o ambiente macOS existente;
- privacidade e execução local;
- bons blocos prontos para OCR, faces, pessoas, poses e qualidade;
- suporte nativo a tracking entre frames;
- possibilidade de usar modelos próprios convertidos para Core ML;
- sem dependência de um servidor Python pesado.
**Limitações**
- a API é Swift/Objective-C, não Python;
- será necessário um processo auxiliar Swift ou uma pequena bridge JSON;
- não substitui um detector geral de objetos com classes customizadas;
- os resultados são observações de visão, não uma noção editorial pronta de “take bom” ou “retake”.
**Uso recomendado no Scanner**
- `ProviderDeAnaliseVisualApple` executando um helper Swift;
- entrada: arquivo + lista de timestamps;
- saída: observações por frame, cada uma com `timestamp`, tipo, bounding box, label, confiança e provider;
- usar `VNGenerateImageFeaturePrintRequest`/similaridade visual para apoiar comparação de takes;
- usar análise de qualidade para foco, exposição e problemas técnicos quando disponível.
Fontes: [Apple Vision](https://developer.apple.com/documentation/vision), [detecção de objetos no Vision](https://developer.apple.com/documentation/vision/detecting_objects_in_still_images), [reconhecimento de texto](https://developer.apple.com/documentation/vision/recognizing-text-in-images) e [Apple Core ML](https://developer.apple.com/documentation/coreml).
### 2. PySceneDetect — recomendação para cortes de cena
Biblioteca Python/BSD-3 para detectar mudanças de cena. Possui `ContentDetector`, `AdaptiveDetector` e `ThresholdDetector`, retorna pares de início/fim e oferece integração com FFmpeg.
**Pontos fortes**
- integração direta com o engine Python;
- contrato temporal já próximo do nosso `Cena`;
- simples de testar com arquivos reais e fixtures;
- licença BSD-3-Clause;
- mais apropriado para “onde a cena muda” do que um VLM.
**Limitações**
- detecta transições visuais, não entende o conteúdo sem um segundo modelo;
- pode gerar falsos positivos com movimento de câmera, flashes e mudanças de iluminação;
- deve operar sobre o arquivo de origem e depois ser projetado para os intervalos da timeline.
Fonte: [repositório oficial PySceneDetect](https://github.com/Breakthrough/PySceneDetect).
### 3. ONNX Runtime + CoreML Execution Provider — recomendação como runtime extensível
ONNX Runtime fornece API Python e permite executar modelos ONNX com `CoreMLExecutionProvider`. As wheels oficiais para macOS incluem o provider Core ML; há opções para CPU, GPU e Neural Engine quando suportadas pelo modelo e pelo dispositivo.
**Pontos fortes**
- desacopla o Scanner do framework de treinamento;
- permite plugar modelos de detecção, classificação, pose ou embeddings;
- mantém uma rota futura para Windows/Linux por outros execution providers;
- cacheia modelos compilados do Core ML;
- API Python direta.
**Limitações**
- a compatibilidade depende dos operadores e do formato do modelo;
- precisamos controlar conversão, pré-processamento, pós-processamento e versionamento;
- usar Core ML não garante que 100% do grafo rode na Neural Engine.
**Uso recomendado no Scanner**
- runtime para modelos licenciados de forma compatível com o produto;
- um `ModeloVisualONNX` interno com adaptadores para detecção/classificação;
- fallback CPU explícito e registro do device usado no resultado.
Fonte: [ONNX Runtime — CoreML Execution Provider](https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider.html).
### 4. MediaPipe Tasks — alternativa especializada
MediaPipe oferece tarefas de visão com APIs para Python e modelos prontos, incluindo detecção de objetos, classificação, segmentação, rosto, mãos, pose e holístico.
**Quando usar**
- pose corporal, mãos, gestos e landmarks;
- tracking de pessoas em trechos curtos;
- quando quisermos manter o mesmo componente em macOS, Linux e Windows.
**Limitações**
- exige escolher e distribuir arquivos de modelo;
- a cobertura e o formato de resultados são diferentes do Vision;
- não deve ser adicionado apenas por sobreposição: primeiro precisamos de um caso que o Vision não resolva.
Fonte: [Google AI Edge — MediaPipe Object Detector para Python](https://ai.google.dev/edge/mediapipe/solutions/vision/object_detector/python).
### 5. Ultralytics YOLO — tecnicamente forte, com risco de licença
Ultralytics oferece detecção, segmentação, pose, classificação e tracking em Python, com modelos pré-treinados e treinamento customizado.
**Vantagens técnicas**
- integração rápida;
- ecossistema amplo;
- bom caminho para objetos específicos do nosso domínio;
- suporta tracking e modelos customizados.
**Risco decisivo**
O código e os artefatos são apresentados sob AGPL-3.0, e a própria documentação indica licença Enterprise para desenvolvimento e produção que não possam cumprir as obrigações da AGPL. Não devemos incorporar Ultralytics ao produto sem uma decisão jurídica/licenciamento explícita.
**Decisão**
Usar apenas em benchmark/protótipo isolado até resolver a licença. Para produção, preferir modelos e runtimes com licença compatível ou adquirir a licença Enterprise.
Fontes: [documentação oficial Ultralytics](https://github.com/ultralytics/ultralytics), [licença e opções comerciais](https://github.com/ultralytics/ultralytics/blob/main/docs/en/index.md).
### 6. OpenCV — fundação de processamento, não provider semântico
OpenCV é útil para decodificação de frames, resize, cor, blur, histograma, métricas técnicas, comparação de imagens e pré/pós-processamento. Também pode executar modelos via DNN, mas não deve ser tratado sozinho como a solução de reconhecimento semântico.
**Uso recomendado**
- extração/amostragem de frames;
- foco, exposição, contraste, ruído e estabilidade;
- diferenças entre frames;
- suporte aos providers Vision, ONNX e MediaPipe.
Fonte: [licença oficial OpenCV](https://opencv.org/license/).
## O que não recomendar como núcleo
Um VLM local pode produzir descrições como “pessoa falando em uma sala”, mas é menos determinístico, mais caro em memória e menos adequado para localizar cortes com precisão. Ele pode entrar depois para gerar descrição semântica de cenas já delimitadas, nunca substituir `PySceneDetect`, Vision ou um detector temporal.
Também não devemos começar pelo YOLO/Ultralytics como dependência central antes de resolver AGPL/licença comercial.
## Matriz resumida
| Ferramenta | Melhor uso | Python direto | Apple Silicon | Offline | Licença/risco | Decisão |
|---|---|---:|---:|---:|---|---|
| Vision | OCR, faces, pessoas, pose, qualidade, similaridade | Não | Excelente | Sim | Framework Apple | Adotar |
| Core ML | Modelos próprios no hardware Apple | Via bridge/runtime | Excelente | Sim | Framework Apple | Adotar |
| PySceneDetect | Cortes e intervalos de cena | Sim | Boa | Sim | BSD-3-Clause | Adotar |
| ONNX Runtime + CoreML EP | Runtime de modelos customizados | Sim | Excelente | Sim | MIT | Adotar como extensão |
| MediaPipe Tasks | Pose, mãos, rosto, holístico | Sim | Boa | Sim | Apache-2.0 no framework; conferir cada modelo | Avaliar por caso |
| OpenCV | Frames e métricas técnicas | Sim | Boa | Sim | Apache-2.0 | Adotar como base auxiliar |
| Ultralytics YOLO | Objetos/pose/tracking | Sim | Boa | Sim | AGPL ou Enterprise | Protótipo somente até decisão |
## Desenho proposto para o nosso código
```text
Clipe/arquivo
↓
ExtratorDeQuadros (FFmpeg/OpenCV)
↓
ProviderDeAnaliseVisual
├── AppleVisionProvider
├── PySceneDetectProvider
├── ONNXCoreMLProvider (opcional)
└── MediaPipeProvider (opcional)
↓
EvidenciaVisual(timestamp, intervalo, tipo, valor, confianca, provider)
↓
ContextoDeAnalise.caracteristicas_visuais / cenas / eventos
```
O contrato atual `ProviderDeAnaliseVisual.analisar(clipe, quadros)` é suficiente para o primeiro passo, mas a saída precisa evoluir de um `dict` livre para evidências temporais. A unidade mínima deveria conter:
- `tipo`: `ocr`, `pessoa`, `objeto`, `pose`, `qualidade`, `similaridade` ou `mudanca_de_cena`;
- `inicio` e `fim` ou `timestamp`;
- `valor` estruturado;
- `confianca` quando fornecida pelo modelo;
- `provider` e `modelo`;
- versão do modelo e hash opcional;
- referência ao arquivo/frame analisado.
## Ordem recomendada de implementação
1. Criar `ExtracaoDeQuadros` usando FFmpeg/OpenCV, com amostragem por intervalo e cache por hash do arquivo.
2. Implementar um helper Swift pequeno para Apple Vision e um `ProviderDeAnaliseVisualApple` Python que troca JSON por stdin/stdout.
3. Adicionar PySceneDetect como etapa própria de detecção de cenas.
4. Criar testes com fixture curta para OCR, presença de pessoa, qualidade e mudança de cena.
5. Medir tempo, memória, cobertura e estabilidade dos resultados em Apple Silicon.
6. Só depois adicionar ONNX/MediaPipe para lacunas concretas.
7. Avaliar um VLM local apenas para descrição semântica de cenas já delimitadas.
## Conclusão
Para o produto atual, a melhor escolha não é uma única biblioteca. É **Vision/Core ML + PySceneDetect + OpenCV**, com **ONNX Runtime/CoreML** como ponto de extensão. Essa combinação cobre a maior parte do Scanner com processamento local, preserva a privacidade e evita amarrar o domínio a uma biblioteca de modelos com licença problemática.