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 [1].
[1] 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)