大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 ShazamKit 创建自定义音频体验
使用 ShazamKit 为您的 app 提供自定义音频匹配。了解在设备上使用自定义目录时如何使用 Shazam 的精确音频匹配来识别任意来源的音频。下载我们的新手课程和代码以及演示程序,我们将指导您完成将音频与自定义目录匹配的过程。我们还将通过构建一个可以与从电视流式传输的视频完美同步的交互式 iOS app 来探索跨设备连接内容是如何轻松。要了解有关 ShazamKit 的更多信息,请查看 WWDC21 中的“探索 ShazamKit”。
资源
相关视频
WWDC22
WWDC21
-
下载
♪播放重低音音乐♪ ♪ 亚历克斯泰莱克:嗨 我是亚历克斯 我是Shazam团队的工程师 感谢大家收看这段影片 今天我要示范在安装ShazamKit的 应用程序中 如何以用户目录辨识 创造使用者音频体验 在这一段中 我会用到 一些现有的ShazamKit概念 例如目录、记号、媒体项目 如果大家还不熟悉这些 一定要去看《探索ShazamKit》 那个演讲 让我们来看看今天会讲到哪些内容 我们会谈到如何利用 用户音频和元数据建立目录 我们会学习当你使用麦克风 和AVFAudio框架录制音频时 如何将音频和你自己的用户目录 做配对 接下来会定制化我们的应用程序 将内容同步到使用者音频 最后 我们会介绍一些很棒的实例 让大家在操作用户目录时可以使用 这是程序编码 大家可以从开发者端下载 我们这一整段会用到的项目 我建议大家在我们开始前 先去下载这个项目 随着学习变得越来越数字化 我们必须想出一些方法 让小孩参与其中 如果你在Apple TV播放影片时 能够在适当的时间 有辅助应用程序在屏幕上显示题目? 今天 我要告诉大家如何利用 用户目录辨识 建立能和教育影片同步和互动的 远程应用程序 首先 到底什么是用户目录 我们要怎么建立用户目录? 用户目录是你从任何音频中 产生的记号的集合 你也可以在每个记号中 加入相关的元数据 要将记号加入你的用户目录中 你可以使用SignatureGenerator对象 它会将音频缓冲转换成记号 首先 建立一个记号产生器 接着用audioEngine的inputNode 上面的installTap功能 将buffer和audioTime 添加到产生器上 buffer参数是指从inputNode的输出 撷取出音频的缓冲 audioTime则是缓冲被撷取的时间 当你指定audioFormat时 其中一个支持取样率格式 一定要是PCM 在产生器叫出记号功能 会将音频缓冲转换成记号 我们把这个叫做参考记号 之后我们可以把它加到用户目录中 你也可以用shazamsignature档案 把记号加到目录里 这是一个可以在装置间分享的 不明确档案 为了在ShazamKit中更容易 纳入用户目录 在这段影片中 我们会提供档案让大家使用 开始之前 让我们先打开下载的项目 看一下里面有什么 让我们仔细看看问题对象
问题代表应用程序中的用户内容 首先 这里有标题和偏移量 标题是影片中描述那个区段的字符串 偏移量则是这个区段出现的时间 举例来说 在45秒时 老师开始讲一个数学公式 你要用那个标题建立一个问题 并且将偏移量设定为45秒 算式代表教学的时间点 会出现数学算式 你可以把它设成累加式构件 例如 你可能想 将方程式的左右两边 设定在不同的偏移量 最后 answerRange和requiresAnswer 是用来标示什么时候会显示 互动性用户界面 让小孩可以练习回答那些问题 让我们来看看这支教育影片 的编码长什么样子 第一个问题是在14秒时开始 我在21秒的时候 有一个红色苹果 在25秒的时候 加上三个绿色苹果 最后 在31秒的时候 学生有机会来回答问题 要注意的是 影片的规格通常是小时 分钟和秒数 像我这样建立偏移量时 你必须先把时间转换成秒数 举例来说 你可以请Siri帮忙 譬如“3分14秒转换成秒数是多少?” 现在 让我们深入讨论编码 看看如何开始进入用户目录! 首先 我要通过加入记号 和跟它相关的元数据 来建立一个目录 这里有CatalogProvider 它有建立目录的功能 你要加到目录里的参考记号 叫做FoodMath.shazamsignature
我们把那个档案叫进来 用它建立一个记号对象 建立好之后 使用媒体项目来定义元数据
我要替一些预先定义的媒体项目 设定属性键 例如标题和子标题 这会用来描述这支教育影片 我也会在SHMediaItemProperty上 用两个使用者键建立扩展: 老师和集数 设定集数和老师的名字 能进一步定制化目录的内容 现在要做的事 是建立customCatalog对象
然后在上面叫出 addReferenceSignature 并且送出记号和mediaItem对象 这会把你刚刚建立的元数据 和你从硬盘加载的参考记号 连结在一起 很好! 现在我把那些设好了 我可以开始将音频和目录配对 看看结果是如何产生的 让我们打开Matcher 我们要把来自麦克风的输入音频 和我们刚刚建立的用户目录做配对 要从麦克风撷取音频 你可以使用AVFAudio的 AVAudioEngine 在这个项目里 我已经在 Info.plist档案中加入 使用麦克风的描述 在Matcher中 我也加入 要求麦克风使用权限 和设定音频对话的编码
要获得配对的更新数据 首先你要建立一个对话对象 以及设定委托
配对功能会用 我们刚刚建立的用户目录 所以你可以直接把它转去对话 现在 你已经可以用 audioEngine的inputNode 上面的installTap功能来配对音频
这个功能会回传audioBuffer 那是从麦克风转换的音频 以及audioTime 那是缓冲被撷取的时间 接着 把对话的 matchStreamingBuffer叫出来 并且送出音频缓冲 和音频时间 我们会建议如果可以的话 就把时间放进去 因为对话会去验证时间 来确保提供的音频是连续的 因为你一开始就设了对话委托 你可以从对话委托来执行对话: didFind match:功能 来处理数据更新
这部分 我会建立一个 叫MatchResult的对象
它包含从对话: didFind match:功能 回传的对话:MatchedMediaItem 它是和目录中参考记号 相关的元数据 它会包含我们前面建立的细节 像是集数和老师的名字 它只能从配对产生 并且包含和配对相关的额外信息 在MatchResult 也有之前我给你们看的问题对象 这里代表的是影片中 数学算式的区段 我们会用这个去找 配对的相关内容 在委托里面 我们设定MatchResult 使用第一个MatchedMediaItem对象 我们暂时先把问题设成空值
现在让我们建立配对 看它是怎么进行的 这是我们的FoodMath应用程序 上面列出了学生可以收看的集数 我可以播放影片 并且跟我同事尼尔 一起练习解一些数学题目 尼尔 你今天要带给我们什么呢? 尼尔:形式是我会问你一个问题 你会有一些时间思考 然后我们来看你有没有答对! 如果你有我们的应用程序 你也可以一起播放 当我开始播放影片时 应用程序辨识出我们在听第三集 《包在我身上》 这真是太棒了! 接着我想知道 利用我们的问题对象 在音频的特定偏移量中 要显示哪一个区段 利用MatchedMediaItem 能知道我们在看的是哪一个影片 它同时也包含配对的额外信息 例如predictedCurrentMatchOffset 这是在参考记号中的 自动更新的位置 而且以秒数来显示时间间隔 你可以通过这个知道 你在影片的哪个位置 以及找出相关的问题对象 回到编码上 在委托回调中 我想要找到跟在 predicatedCurrentMatchOffset之后 最后的问题 而不是设定为空值
我可以用问题的偏移量来比较这些值 在同一个配对中 可以把 对话:didFindMatch叫出来很多次
那么 让我们执行一个 只有在你得到新的问题对象时 才会更新结果的过滤器 一旦你设定完成 你就可以更新结果的值
现在让我们看看它的样子 建立然后执行 这次 我想要学加法 我要再播放一次影片 看看问题的内容 会不会和影片同步显示出来 尼尔:第一题 让我们开始吧 我今天去了商店 我很喜欢苹果 所以我买了一个红色苹果 我还买了一、二、三个绿色苹果 我今天一共买了几个苹果? 计时…开始 亚历克斯:现在是作答的时间 一加三等于多少? 答案是五吗? 喔 不 我答错了 我们再试一次 我要回放影片 这次我会看得更仔细的!
尼尔:第一题 让我们开始吧 我今天去了商店 我很喜欢苹果 所以我买了一个红色苹果 我还买了一、二、三个绿色苹果 我今天一共买了几个苹果? 计时…开始 亚历克斯:我又听了一次 我知道答案是四 要是你觉得这个问题太简单呢? 让我往下快转 看看尼尔 有没有比较难的内容可以教我们
尼尔:第四题 最后一题 今天 我觉得很饿 所以我决定我要买14个苹果 一…二…三…四… 亚历克斯:好多颗苹果啊 那我们再往下转一点 往下跳20秒 尼尔:所以我决定再买28颗苹果 一…二…三… 四…五…六
26…27… 28颗苹果 我今天一共买了几颗苹果? 计时开始 亚历克斯:这是一个很棒的问题 你们有算出来吗? 我要挑我最喜欢的数字! 我答对了! 最后一题的答案是42! 这很容易:影片中 不论学生在哪里 你的远程应用程序都能跟上 和更新内容 让我们来介绍一些 运用用户目录很棒的实例 通过shazamcatalog档案扩展 你可以在装置之间 很顺畅地分享用户目录 你可以利用fileURL从硬盘加载 和存到硬盘中 也可以在网络上传送 使用远程网页服务时 你会想要先下载目录 接着在用户目录对象上 使用添加的功能 当网络上没有可用的目录时 一定要提供本机目录 目录可以根据你的使用案例 储存用户键来回传数据 确保你加到目录中的数据 是有效的属性串列值之一 使用matchStreamingBuffer时 ShazamKit会和音频串流配对 并且去平衡搜寻的性能和强度 替你完成所有的产出 以及自动更新记号 现在你建立一个完整的应用程序 它能跟教育影片同步 而且只通过一个记号 和一个用户目录 就能根据学生目前的位置来更新内容 这只是许多 可能的例子之一 我们真的很期待看看 大家会用ShazamKit建立出什么 谢谢 希望你们有个很棒的WWDC ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。