Cover Song Identification

Cover song identification is a task of identifying when two musical recordings are derived from the same music composition. The cover of a song can be drastically different from the original recording. It can change key, tempo, instrumentation, musical structure or order, etc.

Essentia provides open-source implmentation of some state-of-the-art cover song identification algorithms. The following process-chain is required to use these algorithms.

  1. Tonal feature extraction. Mostly used by chroma features. Here we use HPCP.

  2. Post-processing of the features to achieve invariance (eg. key) [3].

  3. Cross similarity matrix computation ([1] or [2]).

  4. Local sub-sequence alignment to compute the pairwise cover song similarity distance [1].

In this tutorial, we use HPCP, ChromaCrossSimilarity and CoverSongSimilarity algorithms from essentia.

References:

[1]. Serra, J., Serra, X., & Andrzejak, R. G. (2009). Cross recurrence quantification for cover song identification.New Journal of Physics.

[2]. Serra, Joan, et al (2008). Chroma binary similarity and local alignment applied to cover song identification. IEEE Transactions on Audio, Speech, and Language Processing.

[3]. Serra, J., Gómez, E., & Herrera, P. (2008). Transposing chroma representations to a common key, IEEE Conference on The Use of Symbols to Represent Music and Multimedia Objects.

import essentia.standard as estd
from essentia.pytools.spectral import hpcpgram

Let’s load a query cover song, true-cover reference song and a false-cover reference song. Here we chose a accapella cover of the Beatles track Yesterday as our query song and it’s orginal version by the Beatles and a cover of another Beatles track Come Together by the Aerosmith as the reference tracks. We obtained these audio files from the covers80 dataset (https://labrosa.ee.columbia.edu/projects/coversongs/covers80/).

  • Query cover song

import IPython
IPython.display.Audio('./en_vogue+Funky_Divas+09-Yesterday.mp3')
  • Reference song (True cover)

IPython.display.Audio('./beatles+1+11-Yesterday.mp3')