Chromaprint and its associated
Acoustid Web service make up a
high-quality, open-source acoustic fingerprinting system. This package provides
Python bindings for both the fingerprinting algorithm library, which is written
in C but portable, and the Web service, which provides fingerprint lookups.
This library works with Python 2 (2.7+, possibly also 2.6) and Python 3 (3.3+).
First, install the
Chromaprint fingerprinting library by
(The library itself depends on an FFT library, but it's smart enough to use an
algorithm from software you probably already have installed; see the Chromaprint
page for details.) This module can use either the Chromaprint dynamic library or
fpcalc command-line tool, which itself depends on
libavcodec. If you
fpcalc, either ensure that it is on your
$PATH or set the
environment variable to its location.
Then you can install this library from
pip install pyacoustid
This library uses
audioread to do audio decoding when not using
requests to talk to the HTTP API (pip should automatically install
You can run the included demonstration script,
aidmatch.py, to test your
$ python aidmatch.py mysterious_music.mp3
This will show the top metadata match from Acoustid's database. The script uses
audioread_ to decode music, so it should transparently use a media library
available on your system (GStreamer, FFmpeg, MAD, or Core Audio).
The simplest way to use pyacoustid to identify audio files is to call the
import acoustid for score, recording_id, title, artist in acoustid.match(apikey, path): ...
This convenience function uses
audioread_ to decode audio and parses the
response for you, pulling out the most important track metadata. It returns in
iterable over tuples of relevant information. Everything happens in one fell
swoop. There are also a number of "smaller" functions you can use to perform
parts of the process:
fingerprint(samplerate, channels, pcmiter): Generate a fingerprint for raw audio data. Specify the audio parameters and give an iterable containing blocks of PCM data.
fingerprint_file(path): Using either the Chromaprint dynamic library or the
fpcalccommand-line tool, fingerprint an audio file. (You can use
force_fpcalcto use only the latter.) Returns a pair consisting of the file's duration and its fingerprint.
lookup(apikey, fingerprint, duration): Make a request to the
Acoustid_ API to look up the fingerprint returned by the previous function. An API key is required, as is the length, in seconds, of the source audio. Returns a parsed JSON response.
parse_lookup_result(data): Given a parsed JSON response, return an iterator over tuples containing the match score (a float between 0 and 1), the MusicBrainz recording ID, title, and artist name for each match.
The module internally performs thread-safe API rate limiting to 3 queries per
second whenever the Web API is called, in accordance with the
Web service documentation_.
If you're running your own Acoustid database server, you can set the base URL
for all API calls with the
Calls to the library can raise
AcoustidError exceptions of two subtypes:
WebServiceError. Catch these exceptions
if you want to proceed when audio can't be decoded or no match is found on the
NoBackendError, a subclass of
used when the Chromaprint library or fpcalc command-line tool cannot be found.
.. _Web service documentation: http://acoustid.org/webservice
Fix a regression in the previous version that caused a
KeyError crash when
meta parameter to some API functions can now be a list (instead of
just a single string).
force_fpcalc option to
Avoid leaving a dangling socket after communicating with the server.
Fix a crash when passing a
memoryview object to the fingerprinter.
API requests can now optionally time out.
More reliably find the library on Windows on Python 3.8.
hash_fingerprint function to the low-level library.
1.1.7 Include a LICENSE file.
In submission, avoid an error on non-integer durations.
A new function,
get_submission_status, abstracts the API endpoint for
monitoring submissions using the (new) result from the
Fix compatibility with Python 3 in the
submit are now also handled correctly (i.e., they raise an
WebServiceError instead of a
Fix an error on versions of the
fpcalc tool that report the duration as a
bytearray objects in addition to other bytes-like types.
1.1.2 Fix a possible crash on Unicode text in Python 2 in a non-Unicode locale. Look for version "1" of the Chromaprint shared library file.
1.1.1 Fix a possible setup error on Python 3 (thanks to Simon Chopin).
fpcalc.py script in source distributions.
Add Python 3 support (thanks to Igor Tsarev).
fpcalc.py, a script mimicking the
fpcalc program from the
UnicodeDecodeError raised when using the
fpcalc backend on
Windows with Unicode filenames.
Standard error output from
fpcalc is suppressed.
Properly encode Unicode parameters (resolves a
in fingerprint submission).
Parse all recordings for each Acoustid lookup result.
Add a new function,
fingerprint_file, that automatically selects a
backend for fingerprinting a single file.
Fix response parsing when recording has no artists or title.
Fix compatibility with Python < 2.7.
Fingerprinting can now fall back to using the
fpcalc command-line tool
instead of the Chromaprint dynamic library so the library can be used with
the binary distributions (thanks to Lukáš Lalinský).
Fingerprint submission (thanks to Alastair Porter).
Data chunks can now be buffers as well as bytestrings (fixes compatibility
Configurable API base URL.
Result parser now generates all results instead of returning just one.
Find the chromaprint library on Cygwin.
New module names:
acoustid (no package).
0.2 Compress HTTP requests and responses. Limit audio decoding to 120 seconds. Return score from convenience function.
0.1 Initial release.
This library is by Adrian Sampson. Chromaprint and Acoustid are by
Lukáš Lalinský_. This package includes the original
written by Lukáš. The entire library is made available under the
pyacoustid was written to be used with
beets, which you should probably check
_ lukas .. _ctypes: http://docs.python.org/library/ctypes.html .. _beets: http://beets.radbox.org/ .. _MIT license: http://www.opensource.org/licenses/mit-license.php