- 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
63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
"""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()
|