feat: adicionadas métricas opcionais de fala ao Scanner com anális

- adicionadas métricas opcionais de fala ao Scanner com análise acústica na engine
- corrigido o progresso da transcrição do Scanner durante o processamento do Whisper
- refatorado o runner Swift do Apple Vision para executar requests em lote com retry CPU-only, corrigindo falhas de CVPixelBuffer/ANE/OCR
- documentado o fluxo de edição de vídeo por voz integrado ao Scanner, banco e engine
- formalizado o protocolo de edição por chat com perfil editorial e consultas progressivas

Resumo:
- 10 arquivos alterados
- 5 novos
- 5 modificados
- 0 removidos

 5 files changed, 367 insertions(+), 95 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - code/engine/executar_scanner.py
  - code/engine/integracoes/visual/apple_vision_runner.swift
  - code/engine/integracoes/whisper/provider_de_transcricao_local.py
  - code/engine/testes/test_provider_de_transcricao_local.py
  - .jhonny/analises.db-shm
  - .jhonny/analises.db-wal
  - apple_vision_runner
  - code/relatorios/teste-enquadramento-20s.json
  - docs/
This commit is contained in:
João Henrique
2026-09-09 18:50:00 -04:00
parent b03b175973
commit c4c942044f
10 changed files with 15086 additions and 96 deletions
@@ -57,6 +57,42 @@ class TesteDoProviderDeTranscricaoLocal(unittest.TestCase):
with self.assertRaises(ValueError):
ProviderDeTranscricaoLocal("small", tamanho_do_lote=0)
def test_emite_progresso_conforme_os_segmentos_processados(self):
"""Atualiza o chamador enquanto o gerador do Whisper entrega segmentos."""
progresso = []
class ModeloFalso:
"""Representa o modelo externo durante o teste."""
def __init__(self, *argumentos, **opcoes):
pass
class PipelineFalso:
"""Entrega dois segmentos para simular um áudio em processamento."""
def __init__(self, model):
pass
def transcribe(self, *argumentos, **opcoes):
segmentos = [
SimpleNamespace(start=0.0, end=2.0, text=" um", words=[]),
SimpleNamespace(start=2.0, end=4.0, text=" dois", words=[]),
]
return iter(segmentos), SimpleNamespace(duration=4.0)
modulo_falso = types.SimpleNamespace(
BatchedInferencePipeline=PipelineFalso,
WhisperModel=ModeloFalso,
)
with tempfile.TemporaryDirectory() as pasta:
arquivo = Path(pasta) / "audio.wav"
arquivo.write_bytes(b"audio")
with patch.dict(sys.modules, {"faster_whisper": modulo_falso}):
provider = ProviderDeTranscricaoLocal("small", ao_progresso=progresso.append)
provider.transcrever(SimpleNamespace(arquivo=str(arquivo)))
self.assertEqual(progresso, [50.0, 99.0, 100.0])
if __name__ == "__main__":
unittest.main()