Spaces:
Running
Running
import json | |
import torch | |
import numpy as np | |
from .demo_speaker_embeddings import DemoSpeakerEmbeddings | |
class DemoRandomAnonymizer: | |
def __init__(self, device, vec_type='xvector', in_scale=False): | |
self.device = device | |
self.vec_type = vec_type | |
self.in_scale = in_scale | |
self.dim_ranges = None | |
self.embedding_extractor = DemoSpeakerEmbeddings(vec_type=self.vec_type, device=self.device) | |
def load_parameters(self, model_dir): | |
with open(model_dir / 'settings.json') as f: | |
settings = json.load(f) | |
self.vec_type = settings['vec_type'] if 'vec_type' in settings else self.vec_type | |
self.in_scale = settings.get('in_scale', self.in_scale) | |
if self.in_scale: | |
with open(model_dir / 'stats_per_dim.json') as f: | |
dim_ranges = json.load(f) | |
self.dim_ranges = [(v['min'], v['max']) for k, v in sorted(dim_ranges.items(), key=lambda x: int(x[0]))] | |
def anonymize_embedding(self, audio, sr): | |
speaker_embedding = torch.tensor(self.embedding_extractor.extract_vector_from_audio(wave=audio, sr=sr)) | |
if self.dim_ranges: | |
anon_vec = torch.tensor([np.random.uniform(*dim_range) for dim_range in self.dim_ranges]).to(self.device) | |
else: | |
mask = torch.zeros(speaker_embedding.shape[0]).float().random_(-40, 40).to(self.device) | |
anon_vec = speaker_embedding * mask | |
return anon_vec | |