Help us understand the problem. What is going on with this article?

JavaアプリケーションにDialogflowを組み込む話

はじめに

Dialogflowを組み込んだJavaアプリケーションを作成したので、
その手順を備忘録も兼ねて簡単にまとめました。
実際に使用する場合は、ここに記載したもの+Swing等を書くことになると思います。

参考資料

開発環境

  • Windows 10 Home
  • Java 1.8
  • Maven 3.6.2
  • Eclipse IDE (2020-03)
    (Mavenプラグイン導入済み、プライベートJRE設定済み)

必要な物

  • Google アカウント

Dialogflowとは

Dialogflow は、会話型のユーザー インターフェースの設計と、モバイルアプリ、ウェブ アプリケーション、デバイス、ボット、対話型の音声応答システムなどへの統合を容易にする自然言語理解プラットフォームです。
引用元:公式ドキュメント

Google Homeの自然言語解析を行う際に使われているもので、AWSのAmazon Lexなどが類似システムとして挙げられます。


1. GCPプロジェクト・Dialogflow対話モデルの作成

1.1. Google Cloud Platform(GCP)プロジェクトの作成

Dialogflowを接続するGCPプロジェクトを作成します。

  • Google Cloud Platformを開く。
    (必要に応じて利用規約に同意する。GCPの無料トライアルは不要。)
  • プロジェクトの選択->新しいプロジェクトの順にクリックする。
  • プロジェクト名を入力し、作成をクリックする。 CreateProject.gif

1.2. Dialogflow対話モデルの作成

  • Dialogflow Consoleを開く。(必要に応じて初期設定をする)
  • Create Agentをクリックする。
  • DEFAULT LANGUAGEJapanese - jaを、GOOGLE PROJECT作成したプロジェクトを選択し、CREATEを押す。 CreateAgent.gif

ここで、Dialogflowの対話モデルを作成します。
対話モデルの作成に関する情報は、公式ドキュメントを始めとする
多くの情報がネット上にあるので省略します。

今回は「テスト」という発話に対して「Hello Dialogflow!」とレスポンスを返す
テスト用の対話モデルを作成しました。

  • 画面右部分で対話が行えることを確認する。 CheckAgent.gif

1.3. 認証用jsonファイルのダウンロード

  • 再び、Google Cloud Platformを開く。
  • 画面上部よりDialogflow対話モデルが接続されているプロジェクトを選択し、IAMと管理からサービスアカウントを開く。
  • サービスアカウントを作成をクリックし、サービスアカウント名を入力する。
  • ロールを選択より、Dialogflow->Dialogflow API クライアントを選択、続行する。
  • キーを作成をクリックし、JSONを選択して作成をクリックする。
  • 認証キーがかかれたJSONファイルを、デスクトップなどの分かりやすいところにダウンロードする。 CreateKey.gif

2. JavaアプリケーションにDialogflowを組み込む

2.1. mavenプロジェクトを作成

  • Eclipseでファイル->新規->Mavenプロジェクトの順にクリックし、mavenプロジェクトを作成する。
  • シンプルなプロジェクトの作成にチェックを付け、次へ進む。
  • 成果物のグループIdアーティファクトIdを入力し、完了を押す。
    • グループIdは、ドメインをひっくり返せば良い。Javaのパッケージ名のような感じ。
    • アーティファクトIdは、完成時のアプリ名を入れる。

2.2. パッケージ・クラスファイルの作成

作成したMavenプロジェクト内に、パッケージとクラスファイルを作成します。

  • src/main/javaを右クリックし、新規->パッケージの順に選択する。
  • 名前にパッケージ名を入力し、完了をクリックする。
  • ↑ここで作成したパッケージを右クリックし、新規->クラスの順に選択する。
  • 名前にクラス名を入力し、public static void main(String[] args)にチェックを入れ、完了をクリックする。

これで、Mavenプロジェクト内にパッケージと、メインメソッド入りのクラスが作成されました。

2.3. pom.xmlの編集

