web-dev-qa-db-ja.com

HTTP / HTTPS APIからデータを取得するAlexaスキルを作成するにはどうすればよいですか(AWS LambdaのNode.js用の「Alexaスキルキット」を使用)

Amazon Alexaのスキルを作成したいのですが、音声コマンドによってトリガーされると、HTTPSリクエストを介してAPIから情報を取得し、その結果をAlexaユーザーへの音声応答として使用します。

Node.jsのイベント駆動型の概念と Node.js用のAlexaスキルキット の内部のために、ここでは(特にnode.jsの初心者にとって)少し課題があります。また、ユーザーからパラメーターを入手することもそれほど簡単ではありません。

誰かが最初にいくつかのサンプルコードを提供できますか?

6
Dirk Paessler

予選

  • 開始するには、Amazonアカウントが必要であり、アカウントに対してAWSを有効にする必要があります。
  • 次に、Amazon Webサイトに素敵なステップバイステップガイドがあります: https://developer.Amazon.com/edw/home.html#/skills
  • 「スキル」を作成するプロセスを段階的に説明します。スキルとは、Alexaが自然言語で質問に答える能力です。このプロセス中に、Lambda関数も作成します(デモスクリプトアプリケーションの1つを作成するために選択すると、必要なすべてのライブラリが自動的に取得されます)
  • 次に、AWSコンソールのWebUIでコードを編集できます)。
  • 「スキル」は、自宅のAmazon Echo dotのように、すべての個人用Alexaデバイスで自動的に有効になります。
  • aWSコンソールのAWSCloudwatchセクションでコンソール出力を確認できることを忘れないでください。

私が理解しなければならなかった2つのこと(そして他の人も遭遇するかもしれないこと)

最初のAlexaSkillを作成したとき、私は新しいnode.js、Lambda、およびAlexa SkillsSDKでした。それで私はいくつかの問題に遭遇しました。同じ問題に遭遇した次の人のために、ここで解決策を文書化したいと思います。

  1. https.get()を使用してnode.jsでhttp getリクエストを行う場合、res.onのような終了コールバックのハンドラーを提供する必要があります。 ( 'end'、function(res){});
  2. this.emit( ':tell'、 'blabla');を呼び出すと、回答がLambdaスクリプトからAlexaサービスに返送されます(これは、 AWSからのサンプル)。しかし、エンドハンドラーの「this」はもはや正しい「this」ではないため、事前にハンドルを保存する必要があります(mythisを使用して少し曲がりくねってこれを行っています。よりスマートなソリューションがあると確信していますが、機能します)。

次のコードスニペットがあれば、2時間のデバッグを簡単に節約できたでしょう。 :-)

コード

私のサンプルでは、​​ラムダスクリプトはすでにAPIからフォーマット済みのテキストを取得しています。 XML/JSONまたはその他のAPIを呼び出す場合は、答えをもう少し処理する必要があります。

'use strict';

const Alexa = require('Alexa-sdk');
var https = require('https');

const APP_ID = ''; // TODO replace with your app ID (OPTIONAL).

const handlers = {

  'functionwithoutdata': function() {
    var responseString = '';
    var mythis = this;
    https.get('**YOURURL**?**yourparameters**', (res) => {
      console.log('statusCode:', res.statusCode);
      console.log('headers:', res.headers);

      res.on('data', (d) => {
        responseString += d;
      });

      res.on('end', function(res) {
        const speechOutput = responseString;
        console.log('==> Answering: ', speechOutput);
        mythis.emit(':tell', 'The answer is'+speechOutput);
      });
    }).on('error', (e) => {
      console.error(e);
    });
  },

  'functionwithdata': function() {
    var mydata = this.event.request.intent.slots.mydata.value;
    console.log('mydata:', mydata);
    var responseString = '';
    var mythis = this;
    https.get('**YOURURL**?**yourparameters**&mydata=' + mydata, (res) => {
      console.log('statusCode:', res.statusCode);
      console.log('headers:', res.headers);

      res.on('data', (d) => {
        responseString += d;
      });

      res.on('end', function(res) {
        const speechOutput = responseString;
        console.log('==> Answering: ', speechOutput);
        mythis.emit(':tell', 'The answer is'+speechOutput);
      });
    }).on('error', (e) => {
      console.error(e);
    });
  }

};

exports.handler = (event, context) => {
  const Alexa = Alexa.handler(event, context);
  Alexa.APP_ID = APP_ID;
  Alexa.registerHandlers(handlers);
  Alexa.execute();
};
14
Dirk Paessler

Amazon Alexaボットを最初から作成する方法は?

Alexa音声対応ボットを作成する方法をお探しの場合は、適切な場所にいます。

