def test_trim(atol=1e-5, rtol=1e-8): # Things we want to test: # 1. Jam trimmed correctly (mainly handled by jams.slice) # 2. value dict updated correctly (event_time, event_duration, source_time) # 3. scaper sandbox updated correctly (n_events, poly, gini, duration) # 4. audio trimmed correctly tmpfiles = [] with _close_temp_files(tmpfiles): # Create all necessary temp files orig_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) orig_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) trim_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) trim_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) trimstrict_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) trimstrict_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) tmpfiles.append(orig_wav_file) tmpfiles.append(orig_jam_file) tmpfiles.append(trim_wav_file) tmpfiles.append(trim_jam_file) tmpfiles.append(trimstrict_wav_file) tmpfiles.append(trimstrict_jam_file) # --- Create soundscape and save to tempfiles --- # sc = scaper.Scaper(10, FG_PATH, BG_PATH) sc.protected_labels = [] sc.ref_db = -50 sc.add_background(label=('const', 'park'), source_file=('choose', []), source_time=('const', 0)) # Add 5 events start_times = [0.5, 2.5, 4.5, 6.5, 8.5] for event_time in start_times: sc.add_event(label=('const', 'siren'), source_file=('choose', []), source_time=('const', 5), event_time=('const', event_time), event_duration=('const', 1), snr=('const', 10), pitch_shift=None, time_stretch=None) sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) # --- Trim soundscape using scaper.trim with strict=False --- # scaper.trim(orig_wav_file.name, orig_jam_file.name, trim_wav_file.name, trim_jam_file.name, 3, 7, no_audio=False) # --- Validate output --- # # validate JAMS trimjam = jams.load(trim_jam_file.name) trimann = trimjam.annotations.search(namespace='scaper')[0] # Time and duration of annotation observation must be changed, but # values in the value dict must remained unchanged! for event in trimann.data: if event.value['role'] == 'background': assert (event.time == 0 and event.duration == 4 and event.value['event_time'] == 0 and event.value['event_duration'] == 10 and event.value['source_time'] == 0) else: if event.time == 0: assert (event.duration == 0.5 and event.value['event_time'] == 2.5 and event.value['event_duration'] == 1 and event.value['source_time'] == 5) elif event.time == 1.5: assert (event.duration == 1 and event.value['event_time'] == 4.5 and event.value['event_duration'] == 1 and event.value['source_time'] == 5) elif event.time == 3.5: assert (event.duration == 0.5 and event.value['event_time'] == 6.5 and event.value['event_duration'] == 1 and event.value['source_time'] == 5) else: assert False # validate audio orig_wav, sr = soundfile.read(orig_wav_file.name) trim_wav, sr = soundfile.read(trim_wav_file.name) assert np.allclose(trim_wav, orig_wav[3 * sr:7 * sr], atol=atol, rtol=rtol)
def test_trim(atol=1e-5, rtol=1e-8): # Things we want to test: # 1. Jam trimmed correctly (mainly handled by jams.slice) # 2. value dict updated correctly (event_time, event_duration, source_time) # 3. scaper sandbox updated correctly (n_events, poly, gini, duration) # 4. audio trimmed correctly tmpfiles = [] with _close_temp_files(tmpfiles): # Create all necessary temp files orig_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) orig_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) trim_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) trim_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) trimstrict_wav_file = tempfile.NamedTemporaryFile( suffix='.wav', delete=True) trimstrict_jam_file = tempfile.NamedTemporaryFile( suffix='.jams', delete=True) tmpfiles.append(orig_wav_file) tmpfiles.append(orig_jam_file) tmpfiles.append(trim_wav_file) tmpfiles.append(trim_jam_file) tmpfiles.append(trimstrict_wav_file) tmpfiles.append(trimstrict_jam_file) # --- Create soundscape and save to tempfiles --- # sc = scaper.Scaper(10, FG_PATH, BG_PATH) sc.protected_labels = [] sc.ref_db = -50 sc.add_background(label=('const', 'park'), source_file=('choose', []), source_time=('const', 0)) # Add 5 events start_times = [0.5, 2.5, 4.5, 6.5, 8.5] for event_time in start_times: sc.add_event(label=('const', 'siren'), source_file=('choose', []), source_time=('const', 5), event_time=('const', event_time), event_duration=('const', 1), snr=('const', 10), pitch_shift=None, time_stretch=None) sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) # --- Trim soundscape using scaper.trim with strict=False --- # scaper.trim(orig_wav_file.name, orig_jam_file.name, trim_wav_file.name, trim_jam_file.name, 3, 7, no_audio=False) # --- Validate output --- # # validate JAMS trimjam = jams.load(trim_jam_file.name) trimann = trimjam.annotations.search(namespace='scaper')[0] # Time and duration of annotation observation must be changed, but # values in the value dict must remained unchanged! for event in trimann.data: if event.value['role'] == 'background': assert (event.time == 0 and event.duration == 4 and event.value['event_time'] == 0 and event.value['event_duration'] == 10 and event.value['source_time'] == 0) else: if event.time == 0: assert (event.duration == 0.5 and event.value['event_time'] == 2.5 and event.value['event_duration'] == 1 and event.value['source_time'] == 5) elif event.time == 1.5: assert (event.duration == 1 and event.value['event_time'] == 4.5 and event.value['event_duration'] == 1 and event.value['source_time'] == 5) elif event.time == 3.5: assert (event.duration == 0.5 and event.value['event_time'] == 6.5 and event.value['event_duration'] == 1 and event.value['source_time'] == 5) else: assert False # validate audio orig_wav, sr = soundfile.read(orig_wav_file.name) trim_wav, sr = soundfile.read(trim_wav_file.name) assert np.allclose(trim_wav, orig_wav[3*sr:7*sr], atol=atol, rtol=rtol)
def test_generate_from_jams(atol=1e-5, rtol=1e-8): # Test for invalid jams: no annotations tmpfiles = [] with _close_temp_files(tmpfiles): jam = jams.JAMS() jam.file_metadata.duration = 10 jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) gen_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) jam.save(jam_file.name) pytest.raises(ScaperError, scaper.generate_from_jams, jam_file.name, gen_file.name) # Test for valid jams files tmpfiles = [] with _close_temp_files(tmpfiles): # Create all necessary temp files orig_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) orig_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) gen_wav_file = tempfile.NamedTemporaryFile(suffix='.wav', delete=True) gen_jam_file = tempfile.NamedTemporaryFile(suffix='.jams', delete=True) tmpfiles.append(orig_wav_file) tmpfiles.append(orig_jam_file) tmpfiles.append(gen_wav_file) tmpfiles.append(gen_jam_file) # --- Define scaper --- * sc = scaper.Scaper(10, FG_PATH, BG_PATH) sc.protected_labels = [] sc.ref_db = -50 sc.add_background(label=('choose', []), source_file=('choose', []), source_time=('const', 0)) # Add 5 events for _ in range(5): sc.add_event(label=('choose', []), source_file=('choose', []), source_time=('const', 0), event_time=('uniform', 0, 9), event_duration=('choose', [1, 2, 3]), snr=('uniform', 10, 20), pitch_shift=('uniform', -1, 1), time_stretch=('uniform', 0.8, 1.2)) # generate, then generate from the jams and compare audio files # repeat 5 time for _ in range(5): sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) scaper.generate_from_jams(orig_jam_file.name, gen_wav_file.name) # validate audio orig_wav, sr = soundfile.read(orig_wav_file.name) gen_wav, sr = soundfile.read(gen_wav_file.name) assert np.allclose(gen_wav, orig_wav, atol=atol, rtol=rtol) # Now add in trimming! for _ in range(5): sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) scaper.trim(orig_wav_file.name, orig_jam_file.name, orig_wav_file.name, orig_jam_file.name, np.random.uniform(0, 5), np.random.uniform(5, 10)) scaper.generate_from_jams(orig_jam_file.name, gen_wav_file.name) # validate audio orig_wav, sr = soundfile.read(orig_wav_file.name) gen_wav, sr = soundfile.read(gen_wav_file.name) assert np.allclose(gen_wav, orig_wav, atol=atol, rtol=rtol) # Double trimming for _ in range(2): sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) scaper.trim(orig_wav_file.name, orig_jam_file.name, orig_wav_file.name, orig_jam_file.name, np.random.uniform(0, 2), np.random.uniform(8, 10)) scaper.trim(orig_wav_file.name, orig_jam_file.name, orig_wav_file.name, orig_jam_file.name, np.random.uniform(0, 2), np.random.uniform(4, 6)) scaper.generate_from_jams(orig_jam_file.name, gen_wav_file.name) # Tripple trimming for _ in range(2): sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) scaper.trim(orig_wav_file.name, orig_jam_file.name, orig_wav_file.name, orig_jam_file.name, np.random.uniform(0, 2), np.random.uniform(8, 10)) scaper.trim(orig_wav_file.name, orig_jam_file.name, orig_wav_file.name, orig_jam_file.name, np.random.uniform(0, 1), np.random.uniform(5, 6)) scaper.trim(orig_wav_file.name, orig_jam_file.name, orig_wav_file.name, orig_jam_file.name, np.random.uniform(0, 1), np.random.uniform(3, 4)) scaper.generate_from_jams(orig_jam_file.name, gen_wav_file.name) # validate audio orig_wav, sr = soundfile.read(orig_wav_file.name) gen_wav, sr = soundfile.read(gen_wav_file.name) assert np.allclose(gen_wav, orig_wav, atol=atol, rtol=rtol) # Test with new FG and BG paths for _ in range(5): sc.generate(orig_wav_file.name, orig_jam_file.name, disable_instantiation_warnings=True) scaper.generate_from_jams(orig_jam_file.name, gen_wav_file.name, fg_path=ALT_FG_PATH, bg_path=ALT_BG_PATH) # validate audio orig_wav, sr = soundfile.read(orig_wav_file.name) gen_wav, sr = soundfile.read(gen_wav_file.name) assert np.allclose(gen_wav, orig_wav, atol=atol, rtol=rtol) # Ensure jam file saved correctly scaper.generate_from_jams(orig_jam_file.name, gen_wav_file.name, jams_outfile=gen_jam_file.name) orig_jam = jams.load(orig_jam_file.name) gen_jam = jams.load(gen_jam_file.name) assert orig_jam == gen_jam