• Added a new distirbution tuple: ("choose_weighted", list_of_options, probabilities), which supports weighted sampling: list_of_options[i] is chosen with probability probabilities[i].


  • Scaper.generate now accepts a new argument for controlling trade-off between speed and quality in pitch shifting and time stretching:
    • quick_pitch_time: if True, both time stretching and pitch shifting will be applied in quick mode, which is much faster but has lower quality.


  • Scaper.generate now accepts two new optional arguments for controlling audio clipping and normalization:
    • fix_clipping: if True and the soundscape audio is clipping, it will be peak normalized and all isolated events will be scaled accordingly.
    • peak_normalization: if True, sounscape audio will be peak normalized regardless of whether it’s clipping or not and all isolated events will be scaled accordingly.
  • All generate arguments are now documented in the scaper sandbox inside the JAMS annotation.
  • Furthermore, we also document in the JAMS: the scale factor used for peak normalization, the change in ref_db, and the actual ref_db of the generated audio.


  • Switching from FFMpeg LUFS calculation to pyloudnorm for better performance: runtime is reduced by approximately 30%
  • The loudness calculation between FFMpeg LUFS and pyloudnorm is slightly different so this version will generate marginally different audio data compared to previous versions: the change is not perceptible, but np.allclose() tests on audio from previous versions of Scaper may fail.
  • This change updates the regression data for Scaper’s regression tests.
  • This release used soxbindings 1.2.2 and pyloudnorm 0.1.0.


  • Trimming now happens on read, rather than after read. This prevents the entire file from being loaded into memory. This is helpful for long source audio files.
  • Since the audio processing pipeline has changed, this version will generate marginally different audio data compared to previous versions: the change is not perceptible, but np.allclose() tests on audio from previous versions of Scaper may fail.
  • This change updates the regression data for Scaper’s regression tests


  • Uses soxbindings when installing on Linux or MacOS, which results in better performance.
  • Adds explicit support for Python 3.7 and 3.8. Drops support for Python 2.7 and 3.4.


  • Fixes a bug with fade in and out lengths are set to 0.
  • This is the last version to support Python 2.7 and 3.4.


  • Scaper now returns the generated audio and annotations directly in memory, allowing you to skip any/all file I/O!
  • Saving the audio and annotations to disk is still supported, but is now optional.
  • While this update modifies the API of several functions, it should still be backwards compatible.


  • Operations on all files happen in-memory now, via new PySox features (build_array) and numpy operations for applying fades.
  • Scaper is faster now due to the in-memory changes.


  • Fixed a bug where trim before generating soundscapes from a JAMS file with saving of isolated events resulted in incorrect soundscape audio.


  • Fixed a bug where _sample_trunc_norm returned an array in Scipy 1.5.1, but returns a scalar in Scipy 1.4.0.


  • Fixed a bug where time stretched events could have a negative start time if they were longer than the soundscape duration.


  • Use sox flag -s for time stretching (speech mode), gives better sounding results.


  • Fixed a bug where short backgrounds did not concatenate to fill the entire soundscape.


  • Fixed a bug where the soundscapes were off by one sample when generated. Fixes bug where generating from jams using a trimmed jams file was using the trimmed soundscape duration instead of the original duration.
  • Added a field to the sandbox that keeps track of the original duration of the soundscape before any trimming is applied.


  • Fixed a bug with the format and subtype of audio files not being maintained in match_sample_length.


  • Fixed a bug with generating the file names when saving the isolated events. The idx for background and foreground events now increment separately.


  • Fixed a bug with generating docs on ReadTheDocs.


  • Source separation support! Add option to save isolated foreground events and background audio files.
  • Makes pysoundfile a formal dependency.
  • Seeding tests more robust.


  • Added a random_state parameter to Scaper object, which allows all runs to be perfectly reproducible given the same audio and the same random seed.
  • Switched from numpydoc to napoleon for generating the documentation. Also switched Sphinx to the most recent version.
  • Added functions to Scaper object that allow one to reset the foreground and background event specifications independently. This allows users to reuse the same Scaper object and generate multiple soundscapes.
  • Added a function to Scaper that allows the user to set the random state after creation.


  • Added functionality which modifies a source_time distribution tuple according to the duration of the source and the duration of the event.
  • This release alters behavior of Scaper compared to earlier versions.


  • Fix bug where temp files might not be closed if an error is raised


  • Store sample rate in output JAMS inside the scaper sandbox


  • Fix bug where estimated duration of time stretched event is different to actual duration leading to incorrect silence padding and sometimes incorrect soundscape duration (in audio samples).


  • Major revision
  • Support jams>=0.3
  • Switch from the sound_event to the scaper namespace.
  • While the API remains compatible with previous versions, the change of underlying namespace breaks compatibility with jams files created using scaper for versions <1.0.0.


  • Fix bug related to creating temp files on Windows.


  • #28: Improve LUFS calculation:

    • Compute LUFS after initial processing (e.g. trimming, augmentation) of foreground and background events
    • Self-concatenate short events (< 500 ms) to avoid ffmpeg constant of -70.0 LUFS


  • Fix markdown display on PyPi


  • Increases minimum version of pysox to 1.3.3 to prevent crashing on Windows


  • First release.