Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.
Recentemente, escrevi um tutorial sobre Criando um AWS Lambda que se comunicava com a função Couchbase banco de dados NoSQL usando a linguagem de programação Go. Este tutorial anterior foi baseado em um desenvolvimento sem servidor padrão, mas e se quiséssemos levar as coisas para o próximo nível? Por exemplo, os dispositivos acionados pelo Amazon Alexa, na maioria das circunstâncias, utilizam o AWS Lambda para funcionar. Então, o que seria necessário para tornar nossa função compatível com o Alexa?
Neste tutorial, veremos como trabalhar com solicitações do Amazon Alexa e responder adequadamente para que o Alexa transmita uma mensagem de áudio de volta ao usuário. Os dados com os quais responderemos virão do nosso banco de dados e serão gerenciados com a linguagem de programação Go.
Criação de uma função Lambda com suporte ao Amazon Alexa
Se você ainda não viu meu tutorial anteriorsugiro que dê uma olhada antes de continuar a leitura. O tutorial anterior é curto e fornecerá alguma perspectiva sobre o desenvolvimento de funções Lambda com Go e Couchbase.
Em seguida, crie um projeto em seu **$GOPATH** com um arquivo **main.go** nele. Na linha de comando, execute o seguinte para baixar nossas dependências:
1 2 3 4 5 6 7 |
ir obter github.com/arienmalec/alexa-ir ir obter github.com/aws/aws-lambda-ir/lambda ir obter github.com/satori/ir.uuid ir obter gopkg.em/couchbase/gocb.v1 |
Das nossas dependências, estamos baixando o AWS Lambda SDK para Go, bem como o Couchbase SDK para Go. Também estamos baixando um pacote UUID para gerar valores exclusivos para representar nossas chaves de documento, que é o que tínhamos em nosso tutorial anterior. No entanto, desta vez, estamos baixando outro pacote que contém modelos para cada uma de nossas solicitações e respostas. O Alexa espera que as solicitações e as respostas estejam em um determinado formato JSON, que é praticamente a única finalidade do pacote Alexa.
No arquivo **main.go**, adicione o seguinte código padrão:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
pacote principal importação ( "github.com/arienmalec/alexa-go" "github.com/aws/aws-lambda-go/lambda" uuid "github.com/satori/go.uuid" gocb "gopkg.in/couchbase/gocb.v1" ) var balde *gocb.Balde tipo Todo estrutura { ID string `json:"id,omitempty"` Texto string `json:"text,omitempty"` Tipo string `json:"type,omitempty"` } func IntentDispatcher(solicitação alexa.Solicitação) (alexa.Resposta, erro) { var resposta alexa.Resposta interruptor solicitação.Corpo.Intenção.Nome { caso "GetTodosIntent": resposta = HandleGetTodosIntent(solicitação) caso "CreateTodoIntent": resposta = HandleCreateTodoIntent(solicitação) caso "AboutIntent": resposta = HandleAboutIntent(solicitação) } retorno resposta, nulo } func HandleAboutIntent(solicitação alexa.Solicitação) alexa.Resposta { } func HandleCreateTodoIntent(solicitação alexa.Solicitação) alexa.Resposta { } func HandleGetTodosIntent(solicitação alexa.Solicitação) alexa.Resposta { } func principal() { agrupamento, _ := gocb.Conectar("couchbase://HOST_HERE") agrupamento.Autenticar(gocb.PasswordAuthenticator{Nome de usuário: "todos", Senha: "123456"}) balde, _ = agrupamento.OpenBucket("todos", "") lambda.Início(IntentDispatcher) } |
Então, o que está acontecendo no código acima?
Depois de importar as dependências baixadas, podemos criar um arquivo Todo
que armazenará nossos dados. Da mesma forma que no exemplo anterior, vamos armazenar as informações da lista de tarefas e consultar essas informações.
No principal
estamos estabelecendo uma conexão com nossa instância do Couchbase e abrindo nosso bucket. É importante que nossa instância do Couchbase esteja hospedada em algum lugar porque o Lambda precisa ser capaz de interagir com ela. Isso significa que você provavelmente não poderá testar com o Couchbase em execução em seu host local.
Quando se trata da Alexa, as coisas acontecem com base em ações conhecidas como intenções. Essas ações são normalmente uma solicitação à Alexa. Em qualquer habilidade, você pode interagir com a Alexa de várias maneiras, portanto, com várias intenções. Nossa habilidade terá uma Sobre a intenção
para obter informações, um CreateTodoIntent
para salvar dados, e um GetTodosIntent
para consultar nossos dados e retorná-los ao usuário. Essas intenções serão controladas pelo nosso IntentDispatcher
função.
A ideia por trás de nossa IntentDispatcher
é uma solicitação que virá da Alexa. Dentro da solicitação, a Amazon descobrirá a intenção correta e poderemos usar essas informações. Essas informações de intenção serão definidas mais adiante. Usando as informações de intenção, podemos chamar a função correta.
Então, vamos dar uma olhada no Sobre a intenção
função:
1 2 3 4 5 |
func HandleAboutIntent(solicitação alexa.Solicitação) alexa.Resposta { retorno alexa.NewSimpleResponse("Sobre", "Criado por Nic Raboy do The Polyglot Developer.") } |
Se a função for chamada, poderemos usar o pacote Alexa para formatar nossa resposta como JSON correto e retorná-la. A resposta terá um título e um texto para ser falado de volta ao usuário.
Agora vamos dar uma olhada no CreateTodoIntent
função:
1 2 3 4 5 6 7 8 9 |
func HandleCreateTodoIntent(solicitação alexa.Solicitação) alexa.Resposta { todo := Todo{Texto: solicitação.Corpo.Intenção.Caça-níqueis["todo"].Valor} balde.Inserir(uuid.Deve(uuid.NovoV4()).Cordas(), todo, 0) retorno alexa.NewSimpleResponse("Todo Criado", "Adicionado `"+todo.Texto+"`para a lista.") } |
Se nosso expedidor escolher a função acima, pegaremos os dados dinâmicos, conhecidos como slot, e os inseriremos no Couchbase. Os dados do slot serão analisados pela Amazon e incluídos na solicitação, assim como a intenção. Os dados do slot serão retornados e falados pela Alexa quando terminarmos.
A função final é mais longa, mas não muito mais complicada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func HandleGetTodosIntent(solicitação alexa.Solicitação) alexa.Resposta { todos := "" consulta := gocb.NewN1qlQuery("SELECT text FROM `todos` AS todos") linhas, _ := balde.ExecutarN1qlQuery(consulta, nulo) var fila Todo para linhas.Próximo(&fila) { todos += fila.Texto + ". " } retorno alexa.NewSimpleResponse("Lista de tarefas", todos) } |
No HandleGetTodosIntent
estamos consultando o balde aberto usando N1QL. Com os resultados, estamos formando uma cadeia de dados a ser retornada ao usuário e falada pela Alexa.
Com o código concluído, podemos nos concentrar na implantação.
Implementação e teste da função Lambda como uma habilidade da Alexa
Antes de podermos implementar no Skill Store, precisamos preparar nosso código de função para o Lambda. Da mesma forma que no exemplo anterior, precisamos compilar nosso aplicativo para Linux, que é o que o Lambda usa.
Na linha de comando, execute o seguinte:
1 2 3 |
GOOS=linux ir construir zíper manipulador.zíper ./binário-nome |
Certifique-se de alterar o nome binário
com o nome do seu arquivo binário real criado a partir do comando de compilação anterior. Se não for possível executar o comando zíper
vá em frente e arquive o arquivo da forma que fizer mais sentido.
Com o arquivo **handler.zip** em mãos, acesse o Lambda Management Dashboard (https://console.aws.amazon.com/lambda) e crie uma nova função usando os padrões. Apenas certifique-se de que esteja usando um projeto Go.
Para o acionador, escolha **Alexa Skills Kit** e faça o upload do arquivo ZIP. Para o **Handler**, certifique-se de fornecer o nome do seu arquivo binário, não o nome do seu arquivo ZIP.
A última coisa a ser observada é o seu ID ARN. Esse valor de ARN será necessário quando configurarmos a Alexa.
Agora, acesse o Alexa Developer Console (https://developer.amazon.com/alexa/console) para que possamos criar uma nova habilidade. Como parte do processo de criação, você precisará fazer quatro coisas:
- Nome da invocação
- Intenções, amostras e slots
- Modelo de construção
- Ponto final
O nome da invocação não precisa corresponder ao nome da sua Skill, mas deve ser uma palavra real que possa ser pronunciada com todos os sotaques. Se você começar a inventar palavras ou usar palavras complicadas, terá sorte se a Alexa entender o que as pessoas disseram.
O endpoint é o ARN que você copiou na etapa anterior do console do Lambda. Certifique-se de colá-lo.
A maior parte de nosso trabalho será em torno da criação de intents, exemplos de enunciados e nossos dados de slots dinâmicos. Precisamos criar três intents para corresponder ao que temos em nosso código Golang. Cada uma de nossas intenções deve ter uma lista de frases que ativam a intenção.
Por exemplo, o GetTodosIntent
pode ter os seguintes exemplos de enunciados:
1 2 3 4 5 6 7 |
o que são meu todos obter eu meu lista o que é em meu todo lista obter eu meu todos |
Quanto mais frases de exemplo você tiver, melhor será o desempenho da sua habilidade. Basicamente, os exemplos ajudam a Alexa a determinar qual intenção acionar em seu código. A CreateTodoIntent
é onde as coisas ficarão um pouco complicadas porque estamos esperando dados dinâmicos.
Dê uma olhada nos exemplos de enunciados a seguir:
1 2 3 4 5 |
adicionar {todo} para meu lista salvar {todo} criar {todo} para meu lista |
Observe que eu tenho {todo}
nas amostras acima, que corresponde à do slot no meu código. O {todo}
é, na verdade, uma variável para informações dinâmicas. Essas informações serão salvas em nosso banco de dados. No entanto, precisamos definir que tipo de dados {todo}
é.
Crie um tipo de slot personalizado e atribua a ele alguns valores. Por exemplo, eu adicionei:
1 2 3 |
lavagem carro limpo casa |
Você não precisa de uma lista exaustiva, mas ela é um dado de aprendizado para a Alexa e ajuda a Alexa a identificar quais tipos de informações devem ser consideradas informações de slot. O fato de o texto não constar na lista não significa que a Alexa não o pegará.
Neste momento, você deve conseguir criar sua habilidade. Vá em frente e digite algumas frases de exemplo no portal de teste para vê-lo em ação antes de tentar implementar.
Conclusão
Você acabou de ver como criar uma Amazon Alexa Skill usando Golang e Servidor Couchbase. Essa foi uma extensão de um tutorial anterior que escrevi, intitulado, Desenvolvimento de funções AWS Lambda com Golang e Couchbase NoSQL.
Há também algo a ser observado sobre nossa habilidade. A Amazon tem várias intenções obrigatórias que devem estar presentes para serem aprovadas. Por exemplo, é necessário que haja intenções para interromper e cancelar ações. Nós não as adicionamos, mas elas seguiriam a mesma estratégia.
Se você quiser ver outro exemplo de desenvolvimento de uma habilidade com a Golang, confira meu tutorial intitulado, Crie uma habilidade para Alexa com Golang e AWS Lambda.