作成したMavenプロジェクト内のpom.xmlというファイルを、次のように書き換えます。

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">

  <!--groupIdとartifactIdの...は、Mavenプロジェクト作成時に入力したものと置き換えてください。-->
  <modelVersion>4.0.0</modelVersion>
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.2</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
          <finalName>...</finalName>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <!--mainClassの...は、パッケージ名.クラス名です。-->
              <mainClass>...</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>mark-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>libraries-bom</artifactId>
        <version>5.1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-dialogflow</artifactId>
    </dependency>
  </dependencies>
</project>

入力が終わったら保存し、pom.xmlを適用します。

  • pom.xmlを右クリックし、Maven->プロジェクトの更新の順に選択する。
  • 使用可能なMavenコードベースから作成したMavenプロジェクトを選択し、OKで続行する。

UpdateMavenProject.gif

2.4. Javaファイルの編集

先に作成したメインメソッド入りのクラスファイルを、次のように書き換えます。

Main.java
//package名は、適宜おき換えてください。
package tokyo.penguin_syan.dialogflowTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import com.google.api.client.util.Maps;
import com.google.cloud.dialogflow.v2.DetectIntentResponse;
import com.google.cloud.dialogflow.v2.QueryInput;
import com.google.cloud.dialogflow.v2.QueryResult;
import com.google.cloud.dialogflow.v2.SessionName;
import com.google.cloud.dialogflow.v2.SessionsClient;
import com.google.cloud.dialogflow.v2.TextInput;
import com.google.cloud.dialogflow.v2.TextInput.Builder;

public class Main {

  public static void main(String[] args) {
    Scanner userInput = new Scanner(System.in);
    List<String> text = new ArrayList<String>();
    String input;
    Map<String, QueryResult> ret;
    //sessionIdはテスト用の適当な数値です。
    int sessionId = 123456789;

    do {
      System.out.print("\nYou  : ");
      input = userInput.next();
      if(input.equals("exit"))
        System.exit(0);

      text.add(input);
      ret = new HashMap<>();

      try {
        //引数内の---は、ダウンロードしたjsonファイルに記載されたproject_idに置き換えてください。
        ret.putAll(detectIntentTexts(---,
            text, String.valueOf(sessionId++), "ja"));
        System.out.format("Agent: %s\n", ret.get(input).getFulfillmentText());
      } catch (Exception e) {
        e.printStackTrace();
      }

    }while(true);
  }

  public static Map<String, QueryResult> detectIntentTexts(
    String projectId,
    List<String> texts,
    String sessionId,
    String languageCode) throws Exception {
      Map<String, QueryResult> queryResults = Maps.newHashMap();
      try (SessionsClient sessionsClient = SessionsClient.create()) {
        SessionName session = SessionName.of(projectId, sessionId);
        for (String text : texts) {
          Builder textInput = TextInput.newBuilder().setText(text).setLanguageCode(languageCode);
          QueryInput queryInput = QueryInput.newBuilder().setText(textInput).build();
          DetectIntentResponse response = sessionsClient.detectIntent(session, queryInput);
          QueryResult queryResult = response.getQueryResult();
          queryResults.put(text, queryResult);
        }
      }
    return queryResults;
  }

}

2.5. コンパイル

  • パッケージ・エクスプローラー内のMavenプロジェクトを右クリックする。
  • 実行->Maven installの順に選択する。
  • コンソールにBUILD SUCCESSと表示されるまで待つ。

3. 実行

3.1. 実行用batファイルの作成

実行用のbatファイルを作成します。

dialogflowTest_java.bat
@echo off

rem ---にはダウンロードした認証用jsonファイル名前を入れます。
set GOOGLE_APPLICATION_CREDENTIALS=---.json
java -jar test-jar-with-dependencies.jar

実行用にディレクトリ構造を整理します。

  • test-jar-with-dependencies.jarダウンロードしたjsonファイル作成したbatファイルをすべて同じフォルダ内に配置する。
    (test-jar-with-dependencies.jarは,Mavenプロジェクト内のtargetフォルダ内にあります)
ディレクトリ構造
.
├ test-jar-with-dependencies.jar
├ ---.json
└ dialogflowTest_java.bat

3.2. 実行

実行するためには、作成したbatファイルを起動します。
run.gif

無事実行できました。
٩(๑•ㅂ•)۶うぇーい

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした