#shazam #audio-fingerprinting

app songrec

Linux下的开源Shazam客户端,用Rust编写

18个版本

0.4.2 2024年1月22日
0.4.0 2023年12月24日
0.3.3 2023年10月15日
0.3.2 2022年5月26日
0.1.2 2020年11月2日

音频 类别中排名 38

Download history 17/week @ 2024-03-10 233/week @ 2024-03-17 3/week @ 2024-03-24 25/week @ 2024-03-31 1/week @ 2024-04-07 3/week @ 2024-04-21 6/week @ 2024-04-28 1/week @ 2024-05-05 8/week @ 2024-05-19 2/week @ 2024-05-26 19/week @ 2024-06-02 18/week @ 2024-06-09 3/week @ 2024-06-16 71/week @ 2024-06-23

每月下载量 111

GPL-3.0+

755KB
5.5K SLoC

Rust 5K SLoC // 0.0% comments Python 612 SLoC // 0.1% comments Shell 92 SLoC // 0.3% comments

包含(Windows可执行文件,140KB) packaging/windows/7zxSD_LZMA2_x64.sfx

SongRec

SongRec是Linux下的开源Shazam客户端,用Rust编写。

Screenshot

功能

  • 识别任意音频文件中的音频。
  • 识别麦克风中的音频。
  • 通过GUI和命令行(对于文件识别部分)使用。
  • 在GUI中提供识别歌曲的历史记录,可导出为CSV。
  • 从麦克风持续检测歌曲,可以选择输入设备。
  • 能够在兼容PulseAudio配置的情况下,从扬声器而不是麦克风识别歌曲。
  • 从歌曲生成诱饵,当播放时,会欺骗Shazam认为它是相关的歌曲。

还有一个(仅命令行)Python版本,我在用Rust重写之前制作的,也供演示使用。它仅支持文件识别。

工作原理

有关音频指纹识别的有用信息,您可以阅读这篇文章。简单来说,Shazam生成声音的谱图(声音的时间/频率2D图,交叉处的振幅),并从其中映射出频率峰值(这些峰值应与声音或某些乐器的谐波的关键点相匹配)。

Shazam在处理之前还将声音下采样到16 KHz,并将声音切割成四个频段:250-520 Hz,520-1450 Hz,1450-3500 Hz,3500-5500 Hz(这样如果某个频段被噪声过度干扰,则可以从其他频段进行识别)。然后将频率峰值发送到服务器,服务器随后在数据库中查找最强的峰值,以寻找我们在指纹中发送的指纹和关联参考指纹中相邻峰值的同时存在。

因此,客户端实现的Shazam指纹识别算法相当简单,因为大部分处理都在服务器端完成。Shazam的一般工作原理已在公开的研究论文和专利中记录。

安装

以下是安装和运行应用程序的几种方法

使用pacman(Arch Linux)

sudo pacman -S songrec
songrec

使用apt和PPA(Ubuntu,支持18.04,20.04,22.04,23.04,23.10)

wget -qO- 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x6888550b2fc77d09' | sudo tee /etc/apt/trusted.gpg.d/songrec.asc
sudo apt-add-repository ppa:marin-m/songrec -y -u
sudo apt install songrec -y
songrec

使用Flatpak(所有发行版)(注意:使用Flatpak,GUI应该可以正常工作,但由于文件系统沙箱限制,一些CLI功能可能无法使用)

sudo apt install flatpak -y
flatpak remote-add --user flathub https://flathub.org/repo/flathub.flatpakrepo --if-not-exists
flatpak install --user flathub com.github.marinm.songrec -y
flatpak run com.github.marinm.songrec

使用Cargo(所有发行版,对于Ubuntu/Debian提供了依赖项,如果你的rustc版本不够新,请参考以下说明)

sudo apt install cargo rustc -y
echo 'export PATH="$HOME/.cargo/bin:$PATH"' | tee -a ~/.profile ~/.bashrc
source ~/.bashrc

sudo apt install build-essential libasound2-dev libgtk-3-dev libssl-dev -y
cargo install songrec --no-default-features -F gui,ffmpeg,pulse,mpris
songrec

注意:这不是强制性的,但如果你想能够识别比WAV、OGG、FLAC和MP3更多的格式,你应该确保已经安装了ffmpeg软件包。

注意:你可以通过编辑传递给cargo-F标志来删除GTK+、Pulseaudio/PipeWire的libpulse或DBus MPRIS的依赖项。

编译

(警告:提醒编译代码时要使用"--release"模式以获得正确性能。)

安装Rust

首先,你需要安装Rust编译器和包管理器。观察到自1.43.0版本以来,它已经与rustc一起工作。