ローカルホストで実行され、ngrokを介してトンネリングされたノードサーバーを使用して、AmazonAlexaボットを最初から作成しましょう。

  • Amazon開発者アカウントをお持ちでない場合は、サインアップしてください

  • Alexa開発者ページに移動します

  • Alexaコンソールに移動します

  • [スキルの作成]をクリックします

  • スキルに名前を付けます。私は自分の名前をTestSkillにして、[次へ]をクリックします。

  • スキルに追加するモデルを選択してください。実験用にカスタムを選択しました

  • [スキルの作成]をクリックします

このようにして、Alexaスキルダッシュボードにアクセスします

  • 呼び出し名を入力します。「givemepizza」という名前を付けて、[モデルの保存]をクリックします。

  • エンドポイントをクリックします

ここで、エンドポイントをAlexaコンソールに提供する必要がありますが、最初にエンドポイントをセットアップする必要があります。

ノードサーバーの作成

デフォルトの場所、つまり「/」でPOSTリクエストを受け入れることができるサーバーを作成します。

サーバーを作成するためのテクニックはたくさんありますが、私は個人的にノードを好みます。

Node、npm、Visualstudioコードがすでにインストールされていると思います

このチュートリアルの特定の要件については、以下の手順に従ってHelloWorldノードアプリを作成します。

  • ターミナルでnpm initを実行し、パッケージ名Alexaを求められたら
  • ターミナルウィザードに従ってください
  • cd Alexaを実行します
  • package.jsonファイル内
  • npm i express http -saveを実行すると、package.jsonファイルに次のエントリが追加されます。

    「依存関係」:{「エクスプレス」:「4.16.3」、「http」:「0.0.0」}

  • index.jsファイルのメインキーのpackage.jsonに値を設定します

  • 同じレベルにファイルindex.jsを追加します
  • 次のコードをindex.jsファイルに追加します。

    const express = require( 'express'); const app = express(); app.post( '/'、(req、res)=> res.send({version: '1.0'、response:{shouldEndSession:false、outputSpeech:{type: 'SSML'、text: 'Hello World!'、 ssml: 'Hello World!'}}})); app.listen(8080、()=> console.log( 'ポート8080でリッスンしているアプリの例!'));

  • scriptsの値を{ “start”: “node index.js” }に設定します

  • ターミナルでnpm startを実行します

ローカルホストをトンネルします

以下の手順に従って、ngrokを使用してノードサーバーを実行しているPORT 8080のローカルホストにトンネルを追加します。

  • まだ行っていない場合は、ngrokをダウンロードしてインストールします
  • ターミナルでngrok http 8080を実行します
  • 私の場合、SSL対応の転送リンクをコピーします https://6d0d6e60.ngrok.io はSSLリンクです
  • [URLの入力]リンクにリンクを入力します
  • HTTPSを選択し、SSL証明書の種類のドロップダウンで2番目のオプションを選択します。

私の開発エンドポイントは、認証局からのワイルドカード証明書を持つドメインのサブドメインです

  • [エンドポイントの保存]をクリックします

  • JSONエディターをクリックして、次のモデルを提供します。


    {
        "interactionModel": {
            "languageModel": {
                "invocationName": "get me pizza",
                "intents": [
                    {
                        "name": "PizzaOrderIntent",
                        "slots": [],
                        "samples": [
                            "Give me a pizza"
                        ]
                    },
                    {
                        "name": "Amazon.FallbackIntent",
                        "samples": [
                            "I didn't understand"
                        ]
                    },
                    {
                        "name": "Amazon.CancelIntent",
                        "samples": [
                            "cancel plz"
                        ]
                    },
                    {
                        "name": "Amazon.HelpIntent",
                        "samples": [
                            "help"
                        ]
                    },
                    {
                        "name": "Amazon.StopIntent",
                        "samples": [
                            "stop"
                        ]
                    }
                ],
                "types": []
            }
        }
    }
  • [モデルの保存]をクリックし、[モデルの構築]をクリックします

スキルモデルが構築されたら、それをテストする必要があります。 [テスト]タブをクリックし、[このスキルのテストが有効になっています]をオンに切り替えます。

これで、ローカルで実行されているノードプロジェクトに接続されたAlexaボットが作成されました。

質問?コメント? [email protected]で私に連絡してください

記事全文を読む

3
xameeramir

これは、awsLambdaを使用する必要がなく、エクスプレスの純粋なnodejsサーバーで動作するAlexa sdkを使用するサンプルコード(私のものではありません)です。

https://github.com/Glogo/Alexa-skill-sample-nodejs-express

0
Leandro