feat: removido o tamanho do modelo do seletor da tela Editar vídeo

- removido o tamanho do modelo do seletor da tela Editar vídeo
- acelerada a transcrição do Scanner com inferência Whisper em lote e cache de hashes
- garantido um resultado separado para cada clipe de áudio selecionado no Scanner
- adicionado cancelamento do processamento do Scanner pela barra de progresso
- exibido estado visual próprio para Scanner cancelado na barra de progresso
- reorganizada a tela Scanner em blocos separados de imagem e som

Resumo:
- 7 arquivos alterados
- 1 novos
- 6 modificados
- 0 removidos

 6 files changed, 92 insertions(+), 40 deletions(-)

Arquivos:
  - .jhonny/analises.db
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
  - code/engine/integracoes/whisper/provider_de_transcricao_local.py
  - code/engine/scanner/transcricao_da_timeline.py
  - code/engine/testes/test_provider_de_transcricao_local.py
This commit is contained in:
João Henrique
2026-09-09 16:57:29 -04:00
parent 245dcd8015
commit 53a8307f38
7 changed files with 154 additions and 40 deletions
@@ -0,0 +1,62 @@
"""Testes do provider local de transcrição em lote."""
import sys
import tempfile
import types
import unittest
from pathlib import Path
from types import SimpleNamespace
from unittest.mock import patch
from engine.integracoes.whisper import ProviderDeTranscricaoLocal
class TesteDoProviderDeTranscricaoLocal(unittest.TestCase):
"""Verifica a configuração e a conversão dos segmentos do provider."""
def test_usa_pipeline_em_lote_com_vad_e_timestamps_de_palavras(self):
"""Mantém as opções de qualidade ao usar inferência em lote."""
chamadas = {}
class ModeloFalso:
"""Representa o modelo externo durante o teste."""
def __init__(self, *argumentos, **opcoes):
chamadas["modelo"] = (argumentos, opcoes)
class PipelineFalso:
"""Representa o pipeline em lote durante o teste."""
def __init__(self, model):
chamadas["pipeline_modelo"] = model
def transcribe(self, *argumentos, **opcoes):
chamadas["transcricao"] = (argumentos, opcoes)
palavra = SimpleNamespace(word="Olá", start=0.0, end=0.5, probability=0.99)
segmento = SimpleNamespace(start=0.0, end=0.5, text=" Olá ", words=[palavra])
return iter([segmento]), SimpleNamespace(duration=0.5)
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", tamanho_do_lote=8)
resultado = provider.transcrever(SimpleNamespace(arquivo=str(arquivo)))
self.assertEqual(resultado[0].texto, "Olá")
self.assertEqual(chamadas["transcricao"][1]["batch_size"], 8)
self.assertTrue(chamadas["transcricao"][1]["vad_filter"])
self.assertTrue(chamadas["transcricao"][1]["word_timestamps"])
def test_rejeita_tamanho_de_lote_invalido(self):
"""Impede configuração silenciosa de um lote inválido."""
with self.assertRaises(ValueError):
ProviderDeTranscricaoLocal("small", tamanho_do_lote=0)
if __name__ == "__main__":
unittest.main()