你可以从存储库中安装Rust,例如使用Ubuntu/Debian

sudo apt install rustc cargo

或在Fedora Linux下

sudo dnf install rustc cargo

或者,使用任何发行版

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Type "1"
# Login and reconnect to add Rust to the $PATH, or run:
source $HOME/.cargo/env

# If you already installed Rust, then update it:
rustup update

安装依赖库(没有什么特别之处)

Debian

sudo apt install build-essential libasound2-dev libpulse-dev libgtk-3-dev libssl-dev

Void Linux(libressl)

sudo xbps-install base-devel alsa-lib-devel pulseaudio-devel gtk+3-devel libressl-devel

Void Linux(openssl)

sudo xbps-install base-devel alsa-lib-devel pulseaudio-devel gtk+3-devel openssl-devel

Fedora Linux

sudo dnf groupinstall "Development Tools"
sudo dnf install alsa-lib-devel pulseaudio-libs-devel openssl-devel dbus-devel pkgconf-pkg-config glib gtk3-devel

编译项目

这将编译并运行项目

# For the stable release:
cargo install songrec --no-default-features -F gui,ffmpeg,pulse,mpris
songrec

# For the Github tree:
git clone https://github.com/marin-m/songrec
cd songrec
cargo run --release --no-default-features -F gui,ffmpeg,pulse,mpris

对于后者,你将能在target/release/songrec找到项目的二进制文件(你可以将其移动或直接执行)。

注意:你可以通过编辑传递给cargo-F标志来删除GTK+、Pulseaudio/PipeWire的libpulse或DBus MPRIS的依赖项。

示例用法

不传递参数或使用gui子命令将启动GUI,并在应用程序启动时立即尝试实时识别音频

./songrec
./songrec gui

使用gui-norecording子命令将启动GUI而不会在软件启动时立即识别音频(你需要点击“打开麦克风识别”按钮才能这样做)

./songrec gui-norecording

GUI允许你从麦克风、扬声器(在兼容PulseAudio的设置中)或音频文件识别歌曲。如果没有安装FFMpeg,则应接受MP3、FLAC、WAV和OGG格式作为音频文件,如果安装了FFMpeg,则应接受FFMpeg支持的任何音频或视频格式。

以下命令允许使用命令行识别麦克风或文件中的声音(listen在麦克风可用时运行,而recognize仅识别一首歌),使用-h标志以查看所有可用选项

./songrec listen -h
./songrec recognize -h

默认情况下,只有相关的歌曲的艺术家和曲目名称会显示到标准输出,其他信息可能会显示到错误输出。使用--csv--json选项可以显示更多程序可用信息到标准输出。

上述描述了SongRec较新的CLI界面,但还有一个较旧的界面,仅针对音频文件或原始音频指纹操作,如下所述。

以下子命令将尝试从音频文件的中间识别音频,并打印Shazam服务器的JSON响应

./songrec audio-file-to-recognized-song sound_file.mp3

以下子命令将执行相同操作,但有一个中间步骤,操作数据-URI音频指纹,这是Shazam内部使用的

./songrec audio-file-to-fingerprint sound_file.mp3
./songrec fingerprint-to-recognized-song 'data:audio/vnd.shazam.sig;base64,...'

以下将从给定的指纹中生成可听到的音调,应该能够欺骗Shazam认为这是原始歌曲(默认音频输出设备或.WAV文件)

./songrec fingerprint-to-lure 'data:audio/vnd.shazam.sig;base64,...'
./songrec fingerprint-to-lure 'data:audio/vnd.shazam.sig;base64,...' /tmp/output.wav

在使用应用程序时,您可能会注意到某些信息将被保存到 ~/.local/share/songrec~/.config/songrec(或根据您的操作系统等效的目录),包括最后识别的CSV格式的歌曲列表和最后选择的麦克风输入设备(以便在重启应用时自动选择)。如果您遇到持续的问题,您可能希望删除这些目录。

隐私

SongRec不收集任何数据,也不联系Shazam以外的其他服务器。SongRec不会上传原始音频数据:只上传音频指纹,这意味着以“(频率,幅度,时间)”元组的格式编码的频率峰值序列。

这不足以代表任何可听到的内容(使用“播放Shazam诱饵”按钮查看这有多不同于完整声音);这意味着实际上可听到的声音(例如语音片段)不会发送到服务器,只有基于声音特征的元数据被发送,这可能足以识别Shazam已知的歌曲。

本软件在GNU GPL v3许可证下发布。它的目的是提供远程Shazam服务和基于Linux的桌面系统之间的互操作性。

请注意,在某些位于欧盟以外的国家,特别是美国,可能适用软件专利。

依赖关系

~23–43MB
~639K SLoC