Es posible que tu dispositivo tenga capacidades especiales que no están cubiertas por el conjunto actual de rasgos (por ejemplo, "parpadea la luz") de un dispositivo que puede hacer parpadear las luces. Tú puede definir acciones personalizadas para tu dispositivo que especifiquen los comandos enviados a tu dispositivo para activar habilidades especiales.
Para definir una acción personalizada del dispositivo, necesitas lo siguiente:
- Un patrón que debe coincidir con la consulta del usuario
- Una acción personalizada del dispositivo para asociarla con una consulta coincidente
- El texto se lee en voz alta al usuario si el dispositivo admite la acción.
- Un nombre de comando que se envía de vuelta al dispositivo, junto con cualquier parámetro
Para crear la acción personalizada del dispositivo, debes colocar esta información en un action package. Los paquetes de acciones definen el formato de las respuestas de Asistente. A diferencia de SDK de Actions, las acciones personalizadas de dispositivos se completan de forma local. no especificas un extremo para procesar solicitudes y proporcionar respuestas. Las acciones personalizadas de dispositivos y no de naturaleza coloquial.
Crea un paquete de acción
Con lo siguiente como ejemplo, crea un archivo (como actions.json
) que
define un comando de prueba: parpadear una luz LED.
Copia el archivo del código de muestra que
descargado en un paso anterior:
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"
]
}
]
}
]
}
En el ejemplo anterior, se usa la siguiente información para definir el dispositivo personalizado acción:
- Un patrón que debe coincidir con la búsqueda del usuario (parpadeo N veces)
- La acción personalizada del dispositivo que se asociará con una consulta coincidente (
com.example.actions.BlinkLight
) con fines organizativos - El texto se lee en voz alta al usuario si el dispositivo admite la acción. (N de señales intermitentes)
- Un nombre de comando (
com.example.commands.BlinkLight
) que se devuelve a el dispositivo, junto con cualquier parámetro (un número y tal vez una descripción de la velocidad)
Para definir el patrón de consulta, ten en cuenta lo siguiente:
- Puedes usar tipos definidos de schema.org en el patrón de consulta.
- El array
types [...]
define la lista de tipos personalizados (por ejemplo,$Speed
). - Puedes usar tipos personalizados en el patrón de consulta. El usuario puede hablar cualquiera de las sinónimos en tu tipo personalizado para que coincidan con el patrón de consulta.
- Cuando un sinónimo coincide, el tipo de instancia (
speed
) muestra la clave normalizada (SLOWLY
). Puede haber varias entidades en caso, por ejemplo, hay distintas luces que admiten distintas velocidades que titila. - Algunas partes del patrón de TTS de solicitud pueden ser opcionales. Por ejemplo, usa
($Speed:speed)?
en el patrón de consulta para que esta parte sea opcional. $type.raw
(por ejemplo,$speed.raw
) en la El TTS de respuesta se reemplaza por las palabras que el usuario realmente pronunció.
Para obtener descripciones de muchos de estos campos, consulta la ActionPackage en la documentación de Google Cloud.
Implementa el paquete de acciones
Después de crear la acción personalizada de dispositivo en un paquete Action, puedes hacer lo siguiente: Asistente puede acceder al paquete de acciones.
Si bien puedes realizar los pasos de esta sección en tu dispositivo, es posible que sea más fácil hacerlo en tu sistema de desarrollo. Los siguientes comandos no requieren entorno virtual para ejecutar.
Descarga la herramienta de línea de comandos de
gactions
.Quita todas las credenciales existentes del mismo directorio que
gactions
. herramienta.rm creds.data
Guarda tu paquete de Action en Google con la CLI de
gactions
. Reemplazaproject_id
por tu proyecto de la Consola de Actions. ID../gactions update --action_package actions.json --project project_id
La primera vez que ejecutes este comando, se te proporcionará una URL y se te pedirá que accede a tu cuenta. Copia la URL y pégala en un navegador (esto se puede hacer en cualquier sistema). En la página, se te pedirá que accedas a tu Cuenta de Google. Firmar a la cuenta de Google que creó el proyecto en una paso.
Después de aprobar la solicitud de permiso de la API, aparecerá un código en su navegador, por ejemplo, "4/XXXX". Copia y pega este código en la terminal:
Enter the authorization code:
Si la autorización se realizó correctamente, verá una respuesta similar a la siguiente: lo siguiente:
Your app for the Assistant for project my-devices-project was successfully updated with your actions.
Implementa tu paquete de acción en modo de prueba con la CLI de
gactions
. Debes haber guardado tu paquete de Action en Google al menos una vez ejecutando este comando. El modo de prueba habilita el paquete de acción en tu cuenta de usuario../gactions test --action_package actions.json --project project_id
Actualmente, no puedes probar el proyecto con el simulador de acciones.
Para actualizar el paquete de acción, usa el comando
gactions update
.(Opcional) Puedes crear paquetes de acciones localizados para admitir muchos idiomas y configuraciones regionales diferentes al mismo tiempo en un solo proyecto.
Modifica la muestra
Sigue los pasos que se indican en esta sección en el dispositivo.
nano hotword.py
Agrega un controlador para tu acción personalizada. Puedes usar el siguiente controlador si quieres para usar el ejemplo del paquete de acciones anterior.
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)
Ejecuta la muestra
Ejecuta el código fuente modificado.
python hotword.py --device-model-id my-model
Prueba con una consulta. Para el ejemplo anterior, prueba lo siguiente:
Hey Google, parpadea 5 veces.
Ten en cuenta que la consulta debe coincidir con el patrón de consulta del paquete de acciones.