dejavu:用 Python 实现的音频指纹识别

dejavu 在 GitHub 上已经拿到 6,759 Star。

这是一个用 Python 实现的音频指纹识别和识别系统。给一首歌听一遍,它就能提取指纹并存入数据库。下次再播放时,无论是通过麦克风实时收音还是读取本地文件,dejavu 都能在几秒内从数据库里找出匹配的曲目。

正文顶部截图

1、 这项目是干嘛的

核心功能就两个:指纹录入和音频识别。

你可以丢给 dejavu 一个音频文件夹,它会遍历所有文件,提取声学指纹存入数据库。之后无论是通过麦克风实时收听,还是读取本地文件,dejavu 都能在几秒内从数据库里匹配出对应的曲目。

项目作者明确说了:dejavu 不是语音识别工具。它的强项是在有噪声的环境下识别完整的音频信号,比如从电台、广告或背景音里抓出一首歌。

2、 怎么用

安装依赖后,先连上数据库。支持 MySQL 和 PostgreSQL。

录入指纹很简单:

from dejavu import Dejavu
config = {"database": {...}}
djv = Dejavu(config)
djv.fingerprint_directory("mp3", [".mp3"], 3)

fingerprint_directory 接收三个参数:输入目录、文件扩展名、进程数。处理大量文件时,可以随时中断再恢复,dejavu 会记住哪些已经处理过,不会重复工作。对于 45 首歌曲的测试集,共生成约 544 万条指纹。

识别有两种方式。读文件:

from dejavu.logic.recognizer.file_recognizer import FileRecognizer
song = djv.recognize(FileRecognizer, "track.wav")

或者用麦克风实时收音:

from dejavu.logic.recognizer.microphone_recognizer import MicrophoneRecognizer
song = djv.recognize(MicrophoneRecognizer, seconds=10)

命令行也支持直接调用。

3、 背后的原理

dejavu 的算法和 Shazam 类似,基于频谱图的局部敏感哈希。

具体流程是:对音频做短时傅里叶变换,生成频谱图,然后找出振幅的局部峰值。这些峰值的时空坐标组合起来,就是一段音频的"指纹"。

找峰值是整个流程里最耗算力的部分。作者在博客里详细解释了这个过程,包括高斯滤波、邻域判断等图像处理技巧。

4、 识别准确率如何

作者在 45 首歌曲上做了三轮测试。

直接从磁盘读取文件,准确率 100%。

通过笔记本麦克风播放并识别,1 秒片段准确率 60%,2 秒提升到 95.6%,5 秒以上达到 100%。

压缩流媒体(Spotify 160kbit/s 通过 iPhone 播放)的表现也没有下降,1 到 2 秒即可识别。

匹配速度大约是录音时长的三分之一,加上录音本身,整体耗时约 1.36 倍录音时长。瓶颈在于峰值查找,单线程的 Python 在这里有些吃力。

5、 存储占用

45 首歌曲的指纹数据库约 377 MB,存储了 544 万条指纹。相比之下,原始 mp3 文件约 339 MB,wav 格式约 1885 MB。指纹数据的体积介于两者之间。

README区域截图

6、 适合谁用

想搭建音乐识别服务的开发者,需要监测广播或广告播放情况的内容方,以及研究音频指纹算法的学生和研究人员,都可以从这个项目入手。

Docker 支持一键部署,配置参数也开放可调,入门门槛不高。

播或广告播放情况的内容方,以及研究音频指纹算法的学生和研究人员,都可以从这个项目入手。

Docker 支持一键部署,配置参数也开放可调,入门门槛不高。

更多推荐