Siri 的功能不能满足你?那就自己 DIY 一个吧

2017.10.23

Voice First 已成为一个技术趋势,但对我而言,iPhone 上的 Siri 除了可以发短信,记备忘和设置闹铃,几乎没有其他什么用处。
首先它严重受限于网络环境——不仅不能离线使用,有时就算联着网也无法识别语音。其次,目前加入 SiriKit 的第三方 App 仍很少,相当多我会用上的功能还不能通过 Siri 操作。况且,APP 开发者会添加的指令也是有限的,不可能面面俱到。
其实,DIY 一个简易版的 Siri 并不难。如果你只是想要一个简单的语音命令,比如在豆瓣上搜索某个电影,由于其不涉及语义识别之类复杂的技术,用 Workflow 语音识别关键词,再配合预先设定好的 URL Schemes 就已足够。

下面来看看我是如何 DIY 这么一条豆瓣电影搜索的语音指令的。

只需三步,定制一条专属语音命令

前面已提到了,用 Workflow 实现语音指令有两个基本步骤:

  1. 通过「Dictate text」动作识别指令的内容。简单来说,就是用 iOS 自带的语音输入功能,把你说的话变成文本「豆瓣电影」。只是 Workflow 动作在执行时可以自动开始录音,不需要你手动点击键盘上的麦克风🎤了。
  2. 找到并执行关键词对应的动作。既,以这个关键词为钥匙从「Dictionary」动作里取出要执行的 URL,然后打开它。


如果你只是要快速打开某个链接,做到这一步足矣。若还想新增其他的动作,则可以按照上面图右的格式,在 「Dictionary」中点击绿色的加号按钮,然后在输入框左侧填入关键词,在右侧填入想要运行的链接即可。
介于搜索影片时还需要把影片名称给传递给服务器,所以语音指令里除了关键词「豆瓣电影」外,还得包含第二个参数(如《权力的游戏》)。换言之,上面两步中间须插入一个步骤——从语音指令里提取影片名。
这点也好解决。由于 iOS 内置的语音识别是能够分清标点符号的。我们可以在指令里用……来区隔关键词与其他参数1。就像这样:豆瓣电影……权力的游戏。之后再「split text」动作把它们转化为 List,就能自如使用了 。
到这一步,Workflow 已能认出影片名称「权力的游戏」,把它代入到搜索豆瓣电影 Wflow 的 URL Scheme 里,整个语音搜索流程就此打通。

另附上 DIY Siri 语音搜索模块的链接🔗 (点此下载 ),请对照阅读。

关于 DIY Siri 的进阶玩法

如果你已经掌握了 URL Schemes 的基本用法(不知道的话可以先读这篇), DIY 其他指令应该不会觉得困难了。我就不再做赘述。这里仅补充两个小技巧。

语音命令中包含多个变量的解决办法

尚不支持 Siri 添加任务的 GTD APP 有不少,我用的 2Do 就是其中一个。好在 2Do 是可以用 URL Schemes 添加任务的,其在 Workflow 中也有内置的动作。所以我也可以用 DIY 的办法让它支持语音命令。
和搜索电影不同,后者只需要片名一个参数就够了;添加任务时,往往会涉及提醒时间、列表名称、优先级等多个参数。
解决办法和处理单个变量一样,仍是用标点符号来区隔各个变量。就像这样:二度……明天晚上去超市买米……购物单……三。下面让我们把这句话分解来看。
首先,你能看到我把关键词设为了中文「二度」。这是由于当「Dictate」的识别语言设为中文时,是没法识别英文「2Do」的 。故而,我用了这个发音相近的关键词,方便记忆。
其次,「明天晚上」并不需要拿省略号隔开。因为 Workflow 的「Get Date from Input」是可以从多个段自然语言中分辨出的时间的。(而且可以识别出多个时间文本,如下图所示)。

