feat: cover song identification exemple
I juste run the exemple with somme mp3 that i found. Now i was juste too lasy to make a script that download the mp3. Next time I'll do it, promise! I had also to run the exemple in stream mode. lot of nice thing to do :)
This commit is contained in:
parent
4448ea6af2
commit
77c9e59767
BIN
audio/Bella Poarch - Build a Btch (Official Music Video).mp3
Normal file
BIN
audio/Bella Poarch - Build a Btch (Official Music Video).mp3
Normal file
Binary file not shown.
Binary file not shown.
BIN
audio/Yesterday (Remastered 2009).mp3
Normal file
BIN
audio/Yesterday (Remastered 2009).mp3
Normal file
Binary file not shown.
BIN
audio/Yesterday - The Beatles - Connie Talbot (Cover).mp3
Normal file
BIN
audio/Yesterday - The Beatles - Connie Talbot (Cover).mp3
Normal file
Binary file not shown.
189
cover_song_identification.py
Normal file
189
cover_song_identification.py
Normal file
@ -0,0 +1,189 @@
|
||||
## tutorial from: https://essentia.upf.edu/essentia_python_examples.html
|
||||
#
|
||||
##Cover song identification (CSI) in MIR 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 this CSI algorithms.
|
||||
##
|
||||
## Tonal feature extraction. Mostly used by chroma features. Here we use HPCP.
|
||||
##
|
||||
## Post-processing of the features to achieve invariance (eg. key) [3].
|
||||
##
|
||||
## Cross similarity matrix computation ([1] or [2]).
|
||||
##
|
||||
## 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.
|
||||
|
||||
import essentia.standard as estd
|
||||
from essentia.pytools.spectral import hpcpgram
|
||||
|
||||
import IPython
|
||||
#IPython.display.Audio('./en_vogue+Funky_Divas+09-Yesterday.mp3')
|
||||
#IPython.display.Audio('./beatles+1+11-Yesterday.mp3')
|
||||
#IPython.display.Audio('./aerosmith+Live_Bootleg+06-Come_Together.mp3')
|
||||
|
||||
yesterday_original = 'audio/Yesterday (Remastered 2009).mp3'
|
||||
yesterday_cover_01 = 'audio/Yesterday - The Beatles - Connie Talbot (Cover).mp3'
|
||||
yesterday_cover_02 = 'audio/The Beatles - Yesterday Saxophone Cover Alexandra Ilieva Thomann.mp3'
|
||||
different_song = 'audio/Bella Poarch - Build a Btch (Official Music Video).mp3'
|
||||
|
||||
IPython.display.Audio(yesterday_original)
|
||||
IPython.display.Audio(yesterday_cover_01)
|
||||
IPython.display.Audio(yesterday_cover_02)
|
||||
IPython.display.Audio(different_song)
|
||||
|
||||
# query cover song
|
||||
original_song = estd.MonoLoader(filename=yesterday_original, sampleRate=32000)()
|
||||
|
||||
true_cover_01 = estd.MonoLoader(filename=yesterday_cover_01, sampleRate=32000)()
|
||||
true_cover_02 = estd.MonoLoader(filename=yesterday_cover_02, sampleRate=32000)()
|
||||
|
||||
# wrong match
|
||||
false_cover_1 = estd.MonoLoader(filename=different_song, sampleRate=32000)()
|
||||
|
||||
## Now let’s compute Harmonic Pitch Class Profile (HPCP) chroma features of these audio signals.
|
||||
|
||||
query_hpcp = hpcpgram(original_song, sampleRate=32000)
|
||||
|
||||
true_cover_hpcp_1 = hpcpgram(true_cover_01, sampleRate=32000)
|
||||
true_cover_hpcp_2 = hpcpgram(true_cover_02, sampleRate=32000)
|
||||
|
||||
false_cover_hpcp = hpcpgram(false_cover_1, sampleRate=32000)
|
||||
|
||||
## plotting the hpcp features
|
||||
#%matplotlib inline
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(14.5, 4.5)
|
||||
|
||||
plt.title("Query song HPCP")
|
||||
plt.imshow(query_hpcp[:500].T, aspect='auto', origin='lower', interpolation='none')
|
||||
|
||||
## Next steps are done using the essentia ChromaCrossSimilarity function,
|
||||
##
|
||||
## Stacking input features
|
||||
##
|
||||
## Key invariance using Optimal Transposition Index (OTI) [3].
|
||||
##
|
||||
## Compute binary chroma cross similarity using cross recurrent plot as described in [1] or using OTI-based chroma binary method as detailed in [3]
|
||||
|
||||
crp = estd.ChromaCrossSimilarity(frameStackSize=9,
|
||||
frameStackStride=1,
|
||||
binarizePercentile=0.095,
|
||||
oti=True)
|
||||
|
||||
true_pair_crp_1 = crp(query_hpcp, true_cover_hpcp_1)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cross recurrent plot [1]')
|
||||
plt.xlabel('Yesterday accapella cover')
|
||||
plt.ylabel('Yesterday - The Beatles')
|
||||
plt.imshow(true_pair_crp_1, origin='lower')
|
||||
|
||||
|
||||
true_pair_crp_2 = crp(query_hpcp, true_cover_hpcp_2)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cross recurrent plot [1]')
|
||||
plt.xlabel('Yesterday accapella cover')
|
||||
plt.ylabel('Yesterday - The Beatles')
|
||||
plt.imshow(true_pair_crp_2, origin='lower')
|
||||
|
||||
|
||||
|
||||
## Compute binary chroma cross similarity using cross recurrent plot of the non-cover pairs
|
||||
|
||||
crp = estd.ChromaCrossSimilarity(frameStackSize=9,
|
||||
frameStackStride=1,
|
||||
binarizePercentile=0.095,
|
||||
oti=True)
|
||||
|
||||
false_pair_crp = crp(query_hpcp, false_cover_hpcp)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cross recurrent plot [1]')
|
||||
plt.xlabel('Come together cover - Aerosmith')
|
||||
plt.ylabel('Yesterday - The Beatles')
|
||||
plt.imshow(false_pair_crp, origin='lower')
|
||||
|
||||
|
||||
## Alternatively, you can also use the OTI-based binary similarity method as explained in [2] to compute the cross similarity of two given chroma features.
|
||||
|
||||
csm = estd.ChromaCrossSimilarity(frameStackSize=9,
|
||||
frameStackStride=1,
|
||||
binarizePercentile=0.095,
|
||||
oti=True,
|
||||
otiBinary=True)
|
||||
|
||||
oti_csm = csm(query_hpcp, false_cover_hpcp)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cross similarity matrix using OTI binary method [2]')
|
||||
plt.xlabel('Come together cover - Aerosmith')
|
||||
plt.ylabel('Yesterday - The Beatles')
|
||||
plt.imshow(oti_csm, origin='lower')
|
||||
|
||||
|
||||
|
||||
|
||||
## Finally, we compute an asymmetric cover song similarity measure from the pre-computed binary cross simialrity matrix of cover/non-cover pairs using various contraints of smith-waterman sequence alignment algorithm (eg. serra09 or chen17).
|
||||
##
|
||||
## Computing cover song similarity distance between ‘Yesterday - accapella cover’ and ‘Yesterday - The Beatles’
|
||||
|
||||
score_matrix, distance = estd.CoverSongSimilarity(disOnset=0.5,
|
||||
disExtension=0.5,
|
||||
alignmentType='serra09',
|
||||
distanceType='asymmetric')(true_pair_crp_1)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cover song similarity distance: %s' % distance)
|
||||
plt.xlabel('Yesterday accapella cover')
|
||||
plt.ylabel('Yesterday - The Beatles')
|
||||
plt.imshow(score_matrix, origin='lower')
|
||||
|
||||
print('Cover song similarity distance: %s' % distance)
|
||||
|
||||
## other similar
|
||||
|
||||
score_matrix, distance = estd.CoverSongSimilarity(disOnset=0.5,
|
||||
disExtension=0.5,
|
||||
alignmentType='serra09',
|
||||
distanceType='asymmetric')(true_pair_crp_2)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cover song similarity distance: %s' % distance)
|
||||
plt.xlabel('Yesterday accapella cover')
|
||||
plt.ylabel('Yesterday - The Beatles')
|
||||
plt.imshow(score_matrix, origin='lower')
|
||||
|
||||
print('Cover song similarity distance: %s' % distance)
|
||||
|
||||
## Computing cover song similarity distance between Yesterday - accapella cover and Come Together cover - The Aerosmith.
|
||||
|
||||
score_matrix, distance = estd.CoverSongSimilarity(disOnset=0.5,
|
||||
disExtension=0.5,
|
||||
alignmentType='serra09',
|
||||
distanceType='asymmetric')(false_pair_crp)
|
||||
|
||||
fig = plt.gcf()
|
||||
fig.set_size_inches(15.5, 5.5)
|
||||
|
||||
plt.title('Cover song similarity distance: %s' % distance)
|
||||
plt.xlabel('Yesterday accapella cover')
|
||||
plt.ylabel('Come together cover - Aerosmith')
|
||||
plt.imshow(score_matrix, origin='lower')
|
||||
|
||||
print('Cover song similarity distance: %s' % distance)
|
Loading…
Reference in New Issue
Block a user