| 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() | |