Skip to content

🎡 A cross-platform music recognition client for Shazam with WebAssembly and FFI support

License

Notifications You must be signed in to change notification settings

BayernMuller/vibra

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation


vibra

GitHub stars

Overview

  • 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

Live Demo

Platform Compatibility and Build Status

Platform Architecture Build Status
WebAssembly -
Linux x86_64, ARM64
Windows x86_64 βœ…
macOS x86_64, ARM64 βœ…
Raspberry Pi ARMv8-A, ARMv6 βœ…

Building the WebAssembly Version

  • Please refer to bindings/wasm/README.md for instructions on building and running the WebAssembly version of vibra.

Building the Native Version

Prerequisites

  • 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.

Install dependencies

  • Ubuntu
    • sudo apt-get update
    • sudo apt-get install cmake libcurl4-openssl-dev libfftw3-dev
    • sudo apt-get install ffmpeg (Optional)
  • Windows
    • Install CMake
    • Install vcpkg
    • Install dependencies using vcpkg:
      • vcpkg install curl:x64-windows fftw3:x64-windows
    • Add the vcpkg toolchain file to your CMake command (see Build section)
    • Install FFmpeg (Optional)
  • macOS
    • Install Homebrew
    • brew install cmake curl fftw
    • brew install ffmpeg (Optional)

Build

  • 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.

Usage

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
Recognizing a song from a WAV file
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"
Recognizing a song from a microphone
  • You can use sox or FFmpeg to capture raw PCM data from the microphone.
  • sox
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)",
  ...
]
Recognizing non-WAV files
  • 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

FFI Bindings

  • 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 the build 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.

Performance comparison


lower is better

  • 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!

License

  • vibra is licensed under the GPLv3 license. See LICENSE for more details.

Releases

No releases published

Packages

No packages published