dejavu:用 Python 实现的音频指纹识别
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。指纹数据的体积介于两者之间。

6、 适合谁用
想搭建音乐识别服务的开发者,需要监测广播或广告播放情况的内容方,以及研究音频指纹算法的学生和研究人员,都可以从这个项目入手。
Docker 支持一键部署,配置参数也开放可调,入门门槛不高。
播或广告播放情况的内容方,以及研究音频指纹算法的学生和研究人员,都可以从这个项目入手。
Docker 支持一键部署,配置参数也开放可调,入门门槛不高。
更多推荐


所有评论(0)