ChromaSwift

Platform Swift SPM Unit Tests codecov

Swift 包装器,用于 ChromaprintAcoustID 项目的音频指纹库

安装

添加 https://github.com/wallisch/ChromaSwift 作为 SwiftPM 依赖项,并 import ChromaSwift

用法

生成指纹

通过 URL 生成包含音轨文件的指纹。这也适用于视频文件(例如音乐视频)

let fileURL = URL(fileURLWithPath: "Test.mp3")
let testFingerprint = try AudioFingerprint(from: fileURL)

可选地,指定 AudioFingerprintAlgorithm(默认值:.test2

您可以使用 .test4 移除前导静音

警告:只有 .test2 指纹可以在 AcoustID 服务中查找

let testFingerprint = try AudioFingerprint(from: fileURL, algorithm: .test4)

以及/或者要采样的最大持续时间(秒)(默认值:120)。传递 nil 以采样整个文件

let testFingerprint = try AudioFingerprint(from: fileURL, maxSampleDuration: 10.0)

处理指纹

获取用于生成指纹的算法

let algorithm = testFingerprint.algorithm // AudioFingerprint.Algorithm.test2

获取整个文件的持续时间(秒)

let duration = testFingerprint.duration // 46.0

以原始形式获取指纹,作为无符号 32 位整数数组

let rawFingerprint = testFingerprint.raw // [4107342261, 4107276695, ... ]

以 Base64 表示形式获取指纹

let base64FingerprintString = testFingerprint.base64 // "AQABYJGikFSmJBCPijt6Hq..."

以二进制字符串形式获取指纹哈希值

let binaryHashString = testFingerprint.hash // "01110100010011101010100110100100"

从其原始形式、算法和整个文件持续时间实例化指纹对象

let newFingerprint = AudioFingerprint(from: rawFingerprint, algorithm: .test2, duration: duration)

从其 Base64 表示形式和整个文件持续时间实例化指纹对象

let newFingerprint = try AudioFingerprint(from: base64FingerprintString, duration: duration)

获取与其他指纹对象的相似度 (0.01.0)

let similarity = try newFingerprint.similarity(to: testFingerprint) // 1.0

可选地,忽略指纹之间大于 20% 的样本持续时间差异(默认值:false

如果您想检查例如较长的混音是否包含特定曲目,这将非常有用

警告:当与为非常短的持续时间采样的指纹进行比较时,这可能会导致错误的结果

try newFingerprint.similarity(to: testFingerprint, ignoreSampleDuration: true) // 1.0

您也可以获取与指纹哈希值的相似度

警告:这不如比较指纹对象准确,尤其是在算法不匹配的情况下

try newFingerprint.similarity(to: binaryHashString) // 1.0

查找指纹

使用您的 AcoustID API 密钥初始化服务

let acoustID = AcoustID(apiKey: "zfkYWDrOqAk")

可选地,指定超时时间(秒)(默认值:3.0

let acoustID = AcoustID(apiKey: "zfkYWDrOqAk", timeout: 10.0)

查找 AudioFingerprint 对象

do {
    let results = try await acoustID.lookup(newFingerprint)
    // [AcoustID.APIResult]
    for result in results {
        // Matching score (0.0 to 1.0)
        let score = result.score
        for recording in result.recordings! {
            // Song title
            let title = recording.title
            // Song artists
            let artists = recording.artists
            // Song release groups (Albums, Singles, etc.)
            let releasegroups = recording.releasegroups
        }
    }
} catch {
    // AcoustID.Error
}

处理错误

AudioFingerprint 类抛出 AudioDecoder.ErrorAudioFingerprint.Error 错误,AcoustID 类抛出 AcoustID.Error 错误。

访问 Chromaprint C API

您还可以 import CChromaprint 以直接与 Chromaprint C 接口交互。请参阅官方文档以获取更多信息。

注意:为了避免许可问题,CChromaprint 禁用了内部输入重采样,因此需要指纹识别器的输入音频已经处于配置的指纹采样率。

许可

此软件包根据 MIT 许可证分发,有关详细信息,请参阅 LICENSE 文件。

chromaprint 项目默认包含来自 ffmpeg 库的重采样代码,该库在 LGPL 2.1 下获得许可。然而,ChromaSwift 使用 Apple 的 AVFoundation 进行重采样,并从构建中移除了所有 ffmpeg 代码,使软件包完全符合 MIT 规范。