WWDC Quick Look 💓 By SwiftGGTeam
Explore ShazamKit

Explore ShazamKit

观看原视频

Highlight

Apple 将 Shazam 的核心音频识别技术封装为 ShazamKit 框架,开发者可以在 App 中直接调用 Shazam 海量曲库进行歌曲识别,也可以创建自定义音频目录实现离线的任意音频匹配。

核心内容

你拍了一段视频,背景音乐很好听,但不知道歌名。以前的做法是:把视频传给朋友,或者打开另一个识别 App。现在,ShazamKit 让这一切可以在你的 App 内直接完成。

ShazamKit 包含三个核心能力:Shazam 曲库识别、自定义目录识别、以及曲库管理。前两者解决”这是什么音频”的问题,第三个解决”识别到的内容怎么保存”。

Shazam 的技术原理和常见的音频分类器完全不同。SoundAnalysis 框架可以识别”这段音频里有笑声”,但 Shazam 做的是精确匹配:它从音频中提取一种称为 signature(签名)的压缩表示,然后在曲库中寻找完全一致的签名。签名比原始音频小至少一个数量级,且不可逆,无法从签名还原出原始音频。

05:41)这种设计带来两个好处:网络传输量极小,用户隐私得到保护。

自定义目录识别则把匹配搬到了设备本地。你可以把任意音频(比如教学视频、电视节目)生成签名存入自定义目录,App 在本地就能完成匹配。这在远程教学场景中特别有用:老师播放课程视频,学生端的 App 可以自动同步翻页、显示互动内容,即使暂停或回放也能跟上进度。

04:13)另一个典型场景是”可购物视频”:观众看电视节目时,App 识别当前画面中的家具,弹出 AR 预览和购买链接。

详细内容

发起一次 Shazam 曲库匹配

ShazamKit 的核心对象是 SHSession。默认初始化时,它会连接 Shazam 云端曲库。

let session = SHSession()
session.delegate = self

let signatureGenerator = SHSignatureGenerator()
try signatureGenerator.append(buffer, at: nil)

let signature = signatureGenerator.signature()
session.match(signature)

关键点:

  • SHSession() 默认匹配 Shazam 云端曲库,需要在 Developer Portal 中启用 ShazamKit App Service
  • SHSignatureGenerator 将原始音频数据转换为 signature,这是 Shazam 匹配的核心数据结构
  • append(buffer, at: nil) 将音频缓冲区追加到生成器中,bufferAVAudioPCMBuffer 类型
  • signature() 生成最终的签名对象
  • match(signature) 将签名发送到 Shazam 服务器进行匹配

如果是从麦克风实时获取音频,应该使用 matchStreamingBuffer(_:) 方法,它会自动处理签名生成的细节。

接收匹配结果

匹配结果通过 SHSessionDelegate 回调返回。

extension SongResultViewController: SHSessionDelegate {

    public func session(_ session: SHSession, didFind match: SHMatch) {

        guard let matchedMediaItem = match.mediaItems.first else {
            return
        }

        DispatchQueue.main.async {
            self.songView.titleLabel.text = matchedMediaItem.title
            self.songView.artistLabel.text = matchedMediaItem.artist
        }
    }
}

关键点:

  • SHMatch 包含一个 mediaItems 数组,因为一个签名可能匹配多首歌曲
  • matchedMediaItemSHMatchedMediaItem 类型,继承自 SHMediaItem
  • titleartist 是最常用的两个属性,分别对应歌曲名和表演者
  • 回调发生在后台线程,更新 UI 需要切到主线程
  • 每个匹配结果还包含 matchOffset,表示匹配发生在歌曲的哪个时间点

保存到 Shazam 曲库

识别到的歌曲可以保存到用户的 Shazam 曲库中,这个曲库在设备间同步。

guard let matchedMediaItem = match.mediaItems.first else {
    return
}

SHMediaLibrary.default.add([matchedMediaItem]) { error in

    if error != nil {
        // handle the error
    }
}

关键点:

  • SHMediaLibrary.default 对应用户的 Shazam 曲库,采用端到端加密
  • 只有来自 Shazam 曲库的匹配结果才能写入,自定义目录的匹配结果不能写入
  • 不需要特殊权限,但建议让用户明确知晓并同意
  • 保存的歌曲会标注来源 App 的名称

与 MusicKit 的集成

13:04)ShazamKit 返回的 SHMediaItem 包含 songs 属性,这是 MusicKit 框架中的强类型对象。你可以直接用它来获取更丰富的音乐元数据,或者跳转到 Apple Music 播放页面。

核心启发

  1. 视频背景音乐识别

    • 做什么:让用户在编辑视频时一键识别背景音乐并保存歌单
    • 为什么值得做:ShazamKit 可以直接处理视频文件的音频轨道,不需要用户切换到其他 App
    • 怎么开始:用 AVAssetReader 提取视频音频,传给 SHSignatureGenerator,然后调用 session.match(signature)
  2. 课堂同步学习助手

    • 做什么:教育 App 根据老师播放的教学视频自动同步显示课件和互动题
    • 为什么值得做:自定义目录识别完全在本地完成,不依赖网络,学生即使在家上网课也能获得沉浸式体验
    • 怎么开始:参考 code-along session 10045,用 SHCustomCatalog 将课程音频生成签名目录,学生端用 matchStreamingBuffer 实时匹配
  3. 社交视频音乐标签

    • 做什么:在短视频分享 App 中自动为视频打上背景音乐标签
    • 为什么值得做:Shazam 曲库覆盖全球海量音乐,识别准确率高,用户点击标签可直接跳转到 Apple Music
    • 怎么开始:上传视频时后台提取音频签名,调用 Shazam 匹配,将 titleartistartworkURL 存入视频元数据
  4. 现场演出互动体验

    • 做什么:音乐会或活动现场 App 根据当前播放的歌曲切换灯光效果和视觉主题
    • 为什么值得做matchStreamingBuffer 专为实时音频流优化,延迟低,且返回的 genre 属性可以用来匹配不同的视觉风格
    • 怎么开始:用 AVAudioEngine 捕获环境音频,通过 matchStreamingBuffer 持续识别,根据返回的 genretitle 切换 UI 主题

关联 Session

评论

GitHub Issues · utterances