def process_audio(func_name, audio_io): """ Check inputs and return spectrogram images Check that inputs are in correct format (single-channel, between 5-20 seconds), and convert to images Args: func_name (str): name of calling function (for printing) audio_io (bytes): Returns: array of 299x299 images, each representing up to 5s of the original audio """ print(f"runserver.py: {func_name}() checking inputs") # Just return error if no data was posted if not audio_io: return {"error": "No data was given with post?"} # Make sure we can load the data given to us print(f"runserver.py: {func_name}() loading samples") try: audio = Audio.from_bytesio( audio_io, sample_rate=22050, resample_type="kaiser_fast" ) except: return {"error": "Unable to load audio, multi-chennel input is ignored"} print( f"runserver.py: {func_name}() loaded samples at sample_rate {audio.sample_rate}" ) # Check the duration is between 5 and 20 seconds duration = audio.duration() if duration < 5: return {"error": "Audio is shorter than 5 seconds"} elif duration > 20: return {"error": "Audio is longer than 20 seconds"} # 1. split audio into 5 second chunks # 2. generate spectrograms # 3. generate images audio_splits = birds_detector.split_audio(audio) spectrograms = [Spectrogram.from_audio(x) for x in audio_splits] images = [x.to_image(shape=(224, 224)) for x in spectrograms] print(f"runserver.py: {func_name}(), opening audio as spectrograms") return {"images": images}
def test_load_pathlib_and_bytesio_are_almost_equal(veryshort_wav_pathlib, veryshort_wav_bytesio): s_pathlib = Audio.from_file(veryshort_wav_pathlib) s_bytesio = Audio.from_bytesio(veryshort_wav_bytesio) np.testing.assert_allclose(s_pathlib.samples, s_bytesio.samples, atol=1e-7)
def test_load_veryshort_wav_bytesio(veryshort_wav_bytesio): s = Audio.from_bytesio(veryshort_wav_bytesio, sample_rate=22050) assert s.samples.shape == (3133, )