from pathlib import Path class ProviderDeDiarizacaoHuggingFace: """Identifica intervalos de falas por participante em áudio local.""" def __init__(self, modelo: str) -> None: from pyannote.audio import Pipeline self.pipeline = Pipeline.from_pretrained(modelo) def analisar(self, arquivo: str | Path) -> list[tuple[float, float, str]]: import soundfile as sf import torch audio, taxa = sf.read(str(arquivo), dtype="float32") if getattr(audio, "ndim", 1) > 1: audio = audio.mean(axis=1) saida = self.pipeline({"waveform": torch.from_numpy(audio).unsqueeze(0), "sample_rate": taxa}) diarizacao = getattr(saida, "exclusive_speaker_diarization", saida) return [(float(turno.start), float(turno.end), str(falante)) for turno, _, falante in diarizacao.itertracks(yield_label=True)]