def test_can_apply_sliding_windows_in_succession(self): samplerate = SR11025() short_window = samplerate * (16, 512) long_window = SampleRate( frequency=short_window.frequency * 1, duration=short_window.frequency * 64) rs = resampled(resample_to=samplerate, store_resampled=True) samples = AudioSamples.silence(samplerate, Seconds(10)) @simple_in_memory_settings class Sound(rs): short_windowed = ArrayWithUnitsFeature( SlidingWindow, wscheme=short_window, needs=rs.resampled) long_windowed = ArrayWithUnitsFeature( SlidingWindow, wscheme=long_window, needs=short_windowed) _id = Sound.process(meta=samples.encode()) snd = Sound(_id) self.assertEqual((512,), snd.short_windowed.shape[1:]) self.assertEqual((64, 512), snd.long_windowed.shape[1:])
def _process(self, data): sr = data.samples_per_second if self._resample is None: target_sr = self._samplerate.samples_per_second self._resample = Resample( sr, target_sr, 1 if len(data.shape) == 1 else data.shape[1]) if target_sr != sr: self._rs = self._resample # KLUDGE: The following line seems to solve a bug whereby # libsamplerate doesn't generate enough samples the first time # src_process is called. We're calling it once here, so the "real" # output will come out click-free silence = AudioSamples.silence(self._samplerate, Seconds(1), channels=data.channels) self._resample(silence) else: self._rs = self._noop resampled = self._rs(data, self._finalized) if not isinstance(resampled, ArrayWithUnits): resampled = AudioSamples(resampled, self._samplerate) yield resampled
def synthesize(self, duration): """ Synthesize silence Args: duration (numpy.timedelta64): The duration of the synthesized sound """ return AudioSamples.silence(self.samplerate, duration)
def test_smoke(self): samples = AudioSamples.silence(SR22050(), Seconds(1)) samplerate = SR22050() scale = GeometricScale(start_center_hz=20, stop_center_hz=5000, bandwidth_ratio=1.2, n_bands=8) scale.ensure_overlap_ratio(0.5) taps = 16 filter_bank = fir_filter_bank(scale, taps, samplerate, np.hanning(3)) correlogram = auto_correlogram(samples, filter_bank) self.assertEqual(3, correlogram.ndim)
def test_smoke(self): samples = AudioSamples.silence(SR22050(), Seconds(1)) samplerate = SR22050() scale = GeometricScale( start_center_hz=20, stop_center_hz=5000, bandwidth_ratio=1.2, n_bands=8) scale.ensure_overlap_ratio(0.5) taps = 16 filter_bank = fir_filter_bank(scale, taps, samplerate, np.hanning(3)) correlogram = auto_correlogram(samples, filter_bank) self.assertEqual(3, correlogram.ndim)
def test_can_apply_sliding_windows_in_succession(self): samplerate = SR11025() short_window = samplerate * (16, 512) long_window = SampleRate(frequency=short_window.frequency * 1, duration=short_window.frequency * 64) rs = resampled(resample_to=samplerate, store_resampled=True) samples = AudioSamples.silence(samplerate, Seconds(10)) @simple_in_memory_settings class Sound(rs): short_windowed = ArrayWithUnitsFeature(SlidingWindow, wscheme=short_window, needs=rs.resampled) long_windowed = ArrayWithUnitsFeature(SlidingWindow, wscheme=long_window, needs=short_windowed) _id = Sound.process(meta=samples.encode()) snd = Sound(_id) self.assertEqual((512, ), snd.short_windowed.shape[1:]) self.assertEqual((64, 512), snd.long_windowed.shape[1:])
def test_can_decompose_audio_samples(self): samples = AudioSamples.silence(SR22050(), Seconds(1)) bands = frequency_decomposition(samples, [64, 128, 256, 512, 1024]) expected_td = TimeDimension(samples.end, samples.end) self.assertEqual(expected_td, bands.dimensions[0]) self.assertIsInstance(bands.dimensions[1], ExplicitFrequencyDimension)