前一段时间,PDA 个人数字助理在手机出现之前就开始流行起来。现在是SDA(智能数字助理)的时候了。10月4日,Google推出了 Google Home mini 和 Max 音箱,在后台使用 Google Assistant。而从 10 月 19 日起,这些音箱将在 7 个国家销售,价格为 49 美元。
Google 在一年前推出类似于 Amazon Echo 系列音箱的时候一点也不落后。现在谷歌正在变得更加糟糕,并且对其他竞争对手产生了反响。微软也在与 Cortana 争斗。另外像三星和 Sonos 这样的硬件厂商也参加了 SDA 竞赛。
在这个博客中,我们将看到如何从 Raspberry Pi 制作一个类似的 SDA。
在本玩法里,我们需要以下的软硬件:
硬件:
软件:
下图所示的系统架构,描述了来自用户的输入,经由麦克风和 Google Assistant 进行处理,IFTTT 接收到 hotword ,并触发 Node.js 服务器命令,该命令调用 Python 程序来打开或关闭LED。但是架构灵活,每个组件都可以独立工作。这意味着,Node.js 服务器能分别触发 LED,Python 程序分别触发LED,并且它们也能在一起工作。
树莓派(Raspberry Pi)没有内置麦克风来捕捉声音。所以,让我们使用 USB 麦克风来获取语音命令。
从树莓派(Raspberry Pi )终端,键入以下命令列出音频捕获设备:
arecord -l
请从命令中检查设备 ID。这将是像 USB PnP 声音设备。默认情况下,内置的声卡将是 o,这个新的 USB 麦克风将有为 1 的 card 和为 0 的 device ID。
也有其他方法来检查,如下面的命令:
alsamixer
它将打开一个窗口,在那里可以看到 USB PnP 声卡
由于是新的卡(card),我们需要修改默认的声音配置文件
通过键入命令编辑现有的声音配置文件:
sudo nano /etc/asound.conf
pcm.!default {
type asym
capture.pcm "mic"
playback.pcm "speaker"
}
pcm.mic {
type plug
slave {
pcm "hw:1,0"
}
}
pcm.speaker {
type hw
card 0
}
ctl.!default {
type hw card 0
}
根据配置,如果有人使用多个设备,只需找到卡(card)号和设备号,并在麦克风下修改该文件。在这里,我假设是:pcm "hw:1,0"
。
同时,复制一份到 /home/pi
。
现在通过录一份音,来检查设置并确认麦克风正在工作:
arecord –format=S16_LE –duration=5 –rate=16k –file-type=wav out.wav
通过输入命令录制回放录音:
speaker-test -t wav
从主目录(/home/pi),一个接一个地执行下面的命令:
sudo apt-get update
sudo apt-get install portaudio19-dev libffi-dev libssl-dev
sudo apt-get install python3-dev python3-venv
python3 -m venv genv
genv/bin/python -m pip install --upgrade pip setuptools
source genv/bin/activate genv
python -m pip install --upgrade google-assistant-library
python -m pip install google-assistant-sdk[samples]
pip install --upgrade google-auth-oauthlib[tool]
在这一步中,我们将创建 Google云平台的 Google Assistant 客户端 ID 和凭证。
从Google Cloud平台(GCP)创建一个新项目,存储项目 ID。 然后从 API Manager 连接到 Google Assistant API,然后启用活动的网页、应用程序、设备和语音。
然后从 OAuth 屏幕获取凭据。 下载存储 OAuth 密钥信息的 JSON 文件,并将其传输到树莓派上。
然后执行以下的命令:
(genv) google-oauthlib-tool –client-secrets “PATH_TO_YOUR_JSON_FILE“ –scope https://www.googleapis.com/auth/assistant-sdk-prototype –save –headless
如果你是从远程 ssh 终端运行,则需要添加 headless 参数。
在此之后,您将重新指引一个许可页面,在那里必须给予 “允许” (allow)许可。
在树莓派 GPIO 引脚 23 需要连接到 LED 的正极,LED 的 GND 引脚到 Raspberry Pi 的 LED。
通过以下的脚本检测 LED 是否工作:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.output(23,1)
在这一步中,我们需要运行 Node.js 服务器来监听特定的端口。我使用了 KylPeacock 的代码。
这个脚本在内部调用上面的 python 脚本,来使用 python-shell 命令打开或关闭 LED。
但是,Node.js 服务器在本地实例上运行,而 Google Assistant 在云上运行。所以我们需要获取互联网网址。
我使用 ngrok 通过输入下面的命令,来获得IP地址,它将提供互联网 IP 地址。
./ngrok http 8000
现在,每当你说话或者任何的关键词(如 Toggle lights)时, Google Assistant 都需要调用此 URL。为此,我们将使用 Webhook 来分配触发器和操作。登录到 IFTTT 网站,选择 Google Assistant,然后选择说一个简单的词,然后选择 webhook 作出触发。
点击“Save”。
使用 Postman,可以通过运行这个 URL 来测试 LED 是否正在改变状态。
现在,我们要做的是集成所有的东西,并测试:发光二极管,扬声器,麦克风,Node.js 服务器,IFTTT, Google Assistant。只需要通过发出这个命令:
python -m googlesamples.assistant.grpc.pushtotalk
以下是说”Toggle lights“ 时的,命令提示符的输出:
使用 Google Assistant 的其他好处是,任何运行 Google Assistant 的设备现在都可以控制此设备。 例如,我从手机上运行命令,得到相同的结果:
由于我们可以远程控制 LED,我们可以建立许多这样的助手程序。
例如,我打算建立会说话的镜子,在刮胡子的时候我会用它来看新闻。
或建立许多交易,如预订、房间预订,订购一个蛋糕等。是这个助手的其他可能的用例。
谷歌建议使用 Dialogflow,或 actions SDK 用于这种复杂的解决方案。
你打算建立什么?
原文链接:http://icircuit.net/make-google-assistant-turn-home-smart-home/2216
参考资料:
https://github.com/krpeacock/google_home_starter
https://becominghuman.ai/turn-your-raspberry-pi-into-homemade-google-home-9e29ad220075
https://www.hackster.io/Salmanfarisvp/googlepi-google-assistant-on-raspberry-pi-9f3677#toc-step-1–setup-raspberry-pi-1
https://developers.google.com/actions/dialogflow/
http://gadgets.ndtv.com/videos/google-home-mini-hands-on-does-it-work-in-india-470137
观光\评论区