最后,你应该不难推断出,「购物单」是一个 2Do 列表的名称。至于最后一个「三」则代表任务优先级。两者仍旧可以从「Split Text」 获取的列表中提取出来。
虽然搭建这个流程略显复杂,不过用起来倒是和 Fantastical 的自然语义识别功能差不多。况且相较后者,前者还支持中文识别。

通过模糊搜索提高 Workflow 识别准确性

和所有的语音助手一样,如果功能,或者说命令关键词数量过多,使用难度就会大大增加。
为了提高易用性,你可以为同一条命令设置多个关键词。比如设置关键词「电影」、「美剧」也对应为豆瓣搜索的动作。操作起来也不算麻烦,只是一次复制粘贴而已。
倘若你担心自己在说关键词时,只能记得 Workflow 名称的一部分,以至无法确保 Workflow 按命令准确运行(因为 Workflow 的 URL Scheme 中必须包含完整的脚本名称)。这条 Workflow (链接🔗)或许可以帮到你。
简单来说,它会遍历你所有的 Workflow ,然后匹配出名称中包含命令关键词的一个或数个 Workflow 供你选择。正如下图图左所示,该 Wflow 找出了我所有使用到「图」字命名的脚本。
图左为 DIY Siri 中的对象选择菜单,图右为 Siri 发短信界面的选择菜单
这和你在使用 Siri 发短信时,它也会给你提供相关的联系人菜单,问你到底要发送给其中哪一位差不多(如上图图右所示)。

总结:DIY Siri 的优点与不足

相比 Siri,由于这个 DIY Siri 是依托于 Workflow 强大功能实现的,从关键词到执行动作都完全是用户自定义,显然可以做得更为实用。而且它还支持跨多个 APP 联动,这点目前的 Siri 可未必能做到。
此外,不像 Siri 受制于网络环境,有时转半天都没反应。识别速度快,支持离线操作也是 DIY Siri 的一个突出优势所在。2
但也正是因为依托于 Workflow,DIY Siri 也有其显而易见的局限性。比如没法通过 Home 键唤出,需要手动结束录音。3而且和其他语音助手一样,它也不适合在许多公共场所下使用。

尾巴

最近,看到不少人在转发一些用 Drafts4 APP 「模拟」 Mac 上 Alfred APP 的尝试4 。细来想想,其实这和 DIY Siri 的实现逻辑并没太大区别——两者都是识别关键词,然后对后续的内容做进一步处理。
其实和修改 Drafts 的脚本相比,在 Workflow 里添加命令更方便一些。且如果你要录入的文本较短,口述命令的操作往往会比打字容易些。当然,不管用哪种方法,最后还得看具体的使用情景和个人的操作习惯。
最后,我还是更期待苹果能完善 Siri 以及 iOS 自身的功能。倘若,iOS 未来能原生支持上面提到的功能,显然会比用户自己折腾出来的,体验要好得多。


  1. ⚠️注意, iPhone 的语音识别似乎分不清何时该用全角符号,何时该用半角符号。在我说出逗号后时而会显示全角,时而则是半角,而顿号和省略号则没有这种麻烦,只是后者更容易被准确识别,所以成为了我的选择。如果你坚持使用其他标点,比如逗号,可以拿正则表达式(,|,)来匹配。  

  2. 只是我发现「Dictate」动作和 iOS 的语音输入略有不同,前者并不是每次在离线状态下都能运行。这里不能排出是 Workflow 的 Bug 所致,因为 Drafts4 的「dictate」功能在离线状态下始终都能顺利开启。  

  3. 不过你仍可以把这条 Workflow 发送到桌面快捷方式,设为 Dock 栏中的一个。同时还可以将之添加到 Widget ,或者 LCP 中。  

  4. 你可以通过以下链接了解它们。Power+:http://iospark.me/2017/09/30/Power-Action/Alfred.js:https://gist.github.com/soffchen/5989f7ef4c0cef9f7a4e29254f3fa0e2  

Comments
Write a Comment