-
Notifications
You must be signed in to change notification settings - Fork 0
/
clf_utils.py
69 lines (61 loc) · 2.08 KB
/
clf_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import os
from resemblyzer import VoiceEncoder, preprocess_wav
from pathlib import Path
import numpy as np
import sounddevice as sd
from scipy.io.wavfile import write
from sklearn.linear_model import Perceptron
de = r'C:\Users\nrdas\Downloads\VoiceID'
os.chdir(de)
class VoiceIDSys:
def __init__(self):
# A user dictionary with name:centroid
self.users = {}
self.encoder = VoiceEncoder()
sd.default.device = 'Microphone (GENERAL WEBCAM)'
def save_sounds(self, duration=10, fs=44100):
print('recording now!')
sample = sd.rec(int(duration * fs), samplerate=fs, channels=2)
sd.wait()
print('recording done!')
path = 'output.wav'
write(path, fs, sample)
return sample, path
def generate_voice_profile(self, data_path):
embeds = []
os.chdir(data_path)
for file in os.listdir('.'):
fpath = Path(os.getcwd() + '\\' + file)
wav = preprocess_wav(fpath)
embed = self.encoder.embed_utterance(wav)
embeds.append(embed)
centroid = np.array(embeds).mean(axis=0)
os.chdir(de)
return centroid
def add_user(self, name, centroid):
self.users[name] = centroid
def id_subject(self, voicepath, th=0.45):
fpath = Path(voicepath)
wav = preprocess_wav(fpath)
embedding = self.encoder.embed_utterance(wav)
diff_list = []
for i in self.users.values():
diff_list.append(i - embedding)
norms = np.linalg.norm(diff_list, axis=1)
print(norms)
m = min(norms)
if m > th:
print('Unauthorized')
print(m)
return False
else:
user = list(self.users.keys())[np.argmin(norms)]
print('Hello', user, '!')
return True
if __name__=='__main__':
sys = VoiceIDSys()
my_profile = sys.generate_voice_profile('C:\\Users\\nrdas\\Downloads\\VoiceID\\data\\nitish')
sys.add_user('nitish', my_profile)
voice, path = sys.save_sounds()
sys.id_subject(path)
#os.remove(path)