feat: reorganizado o fluxo de edição para validar a análise do Sca
- reorganizado o fluxo de edição para validar a análise do Scanner, selecionar o tipo de vídeo e enviar suas instruções no JSON. - banco de análises: métricas de fala viraram colunas, busca lexical FTS5, enunciados com embeddings, views achatadas de leitura (fala/palavra/linha do tempo/fala com visual), ingestor do pipeline de voz e gravação idempotente de evidências visuais e cenas. - retakes passam a ser gravados no banco de análises (SQLite) em vez de JSON por caso, com status de revisão persistido. - planos de edição e suas aplicações passam a ser registrados no banco, em vez de se perderem no arquivo temporário. - comando de limpeza das evidências visuais e cenas duplicadas por execuções antigas do Scanner. - análise visual: OpenCV (rostos) e PySceneDetect passam a entrar no detector local por padrão; novo adapter InsightFace gera assinatura facial (embedding) para reconhecer a mesma pessoa entre tomadas, gravada como evidência visual no banco. - corrigido: métricas de fala (energia, pitch, velocidade) agora gravam nas colunas dedicadas, não só no JSON; a view fala+visual passa a casar por vídeo e tempo, já que o mesmo arquivo entra na timeline como clipes distintos de vídeo e áudio; views são recriadas a cada abertura do banco para uma correção de consulta chegar a bancos já existentes. - reordenadas as abas do painel CEP para Scanner, Refinar e Editar vídeo Resumo: - 24 arquivos alterados - 9 novos - 15 modificados - 0 removidos 15 files changed, 872 insertions(+), 29 deletions(-) Arquivos: - .jhonny/analises.db - code/cep-plugin/index.html - code/cep-plugin/main.js - code/engine/aplicar_plano_de_edicao.py - code/engine/integracoes/visual/README.md - code/engine/integracoes/visual/__init__.py - code/engine/integracoes/visual/analisadores.py - code/engine/persistencia/__init__.py - code/engine/persistencia/esquema.py - code/engine/persistencia/repositorio_de_analises_sqlite.py - code/engine/persistencia/repositorio_de_retakes_sqlite.py - code/engine/requirements-visual.txt - code/engine/scanner/configuracao_visual.py - code/engine/scanner/visual.py - code/engine/testes/test_analise_visual_local.py - .jhonny/analises.db.pos-scanner-084841 - code/engine/integracoes/embeddings/ - code/engine/limpar_duplicatas.py - code/engine/persistencia/busca_de_conteudo.py - code/engine/persistencia/enunciados.py - code/engine/persistencia/ingestao_de_voz.py - code/engine/persistencia/limpeza.py - code/engine/persistencia/repositorio_de_planos.py - code/engine/testes/test_busca_de_conteudo.py
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
"""
|
||||
Comando de limpeza das duplicatas do banco de análises.
|
||||
|
||||
Remove as evidências visuais e cenas duplicadas por execuções antigas do
|
||||
Scanner, que acrescentavam em vez de substituir. Faz backup do banco antes de
|
||||
apagar qualquer linha, e aceita ``--simular`` para apenas contar.
|
||||
|
||||
Uso:
|
||||
python code/engine/limpar_duplicatas.py [--banco CAMINHO] [--simular]
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import shutil
|
||||
import sys
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
CAMINHO_DO_CODIGO = Path(__file__).resolve().parent.parent
|
||||
if str(CAMINHO_DO_CODIGO) not in sys.path:
|
||||
sys.path.insert(0, str(CAMINHO_DO_CODIGO))
|
||||
|
||||
from engine.persistencia.conexao import abrir_banco # noqa: E402
|
||||
from engine.persistencia.esquema import reconstruir_indice_de_busca # noqa: E402
|
||||
from engine.persistencia.limpeza import LimpadorDeDuplicatas # noqa: E402
|
||||
|
||||
BANCO_PADRAO = CAMINHO_DO_CODIGO.parent / ".jhonny" / "analises.db"
|
||||
|
||||
|
||||
def criar_backup(banco: Path) -> Path:
|
||||
"""
|
||||
Copia o banco para um arquivo datado ao lado do original.
|
||||
|
||||
Parâmetros:
|
||||
banco: Caminho do banco a copiar.
|
||||
|
||||
Retorna:
|
||||
O caminho do backup criado.
|
||||
"""
|
||||
carimbo = datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||
destino = banco.with_name(f"{banco.name}.backup-{carimbo}")
|
||||
shutil.copy2(banco, destino)
|
||||
return destino
|
||||
|
||||
|
||||
def executar(banco: Path, simular: bool) -> int:
|
||||
"""
|
||||
Conta e, quando autorizado, remove as duplicatas do banco.
|
||||
|
||||
Parâmetros:
|
||||
banco: Caminho do banco de análises.
|
||||
simular: Quando verdadeiro, apenas conta e não apaga nada.
|
||||
|
||||
Retorna:
|
||||
Código de saída do processo: 0 em sucesso, 1 quando o banco não existe.
|
||||
"""
|
||||
if not banco.is_file():
|
||||
print(f"Banco não encontrado: {banco}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
conexao = abrir_banco(banco)
|
||||
limpador = LimpadorDeDuplicatas(conexao)
|
||||
duplicatas = limpador.contar_duplicatas()
|
||||
print(f"Duplicatas encontradas: {duplicatas.evidencias_visuais} evidência(s) visual(is), "
|
||||
f"{duplicatas.cenas} cena(s).")
|
||||
if duplicatas.total == 0:
|
||||
print("Nada a remover.")
|
||||
return 0
|
||||
if simular:
|
||||
print("Simulação: nenhuma linha foi apagada.")
|
||||
return 0
|
||||
|
||||
backup = criar_backup(banco)
|
||||
print(f"Backup criado em {backup}")
|
||||
removidas = limpador.limpar()
|
||||
print(f"Removidas: {removidas.evidencias_visuais} evidência(s) visual(is), "
|
||||
f"{removidas.cenas} cena(s).")
|
||||
print(f"Índice de busca reconstruído com {reconstruir_indice_de_busca(conexao)} fala(s).")
|
||||
return 0
|
||||
|
||||
|
||||
def principal() -> int:
|
||||
"""Lê os argumentos da linha de comando e executa a limpeza."""
|
||||
parser = argparse.ArgumentParser(description="Remove duplicatas do banco de análises.")
|
||||
parser.add_argument("--banco", type=Path, default=BANCO_PADRAO,
|
||||
help="Caminho do analises.db.")
|
||||
parser.add_argument("--simular", action="store_true",
|
||||
help="Apenas conta as duplicatas, sem apagar.")
|
||||
argumentos = parser.parse_args()
|
||||
return executar(argumentos.banco, argumentos.simular)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(principal())
|
||||
Reference in New Issue
Block a user