HoloLensからIBM Watson Unity SDKを使ってWatson Language Translatorとやり取りするメモ

HoloLensからIBM Watson Unity SDKを使ってWatson Language Translatorとやり取りするメモです。

今回の環境

HoloLensプロジェクトでIBM Watson Unity SDKをインストールしたメモが成功した状態で進めます。

  • Unityは 1017.1.2 f1 を使用
  • MRDesignLabs_Unityもインストール済み
  • 基本的なHoloLensプロジェクト設定は済んでいる
  • .NETバージョンは 4.7 が使える状態

Watson Language Translatorを使うサンプルファイルはこちらを参考にしました。

unity-sdk/Scripts/Services/LanguageTranslator/v2 at develop · watson-developer-cloud/unity-sdk

Watson Language Translator の準備

まず、Watson Language Translatorのプロジェクトを作ります。

image

IBM Cloud コンソールから探します。

image

作成します。

image

しばらく待っていると作成され使えるようになります。

サービス資格情報を作ってメモしておく

つづいて、サービス資格情報のところで新規資格情報を作ります。

image

url , username , password が分かるのでメモしておきます。

CURLでテスト

一旦、疎通しているかCURLでテストしてみます。(大事!)

bash
curl -X POST --user {username}:{password} --header "Accept: applicaion/json" --data "{\"text\":\"Hello, world\",\"source\":\"en\",\"target\":\"es\"}" https://gateway.watsonplatform.net/language-translator/api/v2/translate

先ほどメモしていた情報を元にCURLを組みます(上記の username , password はダミーです)

WindowsでもWindows Subsystem for Linuxで簡単にbashからcurlが叩けるのが最近素晴らしいですね。

{
  "translations" : [ {
    "translation" : "Hola, mundo"
  } ],
  "word_count" : 2,
  "character_count" : 12
}

無事応答が帰ってきて翻訳されています。

Cubeに割り当てたサンプルC#ファイル

Cubeに割り当てるときに参考にしたサンプルC#ファイルはこちらです。

unity-sdk/Scripts/Services/LanguageTranslator/v2 at develop · watson-developer-cloud/unity-sdk

こちらに先ほどメモした設定を反映させます。

image

ちょうどこのあたり。

image

名前が一致していると対応しやすいですね。それぞれ反映させます。

実行してみるといろいろレスポンスが

ためしにUnity Editorで実行してみます。4つほどレスポンスが来ます。

[XX/XX/2018 XX:XX:XX][ExampleLanguageTranslator.OnGetTranslation()][DEBUG] Langauge Translator – Translate Response: {“translations”:[{“translation”:”Hola, bienvenido a IBM Watson!”}],”word_count”:5,”character_count”:29}
UnityEngine.Debug:Log(Object)

すでに翻訳が成功しています。

        if (!_languageTranslator.GetTranslation(OnGetTranslation, OnFail, _pharseToTranslate, "ja", "en"))
            Log.Debug("ExampleLanguageTranslator.GetTranslation()", "Failed to translate.");
        while (!_getTranslationTested)
            yield return null;

対応するソースコードはこちらの部分ですね。

[XX/XX/2018 XX:XX:XX][ExampleLanguageTranslator.OnGetModels()][DEBUG] Language Translator – Get models response: {“models”:[{“model_id”:”en-es
~~~ 省略 ~~~
es”,”source”:”fr”,”target”:”es”,”base_model_id”:””,”domain”:”news”,”customizable”:true,”default_model”:true,”owner”:””,”status”:”available”,”name”:”fr-es”,”train_log”:null}]}

こちらはモデルを返してくれるようです。カスタマイズした場合のレスポンス?成功している。

[XX/XX/2018 XX:XX:XX][RESTConnector.ProcessRequestQueue()][ERROR] URL: https://gateway.watsonplatform.net/language-translator/api/v2/models?base_model_id=en-es&name=Texan, ErrorCode: 403, Error: 403 Forbidden, Response: {
“error_code” : 403,
“error_message” : “The given plan does not permit customization requests.”
}

[XX/XX/2018 XX:XX:XX][ExampleLanguageTranslator.OnFail()][ERROR] Error received: URL: https://gateway.watsonplatform.net/language-translator/api/v2/models?base_model_id=en-es&name=Texan, ErrorCode: 403, Error: 403 Forbidden, Response: {
“error_code” : 403,
“error_message” : “The given plan does not permit customization requests.”
}

カスタマイズされた際のリクエストはこのプランではダメだよ。とのこと。私がシンプルに使う上では、追加のリクエストがサンプルに入っている模様。

Language Translatorでブログ記事を翻訳してみた – IBM THINK Watson – Japan このあたりを参考にプランを変更してみた。

image

ライトから、

image

ゴツい感じの「拡張」のほうにして再度やってみる。

image

さきほどのエラーもなく、ずらずらーっとレスポンスきた。なるほど、拡張までも対応したものなんですね。

カスタマイズも面白そうですが、今回はシンプルな翻訳を試したいだけなので、ライトで良いでしょう。

出来上がったコード

ということで、拡張部分のソースを削って、シンプルにしたものがこちら。

ソースコード読みやすかったです。

using UnityEngine;
using IBM.Watson.DeveloperCloud.Services.LanguageTranslator.v2;
using IBM.Watson.DeveloperCloud.Utilities;
using IBM.Watson.DeveloperCloud.Logging;
using System.Collections;
using IBM.Watson.DeveloperCloud.Connection;
using System.Collections.Generic;

public class ExampleSimpleLanguageTranslate : MonoBehaviour
{
    private string _pharseToTranslate = "おはようございます!";
    private string _username = "username";
    private string _password = "password";
    private string _url = "url";

    private LanguageTranslator _languageTranslator;

    private bool _getTranslationTested = false;

    void Start()
    {
        LogSystem.InstallDefaultReactors();

        //  Create credential and instantiate service
        Credentials credentials = new Credentials(_username, _password, _url);

        _languageTranslator = new LanguageTranslator(credentials);

        Runnable.Run(Examples());
    }

    private IEnumerator Examples()
    {
        // 日本語→英語で翻訳
        if (!_languageTranslator.GetTranslation(OnGetTranslation, OnFail, _pharseToTranslate, "ja", "en"))
            Log.Debug("ExampleLanguageTranslator.GetTranslation()", "Failed to translate.");
        while (!_getTranslationTested)
            yield return null;

        Log.Debug("ExampleLanguageTranslator.Examples()", "Language Translator examples complete.");
    }

    private void OnGetTranslation(Translations translation, Dictionary<string, object> customData)
    {
        Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", customData["json"].ToString());
        _getTranslationTested = true;
    }

    private void OnFail(RESTConnector.Error error, Dictionary<string, object> customData)
    {
        Log.Error("ExampleLanguageTranslator.OnFail()", "Error received: {0}", error.ToString());
    }
}

username , password , url は私の設定を反映しています。

早速、HoloLensに転送して実行して見ると。

{"translations":[{"translation":"Good morning!"}],"word_count":3,"character_count":10}

と「おはようございます!」が「Good morning!」と翻訳されて返ってきました!

まとめ

ということで、HoloLensからIBM Watson Unity SDKを使ってWatson Language Translatorとやり取りしてみました。

IBM Cloud の仕組みを理解しつつプログラムをつくるという注意点はあるものの、すんなり使うことができました。

これができると、Watsonの持つ手軽に使える機械学習まわりが使えるようになるので、連携が楽しそうです。引き続き、気になったサービスを試してみます。

それでは、良き HoloLens & Unity & IBM Watson Unity SDK Life を!