Echoprint Codegen binaries
Boost headers only are located in folder boost
. Please customize BOOST_CFLAGS=-I../boost
.
cd echoprint-codegen/
cd src/
make
make DESTDIR=../build install
There are two modes of operation of the Echoprint codegen:
-
the codegen library (libcodegen) is meant to be linked into code that passes it a buffer of PCM data and will output a code string.
-
the codegen binary runs standalone, accepts filenames as inputs and runs in a multithreaded worker mode.
- Boost >= 1.35
- zlib
- TagLib
- ffmpeg - this is called via shell and is not linked into codegen
On Ubuntu or Debian you can install these dependencies with:
sudo apt-get install ffmpeg libboost1.42-dev libtag1-dev zlib1g-dev
On OS-X with homebrew you can use:
brew install ffmpeg boost taglib
On Windows:
Refer to the documentation under the windows folder for more specifics.
The binary generated in Windows will be named codegen by default where as on Linux or Mac OS-X it is named echoprint-codegen.
Code generation takes a buffer of floating point PCM data sampled at 11025 Hz and mono.
Codegen * pCodegen = new Codegen(const float* pcm, uint numSamples, int start_offset);
pcm: a buffer of floats, mono, 11025 Hz
numSamples: the number of samples
start_offset: creates a hint to the server on where the sample is taken from in the original file if known
string code = pCodegen->getCodeString();
The code string is just a base64 encoding of a zlib compression of the original code string, which is a hex encoded series of ASCII numbers. See API/fp.py in echoprint-server for decoding help.
You only need to query for 20 seconds of audio to get a result.
The makefile builds an example code generator that uses libcodegen, called "codegen." This code generator has more features -- it will output ID3 tag information and uses ffmpeg to decode any type of file. If you don't need to compile libcodegen into your app you can rely on this. Note that you need to have ffmpeg installed and accessible on your path for this to work.
./echoprint-codegen billie_jean.mp3 10 30
Will take 30 seconds of audio from 10 seconds into the file and output JSON suitable for querying:
{"metadata":{"artist":"Michael jackson", "release":"800 chansons des annes 80", "title":"Billie jean", "genre":"", "bitrate":192, "sample_rate":44100, "seconds":294, "filename":"billie_jean.mp3", "samples_decoded":220598, "given_duration":30, "start_offset":10, "version":4.00}, "code_count":846, "code":"JxVlIuNwzAMQ1fxCDL133+xo1rnGqNAEcWy/ERa2aKeZmW...
You can host your own Echoprint server and ingest or query to that.
Codegen also runs in a multithreaded mode for bulk resolving:
./echoprint-codegen -s 10 30 < file_list
Will compute codes for every file in file_list for 30 seconds starting at 10 seconds. (It tries to be smart about the number of threads to use.) It will output a JSON list.
Codegen scans audio at roughly 250x real time per processor after decoding and resampling to 11025 Hz. This means a full song can be scanned in less than 0.5s on an average computer, and an amount of audio suitable for querying (30s) can be scanned in less than 0.04s.
Decoding from MP3 will be the bottleneck for most implementations. Decoders like mpg123 or ffmpeg can decode 30s mp3 audio to 11025 PCM in under 0.10s.
clump:echoprint-codegen bwhitman$ time mpg123 -q -s -4 -n 1200 song.mp3 > /dev/null
real 0m0.079s
user 0m0.067s
sys 0m0.007s