Spaces:
Runtime error
Runtime error
from pathlib import Path | |
import torch | |
import numpy as np | |
from scipy.spatial.distance import cosine | |
import json | |
from .demo_speaker_embeddings import DemoSpeakerEmbeddings | |
class DemoGANAnonymizer: | |
def __init__(self, vec_type='xvector', device=None, sim_threshold=0.7): | |
self.vec_type = vec_type | |
self.device = device | |
self.sim_threshold = sim_threshold | |
self.embedding_extractor = DemoSpeakerEmbeddings(vec_type=self.vec_type, device=self.device) | |
self.model_dir = None | |
self.vectors_file = None | |
self.gan_vectors = None | |
self.unused_indices = None | |
def load_parameters(self, model_dir: Path): | |
self.model_dir = model_dir | |
with open(model_dir / 'settings.json') as f: | |
settings = json.load(f) | |
self.vec_type = settings.get('vec_type', self.vec_type) | |
self.vectors_file = settings.get('vectors_file', self.vectors_file) | |
self.gan_vectors = torch.load(model_dir / self.vectors_file, map_location=self.device) | |
self.unused_indices = self.load_unused_indices() | |
def load_unused_indices(self): | |
return torch.load(self.model_dir / f'unused_indices_{self.vectors_file}', map_location='cpu') | |
def anonymize_embedding(self, audio, sr): | |
speaker_embedding = self.embedding_extractor.extract_vector_from_audio(wave=audio, sr=sr) | |
anon_vec = self._select_gan_vector(spk_vec=speaker_embedding) | |
return anon_vec | |
def _select_gan_vector(self, spk_vec): | |
i = 0 | |
limit = 20 | |
while i < limit: | |
idx = np.random.choice(self.unused_indices) | |
anon_vec = self.gan_vectors[idx] | |
sim = 1 - cosine(spk_vec.cpu().numpy(), anon_vec.cpu().numpy()) | |
if sim < self.sim_threshold: | |
break | |
i += 1 | |
self.unused_indices = self.unused_indices[self.unused_indices != idx] | |
if len(self.unused_indices) == 0: | |
self.unused_indices = self.load_unused_indices() | |
return anon_vec |