In [44]:
%matplotlib inline
import mir_eval, librosa, numpy, matplotlib.pyplot as plt
mir_eval
(documentation, paper) is a Python library containing evaluation functions for a variety of common audio and music processing tasks.
mir_eval
was primarily created by Colin Raffel. This notebook was created by Brian McFee and edited by Steve Tjoa.
Most tasks in MIR are complicated. Evaluation is also complicated!
Any given task has many ways to evaluate a system. There is no one right away.
For example, here are issues to consider when choosing an evaluation method:
bss_eval
in Matlab)pip install mir_eval
If that doesn't work:
pip install --no-deps mir_eval
In [5]:
y, sr = librosa.load('audio/simple_piano.wav')
In [13]:
# Estimate onsets.
est_onsets = librosa.onset.onset_detect(y=y, sr=sr, units='time')
In [14]:
est_onsets
Out[14]:
In [15]:
# Load the reference annotation.
ref_onsets = numpy.array([0.1, 0.21, 0.3])
In [19]:
mir_eval.onset.evaluate(ref_onsets, est_onsets)
Out[19]:
mir_eval
finds the largest feasible set of matches using the Hopcroft-Karp algorithm.
In [31]:
est_tempo, est_beats = librosa.beat.beat_track(y=y, sr=sr)
est_beats = librosa.frames_to_time(est_beats, sr=sr)
In [32]:
est_beats
Out[32]:
In [33]:
# Load the reference annotation.
ref_beats = numpy.array([0.53, 1.02])
In [34]:
mir_eval.beat.evaluate(ref_beats, est_beats)
Out[34]:
In [35]:
mir_eval.chord.evaluate()
Hidden benefits
mir_eval has tools for display and sonification.
In [38]:
import librosa.display
import mir_eval.display
Common plots: events
, labeled_intervals
pitch, multipitch, piano_roll segments, hierarchy, separation
In [37]:
librosa.display.specshow(S, x_axis='time', y_axis='mel')
mir_eval.display.events(ref_beats, color='w', alpha=0.8, linewidth=3)
mir_eval.display.events(est_beats, color='c', alpha=0.8, linewidth=3, linestyle='--')
In [39]:
y_harm, y_perc = librosa.effects.hpss(y, margin=8)
In [45]:
plt.figure(figsize=(12, 4))
mir_eval.display.separation([y_perc, y_harm], sr, labels=['percussive', 'harmonic'])
plt.legend()
Out[45]:
In [ ]:
Audio(data=numpy.vstack([
In [ ]:
mir_eval.sonify.chords()