AWS re:Invent 2016では、Alexaとバーチャルアシスタントはハイライトとして、多くの関心を集めました。Alexaは、Amazon Echo、Echo Dot、Echo Tap、Fire TVに対応する音声サービスであり、顧客は音声を使ってより直感的な方法でデバイスとやりとりすることができる機能やスキルを提供します。私は新しもの好きなので、EchoとEcho Dotの第一世代を持っていて、実際に私の小さなアパートにこれらのデバイスを3個を持っています。すごくいいですね。

私はAlexaがまもなく私たちの未来の一部になると信じています。すでにフォードやフォルクスワーゲンの車に導入されています。今後、こうした統合が多く見られるようになるはずです。Nuxeoでは、最新技術に対応し、クールな新機能や統合を構築して、プラットフォームの優位性を高めています。そこで、Alexaを介してNuxeo Platformで文書を検索することができるNuxeoスキルを作成することにしました。

このプレイリストで実際のスキルを確認できます:




私のGitHubリポジトリにすべてのソースがあります。それでは実装を詳しく見てみましょう。

##スキル情報

まず、言語、名前、アイコンなど、スキルに関する一般的な情報を定義する必要があります。

Nuxeoスキル情報

##統合モデル

次のステップは、あなたのスキル、さまざまなインテントとそのコンテンツとのやりとりの方法を定義することです。

{
  "intents": [
    {
      "intent": "GetMyLast"
    },
    {
      "intent": "GetMyTasks"
    },
    {
      "intent": "Search",
      "slots": [
        {
          "name": "Criteria",
          "type": "Value"
        }
      ]
    },
    {
      "intent": "AMAZON.RepeatIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}

AMAZON.*はナビゲーションに使用される定義済みの「インテント」です。次に、パラメータを持たない「GetMyLast」と「GetMyTasks」、最後に、「Criteria」パラメータを取る「Search」インテントがあります。

Nuxeo認証スクリーンショット

##設定

###アカウントのリンク

Nuxeoサーバを照会できるようにするには、資格情報を保管してその情報を使用してサーバを動的に照会するためのトークンを作成する必要があります。

UI認証の要件は、SSLと一意のURLを持つことです。そのため、あなたのサーバのURLを入力し、Alexaスキルを1つしか持たないようにするUIを作成する必要がありました。もちろん、自由にフォークして自分のものを作り、提供することができます。

UIがあなたのアカウントを検証すると、Nuxeoでトークン認証を生成し、それを新しいAlexa Token AuthとしてユーザとサーバのURLと組み合わせます。

Nuxeo認証スクリーンショット

私のホスティングがPHPをネイティブでサポートしていたので、Nuxeo PHP ClientとPolymerをUIとして使用しました。NuxeoではPolymerを愛用しています

このGitHubリポジトリにソースがあります。

これで、この認証UIでスキルを設定するだけです。

Nuxeo認証の設定

###Lambda

サービスエンドポイントを定義する必要があります。Lambdaはセットアップがとても簡単だと思われるので、これを使用します。

Nuxeo Executorの設定

NodeJSとNuxeo JavaScriptクライアントはすばやく簡単なので、これを使用することにしました。

プロジェクトの依存関係は次のとおりです。

  • alexa-sdk:Alexaプリミティブの場合
  • alexa-app:小さなフレームワークで、Alexaのアプリケーション開発を簡素化する
  • nuxeo:Nuxeoサーバにアクセスする
  • striptags:Alexaがタグを好まないので、答えからHTMLタグを削除する

それぞれの「インテント」には、以下を指定する方法があります:

app.intent('Search', function(request, response) {
    // Retrieve the criteria
    var criteria = request.slot("Criteria");
    // Load the token from the request
    return loadToken(request)
        .then(function(nuxeo) {
            // Search Nuxeo
            return nuxeo.repository().query({...});
        })
        .then(function(doc) {
            // List the results
            ...
            for (let id in doc.entries) {
                ...
                docs += res;
                response.say(res);
            }
            // Add a result card for the Alexa UI
            response.card({type: 'Standard', ...}});
        }).catch ( function(err) {
            // Handle Error
            handleError(err, request, response);
        });
});

GitHubリポジトリにソースがあります。

##感謝の言葉

この統合方法をより簡単にした、さまざまなAPIクライアント、PHP、NodeJSに感謝します。私と同じようにこのスキルを活用していただければと思います。