|
|
- #!/usr/bin/env python
- # coding: utf8
-
- """ Unit testing for Separator class. """
-
- __email__ = 'spleeter@deezer.com'
- __author__ = 'Deezer Research'
- __license__ = 'MIT License'
-
- from os import makedirs
- from os.path import join
- from tempfile import TemporaryDirectory
-
- import pytest
- import numpy as np
-
- from spleeter.__main__ import evaluate
- from spleeter.audio.adapter import AudioAdapter
-
- BACKENDS = ['tensorflow', 'librosa']
- TEST_CONFIGURATIONS = {el: el for el in BACKENDS}
-
- res_4stems = {
- 'vocals': {
- 'SDR': 3.25e-05,
- 'SAR': -11.153575,
- 'SIR': -1.3849,
- 'ISR': 2.75e-05
- },
- 'drums': {
- 'SDR': -0.079505,
- 'SAR': -15.7073575,
- 'SIR': -4.972755,
- 'ISR': 0.0013575
- },
- 'bass': {
- 'SDR': 2.5e-06,
- 'SAR': -10.3520575,
- 'SIR': -4.272325,
- 'ISR': 2.5e-06
- },
- 'other': {
- 'SDR': -1.359175,
- 'SAR': -14.7076775,
- 'SIR': -4.761505,
- 'ISR': -0.01528
- }
- }
-
-
- def generate_fake_eval_dataset(path):
- """
- generate fake evaluation dataset
- """
- aa = AudioAdapter.default()
- n_songs = 2
- fs = 44100
- duration = 3
- n_channels = 2
- rng = np.random.RandomState(seed=0)
- for song in range(n_songs):
- song_path = join(path, 'test', f'song{song}')
- makedirs(song_path, exist_ok=True)
- for instr in ['mixture', 'vocals', 'bass', 'drums', 'other']:
- filename = join(song_path, f'{instr}.wav')
- data = rng.rand(duration*fs, n_channels)-0.5
- aa.save(filename, data, fs)
-
-
- @pytest.mark.parametrize('backend', TEST_CONFIGURATIONS)
- def test_evaluate(backend):
- with TemporaryDirectory() as dataset:
- with TemporaryDirectory() as evaluation:
- generate_fake_eval_dataset(dataset)
- metrics = evaluate(
- adapter='spleeter.audio.ffmpeg.FFMPEGProcessAudioAdapter',
- output_path=evaluation,
- stft_backend=backend,
- params_filename='spleeter:4stems',
- mus_dir=dataset,
- mwf=False,
- verbose=False)
- for instrument, metric in metrics.items():
- for m, value in metric.items():
- assert np.allclose(
- np.median(value),
- res_4stems[instrument][m],
- atol=1e-3)
|