Google Cloud Platform

Cloud Machine Learning API を使った会話アプリの作成 - Part 2

このブログ記事の Part 1 では、Cloud Machine Learning API と API.AI を使って構築される iOS 対応の会話型ツアー ガイド アプリがどのようなものかを紹介しました。また、API.AI のインテントとコンテキストの作成方法も説明しました。

Part 2 では、API.AI の高度なトピックであるウェブフックと Cloud Functions を取り上げます。Cloud Machine Learning API(Speech、Vision、Translation の各 API)の使い方や、2 つ目の言語のサポート方法も解説します。

Cloud Functions によるウェブフック

API.AI ではウェブフックの統合を利用して、マッチされたインテントからウェブ サービスに情報を渡し、結果を取得できます。パレードの情報をリクエストし、Cloud Functions から入手する方法を見ていきましょう。

  1. console.cloud.google.com にアクセスします。自分のアカウントでログインし、新しいプロジェクトを作成します。
  2. 新しいプロジェクトを作成したら、そのプロジェクトに移動します。
  3. Cloud Functions API を有効にします。

1tf6NW7eoOIacbuQGJthQ1mlOUpzo_nbXaAv31WObLAhwRTIsB4x4878nko-aNhnt8IiLIQfI0no2-ScTtMt5YAOSPKnHdJvSNHeqaag9Onu28NiEkxInQkE8HaYAFNutka1Jj5muhkn.PNG

4. 関数を作成します。ここでは “parades”(パレード)という名前の関数を作成することにします。“HTTP trigger”(HTTP トリガ)オプションを選択し、“Inline editor”(インライン エディタ)を選択します。

wS_7i2-9oU6vRaOkXKiq2hXHDvyXyJDgv4ceGSsXaVHR5iFioz1GHCz5tCCKYQjsIkBd6WdMYrJ5EtcTEHD047TUkeZm5Z2o6B8bybWzOZFYq0208dM-4JGcPfsn8Nk68-71vqtsml8u.PNG

5. 実行する関数を “parades” と指定することを忘れないでください。

“ステージ バケット” も作成する必要があります。“browse”(ブラウズ)をクリックするとブラウザが表示されますが、バケットはまだありません。

8iPU4507SiuZ_ygEn5uTlp_SOxD7I0EDhw8i6DrOlyiSniwYKHmUgD51ei9fuixHlibuuu-Iqtt-FgVagL19tL4iKlgLtliwO5f5SPUhkC2IsgF0HqMfiLEupq7z5An618aWIHfZpr0g.PNG

6. “+” ボタンをクリックし、バケットを作成します。

  • バケットの一意な名前を指定し(たとえばプロジェクト名が使えます)、“regional”(リージョナル)ストレージを選択し、デフォルトのリージョンのままにします(us-central1)。
  • 前のウィンドウで “select”(選択)ボタンをクリックします。
  • “Create”(作成)ボタンをクリックし、関数を作成します。

関数が作成され、デプロイされます。

HRLdGAMp8eDlplcdBNQnnBxtCrl1SNTMr5RVjATJYY0FX_5RJXBnbSdlWENSGbAddguq1engLG-qSOkPzTZcgWkG8uT-L-UfxRiTrsayrXm_Xptdpmnr9zTfOMBOUXQ0JG53O7Qgho8m.PNG

7. “parades” 関数行をクリックします。“source”(ソース)タブでソースを見ることができます。

いよいよ私たちの関数のコーディングです! 2 つのファイルが必要になります。“index.js” ファイルには JavaScript / Node.JS のロジックが含まれます。“package.json” ファイルには、私たちの関数で必要な依存関係など、Node パッケージの定義が含まれます。

package.json ファイルは以下のとおりです。これで、NPM モジュールの actions-on-google を利用して、API.AI および Actions on Google プラットフォームとの統合を容易に行うことができます。この統合により、皆さんのエクステンション(Google Home から使えます)で Google アシスタントを拡張することが可能になります。

  {
  "name": "parades",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "actions-on-google": "^1.1.1"
  }
}

index.js ファイルのコードは以下のとおりです。

  const ApiAiApp = require('actions-on-google').ApiAiApp;
function parade(app) {
  app.ask(`Chinese New Year Parade in Chinatown from 6pm to 9pm.`);
}
exports.parades = function(request, response) {
    var app = new ApiAiApp({request: request, response: response});
    var actionMap = new Map();
    actionMap.set("inquiry.parades", parade);
    app.handleRequest(actionMap);
};

上のコードの内容を説明します。

  1. NPM モジュールの actions-on-google を要求します。
  2. ask() メソッドを使って、アシスタントからユーザーに結果を送信させます。
  3. 関数をエクスポートします。この関数では、actions-on-google モジュールの ApiAiApp クラスを使ってリクエストを処理します。
  4. API.AI から JavaScript 関数に “intents” をマップするためのマップを作成します。
  5. handleRequest() を呼び出してリクエストを処理します。
  6. コードを入力したら、必ず関数の “create” ボタンをクリックします。これで関数がクラウドにデプロイされます。

tell() APIと ask() API には微妙な違いがあります。tell() は会話を終了させ、マイクを閉じますが、ask() はそうではありません。この違いは、このブログ記事の Part 1 と Part 2 で説明しているような API.AI プロジェクトでは重要ではありません。Part 3 で Actions on Google を統合する際に、この違いについて詳しく説明します。

