librosa.onset.onset_detect

librosa.onset.onset_detect(y=None, sr=22050, onset_envelope=None, hop_length=512, backtrack=False, energy=None, units='frames', **kwargs)[source]

Basic onset detector. Locate note onset events by picking peaks in an onset strength envelope.

The peak_pick parameters were chosen by large-scale hyper-parameter optimization over the dataset provided by [R42].

[R42]https://github.com/CPJKU/onset_db
Parameters:

y : np.ndarray [shape=(n,)]

audio time series

sr : number > 0 [scalar]

sampling rate of y

onset_envelope : np.ndarray [shape=(m,)]

(optional) pre-computed onset strength envelope

hop_length : int > 0 [scalar]

hop length (in samples)

units : {‘frames’, ‘samples’, ‘time’}

The units to encode detected onset events in. By default, ‘frames’ are used.

backtrack : bool

If True, detected onset events are backtracked to the nearest preceding minimum of energy.

This is primarily useful when using onsets as slice points for segmentation.

energy : np.ndarray [shape=(m,)] (optional)

An energy function to use for backtracking detected onset events. If none is provided, then onset_envelope is used.

kwargs : additional keyword arguments

Additional parameters for peak picking.

See librosa.util.peak_pick for details.

Returns:

onsets : np.ndarray [shape=(n_onsets,)]

estimated positions of detected onsets, in whichever units are specified. By default, frame indices.

Note

If no onset strength could be detected, onset_detect returns an empty list.

Raises:

ParameterError

if neither y nor onsets are provided

or if units is not one of ‘frames’, ‘samples’, or ‘time’

See also

onset_strength
compute onset strength per-frame
onset_backtrack
backtracking onset events
librosa.util.peak_pick
pick peaks from a time series

Examples

Get onset times from a signal

>>> y, sr = librosa.load(librosa.util.example_audio_file(),
...                      offset=30, duration=2.0)
>>> onset_frames = librosa.onset.onset_detect(y=y, sr=sr)
>>> librosa.frames_to_time(onset_frames, sr=sr)
array([ 0.07 ,  0.395,  0.511,  0.627,  0.766,  0.975,
        1.207,  1.324,  1.44 ,  1.788,  1.881])

Or use a pre-computed onset envelope

>>> o_env = librosa.onset.onset_strength(y, sr=sr)
>>> times = librosa.frames_to_time(np.arange(len(o_env)), sr=sr)
>>> onset_frames = librosa.onset.onset_detect(onset_envelope=o_env, sr=sr)
>>> import matplotlib.pyplot as plt
>>> D = librosa.stft(y)
>>> plt.figure()
>>> ax1 = plt.subplot(2, 1, 1)
>>> librosa.display.specshow(librosa.amplitude_to_db(D, ref=np.max),
...                          x_axis='time', y_axis='log')
>>> plt.title('Power spectrogram')
>>> plt.subplot(2, 1, 2, sharex=ax1)
>>> plt.plot(times, o_env, label='Onset strength')
>>> plt.vlines(times[onset_frames], 0, o_env.max(), color='r', alpha=0.9,
...            linestyle='--', label='Onsets')
>>> plt.axis('tight')
>>> plt.legend(frameon=True, framealpha=0.75)

(Source code)

../_images/librosa-onset-onset_detect-1.png