speaker-verification
audio
nemotron
tyger
experimental
File size: 2,161 Bytes
b21cfae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import unittest
import numpy as np
from identity import IdentityManager
from audio_sync import estimate_echo_delay


class IdentityTests(unittest.TestCase):
    def setUp(self):
        self.a=np.eye(192,dtype=np.float32)[0];self.b=np.eye(192,dtype=np.float32)[1]
        self.r=np.eye(192,dtype=np.float32)[2];self.now=100
        self.manager=IdentityManager(robo=self.r,clock=lambda:self.now)

    def say(self,vector,text):
        for _ in range(4):self.manager.observe({'embedding':vector,'kind':'speech','confidence':.9})
        return self.manager.finish(text,enabled=True)

    def test_multiuser_and_unknown(self):
        self.assertFalse(self.say(self.a,'How are you?')['accepted'])
        self.assertTrue(self.say(self.a,'Hey Robo, I would like to talk to you.')['new_user'])
        self.assertTrue(self.say(self.a,'Tell me something.')['accepted'])
        self.assertTrue(self.say(self.b,'Hallo Robo, ich bin auch hier.')['new_user'])
        self.assertEqual(len(self.manager.users),2)
        self.assertFalse(self.say(self.r,'Hey Robo, this is your own voice.')['accepted'])

    def test_uncertainty_expiry_and_clear(self):
        self.manager.observe({'embedding':None,'kind':'overlap','confidence':.9})
        self.assertFalse(self.manager.finish('Hey Robo',enabled=True)['accepted'])
        self.say(self.a,'Hey Robo, please enroll me.');self.now+=301
        self.assertFalse(self.say(self.a,'Are you there?')['accepted'])
        self.manager.clear();self.assertEqual(self.manager.status()['users'],[])

    def test_calibration(self):
        rng=np.random.default_rng(7);reference=rng.normal(0,.03,32000)
        for ms in [0,13.5,80,180,440]:
            delay=round(ms*16);mic=np.r_[np.zeros(delay),reference][:len(reference)]*.1
            result=estimate_echo_delay(mic,reference)
            self.assertTrue(result['available']);self.assertAlmostEqual(result['delay_ms'],ms,places=1)
        self.assertFalse(estimate_echo_delay(np.zeros_like(reference),reference)['available'])
        self.assertFalse(estimate_echo_delay(rng.normal(size=len(reference)),reference)['available'])


if __name__=='__main__':unittest.main()