SiriKit 新变化:高品质的 Siri 媒体交互

Stella981
• 阅读 521

作者:wiilen,iOS 开发者。

Sessions: https://developer.apple.com/videos/play/wwdc2020/10060/

在 WWDC 19 时,苹果提供了 Siri Media Intent,让用户能通过 Siri 来操作音视频 App,进行搜索/播放节目。

基于上线以来的反馈,今年在该 Session 中,工程师为我们提供了一些数据的支撑,指明应该如何优化用 Siri 播放 App 的相关体验。

首先来看看该视频的一图简介:

SiriKit 新变化:高品质的 Siri 媒体交互

高品质

语音助手取信于用户的界线比传统的用户界面还要高,所以可用性的要求也更高。如果要支持 Siri Media,更应该把它做好。

  1. 用户要播放时,应该直接播放

试想,如果有人用语音来播放你的 App,结果无事发生,他们可能就不会再用第二次了。因此有一个健壮的播放栈来确保播放,是让 App 支持 Siri 时首先要考虑的。

  1. 快速开始播放

去年苹果发现 SiriKit Media App 中出现的最多的问题是超时。对于像 CarPlay 这种场景下,重要的是快速开始播放。对于 CarPlay 而言,超时的阈值会更低,如果播放开始得不够快,你的 App 可能被杀掉。为了帮助解决这个问题,今年苹果为性能优化增加了新的选项,参考「Expand your SiriKit Media Intents More PlatForms」[1]。

  1. 让 Siri 了解用户的偏好

方法是使用 Siri User Vocabulary API。对于 App 层面的特色词,可以使用 Siri Global Vocabulary API。后面有演示介绍如何添加。

  1. 支持更多的表达方式

允许用户通过不同的表达来与你的 App 交互,用户更可能在日常生活中使用该 App。毕竟 Siri 是个智能助理,而只有当和 Siri 的交流更符合自然语言的习惯时,它才能显得足够智能。所以只有当用户没有明说想要什么,而 Siri 做出了最佳猜测时,这才显得完美。

常见的用户表达语句

  1. 播放「App」

通常 mediaSearch 为空,或者只包含了音乐的类型。

超过一半的 App 都需要对用户的命令进行猜测。比如用户会说「播放 App」或者是「在 App 中播放音乐」。当用户没告诉你他想播放什么时,最重要的是能猜对,播放他想听的。满足了这个场景的需求,就可以服务到大量用户。根据 App 的情况来决定播放什么最适合用户。大概有 50% 的请求是这种类型的。

  1. 在「App」中播放「节目」

mediaSearch 中只含有标题,而没有其他信息。用户不会告诉你他们要播什么类型,只提供了一个词,可能是歌曲、专辑、艺人、主播等。要满足这样的需求,最好要对不同类型的节目都进行搜索。约占所有请求的 30%。

  1. 播放「艺人」的「节目」

mediaSearch 中带有艺人名字,合并其他信息。这是一种更精确的搜索,用户指明了他们想要听的内容。这种请求的占比下降到了 5%。

  1. 播放「列表」

mediaSearch 中包含了列表的名字,并且类型为 playlist。这种请求也只占了 5%。

以上几种语句就涵盖了 90% 的场景,但苹果也希望开发者能多支持一些用户语句。最后视频中还提到一点:用户用的越多,可能会使用一些越复杂的语句,这对 App 来说是好事,因为这意味着用户越喜欢通过 Siri 来使用该 App。

MediaSearch Demo

工程师演示了用户语句不同时,mediaSearch 返回的结果是怎样的。首先有个开发的小技巧:当进行测试时,可以直接在 Siri Intent Query 中输入想要让 Siri 识别到的句子。

SiriKit 新变化:高品质的 Siri 媒体交互

  1. 播放「App」

语句:play controlAudio

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到 mediaSearch 此时是 nil,说明 Siri 没有识别到额外的参数。

多说了一个类型之后则略有变化。

语句:play music in controlAudio

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到 mediaSearchmediaType 被识别到了。

  1. 在「App」中播放「节目」

语句:Play Special Disaster Team in ControlAudio

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到 mediaName 也被识别到了,并且是要播放的内容标题。

  1. 在「App」中播放「艺人」的「节目」

语句:Play  Maybe Sometime by Special Disaster Team in ControlAudio

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到 mediaNameartistName 都被识别出来了,并且被放到了 mediaSearch 的相应字段中

  1. 在「App」播放「列表」

语句:Play my WWDC playlist in ControlAudio

注意:playlist 这个词是不能少的

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到 mediaType 被识别出来了,5 代表是播放列表,WWDC 作为 mediaName 也被放到对应的字段中。

Siri Media Vocabulary

Siri 的自然语言处理系统是一个机器学习系统,它会尝试根据用户语句来识别用户的意图,并执行操作。对应的模型也被训练过,用于识别音频相关的特征。因此你不需要自己去识别如音乐类型、媒体类型、排序方式等等,因为 Siri 都已经帮你做好了。

