Ваше устройство может иметь особые возможности, не охваченные текущим наборомчерты- например, функция «Мигни светом» для устройства, которое может мигать светом. Вы можете определить для своего устройства специальные действия, определяющие команды, отправляемые на ваше устройство для активации специальных способностей.
Чтобы определить пользовательское действие устройства, вам необходимо следующее:
- Шаблон для сопоставления с пользовательским запросом
- Пользовательское действие устройства, которое можно связать с совпадающим запросом.
- Текст, озвучиваемый пользователю, если устройство поддерживает это действие.
- Имя команды, которое отправляется обратно на ваше устройство вместе со всеми параметрами.
Вы создаете пользовательское действие для устройства, помещая эту информацию в пакет действий . Пакеты действий определяют формат ответов Ассистента. В отличие от Actions SDK, пользовательские действия с устройством выполняются локально; вы не указываете конечную точку для обработки запросов и предоставления ответов. Пользовательские действия на устройстве не носят диалоговый характер.
Создать пакет действий
Используя следующий пример, создайте файл (например, actions.json
), который определяет тестовую команду: мигание светодиода. Скопируйте файл из примера кода, который вы скачали на предыдущем шаге :
cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/library/
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 .
Развертывание пакета действий
После создания настраиваемого действия устройства в пакете действий вы можете сделать пакет действий доступным для Ассистента.
Хотя вы можете выполнить действия, описанные в этом разделе, на своем устройстве, возможно, их будет проще выполнить в вашей системе разработки. Для запуска следующих команд не требуется виртуальная среда.
Загрузите инструмент командной строки
gactions
.Удалите все существующие учетные данные из того же каталога, что и инструмент
gactions
.rm creds.data
Сохраните пакет действий в Google с помощью интерфейса командной строки
gactions
. Заменитеproject_id
на идентификатор проекта Actions Console../gactions update --action_package actions.json --project project_id
При первом запуске этой команды вам будет предоставлен URL-адрес и предложено войти в систему. Скопируйте URL-адрес и вставьте его в браузер (это можно сделать в любой системе). На странице вам будет предложено войти в свою учетную запись Google. Войдите в учетную запись Google, которая создала проект в предыдущемшаг .
После того, как вы одобрите запрос разрешения от API, в вашем браузере появится код, например «4/XXXX». Скопируйте и вставьте этот код в терминал:
Enter the authorization code:
Если авторизация прошла успешно, вы увидите ответ, подобный следующему:
Your app for the Assistant for project my-devices-project was successfully updated with your actions.
Разверните пакет действий в тестовом режиме с помощью интерфейса командной строки
gactions
. Прежде чем запускать эту команду, вы должны сохранить свой пакет действий в Google хотя бы один раз. Тестовый режим включает пакет действий только в вашей учетной записи пользователя../gactions test --action_package actions.json --project project_id
В настоящее время вы не можете протестировать проект с помощью симулятора Actions.
Чтобы обновить пакет действий, используйте команду
gactions update
.(Необязательно) Вы можете создавать локализованные пакеты действий для одновременной поддержки множества разных языков и локалей в одном проекте.
Изменить образец
Выполните действия, описанные в этом разделе, на устройстве.
nano hotword.py
Добавьте обработчик для вашего специального действия. Вы можете использовать обработчик ниже, если хотите использовать приведенный выше пример пакета действий.
import time # Add this to the imports near the top of the file ... if event.type == EventType.ON_DEVICE_ACTION: for command, params in event.actions: print('Do command', command, 'with params', str(params)) # Add the following lines after the existing line above: if command == "com.example.commands.BlinkLight": number = int( params['number'] ) for i in range(int(number)): print('Device is blinking.') # GPIO.output(25, 1) time.sleep(1) # GPIO.output(25, 0) time.sleep(1)
Запустите образец
Запустите измененный исходный код.
python hotword.py --device-model-id my-model
Попробуйте запрос. Для приведенного выше примера попробуйте следующее:
Ок, Google, моргни 5 раз.
Обратите внимание, что запрос должен соответствовать шаблону запроса в пакете действий.