下の画面の “Testing”(テスト)タブは関数を呼び出し、“General”(一般)タブは統計情報を表示し、“Trigger”(トリガ)タブは関数のために作成された HTTP URL を示します。

7P8uSS-U8MftkqwDGqaJUDSLOoG28VWTo6MOcDM723K705up6E3pi1H64rp5M2x0jbSw5haCY1JBaVKfP5ar1dLJfW8k5r4_MD1eN8sxkoJfIGnZABjOqOkGgz8ECtpjNi5ayWXWkh73.PNG

最後に、API.AI コンソールに移動し、“Fulfillment” タブをクリックします。ウェブフックを有効にし、上の URL を URL フィールドに貼り付けます。

mFolwWQGqduLpCfL48Um_YSjYEbaSB4bk_mIw18zfsq5thibIBNci2oudrF1OKYQHyqCKJiXqVqahjo1gWzdSm41S54icV2Y0XVunP9Xl0h42-yhhrfEkhJVkZ1aYDJjnj0BpAZMclwj.PNG

以上で、テキストを介して人と会話するチャットボットを API.AI で作成することができました。次に、Cloud Speech API でボットが「聞く」ことを、Cloud Vision API で「見る」ことを、iOS のテキスト音声変換 SDK で「話す」ことを、Cloud Translation API で「翻訳する」ことを可能にしましょう。

Cloud Speech API の使用

Cloud Speech API にはサンプル iOS アプリが含まれています。gRPC 対応の非ストリーミング サンプル アプリを私たちのチャットボット アプリに統合することは、至って簡単です。

Google Cloud Console から API キーを入手し、SpeechRecognitionService.m の次のでその API キーを指定します。

  #define API_KEY @"YOUR_API_KEY"

ランドマーク検出

  NSDictionary *paramsDictionary =
  @{@"requests":@[
        @{@"image":
            @{@"content":binaryImageData},
          @"features":@[
              @{@"type":@"LANDMARK_DETECTION", @"maxResults":@1}]}]};

iOS で Cloud Vision API を使用するときは、このに従ってください。上のように、ラベルと顔の検出をランドマーク検出に置き換える必要があります。

Cloud Speech API で使用したのと同じ API キーが使えます。

テキスト音声変換

iOS 7 以降では、テキスト音声変換 SDK である AVSpeechSynthesizer がビルトインで用意されています。以下のコードだけで、テキストを音声に変換できます。

  #import 
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:message];
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
[synthesizer speakUtterance:utterance];

複数言語のサポート

Cloud Speech API で新たな言語をサポートするには、iOS クライアント側で 1 行を変更します(現在、複数言語を同時に使うことはできません)。中国語をサポートするには、SpeechRecognitionService.m のこのを置き換えます。

  recognitionConfig.languageCode = @"en-US";

上の行を以下のように変更します。

  recognitionConfig.languageCode = @"zh-Hans";

テキスト音声変換で中国語をサポートするには、コードに次の行を追加します。

  #import 
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:message];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-Hans"];
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
[synthesizer speakUtterance:utterance];

Cloud Speech API と Apple の AVSpeechSynthesisVoice は、BCP-47 言語コードをサポートしています。

Cloud Vision API のランドマーク検出機能は現在、英語しかサポートしていません。そのため、他の言語で検出する場合は、英語のランドマーク記述を受け取った後で、Cloud Translation API を使って目的の言語に翻訳する必要があります(Translation API は、Cloud Vision API や Cloud Speech API のように使います)。

API.AI 側では、新しいエージェントを作成し、その言語を中国語に設定する必要があります。1 つのエージェントは 1 つの言語しかサポートできないからです。同じエージェントを 2 つ目の言語で使おうとすると、その言語については機械学習が機能しません。

2SSsSiMpBOXxBkMHQvqjgH9EUONYGTX-0vONu84HCRSDmImo28R6wRXwVRJIeobiJMa-dgO6BVwJUfJ1CzLiKXR-ufxAa_s-yF34_i_9qx3TT7shFV6WE8--9ZKwlpDOVgOMXqpwh6xw.PNG

また、すべてのインテントとエンティティを中国語で作成する必要もあります。

MnDBYOo6ntvJcAKpp-UBoPDC_K2iq6AQEBbLKY8SxWfzzjl3zPSFguC6X8MYJ-2eseBVRm9B19MIw5lUoEbyPkP1xtvOYSSlDILfJ3cZ2xEhP73GuJYGQlu2Mfy8f1XLdOwq9Q7Fkj6q.PNG

これで完了です。英語と中国語をサポートするシンプルな “ツアー ガイド” チャットボットを作成できました。

次回の予定

このサンプル アプリを通じて、機械学習を利用したアプリの作成が簡単なことをおわかりいただけたと思います。さらに多くの情報を得たいのであれば、以下のクイックスタートを試してみるとよいでしょう。


ソース コードは GitHub からダウンロードできます。

Part 3 では、Google アシスタント をベースに Actions on Google との統合を利用して、このアプリを作成する方法を紹介します。

* この投稿は米国時間 8 月 16 日、Software Engineer である Chang Luo と Bob Liu によって投稿されたもの(投稿はこちら)の抄訳です。

- By Chang Luo and Bob Liu, Software Engineers