A library for soundscape synthesis and augmentation
Clone or download
Latest commit 6a0a1fd Aug 8, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs Minor update to docs Jul 22, 2018
scaper Release v1.0.0 Aug 8, 2018
tests Remove pandas dependency (use csv), set min jams to v0.3.2 Jul 29, 2018
.gitignore Ignore pytest cache files Jul 22, 2018
.travis.yml Bring back faulthandler Sep 28, 2017
LICENSE Create LICENSE May 4, 2017
README.md Fix docs badge Oct 17, 2017
setup.cfg Remove license_file Oct 3, 2017
setup.py Remove sound_event namespace Jul 29, 2018

README.md

scaper

A library for soundscape synthesis and augmentation

PyPI License Build Status Coverage Status Documentation Status PyPI

Please refer to the documentation for details.

For the motivation behind scaper and its applications check out the scaper-paper:

Scaper: A library for soundscape synthesis and augmentation
J. Salamon, D. MacConnell, M. Cartwright, P. Li, and J. P. Bello
In IEEE Workshop on Applications of Signal Processing to Audio and Acoustics (WASPAA), New Paltz, NY, USA, Oct. 2017.

Installation

Non-python dependencies

Scaper has two non-python dependencies:

On macOS these can be installed using homebrew:

brew install sox
brew install ffmpeg

On linux you can use your distribution's package manager, e.g. on Ubuntu (15.04 "Vivid Vervet" or newer):

sudo apt-get install sox
sudo apt-get install ffmpeg

NOTE: on earlier versions of Ubuntu ffmpeg may point to a Libav binary which is not the correct binary. If you are using anaconda, you can install the correct version by calling conda install -c conda-forge ffmpeg. Otherwise, you can obtain a static binary from the ffmpeg website.

On windows you can use the provided installation binaries:

Installing Scaper

The simplest way to install scaper is by using pip, which will also install the required python dependencies if needed. To install scaper using pip, simply run:

pip install scaper

To install the latest version of scaper from source, clone or pull the lastest version:

git clone git@github.com:justinsalamon/scaper.git

Then enter the source folder and install using pip to handle python dependencies:

cd scaper
pip install -e .

Tutorial

To help you get started with scaper, please see this step-by-step tutorial.

Example

import scaper
import numpy as np

# OUTPUT FOLDER
outfolder = 'audio/soundscapes/'

# SCAPER SETTINGS
fg_folder = 'audio/soundbank/foreground/'
bg_folder = 'audio/soundbank/background/'

n_soundscapes = 1000
ref_db = -50
duration = 10.0 

min_events = 1
max_events = 9

event_time_dist = 'truncnorm'
event_time_mean = 5.0
event_time_std = 2.0
event_time_min = 0.0
event_time_max = 10.0

source_time_dist = 'const'
source_time = 0.0

event_duration_dist = 'uniform'
event_duration_min = 0.5
event_duration_max = 4.0

snr_dist = 'uniform'
snr_min = 6
snr_max = 30

pitch_dist = 'uniform'
pitch_min = -3.0
pitch_max = 3.0

time_stretch_dist = 'uniform'
time_stretch_min = 0.8
time_stretch_max = 1.2
    
# Generate 1000 soundscapes using a truncated normal distribution of start times

for n in range(n_soundscapes):
    
    print('Generating soundscape: {:d}/{:d}'.format(n+1, n_soundscapes))
    
    # create a scaper
    sc = scaper.Scaper(duration, fg_folder, bg_folder)
    sc.protected_labels = []
    sc.ref_db = ref_db
    
    # add background
    sc.add_background(label=('const', 'noise'), 
                      source_file=('choose', []), 
                      source_time=('const', 0))

    # add random number of foreground events
    n_events = np.random.randint(min_events, max_events+1)
    for _ in range(n_events):
        sc.add_event(label=('choose', []), 
                     source_file=('choose', []), 
                     source_time=(source_time_dist, source_time), 
                     event_time=(event_time_dist, event_time_mean, event_time_std, event_time_min, event_time_max), 
                     event_duration=(event_duration_dist, event_duration_min, event_duration_max), 
                     snr=(snr_dist, snr_min, snr_max),
                     pitch_shift=(pitch_dist, pitch_min, pitch_max),
                     time_stretch=(time_stretch_dist, time_stretch_min, time_stretch_max))
    
    # generate
    audiofile = os.path.join(outfolder, "soundscape_unimodal{:d}.wav".format(n))
    jamsfile = os.path.join(outfolder, "soundscape_unimodal{:d}.jams".format(n))
    txtfile = os.path.join(outfolder, "soundscape_unimodal{:d}.txt".format(n))
    
    sc.generate(audiofile, jamsfile,
                allow_repeated_label=True,
                allow_repeated_source=False,
                reverb=0.1,
                disable_sox_warnings=True,
                no_audio=False,
                txt_path=txtfile)