【268】45周 如何用语音控制电脑

Hum
07月11日

如何用语音控制电脑

| 本文为付费栏目文章,您已订阅,可阅读全文 |
用语音控制电脑这个欲望,自从我看过《钢铁侠》之后就一直有。

钢铁侠剧情
这个欲望首先来自于对「酷」和便利的追求,也来自于我的一种执拗。语音控制电灯、空调等基础电器已经毫不新鲜,但偏偏电脑这样智能设备中最通用的东西,竟然没办法单纯用语言做出哪怕任何简单的控制,简直不能忍。
前一段时间,我总算是达到了目的——可以用我自制的命令,单纯通过语言,对 iMac 进行关机、睡眠、播放音乐等命令。这中间要结合 Amazon 的智能音箱 Alexa,云服务的枢纽 IFTTT,云盘服务 Dropbox,以及 macOS 上的 Keyboard Maestro 来实现。它的灵活度很高,基本上,通过 Keyboard Maestro 能完成的事,都可以为它指定一个语音命令,然后用语音来完成。

流程概览

这个流程,缩到最简,是「我们说一句话,电脑做一件事」。拆开来看,则是:
  1. 我们说一句话
  2. 这句话通过某种方式传达到电脑上
  3. 电脑接收到这句话后,触发预设的命令
对于这样的事,在思考对策的时候,倒推是个好方法。

倒推思考第一步:解决电脑自动执行指令

先不考虑语音,来看解决「电脑接到指令,就执行命令」的问题。这个问题实际上分为两个部分,一是电脑如何执行命令,二是电脑如何根据条件执行命令。
前一个问题——「电脑如何执行命令」——很容易回答,通过系统中现成的命令就可以,比如在 Terminal 输入 osascript -e 'tell app "System Events" to shut down',就可以让 macOS 直接关机。

在 Terminal 中输入命令
这些命令有很多,涉及到系统的方方面面,如果有其它需求的话,可以用英文搜索对应的命令(Command),比如搜索 macOS screen sleep command 就能搜到屏幕睡眠的命令是 pmset displaysleepnow
虽然可以搜到,但是我个人更建议使用自动化工具。自动化工具在执行命令上有两个好处,第一是内置常用命令,我们不用再搜,另外它可以形成流程,做到比单条命令更丰富的东西。
而后一个问题——「电脑如何根据条件执行命令」——是个自动化问题,即如何设定一个条件(比如定时),让电脑自动执行预设好的命令(比如关机)。这种情况时候就避不开自动化工具来,免费的选择有 Automator,付费的选择有 Keyboard Maestro 和 Hezal 等。
这些自动化工具可以检测 Finder 的变化,形成触发命令的条件。比如我可以在桌面上新建一个名为「关机」的文件夹,就会触发关机的指令。

倒推思考:第二步,脱离键盘鼠标为系统输入信息

预设好了条件、流程和命令,就要开始解决「如何不用键盘和鼠标,就为系统输入信息,来满足触发命令的条件」的问题了。要做到这一点也有大量方法,而对于大多数人最简单也最稳定的方法就是云盘同步,比如用 Dropbox 这种现成的服务。
我们可以设定,只要让电脑里的自动化工具检测 Dropbox 里的文件变动,比如 Dropbox 的文件夹里出现了名为「关机」的文件,就执行关机命令。这样的话,我们就能用其它设备,在 Dropbox 里创建名为「关机」的文件,来做到遥控电脑关机。《把你的 iOS 设备变成控制 Mac 的「遥控器」》这篇文章使用的就是这个思路。

倒推思考:第三步,解决语音传输问题

接下来的问题,就只剩下语音传输的问题了。macOS 目前不能做到 Hi, Siri,所以目前还无法通过系统本身做到单纯的语音传输,只能借助外部方案。在已有的外部方案里,对于我来说最方便的是 Amazon 的智能音箱 Alexa 和 IFTTT 的联通。
由于 Amazon 智能音箱的定位更加开放,Alexa 可以做到 IFTTT 中自定义语音命令,而 IFTTT 当然又可以在 Dropbox 新建文件,所以我们自然可以对 Alexa 说句话,通过 IFTTT 让它发给 Dropbox。

Alexa——IFTTT——Dropbox
这个传输速度还是足够理想的,排除墙的影响,5 秒之内就完成能触发命令。

概览小结

至此,我们已经将所有理论上的步骤连接在了一起。如果你技术能力比较强,会发现每个步骤所用的工具都有很多的选择,事实也确实是这样。我使用的这些工具,是力求现成、稳定的服务或工具,大家都很熟悉,不用重新搭建什么,甚至不用重新注册什么,因此也相对省心。
如果你看明白了步骤的思路,条件也允许,大可以先去按照自己的想法试试看。你也许会发现在实践过程中,有不少细处需要注意,这时候可以再回来看看后文中的具体配置。

具体配置

思路是倒推的,但步骤正着写比较顺,我们先顺一下整个流程:

流程概览图
接下来,我们来看看,每个环节应该如何配置。

云端部分:通过 IFTTT 使 Alexa 在 Dropbox 中生成新文件

这部分要做的事,是概述中后两步的结合。很简单,就是要用语音在电脑上生成一个文件,形成触发条件。
工具方面,我的选择是 Alexa(语音助手) + IFTTT + Dropbox(云盘),云盘用于脱离键鼠操作,语音助手来实现语音控制。
说起来复杂,这个步骤在 IFTTT 的设置上却异常简单,具体设置如下:

