from pathlib import Path from typing import Any from ...scanner.modelos import PalavraDeTranscricao, SegmentoDeTranscricao class ProviderDeTranscricaoLocal: """Provider local usando faster-whisper, sem transmitir mídia.""" def __init__(self, modelo: str, dispositivo: str = "cpu", tipo_de_calculo: str = "int8", idioma: str = "pt") -> None: self.nome_do_modelo = Path(modelo).name if "faster-whisper-" in modelo: self.nome_do_modelo = modelo.split("faster-whisper-", 1)[1].split("/", 1)[0] from faster_whisper import WhisperModel self.modelo = WhisperModel(modelo, device=dispositivo, compute_type=tipo_de_calculo) self.idioma = idioma def transcrever(self, clipe: Any) -> list[SegmentoDeTranscricao]: arquivo = Path(clipe.arquivo) if not arquivo.is_file(): raise FileNotFoundError(f"Arquivo de áudio não encontrado: {arquivo}") segmentos, _ = self.modelo.transcribe(str(arquivo), language=self.idioma, vad_filter=True, word_timestamps=True) return [SegmentoDeTranscricao(float(s.start), float(s.end), s.text.strip(), None, tuple(PalavraDeTranscricao(w.word.strip(), float(w.start), float(w.end), getattr(w, "probability", None)) for w in (s.words or []) if w.word.strip())) for s in segmentos]