- vibra is a library and CLI tool for music recognition using the unofficial Shazam API.
- It analyzes audio files, generates fingerprints, and queries Shazam's database for song identification.
- Key features:
- Fast and lightweight, optimized for various platforms, including embedded devices.
- Cross-platform support: Linux, Windows, macOS, WebAssembly, and FFI bindings for other languages.
- Flexible input processing: native support for WAV files, optional FFmpeg for other formats.
- Based on Shazam's algorithm:
- Inspired by SongRec, adapted to C++ 11.
- Target platforms:
- Embedded devices (e.g., Raspberry Pi, Jetson Nano)
- Desktop and server environments for high-performance recognition
- WebAssembly for web-based use
- Additional support for iOS, Android, and other languages via FFI bindings
- You can try the music recognition with the WebAssembly version of vibra here
- The source code for the demo is available at vibra-live-demo
Platform | Architecture | Build Status |
---|---|---|
WebAssembly | - | |
Linux | x86_64, ARM64 | |
Windows | x86_64 | β |
macOS | x86_64, ARM64 | β |
Raspberry Pi | ARMv8-A, ARMv6 | β |
- Please refer to bindings/wasm/README.md for instructions on building and running the WebAssembly version of vibra.
- vibra requires CMake for its build process. Please install CMake before proceeding.
- The project is developed using the C++11 standard.
- vibra has the following dependencies:
- CMake: A cross-platform build system generator.
- libfftw3: A library for computing Fast Fourier Transforms.
- libcurl (CLI tool only): A library for transferring data with URLs.
- If you don't need CLI tool, libcurl is not required.
- You can disable it by setting the
-DLIBRARY_ONLY=ON
option in the CMake command.
- FFmpeg (Optional): Provides support for audio formats other than WAV (e.g., MP3, FLAC).
- Install FFmpeg if you need to process audio files in formats other than WAV.
- Ubuntu
sudo apt-get update
sudo apt-get install cmake libcurl4-openssl-dev libfftw3-dev
sudo apt-get install ffmpeg
(Optional)
- Windows
- macOS
- Install Homebrew
brew install cmake curl fftw
brew install ffmpeg
(Optional)
-
Clone vibra repository
git clone https://github.com/bayernmuller/vibra.git
-
Run the following commands to build vibra:
cd vibra
mkdir build && cd build
cmake ..
make
sudo make install
(Optional)- Installs the libvibra static, shared libraries and the vibra command-line tool.
Use --help option to see the help message.
vibra {COMMAND} [OPTIONS]
Options:
Commands:
-F, --fingerprint Generate a fingerprint
-R, --recognize Recognize a song
-h, --help Display this help menu
Sources:
File sources:
-f, --file File path
Raw PCM sources:
-s, --seconds Chunk seconds
-r, --rate Sample rate
-c, --channels Channels
-b, --bits Bits per sample
vibra --recognize --file sample.wav > result.json
jq .track.title result.json
"Stairway To Heaven"
jq .track.subtitle result.json
"Led Zeppelin"
jq .track.share.href result.json
"https://www.shazam.com/track/5933917/stairway-to-heaven"
sox -d -t raw -b 24 -e signed-integer -r 44100 -c 1 - 2>/dev/null
| vibra --recognize --seconds 5 --rate 44100 --channels 1 --bits 24 > result.json
- FFmpeg
ffmpeg -f avfoundation -i ":2" -f s32le -ar 44100 -ac 1 - 2>/dev/null
| vibra --recognize --seconds 5 --rate 44100 --channels 1 --bits 32 > result.json
# - "avfoundation" can be replaced depending on your system.
# - Make sure to use the correct device index for your system.
- output
jq .track.title result.json
"Bound 2"
jq .track.subtitle result.json
"Kanye West"
jq .track.sections[1].text result.json
[
"B-B-B-Bound to fall in love",
"Bound to fall in love",
"(Uh-huh, honey)",
...
]
- To decode non-WAV media files, FFmpeg must be installed on your system.
- Vibra will attempt to locate FFmpeg in your system's PATH environment variable. If you prefer, you can explicitly specify the FFmpeg path by setting the
FFMPEG_PATH
environment variable.
# Automatically find FFmpeg in PATH
vibra --recognize --file sample.mp3
# Specify the FFmpeg path
export FFMPEG_PATH=/opt/homebrew/bin/ffmpeg
vibra --recognize --file sample.mp3
# You can use your own FFmpeg which is optimized for your system.
- You can see the sample shazam result json file in here
- vibra provides FFI bindings, allowing other languages to leverage its music recognition functionality.
- After building vibra, the shared library
libvibra.so
will be located in thebuild
directory. - This shared library can be integrated into languages such as Python or Swift using FFI mechanisms.
- For detailed function signatures, please refer to the vibra header file vibra.h.
- I compared the performance of vibra with the SongRec rust and python version on the Raspberry Pi 4.
- vibra is about 2 times faster than the SongRec!
- vibra is licensed under the GPLv3 license. See LICENSE for more details.