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
@@ -0,0 +1,31 @@
# Teste de transcrição local — `0E6A8870.MP4`
## Configuração
- Modelo: `faster-whisper-base`
- Idioma: `pt`
- Dispositivo: CPU
- Quantização: `int8`
- Provider: `ProviderDeTranscricaoLocal`
- Origem: `/Volumes/Merongo/PROJETOS/brools/0E6A8870.MP4`
- Duração do vídeo: aproximadamente `6,05 s`
## Desempenho
| Medição | Resultado |
|---|---:|
| Carregamento do modelo | 1,849 s |
| Transcrição | 0,802 s |
| Memória máxima do processo | aproximadamente 665 MB |
## Resultado temporal
| Início | Fim | Texto reconhecido |
|---:|---:|---|
| 0,000 s | 6,000 s | “a mais é fazer bem pesado, porque não vai fazer as boguinhas que a gente ame de 11, então aqui...” |
## Observações
O processamento local funcionou sem autorização do Apple Speech e sem acesso de rede. O modelo `base` foi rápido para este arquivo curto, mas a transcrição apresenta baixa clareza em parte do trecho; a qualidade deve ser comparada com o modelo `small` antes de escolher o perfil definitivo.
Para o catálogo SQLite, este resultado deve ser persistido como um segmento de transcrição associado ao identificador do ativo e à versão do modelo. O modelo carregado deve permanecer reutilizável pelo worker, evitando pagar o custo de 1,849 s a cada arquivo.
@@ -0,0 +1,64 @@
# Teste de indexação — `0E6A8873.MP4`
## Identificação do ativo
- Origem: `/Volumes/Merongo/PROJETOS/brools/0E6A8873.MP4`
- Tamanho: `354.817.464` bytes
- Fingerprint parcial SHA-256: `d1072c11b67454a6e2eb0422ca037b1648a1ed05725ab2064c2e01d7194f2fdc`
- Duração: `23,315 s`
- Vídeo: H.264, `3840 × 2160`, aproximadamente `23,976 FPS`
- Áudio: AAC, 2 canais, `48 kHz`
## Resultado por etapa
| Etapa | Status | Tempo | Resultado |
|---|---|---:|---|
| FFprobe/metadados | concluída | 0,097 s | Metadados técnicos lidos |
| Extração de áudio | concluída | 0,078 s | WAV mono, 16 kHz, 745.570 bytes |
| Amostragem visual simples | concluída | 2,147 s | 23 frames, 1 FPS, reduzidos para 640 px |
| Apple Speech `pt-BR` on-device | autorização pendente | 0,011 s | Código 4: permissão não concedida |
## Interpretação
O pipeline barato de preparação é viável para processamento em segundo plano. Para este arquivo, a leitura técnica e a extração de áudio são praticamente instantâneas; a amostragem visual reduzida é a etapa mais custosa entre as etapas executadas, mas ainda terminou em aproximadamente 2,1 segundos.
O Apple Speech não apresentou mais o crash `SIGABRT`. O processo Foundation-only iniciou normalmente e retornou um erro controlado de autorização. Depois que o bundle receber permissão de reconhecimento de fala no macOS, esta mesma etapa poderá ser repetida sem alterar o catálogo nem as etapas já concluídas.
## Como isso será armazenado no SQLite
Este teste deverá produzir, conceitualmente:
```text
ativos
id = UUID interno
caminho_relativo = 0E6A8873.MP4
fingerprint = d1072...
tamanho = 354817464
duracao = 23.314958
status = parcial
trabalhos_de_indexacao
ativo_id = ...
etapa = metadados
status = concluida
tempo = 0.097
trabalhos_de_indexacao
ativo_id = ...
etapa = amostragem_visual
status = concluida
checkpoint = 23.315
trabalhos_de_indexacao
ativo_id = ...
etapa = transcricao
status = aguardando_autorizacao
provider = Apple Speech
locale = pt-BR
```
Os frames e o WAV são cache reconstruível e não devem ser tratados como o cadastro principal. Quando houver transcrição e análise visual, seus segmentos e evidências serão gravados com timestamps no arquivo de origem.
## Próximo teste
Conceder a permissão do Apple Speech ao bundle do transcritor e repetir somente a etapa de transcrição deste arquivo. Em seguida, comparar a qualidade do resultado antes de enfileirar os demais 23 arquivos.
@@ -0,0 +1,50 @@
# Descrição preliminar das cenas — próximos quatro vídeos
## Escopo
Este relatório complementa `proximos-4-transcricoes.md`. A transcrição foi executada
com `ProviderDeTranscricaoLocal`; a análise visual foi tentada através de
`AnalisadorAppleVisionNativo.analisar(QuadroDeVideo)`, usando frames PNG reduzidos
para 640 px de largura.
## Observações preliminares dos frames amostrados
Estas descrições são uma inspeção visual dos frames de teste e ainda não devem ser
gravadas como evidência automática definitiva no catálogo.
| Arquivo | Descrição preliminar |
|---|---|
| `0E6A8871.MP4` | Close de uma mão segurando uma caneta sobre um tablet. A tela mostra um diagrama de rosto com marcações/pontos; a ação principal é indicar ou marcar regiões do rosto. |
| `0E6A8872.MP4` | Mulher de blusa vermelha e cabelo preso demonstra algo usando uma caneta e um tablet com diagrama facial. Há alternância entre enquadramento da apresentadora e close do tablet/caneta. |
| `0E6A8873.MP4` | Demonstração presencial: mulher de blusa vermelha aparece junto de outra pessoa em posição reclinada e, em outro momento, junto de uma pessoa sentada. A atividade visível parece envolver indicação/avaliação da região facial, mas a finalidade não foi inferida. |
| `0E6A8874.MP4` | Plano médio frontal da mulher de blusa vermelha falando e gesticulando. Em alguns momentos ela aponta ou toca o próprio rosto; há um objeto/tablet no primeiro plano. |
## Resultado técnico da tentativa automática
O adapter existente foi chamado corretamente, sem criar uma implementação paralela:
```text
AnalisadorAppleVisionNativo(
recursos=("pessoas", "categorias", "ocr"),
interpretar_com_apple_intelligence=False,
).analisar(QuadroDeVideo(...))
```
O retorno não trouxe `pessoas`, `categorias` nem `ocr`. Trouxe somente uma
evidência `diagnostico_apple_vision`, com estes avisos:
- `pessoas`: falha ao carregar o modelo ANE do Vision;
- `ocr`: erro genérico do framework;
- `categorias`: falha ao criar `CVPixelBufferPool` com dimensões zeradas.
O fallback `AnalisadorDeRostosOpenCV`, `AnalisadorDeComposicaoOpenCV` e
`AnalisadorDeQualidadeOpenCV` também não pôde ser executado neste teste porque o
interpretador usado pelo engine não possui `cv2` instalado.
## Decisão para o catálogo
As descrições acima devem ficar, por enquanto, como resultado de validação manual
do teste. O catálogo deve armazenar a etapa visual como `parcial`/`indisponível`,
preservando os avisos técnicos e os frames amostrados para reprocessamento. Não
devemos registrar como fato automático algo que o Vision não confirmou.
@@ -0,0 +1,59 @@
# Teste de transcrição — próximos quatro vídeos
## Configuração comum
- Provider: `ProviderDeTranscricaoLocal`
- Modelo: `faster-whisper-base`
- Idioma: `pt-BR`
- Dispositivo: CPU
- Cálculo: `int8`
- Modelo carregado uma única vez: `1,613 s`
- Memória máxima observada no processo: aproximadamente `805 MB`
## Desempenho
| Arquivo | Duração | Tempo de transcrição |
|---|---:|---:|
| `0E6A8871.MP4` | 5,797 s | 4,213 s |
| `0E6A8872.MP4` | 17,726 s | 1,377 s |
| `0E6A8873.MP4` | 23,315 s | 1,737 s |
| `0E6A8874.MP4` | 14,556 s | 1,300 s |
Tempo de transcrição dos quatro arquivos: `8,627 s`, além do carregamento inicial do modelo.
## Segmentos reconhecidos
### `0E6A8871.MP4`
- `[0,000–3,840]` Tende um pouquinho mais aqui, acho que pode dratar um pouquinho mais a pé, se eu
- `[3,840–5,580]` doutora do entratante, a noite, ouzo.
### `0E6A8872.MP4`
- `[0,000–3,360]` Então, por isso que eu vou fazer tanto, não se paguei nem com um pouquinho mais lá para trás.
- `[4,120–10,580]` E, espero, por biculares aqui, que é o musco orbicular da boca, que ele serve com o esfímpere, ele fecha sim, né?
- `[10,900–14,700]` Então, quando você faz o biquinho, fica três movinhas de um lado,
- `[15,020–17,680]` é uma, dois de cada lado, basicamente só que essas daqui são um pouco...
### `0E6A8873.MP4`
- `[0,000–4,700]` é que essa parte aqui em perior tem alguns que soem aqui, tem um pouquinho de
- `[4,700–8,960]` classidente de pés, né? Então isso, quando eu passei em dia, tem uma certa
- `[8,960–12,840]` classidade, a gente não bloqueia tanto justamente porque esse bloqueia
- `[12,840–15,940]` vai parecer que está mais classindo ainda, porque daí é um
- `[15,940–20,180]` muito bom explotido, isso vai ficar mais explotidamente. Então quando tem uma
- `[20,180–23,260]` sobre eu, quando você tem bolsa, daí a gente não faz aqui...
### `0E6A8874.MP4`
- `[0,000–2,740]` O profissão da pele, porque a gente está tratando músculo,
- `[2,860–5,880]` a gente está enfraquecendo músculos que estão mudando impressões na pele.
- `[6,280–8,900]` Mas quando a pele está muito fininha que é a parte da Pávera,
- `[9,020–12,700]` a gente tem que tratar a pele como um todo, da parte de dermatológica, entendeu?
- `[13,000–14,520]` Então, por isso que a gente não pode fazer...
## Avaliação
O desempenho é suficiente para um worker de baixa prioridade, especialmente porque o modelo fica carregado e é reutilizado. A qualidade do `base` é compreensível, mas há erros fonéticos relevantes em termos técnicos. Para o catálogo, esses segmentos ainda são úteis para busca aproximada; para texto final de edição, o próximo experimento deve comparar o mesmo conjunto com `faster-whisper-small`.
Cada segmento deverá ser salvo no SQLite com `ativo_id`, `inicio`, `fim`, `texto`, `modelo`, `provider`, `idioma`, `confianca` quando disponível e versão da etapa.