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 ServiceSHSignatureGenerator将原始音频数据转换为 signature,这是 Shazam 匹配的核心数据结构append(buffer, at: nil)将音频缓冲区追加到生成器中,buffer是AVAudioPCMBuffer类型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数组,因为一个签名可能匹配多首歌曲matchedMediaItem是SHMatchedMediaItem类型,继承自SHMediaItemtitle和artist是最常用的两个属性,分别对应歌曲名和表演者- 回调发生在后台线程,更新 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 播放页面。
核心启发
-
视频背景音乐识别
- 做什么:让用户在编辑视频时一键识别背景音乐并保存歌单
- 为什么值得做:ShazamKit 可以直接处理视频文件的音频轨道,不需要用户切换到其他 App
- 怎么开始:用
AVAssetReader提取视频音频,传给SHSignatureGenerator,然后调用session.match(signature)
-
课堂同步学习助手
- 做什么:教育 App 根据老师播放的教学视频自动同步显示课件和互动题
- 为什么值得做:自定义目录识别完全在本地完成,不依赖网络,学生即使在家上网课也能获得沉浸式体验
- 怎么开始:参考 code-along session 10045,用
SHCustomCatalog将课程音频生成签名目录,学生端用matchStreamingBuffer实时匹配
-
社交视频音乐标签
- 做什么:在短视频分享 App 中自动为视频打上背景音乐标签
- 为什么值得做:Shazam 曲库覆盖全球海量音乐,识别准确率高,用户点击标签可直接跳转到 Apple Music
- 怎么开始:上传视频时后台提取音频签名,调用 Shazam 匹配,将
title、artist、artworkURL存入视频元数据
-
现场演出互动体验
- 做什么:音乐会或活动现场 App 根据当前播放的歌曲切换灯光效果和视觉主题
- 为什么值得做:
matchStreamingBuffer专为实时音频流优化,延迟低,且返回的genre属性可以用来匹配不同的视觉风格 - 怎么开始:用
AVAudioEngine捕获环境音频,通过matchStreamingBuffer持续识别,根据返回的genre或title切换 UI 主题
关联 Session
- Create custom audio experiences with ShazamKit — Code-along 实战:用自定义目录构建教育同步 App
- Meet MusicKit for Swift — ShazamKit 返回的媒体项可与 MusicKit 强类型对象直接对接
- Classify sound in video with Sound Analysis — 如果需要识别”笑声""掌声”等声音类别,用 SoundAnalysis 而非 ShazamKit
评论
GitHub Issues · utterances