Registrar ações personalizadas do dispositivo

Seu dispositivo pode ter habilidades especiais não cobertas pelo conjunto atual de características como "piscar minha luz" característica de um dispositivo que pode piscar as luzes. Você pode definir ações personalizadas para seu dispositivo que especificam os comandos enviados para seu dispositivo para acionar habilidades especiais.

Para definir uma ação personalizada para o dispositivo, você precisa do seguinte:

  • Um padrão para corresponder à consulta do usuário
  • Uma ação de dispositivo personalizada para associar a uma consulta correspondente
  • Texto falado para o usuário se o dispositivo oferecer suporte à ação
  • Um nome de comando que é enviado de volta ao seu dispositivo, com todos os parâmetros

Você cria a ação personalizada do dispositivo colocando essas informações em um pacote de ações. Os pacotes de ações definem o formato das respostas do Google Assistente. Ao contrário do SDK do Actions, as ações personalizadas do dispositivo são atendidas localmente; você não especificar um para processar solicitações e fornecer respostas. As ações personalizadas do dispositivo são não natural por natureza.

Criar um pacote de ações

Usando o seguinte exemplo, crie um arquivo (como actions.json) que define um comando de teste: piscar um LED. Copie o arquivo do exemplo de código salvo em uma etapa anterior:

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/library/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .

Exemplo
{
    "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"
                    ]
                }
            ]
        }
    ]
}

O exemplo anterior usa as seguintes informações para definir o dispositivo personalizado ação:

  • Um padrão que corresponde à consulta do usuário (piscar N vezes)
  • A ação de dispositivo personalizada que será associada a uma consulta correspondente (com.example.actions.BlinkLight) para fins organizacionais
  • Texto falado para o usuário se o dispositivo oferecer suporte à ação (Piscando N vezes)
  • Um nome de comando (com.example.commands.BlinkLight) que é enviado de volta para o dispositivo, com todos os parâmetros (um número e possivelmente uma descrição da velocidade)

Para definir o padrão de consulta, observe o seguinte:

  • É possível usar tipos definidos pelo schema.org. no padrão de consulta.
  • A matriz types [...] define a lista de tipos personalizados (por exemplo, $Speed).
  • É possível usar tipos personalizados no padrão de consulta. O usuário pode falar qualquer um sinônimos no seu tipo personalizado para corresponder ao padrão de consulta.
  • Quando um sinônimo tem correspondência, a instância do tipo (speed) teria retorna a chave normalizada (SLOWLY). Pode haver várias entidades caso, por exemplo, há diferentes luzes que suportam diferentes velocidades de piscar.
  • Partes do padrão TTS de solicitação podem ser opcionais. Por exemplo, use ($Speed:speed)? no padrão de consulta para tornar essa parte opcional.
  • $type.raw (por exemplo, $speed.raw) no A TTS de resposta é substituída pelas palavras que o usuário falou.

Para acessar descrições de muitos desses campos, consulte o ActionPackage na documentação do Google Cloud.

Implantar o pacote de ações

Depois de criar sua ação de dispositivo personalizada em um pacote de ações, você pode tornar o Pacote de ação acessível ao Google Assistente.

Embora você possa seguir as etapas desta seção no seu dispositivo, pode ser mais fácil no seu sistema de desenvolvimento. Os comandos a seguir não precisam de uma ambiente virtual para ser executado.

  1. Faça o download da ferramenta de linha de comando gactions.

  2. Remova todas as credenciais atuais do mesmo diretório que gactions. .

    rm creds.data
  3. Salve o pacote de ações no Google usando a CLI gactions. Substitua project_id pelo seu projeto do Console do Actions ID.

    ./gactions update --action_package actions.json --project project_id
  4. Na primeira vez que executar o comando, você vai receber um URL e a solicitação para fazer login. Copie e cole o URL em um navegador (isso pode ser feito em qualquer sistema). A página solicitará que você faça login na sua Conta do Google. Assinatura para a Conta do Google que criou o projeto em uma step.

  5. Depois que você aprovar a solicitação de permissão da API, um código vai aparecer no navegador, como "4/XXXX". Copie e cole este código no terminal:

    Enter the authorization code:

    Se a autorização tiver sido bem-sucedida, você verá uma resposta semelhante a o seguinte:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Implante o pacote de ações no modo de teste usando a CLI gactions. O pacote de ações precisa ter sido salvo pelo menos uma vez no Google ao executar esse comando. O modo de teste ativa o pacote de ação no seu apenas por conta de usuário.

    ./gactions test --action_package actions.json --project project_id

    No momento, não é possível testar o projeto usando o simulador do Actions.

  7. Para atualizar o pacote de ações, use o comando gactions update.

  8. (Opcional) Criar pacotes de ações localizados para oferecer suporte a vários idiomas e localidades diferentes ao mesmo tempo em um único projeto.

Modificar o exemplo

Siga as etapas desta seção no dispositivo.

nano hotword.py

Adicione um gerenciador à ação personalizada. Você pode usar o manipulador abaixo se quiser para usar o exemplo de pacote de ações acima.

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)

Executar a amostra

Execute o código-fonte modificado.

python hotword.py --device-model-id my-model

Tente fazer uma consulta. Para o exemplo acima, tente o seguinte:

Ok Google, piscar cinco vezes.

A consulta precisa corresponder ao padrão no pacote de ações.