IFTTT 设置
注意:
  1. Dropbox 部分(右边)的 「Contents(内容)」是必填的,单这里可以随便填,我们用的是标题作为触发条件,因此内容无所谓。
  2. Dropbox 部分(右边)要设置生成文件的文件夹,我在这里设置的是一个名为「inbox」的文件夹。
  3. Amazon Alexa 部分的 phrase 那里,你填写的是自定义命令,但是,在我们跟 Alexa 对话时,要在自定义命令之前加一句「trigger」。比方说图片里的命令是「turn off my screen」,那么我在实际使用时,应该对 Alexa 说「Hi Alexa, trigger turn off my screen.」

本地部分:制作「接受与执行命令」的流程

这一步的细节要复杂得多。它分为接收内容的部分,以及执行命令的部分。我们先看接收内容的部分,它的思路是:
  1. 我们检测 Dropbox 文件夹中「inbox」这个文件夹;
  2. 我们设定,当「inbox」文件夹里新增了一个文件,触发接下来的结果;
  3. 因为我们是根据文件名执行对应的命令,所以,我们设定:当「inbox」文件夹里新增了一个文件,并且它的文件名(比如)「Sleep」的时候,就「睡眠」、是「Mute」,就「静音」等;
  4. 我们设定,当流程结束后,删掉这个文件(这样就不会残留垃圾)。
最后,实际发生的就是:如果「inbox」文件夹里,增加了一个名为「Sleep」的新文件,让 iMac 睡眠。
它在 Keyboard Maestro 里是这样实现的:

Keyboard Maestro 完整流程
第一部分,是指定 Dropbox 中的「inbox」文件夹用于接受文件。并且在此基础上,把启动条件设定为——「adds an item (新增一个文件时)」。下面还有一个选项,是「trigger all changes immediately(即时触发动作)」。

总条件:监测文件变动
总结下来就是:当「inbox」这个文件夹新增了一个文件时即触发以下动作,这是个总的条件。
第二部分,用到了「Switch」这个动作,来在总的条件的基础上,设定更复杂多样的条件。

根据不同的文件名触发不同的命令
「Switch」是切换的意思,根据什么切换呢?根据一定的条件切换。这个条件,我们可以设置成「Text」文本,于是这个动作就变成了「Switch of Text」。在我们这个流程中,它实际是「如果一段 Text 包含/等于/etc 另一段 Text 就执行 xx 命令」。前面这个 Text,是 %TriggerValue%,这是啥?

TriggerValve
它很厉害,可以获取「Trigger(触发因素)」的结果,然后把它作为接下来的动作的条件的一部分。在这里它干的是:获取「inbox」文件夹里新增的文件。
接下来,我们就可以设定,如果这个文件名是啥,就指定什么命令(比如是「Shutdown」就关机)。它在 Keyboard Maestro 里实现得很简单。
点击图片中左下角绿底白字的加号 (+),在空白处填入你想要触发命令的文件名。这一步和 IFTTT 的设置一致,比如我的 IFTTT 的设置里,「File Name」的部分,也就是生成的文件名是「SSleeps」,那么 Keyboard Maestro 这一步中要填的就也是「SSleeps」:

填写和 IFTTT 中一致的文件名
这样大小条件就都具备了,电脑会去检测「inbox」这个文件夹,还会特别关注新增的文件是不是名为「SSleeps」。接下来,就要告诉电脑,满足这个要求时做什么了,这对 Keyboard Maestro 就是小意思了,在 Keyboard Maestro 里有一片针对系统控制的动作:

Keyboard Maestro 中控制系统的动作
在 IFTTT 里我们的口令是「turn off my screen」,也就是屏幕睡眠,那我们就在动作列表里找一下有没有屏幕睡眠即可。一番查找发现倒数第三个是「Sleep Screen」,于是我们把它拖到原本「No Action」的位置,就完成了一个动作指令:

使屏幕睡眠的完整动作
如果你想添加多个操作,只要重复前面步骤即可。但是不要忘记要在 IFTTT 给每一个操作设置一条自定义的语音命令。
最后,我们要删除这个我们为了触发命令而生成的文件,所以我们再加入一个「Delete File(删除文件)」的动作:

删除生成的文件
这个动作中仍然填入 %TriggerValue%,因为它就代之了前面我们生成的文件,无所谓它的文件名、内容、格式是什么。

总结

至此,整个操作就大功告成了。我先为各位梳理了一下思路:
  1. 先掌握让电脑根据条件执行指令;
  2. 再掌握用自动化工具监测 Finder 变化以触发行动;
  3. 想办法脱离键鼠触发自动化工具的条件(这时候我们用到了云盘);
  4. 想办法用把语音和云盘关联起来。
如你所见,做到这些是不限平台不限工具的,步骤也许还可以更加简单。而我根据我的设备—— iMac,考虑到市面上稳定、价格、靠谱程度和普遍程度等因素,选择了 Alexa、IFTTT、Dropbox 以及 Keyboard Maestro 来完成这件事,并展示了实现的所有细节。
当一切都设置完成,就可以对 Alexa 说一句「Hey Alexa, trigger turn off my Mac.」Alexa 会回复一声「Sending that to IFTTT.」几秒后 iMac 就会开始关机。
我的执拗终于被满足。
注:本文以后也许会拍摄效果视频,来展示整个流程的便利性。

上一期
文件批量重命名终极解决方案
下一期
Windows 中的文件批量处理 | 效率思维
 
精选评论(1) 我的评论
  • Owlet
    用Keyboard Maestro的remote trigger,然後把URL放到Workflow裡,ios 12的siri已經可以通過給定的phrase控制workflow了。
    07月12日 2
    • 少数派编辑部
      也是个不错的方法。也是因为这样,文章先讲了思路,再讲了工具。工具以后会越来越容易的。
      07月12日 1