你的设备可能具备当前这套工具中未涵盖的特殊功能 特征 -- 例如“闪烁我的灯”特征。您 可以为您的设备定义自定义操作,以指定发送到 来触发特殊能力。
如需定义自定义设备操作,您需要符合以下条件:
- 与用户查询匹配的模式
- 要与匹配的查询相关联的自定义设备操作
- 向用户说出的文本(如果设备支持此操作)
- 将连同所有参数一起发送回设备的命令名称
要创建自定义设备操作,您需要将这些信息放入 操作包。 操作包定义 Google 助理响应的格式。取消 Actions SDK,自定义设备操作在本地执行;您不指定 端点处理请求并提供响应。自定义设备操作包括 而非对话性质
创建操作包
以以下示例为例,创建一个文件(例如 actions.json
)
定义了一个测试命令:闪烁 LED。
从您在前面的示例代码中
在上一步中下载:
cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
{ "manifest": { "displayName": "Blinky light", "invocationName": "Blinky light", "category": "PRODUCTIVITY" }, "actions": [ { "name": "com.example.actions.BlinkLight", "availability": { "deviceClasses": [ { "assistantSdkDevice": {} } ] }, "intent": { "name": "com.example.intents.BlinkLight", "parameters": [ { "name": "number", "type": "SchemaOrg_Number" }, { "name": "speed", "type": "Speed" } ], "trigger": { "queryPatterns": [ "blink ($Speed:speed)? $SchemaOrg_Number:number times", "blink $SchemaOrg_Number:number times ($Speed:speed)?" ] } }, "fulfillment": { "staticFulfillment": { "templatedResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Blinking $number times" } }, { "deviceExecution": { "command": "com.example.commands.BlinkLight", "params": { "speed": "$speed", "number": "$number" } } } ] } } } } ], "types": [ { "name": "$Speed", "entities": [ { "key": "SLOWLY", "synonyms": [ "slowly", "slow" ] }, { "key": "NORMALLY", "synonyms": [ "normally", "regular" ] }, { "key": "QUICKLY", "synonyms": [ "quickly", "fast", "quick" ] } ] } ] }
上例使用以下信息来定义自定义设备 操作:
- 用于与用户查询匹配的模式(闪烁 N 次)
- 要与匹配的查询相关联的自定义设备操作 (
com.example.actions.BlinkLight
) 用于组织目的 - 向用户说出的文本(如果设备支持此操作) (闪烁 N 次)
- 将发送回至的命令名称 (
com.example.commands.BlinkLight
) 以及所有参数(数字,可能还包括速度说明)
如需定义查询句式,请注意以下事项:
- 您可以使用 schema.org 定义的类型 。
types [...]
数组定义了自定义类型(例如,$Speed
)。- 您可以在查询句式中使用自定义类型。该用户可以说出 同义词,以便与查询句式匹配。
- 当同义词匹配时,类型实例 (
speed
) 将 返回标准化键 (SLOWLY
)。可以有多个实体 例如,有不同的灯具支持不同的速度 闪烁。 - 请求 TTS 格式的部分内容是可选的。例如,使用
($Speed:speed)?
,使此部分成为可选部分。 $type.raw
(例如$speed.raw
) 响应 TTS 会替换为用户实际说出的字词。
有关其中许多字段的说明,请参见 ActionPackage 文档。
部署操作包
在操作软件包中构建自定义设备操作后,您可以将 Google 助理可访问的操作包。
虽然您可以在设备上执行本部分中的步骤,但这可能会 在您的开发系统上执行这些操作。以下命令不需要 虚拟环境。
下载
gactions
命令行工具。从
gactions
所在的目录中移除所有现有凭据 工具。rm creds.data
使用
gactions
CLI 将您的 Action 软件包保存到 Google。 将project_id
替换为您的 Actions 控制台项目 ID。./gactions update --action_package actions.json --project project_id
第一次运行此命令时,您将获得一个网址,并要求您 登录。复制该网址并将其粘贴到浏览器中(在任何系统上都可以完成此操作)。 该页面会要求您登录 Google 账号。签名 登录了在之前的 step。
从 API 批准权限请求后,系统会显示一个代码 例如“4/XXXX”。复制此代码并将其粘贴到 终端:
Enter the authorization code:
如果授权成功,您将看到类似于 以下:
Your app for the Assistant for project my-devices-project was successfully updated with your actions.
使用
gactions
CLI 将 Action 软件包部署为测试模式。 你之前必须至少将 Action 包保存到 Google 一次 运行此命令。在测试模式下,系统会在您的 用户账号。./gactions test --action_package actions.json --project project_id
目前,您无法使用 Actions 模拟器测试项目。
如需更新 Action 软件包,请使用
gactions update
命令。(可选)您可以创建已本地化的操作包 支持许多不同的语言和语言区域 同时处理多个项目
修改示例
在设备上执行本部分中的步骤。
nano pushtotalk.py
为您的自定义操作添加处理程序。请注意,下方已经添加了以下处理程序 添加到上述示例操作包的示例代码中。
... device_handler = device_helpers.DeviceRequestHandler(device_id) @device_handler.command('com.example.commands.BlinkLight') def blink(speed, number): logging.info('Blinking device %s times.' % number) delay = 1 if speed == "SLOWLY": delay = 2 elif speed == "QUICKLY": delay = 0.5 for i in range(int(number)): logging.info('Device is blinking.') # GPIO.output(25, 1) time.sleep(delay) # GPIO.output(25, 0) time.sleep(1)
运行示例
运行源代码。
python pushtotalk.py
请尝试查询。对于上面的示例,请尝试以下操作:
闪烁 5 次。
请注意,该查询需要与操作包中的查询句式匹配。