import torch, torchaudio from diffsynth import load_model, ModelConfig from diffsynth.models.demucs import HTDemucs class AudioTrackSeparator(torch.nn.Module): def __init__(self, torch_dtype=torch.float32, device="cuda", model_config=ModelConfig(model_id="DiffSynth-Studio/Demucs-Repackage", origin_file_pattern="model.safetensors")): super().__init__() model_config.download_if_necessary() self.model = load_model(HTDemucs, model_config.path, torch_dtype=torch_dtype, device=device) @torch.no_grad() def __call__(self, audio, target_sample_rate=48000, **kwargs): if isinstance(audio, str): audio, sample_rate = torchaudio.load(audio) else: audio, sample_rate = audio audio = audio.to(dtype=next(iter(self.model.parameters())).dtype, device=next(iter(self.model.parameters())).device) vocals = self.model.extract_track(audio, sample_rate) if target_sample_rate != 44100: vocals = torchaudio.functional.resample(vocals, 44100, target_sample_rate) return vocals