
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 |
go get github.com/arienmalec/alexa-go go get github.com/aws/aws-lambda-go/lambda go get github.com/satori/go.uuid go get gopkg.in/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 |
package main import ( "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 bucket *gocb.Bucket type Todo struct { ID string `json:"id,omitempty"` Text string `json:"text,omitempty"` Type string `json:"type,omitempty"` } func IntentDispatcher(request alexa.Request) (alexa.Response, error) { var response alexa.Response switch request.Body.Intent.Name { case "GetTodosIntent": response = HandleGetTodosIntent(request) case "CreateTodoIntent": response = HandleCreateTodoIntent(request) case "AboutIntent": response = HandleAboutIntent(request) } return response, nil } func HandleAboutIntent(request alexa.Request) alexa.Response { } func HandleCreateTodoIntent(request alexa.Request) alexa.Response { } func HandleGetTodosIntent(request alexa.Request) alexa.Response { } func main() { cluster, _ := gocb.Connect("couchbase://HOST_HERE") cluster.Authenticate(gocb.PasswordAuthenticator{Username: "todos", Password: "123456"}) bucket, _ = cluster.OpenBucket("todos", "") lambda.Start(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(request alexa.Request) alexa.Response { return alexa.NewSimpleResponse("About", "Created by Nic Raboy of 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(request alexa.Request) alexa.Response { todo := Todo{Text: request.Body.Intent.Slots["todo"].Value} bucket.Insert(uuid.Must(uuid.NewV4()).String(), todo, 0) return alexa.NewSimpleResponse("Todo Created", "Added `"+todo.Text+"` to the list.") } |
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(request alexa.Request) alexa.Response { todos := "" query := gocb.NewN1qlQuery("SELECT text FROM `todos` AS todos") rows, _ := bucket.ExecuteN1qlQuery(query, nil) var row Todo for rows.Next(&row) { todos += row.Text + ". " } return alexa.NewSimpleResponse("Todo List", 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 go build zip handler.zip ./binary-name |
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 |
what are my todos get me my list what is on my todo list get me my 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 |
add {todo} to my list save {todo} create {todo} for my list |
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 |
wash car clean house |
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.