Have you ever heard or even use service like Shazam? Cool, right? No, we are not going to make something as magical as it ? But using chromaprint we can create audio fingerprint so that we can do music search by using a music sample.
Before we can use chromaprint python library, pyacoustid, we need to install chromaprint C library in our OS. The build instruction is in its repo. Or if you use Debian/Ubuntu, you can install it using apt
(if there is any error, try to google up the error. Most of the time, it’s due to missing dependency):
sudo apt install ffmpeg acoustid-fingerprinter
Then you can create virtual environment (or not) and install the pip packages:
pip install pyacoustid
Now to generate a fingerprint from a file:
import acoustid import chromaprint duration, fp_encoded = acoustid.fingerprint_file('music.mp3') fingerprint, version = chromaprint.decode_fingerprint(fp_encoded) print(fingerprint)
The fingerprint
will contain an array of 948 signed int
that represent compact characteristic aka fingerprint of the audio file. It can also be visualized with the help of numpy
and matplotlib
:
pip install numpy matplotlib
import numpy as np import matplotlib.pyplot as plt ... fig = plt.figure() bitmap = np.transpose(np.array([[b == '1' for b in list('{:32b}'.format(i & 0xffffffff))] for i in fingerprint])) plt.imshow(bitmap)
Now, let say we have another music file and want to check the similarity with the previous file. One way to do this is by calculating similarity between the fingerprints:
pip install fuzzywuzzy[speedup]
from fuzzywuzzy import fuzz similarity = fuzz.ratio(sample_fingerprint, fingerprint) print(similarity)
The similarity
will contains percentage of similarity between sample_fingerprint
and fingerprint
calculated using fuzzy algorithm.
I also made a simple program that uses all the codes above. The program calculates similarity between files in two directories, find the best match and also visualize the fingerprints.
That’s all. Thanks for reading ☕