作者:wiilen,iOS 开发者。
Sessions: https://developer.apple.com/videos/play/wwdc2020/10060/
在 WWDC 19 时,苹果提供了 Siri Media Intent,让用户能通过 Siri 来操作音视频 App,进行搜索/播放节目。
基于上线以来的反馈,今年在该 Session 中,工程师为我们提供了一些数据的支撑,指明应该如何优化用 Siri 播放 App 的相关体验。
首先来看看该视频的一图简介:
高品质
语音助手取信于用户的界线比传统的用户界面还要高,所以可用性的要求也更高。如果要支持 Siri Media,更应该把它做好。
- 用户要播放时,应该直接播放
试想,如果有人用语音来播放你的 App,结果无事发生,他们可能就不会再用第二次了。因此有一个健壮的播放栈来确保播放,是让 App 支持 Siri 时首先要考虑的。
- 快速开始播放
去年苹果发现 SiriKit Media App 中出现的最多的问题是超时。对于像 CarPlay 这种场景下,重要的是快速开始播放。对于 CarPlay 而言,超时的阈值会更低,如果播放开始得不够快,你的 App 可能被杀掉。为了帮助解决这个问题,今年苹果为性能优化增加了新的选项,参考「Expand your SiriKit Media Intents More PlatForms」[1]。
- 让 Siri 了解用户的偏好
方法是使用 Siri User Vocabulary API。对于 App 层面的特色词,可以使用 Siri Global Vocabulary API。后面有演示介绍如何添加。
- 支持更多的表达方式
允许用户通过不同的表达来与你的 App 交互,用户更可能在日常生活中使用该 App。毕竟 Siri 是个智能助理,而只有当和 Siri 的交流更符合自然语言的习惯时,它才能显得足够智能。所以只有当用户没有明说想要什么,而 Siri 做出了最佳猜测时,这才显得完美。
常见的用户表达语句
- 播放「App」
通常 mediaSearch 为空,或者只包含了音乐的类型。
超过一半的 App 都需要对用户的命令进行猜测。比如用户会说「播放 App」或者是「在 App 中播放音乐」。当用户没告诉你他想播放什么时,最重要的是能猜对,播放他想听的。满足了这个场景的需求,就可以服务到大量用户。根据 App 的情况来决定播放什么最适合用户。大概有 50% 的请求是这种类型的。
- 在「App」中播放「节目」
mediaSearch 中只含有标题,而没有其他信息。用户不会告诉你他们要播什么类型,只提供了一个词,可能是歌曲、专辑、艺人、主播等。要满足这样的需求,最好要对不同类型的节目都进行搜索。约占所有请求的 30%。
- 播放「艺人」的「节目」
mediaSearch 中带有艺人名字,合并其他信息。这是一种更精确的搜索,用户指明了他们想要听的内容。这种请求的占比下降到了 5%。
- 播放「列表」
mediaSearch 中包含了列表的名字,并且类型为 playlist。这种请求也只占了 5%。
以上几种语句就涵盖了 90% 的场景,但苹果也希望开发者能多支持一些用户语句。最后视频中还提到一点:用户用的越多,可能会使用一些越复杂的语句,这对 App 来说是好事,因为这意味着用户越喜欢通过 Siri 来使用该 App。
MediaSearch Demo
工程师演示了用户语句不同时,mediaSearch
返回的结果是怎样的。首先有个开发的小技巧:当进行测试时,可以直接在 Siri Intent Query 中输入想要让 Siri 识别到的句子。
- 播放「App」
语句:play controlAudio
可以看到 mediaSearch
此时是 nil,说明 Siri 没有识别到额外的参数。
多说了一个类型之后则略有变化。
语句:play music in controlAudio
可以看到 mediaSearch
中 mediaType
被识别到了。
- 在「App」中播放「节目」
语句:Play Special Disaster Team in ControlAudio
可以看到 mediaName
也被识别到了,并且是要播放的内容标题。
- 在「App」中播放「艺人」的「节目」
语句:Play Maybe Sometime by Special Disaster Team in ControlAudio
可以看到 mediaName
和 artistName
都被识别出来了,并且被放到了 mediaSearch
的相应字段中
- 在「App」播放「列表」
语句:Play my WWDC playlist in ControlAudio
注意:playlist 这个词是不能少的
可以看到 mediaType
被识别出来了,5 代表是播放列表,WWDC 作为 mediaName
也被放到对应的字段中。
Siri Media Vocabulary
Siri 的自然语言处理系统是一个机器学习系统,它会尝试根据用户语句来识别用户的意图,并执行操作。对应的模型也被训练过,用于识别音频相关的特征。因此你不需要自己去识别如音乐类型、媒体类型、排序方式等等,因为 Siri 都已经帮你做好了。
但有时 Siri 也会犯错,比如「70s punk classics」这个词,「70s」会被识别成年代,而「punk classics」会被识别成 mediaName
,而不是整体被识别成播放列表类型,且整个词作为播放列表的名称。
有两种办法可以解决这个问题:一是使用 User vocabulary;二是使用 Global vocabulary。这两种 vocabulary 的应用场景略有不同。
- User vocabulary:更适用于单个用户,对于每个用户提供个性化的功能时,应该使用它。
如上图的代码中,创建了一个 NSOrderedSet
并把播放列表对应的词汇存到了该 set 中,最后再放到 vocabulary 中。需要注意的是越重要的需要排在更前面的位置,因为排序会影响 Siri 的处理结果。
- Global vocabulary:更适合放入适用于全部用户的词汇,这些词汇是静态的,放在 .plist 文件中,然后被打包到 App 中。只需要放入 App 独有的词,对于一些热门的歌曲或者播客类的词,Siri 都会不断更新,无需开发者自己再放入 App 中。
plist 文件的结构如下图所示。
上一个红框处的词代表了需要加入的词的类型,下一个红框处的词代表了要添加的词汇。被添加的词会被 Siri 识别成 mediaName
放到 mediaSearch
的相应位置。
vocabulary 有不同的类型,开发者可以选择自己的 App 支持的那些类型。
虽然 User vocabulary 和 Global vocabulary 中同类型词的名字略有区别,但最后识别出的词还是被放在 mediaSearch
中相同的位置。
音乐类的 App 可以识别出 PlaylistTile 和 MusicArtistName,有声书类的 App 可以识别出 AudiobookTitle 和 AudiobookAuthorName,广播类和播客类的 App 可以识别出 ShowTitle。注意:如果你的 App 没有设置为对应的类型,就算添加了对应类型的词汇 Siri 也不会识别出来。具体可以参考 WWDC 19 中的相关视频。
Siri Vocabulary Demo
同样对于「70s punk classic」这个例子,视频中演示了使用 vocabulary 前后,识别结果的不同。
当没有加入 vocabulary 时,结果如下:
可以看到「Punk」被单独识别成音乐的类型,而「70s」被识别成了年代。
加入设置 user vocabulary 的相关代码。在正式环境下,Run 之后,vocabulary 还需要一定时间来与 Siri 进行同步,所以可能不会马上就生效。
可以看到 vocabulary 已经生效了,现在上面的短语会被识别成播放列表,而列表名字也被完整的识别出来。
另一种方法是使用 Global vocabulary。添加 AppIntentVocabulary.plist 文件到 App 中,格式如下:
<<< 左右滑动见更多 >>>
再次运行之后,可以看到短语也别成功识别了。
Now Playing 支持
另一个常见的 Siri 使用场景是 Now Playing 相关的操作,用户使用 Now Playing 来控制播放相关的功能,如上一首下一首、播放暂停等。这是通过 MPRemoteCommandCenter
来实现的。只要你的 App 实现了对应的 command,iOS 会完成剩下的工作。具体可以参考样例代码「Becomming a Now playable app」。
对 Siri 来说,支持 Now Playing 就像在当前的支持上多加了一层语音控制层。用户的语音指令会被转换成对应的 command,然后交给 MPRemoteCommandCenter
来处理。最后,App 被唤醒,并执行对应的操作。
播放、暂停、上一首、下一首等语音指令都会被转换成对应的 command,唯一不同的点在于快进快退。用户现在可以指定快进与快退的时间。
除此之外,Siri 还支持一些其他的 command:
如果需要在开始播放时就设置播放的顺序,可以使用 INPlayMediaIntent
来实现。
如果用户询问正在播放的节目信息,在设置 MPNowPlayingInfoCenter
中的属性后,Siri 可以做出相应的回答。
主要是 title、artist、albumTitle 三种类型,举个例子,如果用户问「当前在播放的是什么歌曲?」Siri 就会从 MPMediaItemPropertyTitle
获取相关信息并告诉用户。
如果 App 不支持对应的 Command,有三种方式可以告知用户:
不实现对应的 Command,最省力,Siri 会告诉用户不支持这个指令。
设置 Command 的 enable 属性为 no。
返回
MPRemoteCommandHandlerStatusCommandFailed
。
告诉用户 App 有 Siri 相关功能
对于语音交互来说,一个难题是用户往往意识不到你提供了这样的功能。如果他们不知道,你所付出的努力很可能就被埋没了。
但如果用户知道了有这样的功能,功能的使用率甚至能达到以前的 10 倍。
因此,记得让用户知道你提供了语音交互的功能,用最适合你的 App 的方式呈现。
推荐阅读
关注我们
我们是「老司机技术周报」,每周会发布一份关于 iOS 的周报,也会定期分享一些和 iOS 相关的技术。欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2020」,领取学习大礼包。
支持作者
这篇文章的内容来自于 《WWDC20 内参》。在这里给大家推荐一下这个专栏,专栏目前已经创作了 108 篇文章,只需要 29.9 元。点击【阅读原文】,就可以购买继续阅读 ~
WWDC 内参 系列是由老司机周报、知识小集合以及 SwiftGG 几个技术组织发起的。已经做了几年了,口碑一直不错。 主要是针对每年的 WWDC 的内容,做一次精选,并号召一群一线互联网的 iOS 开发者,结合自己的实际开发经验、苹果文档和视频内容做二次创作。
参考资料
[1]
「Expand your SiriKit Media Intents More PlatForms」: https://developer.apple.com/videos/play/wwdc2020/10061/
本文分享自微信公众号 - 老司机技术周报(LSJCoding)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。