但有时 Siri 也会犯错,比如「70s punk classics」这个词,「70s」会被识别成年代,而「punk classics」会被识别成 mediaName,而不是整体被识别成播放列表类型,且整个词作为播放列表的名称。

有两种办法可以解决这个问题:一是使用 User vocabulary;二是使用 Global vocabulary。这两种 vocabulary 的应用场景略有不同。

  1. User vocabulary:更适用于单个用户,对于每个用户提供个性化的功能时,应该使用它。

SiriKit 新变化:高品质的 Siri 媒体交互

如上图的代码中,创建了一个 NSOrderedSet 并把播放列表对应的词汇存到了该 set 中,最后再放到 vocabulary 中。需要注意的是越重要的需要排在更前面的位置,因为排序会影响 Siri 的处理结果。

  1. Global vocabulary:更适合放入适用于全部用户的词汇,这些词汇是静态的,放在 .plist 文件中,然后被打包到 App 中。只需要放入 App 独有的词,对于一些热门的歌曲或者播客类的词,Siri 都会不断更新,无需开发者自己再放入 App 中。

SiriKit 新变化:高品质的 Siri 媒体交互

plist 文件的结构如下图所示。

SiriKit 新变化:高品质的 Siri 媒体交互

上一个红框处的词代表了需要加入的词的类型,下一个红框处的词代表了要添加的词汇。被添加的词会被 Siri 识别成 mediaName 放到 mediaSearch 的相应位置。

vocabulary 有不同的类型,开发者可以选择自己的 App 支持的那些类型。

SiriKit 新变化:高品质的 Siri 媒体交互

虽然 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 时,结果如下:

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到「Punk」被单独识别成音乐的类型,而「70s」被识别成了年代。

SiriKit 新变化:高品质的 Siri 媒体交互

加入设置 user vocabulary 的相关代码。在正式环境下,Run 之后,vocabulary 还需要一定时间来与 Siri 进行同步,所以可能不会马上就生效。

SiriKit 新变化:高品质的 Siri 媒体交互

可以看到 vocabulary 已经生效了,现在上面的短语会被识别成播放列表,而列表名字也被完整的识别出来。

另一种方法是使用 Global vocabulary。添加 AppIntentVocabulary.plist 文件到 App 中,格式如下:

SiriKit 新变化:高品质的 Siri 媒体交互

SiriKit 新变化:高品质的 Siri 媒体交互

<<< 左右滑动见更多 >>>

再次运行之后,可以看到短语也别成功识别了。

Now Playing 支持

另一个常见的 Siri 使用场景是 Now Playing 相关的操作,用户使用 Now Playing 来控制播放相关的功能,如上一首下一首、播放暂停等。这是通过 MPRemoteCommandCenter 来实现的。只要你的 App 实现了对应的 command,iOS 会完成剩下的工作。具体可以参考样例代码「Becomming a Now playable app」。

对 Siri 来说,支持 Now Playing 就像在当前的支持上多加了一层语音控制层。用户的语音指令会被转换成对应的 command,然后交给 MPRemoteCommandCenter 来处理。最后,App 被唤醒,并执行对应的操作。

SiriKit 新变化:高品质的 Siri 媒体交互

播放、暂停、上一首、下一首等语音指令都会被转换成对应的 command,唯一不同的点在于快进快退。用户现在可以指定快进与快退的时间。

SiriKit 新变化:高品质的 Siri 媒体交互

除此之外,Siri 还支持一些其他的 command:

SiriKit 新变化:高品质的 Siri 媒体交互

如果需要在开始播放时就设置播放的顺序,可以使用 INPlayMediaIntent 来实现。

如果用户询问正在播放的节目信息,在设置 MPNowPlayingInfoCenter 中的属性后,Siri 可以做出相应的回答。

SiriKit 新变化:高品质的 Siri 媒体交互

主要是 title、artist、albumTitle 三种类型,举个例子,如果用户问「当前在播放的是什么歌曲?」Siri 就会从 MPMediaItemPropertyTitle 获取相关信息并告诉用户。

如果 App 不支持对应的 Command,有三种方式可以告知用户:

  1. 不实现对应的 Command,最省力,Siri 会告诉用户不支持这个指令。

  2. 设置 Command 的 enable 属性为 no。

  3. 返回 MPRemoteCommandHandlerStatusCommandFailed

告诉用户 App 有 Siri 相关功能

对于语音交互来说,一个难题是用户往往意识不到你提供了这样的功能。如果他们不知道,你所付出的努力很可能就被埋没了。

但如果用户知道了有这样的功能,功能的使用率甚至能达到以前的 10 倍。

因此,记得让用户知道你提供了语音交互的功能,用最适合你的 App 的方式呈现。

推荐阅读

当 Widget 遇到智能化

关注我们

我们是「老司机技术周报」,每周会发布一份关于 iOS 的周报,也会定期分享一些和 iOS 相关的技术。欢迎关注。

SiriKit 新变化:高品质的 Siri 媒体交互

关注有礼,关注【老司机技术周报】,回复「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源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这