Chromaprint声音指纹识别和Acoustid API的绑定
项目描述
Chromaprint及其相关的Acoustid网络服务组成一个高质量、开源的声音指纹识别系统。本包提供了对指纹算法库的Python绑定,该库是用C语言编写的但具有可移植性,以及提供指纹查找的网络服务。
安装
此库与Python 2(2.7+,可能也包括2.6)和Python 3(3.3+)兼容。
首先,通过Lukas Lalinsky安装Chromaprint指纹库。 (该库本身依赖于一个FFT库,但它足够智能,可以使用您可能已经安装的软件中的算法;请参阅Chromaprint页面以获取详细信息。) 此模块可以使用Chromaprint动态库或fpcalc命令行工具,后者本身依赖于libavcodec。 如果您使用fpcalc,请确保它已添加到您的$PATH,或者将FPCALC环境变量设置为它的位置。
然后您可以使用pip从PyPI安装此库
$ pip install pyacoustid
此库使用audioread在未使用fpcalc时进行音频解码,并使用requests与HTTP API通信(pip应自动安装这些依赖项)。
运行
您可以通过运行包含的示例脚本aidmatch.py来测试您的安装
$ python aidmatch.py mysterious_music.mp3
这将显示来自Acoustid数据库的最高级元数据匹配。该脚本使用audioread解码音乐,因此它应透明地使用系统上可用的媒体库(GStreamer、FFmpeg、MAD或Core Audio)。
在您的代码中使用
使用pyacoustid识别音频文件的最简单方法是调用match函数
>>> import acoustid >>> for score, recording_id, title, artist in acoustid.match(apikey, path): >>> ...
此便利函数使用audioread解码音频并为您解析响应,提取最关键的曲目元数据。它返回一个包含相关信息的元组可迭代对象。所有操作都在一次操作中完成。还有许多“较小”的函数可用于执行过程的某些部分
fingerprint(samplerate, channels, pcmiter):为原始音频数据生成指纹。指定音频参数并提供包含PCM数据块的迭代对象。
fingerprint_file(path):使用Chromaprint动态库或fpcalc命令行工具对音频文件进行指纹识别。(您可以使用force_fpcalc仅使用后者。)返回一个包含文件持续时间和其指纹的元组。
lookup(apikey, fingerprint, duration):向Acoustid API发送请求,查找由前一个函数返回的指纹。需要API密钥,以及源音频的长度(以秒为单位)。返回解析的JSON响应。
parse_lookup_result(data):给定解析的JSON响应,返回一个包含匹配分数(介于0和1之间的浮点数)、MusicBrainz录制ID、标题和艺术家名称的每个匹配的元组迭代器。
compare_fingerprints(a, b):比较由fingerprint_file产生的两个指纹,返回相似度分数。
当调用Web API时,模块内部执行线程安全的API速率限制,每秒最多3个查询,符合Web服务文档。
如果您正在运行自己的Acoustid数据库服务器,可以使用set_base_url函数设置所有API调用的基本URL。
对库的调用可以引发两种子类的AcoustidError异常:FingerprintGenerationError和WebServiceError。如果您想在音频无法解码或服务器上找不到匹配项时继续操作,请捕获这些异常。NoBackendError是FingerprintGenerationError的子类,用于在找不到Chromaprint库或fpcalc命令行工具时。
版本历史
- 1.3.0
多位艺术家通过网页上显示的连接短语连接在一起。一个新的(纯Python)函数用于比较两个Chromaprint指纹的相似性。在Windows上搜索更多共享库位置以查找Chromaprint库。
- 1.2.3
修复了从chromaprint_decode_fingerprint返回的数字的符号问题。
- 1.2.2
修复了上一个版本中的回归,该回归在调用submit时导致KeyError崩溃。
- 1.2.1
某些API函数的meta参数现在可以是列表(而不仅仅是单个字符串)。
- 1.2.0
向fingerprint_file和match添加了force_fpcalc选项。避免在服务器通信后留下悬挂套接字。修复了将memoryview对象传递给指纹识别器时的崩溃。API请求现在可以选择超时。在Python 3.8上更可靠地在Windows上找到库。向低级库添加了hash_fingerprint函数。
- 1.1.7
包含一个LICENSE文件。
- 1.1.6
在提交中避免非整数持续时间的错误。一个新函数get_submission_status抽象了API端点,用于监控使用(新)submit函数的结果。
- 1.1.5
修复了在 submit 函数中与 Python 3 的兼容性问题。现在 submit 中的错误也能正确处理(即,它们会引发一个有信息的 WebServiceError 而不是 TypeError)。
- 1.1.4
修复了 fpcalc 工具版本中报告持续时间为分数的错误。
- 1.1.3
除了其他字节类型外,还接受 bytearray 对象。
- 1.1.2
修复了在非 Unicode 区域的 Python 2 中 Unicode 文本可能导致的崩溃。寻找 Chromaprint 共享库文件的“1”版本。
- 1.1.1
修复了在 Python 3 上的可能安装错误(感谢 Simon Chopin)。
- 1.1.0
在源分布中包含 fpcalc.py 脚本。添加 Python 3 支持(感谢 Igor Tsarev)。
- 1.0.0
包含 fpcalc.py,这是一个模拟 Chromaprint 包中的 fpcalc 程序的脚本。处理在 Windows 上使用 Unicode 文件名和 fpcalc 后端时引发的 UnicodeDecodeError。抑制 fpcalc 的标准错误输出。
- 0.7
正确编码 Unicode 参数(解决了指纹提交中的 UnicodeEncodeError)。解析每个 Acoustid 查找结果的录音。
- 0.6
添加了一个新的函数 fingerprint_file,它自动为单个文件选择指纹后端。
- 0.5
修复了当录音没有艺术家或标题时的响应解析错误。修复了与 Python < 2.7 的兼容性。添加特定的 NoBackendError 异常。
- 0.4
指纹识别现在可以回退到使用 fpcalc 命令行工具而不是 Chromaprint 动态库,这样就可以使用二进制发行版(感谢 Lukas Lalinsky)。指纹提交(感谢 Alastair Porter)。数据块现在可以是缓冲区也可以是字节数组(修复了与 pymad 的兼容性)。
- 0.3
可配置的 API 基础 URL。结果解析器现在生成所有结果而不是只返回一个。在 Cygwin 上找到 chromaprint 库。新模块名称:chromaprint 和 acoustid(无包)。
- 0.2
压缩 HTTP 请求和响应。限制音频解码时间为 120 秒。从便利函数返回分数。
- 0.1
初始版本。
致谢
此库由 Adrian Sampson 编写。Chromaprint 和 Acoustid 由 Lukas Lalinsky 编写。此软件包包含 Lukas 编写的原始基于 ctypes 的绑定。整个库在 MIT 许可证 下提供。pyacoustid 是为了与 beets 一起使用而编写的,你可能需要查看它。