#!/usr/bin/env python # coding: utf8 """ Unit testing for audio adapter. """ __email__ = 'spleeter@deezer.com' __author__ = 'Deezer Research' __license__ = 'MIT License' from os.path import join from tempfile import TemporaryDirectory from spleeter import SpleeterError from spleeter.audio.adapter import AudioAdapter from spleeter.audio.ffmpeg import FFMPEGProcessAudioAdapter # pyright: reportMissingImports=false # pylint: disable=import-error from pytest import fixture, raises import numpy as np import ffmpeg # pylint: enable=import-error TEST_AUDIO_DESCRIPTOR = 'audio_example.mp3' TEST_OFFSET = 0 TEST_DURATION = 600. TEST_SAMPLE_RATE = 44100 @fixture(scope='session') def adapter(): """ Target test audio adapter fixture. """ return AudioAdapter.default() @fixture(scope='session') def audio_data(adapter): """ Audio data fixture based on sample loading from adapter. """ return adapter.load( TEST_AUDIO_DESCRIPTOR, TEST_OFFSET, TEST_DURATION, TEST_SAMPLE_RATE) def test_default_adapter(adapter): """ Test adapter as default adapter. """ assert isinstance(adapter, FFMPEGProcessAudioAdapter) assert adapter is AudioAdapter._DEFAULT def test_load(audio_data): """ Test audio loading. """ waveform, sample_rate = audio_data assert sample_rate == TEST_SAMPLE_RATE assert waveform is not None assert waveform.dtype == np.dtype('float32') assert len(waveform.shape) == 2 assert waveform.shape[0] == 479832 assert waveform.shape[1] == 2 def test_load_error(adapter): """ Test load ffprobe exception """ with raises(SpleeterError): adapter.load( 'Paris City Jazz', TEST_OFFSET, TEST_DURATION, TEST_SAMPLE_RATE) def test_save(adapter, audio_data): """ Test audio saving. """ with TemporaryDirectory() as directory: path = join(directory, 'ffmpeg-save.mp3') adapter.save( path, audio_data[0], audio_data[1]) probe = ffmpeg.probe(TEST_AUDIO_DESCRIPTOR) assert len(probe['streams']) == 1 stream = probe['streams'][0] assert stream['codec_type'] == 'audio' assert stream['channels'] == 2 assert stream['duration'] == '10.919184'