File size: 1,907 Bytes
a9536c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import sys
import unittest
from pathlib import Path

import numpy as np


REPO_ROOT = Path(__file__).resolve().parents[1]
if str(REPO_ROOT) not in sys.path:
    sys.path.insert(0, str(REPO_ROOT))


class ReferenceAudioMetricTests(unittest.TestCase):
    def test_si_sdr_is_scale_invariant_but_sdr_is_not(self):
        from lib.audio_metrics import signal_distortion_ratio, scale_invariant_signal_distortion_ratio

        sr = 16000
        t = np.arange(sr, dtype=np.float32) / sr
        reference = np.sin(2 * np.pi * 220 * t).astype(np.float32)
        scaled = 2.0 * reference

        self.assertGreater(scale_invariant_signal_distortion_ratio(reference, scaled), 100.0)
        self.assertLess(signal_distortion_ratio(reference, scaled), 0.1)

    def test_reference_stem_metrics_rank_clean_estimate_above_noisy_estimate(self):
        from lib.audio_metrics import evaluate_reference_stems

        sr = 16000
        t = np.arange(sr, dtype=np.float32) / sr
        lead = 0.18 * np.sin(2 * np.pi * 220 * t).astype(np.float32)
        backing = 0.04 * np.sin(2 * np.pi * 330 * t + 0.4).astype(np.float32)
        noise = 0.03 * np.sin(2 * np.pi * 910 * t).astype(np.float32)

        clean = evaluate_reference_stems(
            references={"lead": lead, "backing": backing},
            estimates={"lead": lead, "backing": backing},
        )
        noisy = evaluate_reference_stems(
            references={"lead": lead, "backing": backing},
            estimates={"lead": lead + noise, "backing": backing - noise},
        )

        self.assertGreater(clean["mean_si_sdr"], noisy["mean_si_sdr"] + 20.0)
        self.assertGreater(clean["stems"]["lead"]["si_sdr"], noisy["stems"]["lead"]["si_sdr"])
        self.assertGreater(clean["stems"]["backing"]["sdr"], noisy["stems"]["backing"]["sdr"])


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