HoloLens (第 1 世代) と Azure 301: 言語翻訳


Note

Mixed Reality Academy のチュートリアルは、HoloLens (第 1 世代) と Mixed Reality イマーシブ ヘッドセットを念頭に置いて編成されています。 そのため、それらのデバイスの開発に関するガイダンスを引き続き探している開発者のために、これらのチュートリアルをそのまま残しておくことが重要だと考えています。 これらのチュートリアルが、HoloLens 2 に使用されている最新のツールセットや操作に更新されることは "ありません"。 これらは、サポートされているデバイス上で継続して動作するように、保守されます。 今後、HoloLens 2 向けに開発する方法を示す新しいチュートリアル シリーズが投稿される予定です。 この通知は、それらのチュートリアルが投稿されたときにリンクと共に更新されます。


このコースでは、Translator Text API と共に Azure Cognitive Services を使用して、Mixed Reality アプリケーションに翻訳機能を追加する方法について説明します。

最終製品

Translator Text API は、ほぼリアルタイムで動作する翻訳サービスです。 このサービスはクラウドベースであり、REST API 呼び出しを使用することにより、アプリでニューラル機械翻訳テクノロジを利用してテキストを別の言語に変換できます。 詳細については、Azure Translator Text API に関するページを参照してください。

このコースを完了すると、次の処理を実行できる Mixed Reality アプリケーションが完成します。

  1. ユーザーが、イマーシブ (VR) ヘッドセットに接続されているマイク (または HoloLens の内蔵マイク) に向かって話します。
  2. アプリがディクテーションをキャプチャし、Azure Translator Text API に送信します。
  3. 翻訳結果が Unity シーンのシンプルな UI グループに表示されます。

このコースでは、Translator サービスから結果を取得して、Unity ベースのサンプル アプリケーションに取り込む方法について説明します。 作成中のカスタム アプリケーションがある場合に、これらの概念をそのアプリケーションで採用するかどうかはご自身でご判断ください。

デバイス サポート

コース HoloLens イマーシブ ヘッドセット
MR と Azure 301:言語翻訳 ✔️ ✔️

注意

このコースでは Windows Mixed Reality イマーシブ (VR) ヘッドセットを中心に取り上げていますが、このコースで習得したことは、Microsoft HoloLens にも応用できます。 このコースに取り組む過程で、HoloLens をサポートするために別途行う必要のある変更があれば、注意事項として記載しています。 HoloLens を使用すると、音声キャプチャ中に反響音が生じることがあります。

前提条件

Note

このチュートリアルは、Unity と C# の基本的な使用経験がある開発者を対象としています。 また、このドキュメント内の前提条件や文章による説明は、執筆時 (2018 年 5 月) にテストおよび検証された内容であることをご了承ください。 「ツールのインストール」の記事に記載されているように、お客様は最新のソフトウェアを自由に使用できます。ただし、このコースの情報は、以下に記載されているものよりも新しいソフトウェアで見つかったものと完全に一致するとは限りません。

このコースでは、次のハードウェアとソフトウェアをお勧めします。

開始する前に

  • このプロジェクトをビルドする際に問題が発生するのを避けるために、このチュートリアルで紹介するプロジェクトは、ルートまたはルートに近いフォルダーに作成することを強くお勧めします (フォルダー パスが長いと、ビルド時に問題が発生する可能性があります)。

  • このチュートリアルのコードを使用すると、PC に接続されている既定のマイク デバイスから録音できます。 既定のマイク デバイスが、音声をキャプチャするために使用する予定のデバイスに設定されていることを確認します。

  • PC でディクテーションを有効にするには、[設定] [プライバシー>音声] > の順に移動し、入力 & 手描き入力し、[音声サービスをオンにして候補を入力する] ボタンを選択します。

  • ヘッドセットに接続されている (または内蔵の) マイクとヘッドホンを使用している場合は、[設定] > [Mixed Reality] > [オーディオと音声認識] で [ヘッドセットを着用している場合はヘッドセット マイクに切り替える] オプションがオンになっていることを確認します。

    Mixed Reality の設定

    マイクの設定

警告

このラボ用にイマーシブ ヘッドセットを開発している場合は、オーディオ出力デバイスの問題が発生する可能性があることにご注意ください。 これは、Unity の新しいバージョン (Unity 2018.2) で修正された Unity の問題に起因するものです。 この問題が発生すると、Unity は実行時に既定のオーディオ出力デバイスを変更できなくなります。 問題が発生した場合は、回避策として、上記の手順が完了していることを確認し、エディターを閉じてからもう一度開いてください。

第 1 章 – Azure portal

Azure Translator API を使用するには、そのサービスのインスタンスをアプリケーションから利用できるように構成する必要があります。

  1. Azure Portal にログインします。

    Note

    まだ Azure アカウントをお持ちでない方は、作成する必要があります。 このチュートリアルを教室やラボで受講している場合は、インストラクターや監督者に新しいアカウントの設定方法を質問してください。

  2. ログインしたら、左上隅の [新規作成] をクリックし、「Translator Text API」を検索します。Enter キーを押します。

    新しいリソース

    Note

    新しいポータルでは、[新規作成] という語が [リソースの作成] に置き換えられている場合があります。

  3. 新しいページに、Translator Text API サービスの説明が表示されます。 このページの左下にある [作成] ボタンを選択すると、このサービスとの関連付けが作成されます。

    Translator Text API サービスを作成する

  4. [作成] をクリックしたら、以下の手順を実行します。

    1. このサービス インスタンスの任意の [名前] を入力します。

    2. 適切な [サブスクリプション] を選択します。

    3. 適切な [価格レベル] を選択します。これが初めて作成する "Translator Text サービス" の場合は、Free レベル (F0 という名前) を使用できるはずです。

    4. [リソース グループ] を選択するか、新規に作成します。 リソース グループは、Azure アセットのコレクションの監視、アクセス制御、プロビジョニング、課金管理を行う方法を提供します。 1 つのプロジェクト (例: これらのラボなど) に関連するすべての Azure サービスを共通のリソース グループの下に保持することをお勧めします。

      Azure リソース グループの詳細については、リソース グループに関する記事をご覧ください

    5. リソース グループの [場所] を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョン内が理想的です。 一部の Azure アセットは、特定のリージョンでしか利用できません。

    6. また、本サービスに適用される利用規約を理解していることを確認する必要があります。

    7. [作成] を選択します

      [作成] ボタンを選択します。

  5. [作成] をクリックしたら、サービスが作成されるのを待つ必要があります。これには 1 分ほどかかることがあります。

  6. サービスのインスタンスが作成されると、ポータルに通知が表示されます。

    Azure サービス作成通知

  7. 通知をクリックして、新しいサービス インスタンスを確認します。

    リソース ポップアップに移動します。

  8. 通知の [リソースに移動] ボタンをクリックして、新しいサービス インスタンスを確認します。 新しい Translator Text API サービス インスタンスが表示されます。

    Translator Text API サービス ページ

  9. このチュートリアルでは、アプリケーションがサービスの呼び出しを行う必要があります。これは、サービスのサブスクリプション キーを使用して実行されます。

  10. Translator Text サービスの [クイック スタート] ページで、最初の手順の [キーを取得する] に移動して、[キー] をクリックします (サービスのナビゲーション メニューにある鍵のアイコンで示された青いハイパーリンクの [キー] をクリックして、これを行うこともできます)。 これにより、サービスの "キー" が表示されます。

  11. 表示されているキーの 1 つをコピーします。これは、プロジェクトの後半で必要になります。

第 2 章 – Unity プロジェクトを設定する

Mixed Reality イマーシブ ヘッドセットを設定してテストします。

Note

このコースでは、モーション コントローラーは必要ありません。 イマーシブ ヘッドセットのセットアップについてご不明な点がある場合は、こちらの手順を参照してください。

次に示すのは、Mixed Reality で開発するための一般的な設定であり、他のプロジェクトのテンプレートとして利用できます。

  1. Unity を開き、[新規作成] をクリックします。

    新しい Unity プロジェクトを開始します。

  2. ここで、Unity プロジェクト名を指定する必要があります。 「MR_Translation」を挿入します。 プロジェクトの種類が [3D] に設定されていることを確認します。 [Location] (場所) を適切な場所に設定します (ルート ディレクトリに近い方が適しています)。 次に、[プロジェクトの作成] をクリックします。

    新しい Unity プロジェクトの詳細を指定します。

  3. Unity を開いた状態で、既定のスクリプト エディターVisual Studio に設定されているかどうか確認することをお勧めします。 [編集] > [基本設定] に移動し、新しいウィンドウで [外部ツール] に移動します。 [外部スクリプト エディター][Visual Studio 2017] に変更します。 [環境設定] ウィンドウを閉じます。

    スクリプト エディターの基本設定を更新します。

  4. 次に、[ファイル] > [ビルド設定] で、[プラットフォームの切り替え] ボタンをクリックして、プラットフォームを [ユニバーサル Windows プラットフォーム] に切り替えます。

    [ビルド設定] ウィンドウで、プラットフォームを UWP に切り替えます。

  5. [ファイル] > [ビルド設定] に移動して、次を確認します。

    1. [ターゲット デバイス][任意のデバイス] に設定されている。

      Microsoft HoloLens の場合は、[ターゲット デバイス]HoloLens に設定します。

    2. [ビルドの種類][D3D] に設定されている

    3. [SDK][Latest installed] (最新のインストール) に設定されている

    4. [Visual Studio Version] (Visual Studio のバージョン)[Latest installed] (最新のインストール) に設定されている

    5. [Build and Run] (ビルドと実行)[Local Machine] (ローカル マシン) に設定されている

    6. シーンを保存し、ビルドに追加します。

      1. これを行うには、[Add Open Scenes] (開いているシーンを追加) を選択します。 保存ウィンドウが表示されます。

        [開いているシーンの追加] ボタンをクリックします

      2. これと、今後のシーン用の新しいフォルダーを作成し、[新しいフォルダー] ボタンを選択して、新しいフォルダーを作成し、「Scenes」という名前を付けます。

        新しい scripts フォルダーを作成する

      3. 新しく作成した Scenes フォルダーを開き、[ファイル名] テキスト フィールドに「MR_TranslationScene」と入力して、[保存] をクリックします。

        新しいシーンに名前を付けます。

        Unity のシーンは Unity プロジェクトに関連付けられている必要があるため、Assets フォルダー内に保存する必要があります。 Unity プロジェクトの構築では、通常、Scenes フォルダー (とその他の類似フォルダー) を作成します。

    7. [ビルド設定] の残りの設定は、ここでは既定値のままにしておきます。

  6. [ビルド設定] ウィンドウで、[プレーヤー設定] ボタンをクリックすると、[インスペクター] が配置されているスペースに関連パネルが表示されます。

    プレーヤーの設定を開きます。

  7. このパネルでは、いくつかの設定を確認する必要があります。

    1. [その他の設定] タブで、次の内容を確認します。

      1. [スクリプト ランタイムのバージョン][安定] である (.NET 3.5 と同等)。

      2. [Scripting Backend] (スクリプト バックエンド)[.NET] である

      3. [API Compatibility Level] (API 互換性レベル)[.NET 4.6] である

        その他の設定を更新します。

    2. [公開設定] タブ内の [機能] で、次の内容を確認します。

      1. InternetClient

      2. マイク

        発行設定を更新しています。

    3. さらに、パネルの下にある [XR 設定] ([公開設定] の下) で、[Virtual Reality サポート] をオンにし、Windows Mixed Reality SDK が追加されていることを確認します。

      X R 設定を更新します。

  8. [ビルド設定] に戻ると、"Unity C# プロジェクト" に適用されていた灰色表示が解除されています。その横にあるチェック ボックスをオンにします。

  9. [ビルド設定] ウィンドウを閉じます。

  10. シーンとプロジェクトを保存します ([ファイル] > [シーン/ファイルの保存] > [プロジェクトの保存])。

第 3 章 – メイン カメラのセットアップ

重要

このコースの "Unity のセットアップ" コンポーネントをスキップして、そのままコードに進みたい場合は、この .unitypackage をダウンロードし、これをカスタム パッケージとしてプロジェクトにインポートした後で第 5 章から続けてください。 その場合でも、Unity プロジェクトを作成する必要があります。

  1. [階層] パネルの中に、[メイン カメラ] という名前のオブジェクトがあります。このオブジェクトは、ユーザーがアプリケーションの "内部" にいるときの "頭" の視点を表しています。

  2. 目の前にある Unity ダッシュボードで、[メイン カメラ] GameObject を選択します。 [インスペクター] パネル (通常はダッシュボードの右側にあります) には、GameObject のさまざまなコンポーネントが表示されます。これらは、[変換][カメラ]、その他いくつかのコンポーネントの順に表示されています。 [メイン カメラ] の [変換] をリセットして、正しい位置に配置する必要があります。

  3. これを行うには、[カメラ] の [変換] コンポーネントの隣にある歯車アイコンを選択し、[リセット] を選択します。

    メイン カメラ変換をリセットします。

  4. [変換] コンポーネントは次のようになります。

    1. [位置]0, 0, 0 に設定されます。

    2. [回転]0, 0, 0 に設定されます。

    3. [スケール]1, 1, 1 に設定されます。

      カメラの変換情報

  5. 次に、[メイン カメラ] オブジェクトが選択された状態で、[インスペクター] パネルの一番下に [コンポーネントの追加] があるのを確認します。

  6. そのボタンを選択し、次に示す [オーディオ ソース] という名前のコンポーネントを探して (検索フィールドに「オーディオ ソース」と入力するか、そのセクションに移動することにより)、そのコンポーネントを選択します (そのコンポーネント上で Enter キーを押しても動作します)。

  7. 次に示すように、[オーディオ ソース] コンポーネントが [メイン カメラ] に追加されます。

    オーディオ ソース コンポーネントを追加します。

    Note

    Microsoft HoloLens の場合、[メイン カメラ]上の [カメラ] コンポーネントの一部である以下も変更する必要があります。

    • [クリア フラグ]: 単色。
    • [背景] "黒、アルファ 0" – [Hex カラー]: #00000000

第 4 章 – デバッグ キャンバスを設定する

翻訳の入力と出力を表示するために、基本的な UI を作成する必要があります。 このコースでは、キャンバス UI オブジェクトと、データを表示するための複数の "テキスト" オブジェクトを作成します。

  1. [階層] パネルの何もない領域を右クリックし、[UI][キャンバス] の順に選択して追加します。

    新しい Canvas UI オブジェクトを追加します。

  2. [キャンバス] オブジェクトが選択されている状態で、([キャンバス] コンポーネント内の) [インスペクター] パネルにある [表示モード][ワールド空間] に変更します。

  3. 次に、[インスペクター] パネルの [四角形の変換] にある以下のパラメーターを変更します。

    1. [位置] - X 0 Y 0 Z 40

    2. [幅] - 500

    3. [高さ] - 300

    4. [スケール] - X 0.13 Y 0.13 Z 0.13

      キャンバスの rect 変換を更新します。

  4. [階層] パネルの [キャンバス] 上で右クリックし、[UI][パネル] の順に選択して追加します。 この [パネル] で、シーンに表示されるテキストの背景が指定されます。

  5. [階層] パネルの [パネル] 上で右クリックし、[UI][テキスト] の順に選択してオブジェクトを追加します。 合計で 4 つのテキスト オブジェクトを作成するまで同じプロセスを繰り返します (ヒント: 最初のテキスト オブジェクトを選択して Ctrl キーと D キーを同時に押すだけで、オブジェクトを複製できます。合計 4 つ作成できるまでこの操作を繰り返します)。

  6. [インスペクター] パネルでそれぞれのテキスト オブジェクトを選択し、以下の表を使用してパラメーターを設定します。

    1. [四角形の変換] コンポーネント:

      名前 変換 - 位置 [高さ]
      MicrophoneStatusLabel X -80 Y 90 Z 0 300 30
      AzureResponseLabel X -80 Y 30 Z 0 300 30
      DictationLabel X -80 Y -30 Z 0 300 30
      TranslationResultLabel X -80 Y -90 Z 0 300 30
    2. [テキスト (スクリプト)] コンポーネント:

      名前 テキスト フォント サイズ
      MicrophoneStatusLabel マイクの状態: 20
      AzureResponseLabel Azure Web の応答 20
      DictationLabel ユーザーの発話内容: 20
      TranslationResultLabel 変換: 20

      UI ラベルの対応する値を入力します。

    3. また、フォント スタイルを [ボールド] に指定します。 これにより、テキストが読みやすくなります。

      太字のフォント。

  7. 第 5 章で作成した各 "UI テキスト オブジェクト" に対して、新しい "子" の UI テキスト オブジェクトを作成します。 これらの子は、アプリケーションの出力を表示します。 対象となる親 (MicrophoneStatusLabel など) を右クリックして "子" オブジェクトを作成し、[UI][テキスト] の順に選択します。

  8. [インスペクター] パネルでそれぞれの子を選択し、以下の表を使用してパラメーターを設定します。

    1. [四角形の変換] コンポーネント:

      名前 変換 - 位置 [高さ]
      MicrophoneStatusText X 0 Y -30 Z 0 300 30
      AzureResponseText X 0 Y -30 Z 0 300 30
      DictationText X 0 Y -30 Z 0 300 30
      TranslationResultText X 0 Y -30 Z 0 300 30
    2. [テキスト (スクリプト)] コンポーネント:

      名前 テキスト フォント サイズ
      MicrophoneStatusText ?? 20
      AzureResponseText ?? 20
      DictationText ?? 20
      TranslationResultText ?? 20
  9. 次に、各テキスト コンポーネントに対して [中央揃え] オプションを選択します。

    テキストを配置します。

  10. 子の UI テキスト オブジェクトが読みやすくなるように、[色] を変更します。 これを行うには、[色] の横にあるバー (現在は "黒") の上でクリックします。

    UI テキスト出力に対応する値を入力します。

  11. 次に、新しく開いた小さな [色] ウィンドウで、[Hex カラー] を 0032EAFF に変更します。

    色を青に更新します。

  12. UI は次のようになります。

    1. [階層] パネル:

      指定された構造に階層を持ちます。

    2. [シーン] および [ゲーム] ビュー:

      シーンとゲーム ビューを同じ構造にします。

第 5 章 – Results クラスを作成する

作成する必要のある最初のスクリプトは、Results クラスです。このクラスは、翻訳の結果を確認する手段を提供します。 このクラスは、次のものを格納して表示します。

  • Azure からの応答結果。
  • マイクの状態。
  • ディクテーションの結果 (音声からテキストへ)。
  • 変換の結果。

このクラスを作成するには、次の手順を実行します。

  1. [プロジェクト] パネル内で右クリックし、[作成] > [フォルダー] の順に選択します。 フォルダーに「Scripts」という名前を付けます。

    scripts フォルダーを作成します。

    scripts フォルダーを開きます。

  2. 作成した Scripts フォルダーをダブルクリックして開きます。 次に、そのフォルダー内で右クリックして、[作成]>[C# スクリプト] の順に選択します。 スクリプトに「Results」という名前を付けます。

    最初のスクリプトを作成します。

  3. 新しい Results スクリプトをダブルクリックして、Visual Studio で開きます。

  4. 次の名前空間を挿入します。

        using UnityEngine;
        using UnityEngine.UI;
    
  5. このクラス内に次の変数を挿入します。

        public static Results instance;
    
        [HideInInspector] 
        public string azureResponseCode;
    
        [HideInInspector] 
        public string translationResult;
    
        [HideInInspector] 
        public string dictationResult;
    
        [HideInInspector] 
        public string micStatus;
    
        public Text microphoneStatusText;
    
        public Text azureResponseText;
    
        public Text dictationText;
    
        public Text translationResultText;
    
  6. 次に、Awake() メソッドを追加します。これは、このクラスが初期化されたときに呼び出されます。

        private void Awake() 
        { 
            // Set this class to behave similar to singleton 
            instance = this;           
        } 
    
  7. 最後に、さまざまな結果情報を UI に出力するメソッドを追加します。

        /// <summary>
        /// Stores the Azure response value in the static instance of Result class.
        /// </summary>
        public void SetAzureResponse(string result)
        {
            azureResponseCode = result;
            azureResponseText.text = azureResponseCode;
        }
    
        /// <summary>
        /// Stores the translated result from dictation in the static instance of Result class. 
        /// </summary>
        public void SetDictationResult(string result)
        {
            dictationResult = result;
            dictationText.text = dictationResult;
        }
    
        /// <summary>
        /// Stores the translated result from Azure Service in the static instance of Result class. 
        /// </summary>
        public void SetTranslatedResult(string result)
        {
            translationResult = result;
            translationResultText.text = translationResult;
        }
    
        /// <summary>
        /// Stores the status of the Microphone in the static instance of Result class. 
        /// </summary>
        public void SetMicrophoneStatus(string result)
        {
            micStatus = result;
            microphoneStatusText.text = micStatus;
        }
    
  8. Unity に戻る前に、必ず Visual Studio で変更を保存してください。

第 6 章 – MicrophoneManager クラスを作成する

2 番目に作成するクラスは、MicrophoneManager です。

このクラスでは次のことを行います。

  • ヘッドセットまたはコンピューターに接続されている録音デバイス (既定である方) を検出する。
  • オーディオ (音声) をキャプチャし、ディクテーションを使用して文字列として保存する。
  • 音声が一時停止したら、ディクテーションを Translator クラスに送信する。
  • 必要に応じて、音声キャプチャを停止できるメソッドをホストする。

このクラスを作成するには、次の手順を実行します。

  1. Scripts フォルダーをダブルクリックして開きます。

  2. Scripts フォルダー内で右クリックし、[作成] > [C# スクリプト] の順にクリックします。 スクリプトに「MicrophoneManager」という名前を付けます。

  3. 新しいスクリプトをダブルクリックして、Visual Studio で開きます。

  4. MicrophoneManager クラスの先頭で、名前空間を次のように更新します。

        using UnityEngine; 
        using UnityEngine.Windows.Speech;
    
  5. 次に、MicrophoneManager クラス内に以下の変数を追加します。

        // Help to access instance of this object 
        public static MicrophoneManager instance; 
    
        // AudioSource component, provides access to mic 
        private AudioSource audioSource; 
    
        // Flag indicating mic detection 
        private bool microphoneDetected; 
    
        // Component converting speech to text 
        private DictationRecognizer dictationRecognizer; 
    
  6. ここで、Awake() メソッドと Start() メソッドのコードを追加する必要があります。 これらは、クラスの初期化時に呼び出されます。

        private void Awake() 
        { 
            // Set this class to behave similar to singleton 
            instance = this; 
        } 
    
        void Start() 
        { 
            //Use Unity Microphone class to detect devices and setup AudioSource 
            if(Microphone.devices.Length > 0) 
            { 
                Results.instance.SetMicrophoneStatus("Initialising..."); 
                audioSource = GetComponent<AudioSource>(); 
                microphoneDetected = true; 
            } 
            else 
            { 
                Results.instance.SetMicrophoneStatus("No Microphone detected"); 
            } 
        } 
    
  7. Update() メソッドは、このクラスでは使用しないので "削除" してもかまいません。

  8. ここで、音声キャプチャを開始および停止し、その音声キャプチャをこの後の手順で作成する Translator クラスに渡すのにアプリが使用するメソッドが必要になります。 次のコードをコピーして、Start() メソッドの下に貼り付けます。

        /// <summary> 
        /// Start microphone capture. Debugging message is delivered to the Results class. 
        /// </summary> 
        public void StartCapturingAudio() 
        { 
            if(microphoneDetected) 
            {               
                // Start dictation 
                dictationRecognizer = new DictationRecognizer(); 
                dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; 
                dictationRecognizer.Start(); 
    
                // Update UI with mic status 
                Results.instance.SetMicrophoneStatus("Capturing..."); 
            }      
        } 
    
        /// <summary> 
        /// Stop microphone capture. Debugging message is delivered to the Results class. 
        /// </summary> 
        public void StopCapturingAudio() 
        { 
            Results.instance.SetMicrophoneStatus("Mic sleeping"); 
            Microphone.End(null); 
            dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult; 
            dictationRecognizer.Dispose(); 
        }
    

    ヒント

    このアプリケーションでは使用しませんが、アプリケーションにオーディオのキャプチャを停止する機能を実装する必要がある場合のために、この例では StopCapturingAudio() メソッドも指定されています。

  9. 次に、音声が停止したときに呼び出されるディクテーション ハンドラーを追加する必要があります。 このメソッドは、ディクテーションされたテキストを Translator クラスに渡します。

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// Debugging message is delivered to the Results class.
        /// </summary>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // Update UI with dictation captured
            Results.instance.SetDictationResult(text);
    
            // Start the coroutine that process the dictation through Azure 
            StartCoroutine(Translator.instance.TranslateWithUnityNetworking(text));   
        }
    
  10. Unity に戻る前に、必ず Visual Studio で変更を保存してください。

警告

このとき、Unity エディターの [コンソール] パネルに、"名前 'Translator' は存在しません..." というエラーが表示されます。 これは、次の章で作成する Translator クラスがコードで参照されているためです。

第 7 章 – Azure と翻訳サービスを呼び出す

作成する必要がある最後のスクリプトは Translator クラスです。

このクラスでは次のことを行います。

  • 認証トークンと引き換えに、Azure でアプリを認証する。
  • 認証トークンを使用して、翻訳すべきテキスト (MicrophoneManager クラスから受信したもの) を送信する。
  • 翻訳された結果を受け取り、UI で視覚化されるように Results クラスにそれを渡す。

このクラスを作成するには、次の手順を実行します。

  1. 先ほど作成した Scripts フォルダーに移動します。

  2. [プロジェクト] パネルで右クリックし、[作成] > [C# スクリプト] の順に選択します。 このスクリプトに「Translator」という名前を付けます。

  3. 新しい Translator スクリプトをダブルクリックして、Visual Studio で開きます。

  4. ファイルの先頭に次の名前空間を追加します。

        using System;
        using System.Collections;
        using System.Xml.Linq;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. 次に、Translator クラス内に以下の変数を追加します。

        public static Translator instance; 
        private string translationTokenEndpoint = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; 
        private string translationTextEndpoint = "https://api.microsofttranslator.com/v2/http.svc/Translate?"; 
        private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key"; 
    
        //Substitute the value of authorizationKey with your own Key 
        private const string authorizationKey = "-InsertYourAuthKeyHere-"; 
        private string authorizationToken; 
    
        // languages set below are: 
        // English 
        // French 
        // Italian 
        // Japanese 
        // Korean 
        public enum Languages { en, fr, it, ja, ko }; 
        public Languages from = Languages.en; 
        public Languages to = Languages.it; 
    

    Note

    • 言語の enum に挿入されている言語は例に過ぎません。 必要に応じてさらに追加できます。この API は 60 を超える言語をサポートしています (クリンゴン語も含まれます)。
    • 使用可能な言語を説明したよりインタラクティブなページも用意されています。ただし、このページはサイトの言語が '' に設定されている場合にのみ動作することに注意してください (Microsoft サイトは通常、ユーザーの母国語にリダイレクトされます)。 サイトの言語は、ページの下部か URL を変更することによって変更できます。
    • 上のコード スニペットの authorizationKey 値は、Azure Translator Text API をサブスクライブしたときに受け取ったキーである必要があります。 これについては、第 1 章で説明されています。
  6. ここで、Awake() メソッドと Start() メソッドのコードを追加する必要があります。

  7. この例では、このコードは認可キーを使用して Azure を呼び出し、"トークン" を取得します。

        private void Awake() 
        { 
            // Set this class to behave similar to singleton  
            instance = this; 
        } 
    
        // Use this for initialization  
        void Start() 
        { 
            // When the application starts, request an auth token 
            StartCoroutine("GetTokenCoroutine", authorizationKey); 
        }
    

    Note

    トークンは 10 分後に期限切れになります。 アプリのシナリオによっては、同じコルーチン呼び出しを複数回実行することが必要になる場合があります。

  8. トークンを取得するコルーチンは次のとおりです。

        /// <summary> 
        /// Request a Token from Azure Translation Service by providing the access key. 
        /// Debugging result is delivered to the Results class. 
        /// </summary> 
        private IEnumerator GetTokenCoroutine(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new InvalidOperationException("Authorization key not set.");
            }
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(translationTokenEndpoint, string.Empty))
            {
                unityWebRequest.SetRequestHeader("Ocp-Apim-Subscription-Key", key);
                yield return unityWebRequest.SendWebRequest();
    
                long responseCode = unityWebRequest.responseCode;
    
                // Update the UI with the response code 
                Results.instance.SetAzureResponse(responseCode.ToString());
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Results.instance.azureResponseText.text = unityWebRequest.error;
                    yield return null;
                }
                else
                {
                    authorizationToken = unityWebRequest.downloadHandler.text;
                }
            }
    
            // After receiving the token, begin capturing Audio with the MicrophoneManager Class 
            MicrophoneManager.instance.StartCapturingAudio();
        }
    

    警告

    IEnumerator メソッドの GetTokenCoroutine() の名前を編集する場合は、上のコードの StartCoroutine および StopCoroutine の呼び出し文字列値を更新する必要があります。 Unity のドキュメントにあるように、特定の "コルーチン" を停止するには、文字列値メソッドを使用する必要があります。

  9. 次に、MicrophoneManager クラスで受信したテキストの翻訳を取得するために、コルーチンを追加します (その直下に "サポート" ストリーム メソッドを指定します)。 このコードは、Azure Translator Text API に送信するクエリ文字列を作成します。次に、内部の Unity UnityWebRequest クラスを使用し、作成したクエリ文字列を使用して、エンドポイントへの Get 呼び出しを実行します。 その後、この結果を使用して、Results オブジェクトに翻訳を設定します。 次のコードにその実装を示します。

        /// <summary> 
        /// Request a translation from Azure Translation Service by providing a string.  
        /// Debugging result is delivered to the Results class. 
        /// </summary> 
        public IEnumerator TranslateWithUnityNetworking(string text)
        {
            // This query string will contain the parameters for the translation 
            string queryString = string.Concat("text=", Uri.EscapeDataString(text), "&from=", from, "&to=", to);
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(translationTextEndpoint + queryString))
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + authorizationToken);
                unityWebRequest.SetRequestHeader("Accept", "application/xml");
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Debug.Log(unityWebRequest.error);
                    yield return null;
                }
    
                // Parse out the response text from the returned Xml
                string result = XElement.Parse(unityWebRequest.downloadHandler.text).Value;
                Results.instance.SetTranslatedResult(result);
            }
        }
    
  10. Unity に戻る前に、必ず Visual Studio で変更を保存してください。

第 8 章 – Unity シーンを構成する

  1. Unity エディターに戻り、Scripts フォルダーの Results クラスをクリックして、[階層] パネルの [メイン カメラ] オブジェクトにドラッグします。

  2. [メイン カメラ] をクリックして、[インスペクター] パネルを確認します。 新しく追加された Script コンポーネント内に、値が空のフィールドが 4 つ表示されます。 これらは、コード内のプロパティへの出力参照です。

  3. これらの 4 つのスロットに、下の図に示すように、[階層] パネルから適切な [テキスト] オブジェクトをドラッグします。

    指定した値を使用してターゲット参照を更新します。

  4. 次に、Scripts フォルダーの Translator クラスをクリックして、[階層] パネルの [メイン カメラ] オブジェクトにドラッグします。

  5. 次に、Scripts フォルダーの MicrophoneManager クラスをクリックして、[階層] パネルの [メイン カメラ] オブジェクトにドラッグします。

  6. 最後に、[メイン カメラ] をクリックして、[インスペクター] パネルを確認します。 ドラッグしたスクリプトに 2 つのドロップダウン ボックスがあり、それらを使用して言語を設定できることを確認できます。

    目的の翻訳言語が入力されていることを確認します。

第 9 章 – Mixed Reality でテストする

ここで、シーンが正しく実装されていることをテストする必要があります。

次のことを確認します。

  • 第 1 章で説明した設定がすべて正しく設定されている。
  • ResultsTranslatorMicrophoneManager の各スクリプトが [メイン カメラ] オブジェクトに関連付けられている。
  • Azure Translator Text API サービス キーが、Translator スクリプト内の authorizationKey 変数内に配置されている。
  • [インスペクター] パネル で [メイン カメラ] のすべてのフィールドが適切に割り当てられている。
  • シーンを実行するとマイクが動作する (動作しない場合は、接続されているマイクが "既定" のデバイスであり、Windows 内で正しく設定されていることを確認します)。

"Unity エディター" の [再生] ボタンを押すことで、イマーシブ ヘッドセットをテストできます。 アプリは、接続されているイマーシブ ヘッドセットを介して機能している必要があります。

警告

既定のオーディオ デバイスの変更について Unity コンソールにエラーが表示される場合は、シーンが想定どおりに機能しない可能性があります。 これは、ヘッドセットにマイクが内蔵されている場合の、Mixed Reality ポータルにおける内蔵マイクの取り扱いが原因です。 このエラーが表示された場合は、シーンを停止してからもう一度開始するだけで、期待どおりに動作するはずです。

第 10 章 – UWP ソリューションをビルドし、ローカル コンピューターにサイドロードする

このプロジェクトの Unity セクションに必要なすべての手順が完了したため、Unity からビルドを実行します。

  1. [ビルド設定] に移動します ([ファイル] > [ビルド設定...])。

  2. [Build Settings] (ビルド設定) ウィンドウで、[Build] (ビルド) をクリックします。

    Unity シーンをビルドします。

  3. [Unity C# プロジェクト] をオンにします (まだオンにしていない場合)。

  4. [ビルド] をクリックします。 Unity によって [エクスプローラー] ウィンドウが起動されます。そこで、アプリのビルド先のフォルダーを作成して選択する必要があります。 ここでそのフォルダーを作成して、「App」という名前を付けます。 次に、App フォルダーを選択した状態で、[フォルダーの選択] を押します。

  5. Unity で、App フォルダーに対してプロジェクトのビルドが開始されます。

  6. Unity によるビルドが完了すると (多少時間がかかる場合があります)、[エクスプローラー] ウィンドウが開いて、ビルドの場所が表示されます (必ずしも最前面に表示されるとは限らないため、タスク バーを確認してください。新しいウィンドウが追加されたことがわかります)。

第 11 章 – アプリケーションをデプロイする

アプリケーションをデプロイするには、以下の手順を実行します。

  1. 新しい Unity ビルド (App フォルダー) に移動し、Visual Studio でソリューション ファイルを開きます。

  2. [ソリューション構成] で、[デバッグ] を選択します。

  3. ソリューションプラットフォームで、x86ローカルマシンを選択します。

    Microsoft HoloLensの場合、これをリモートマシンに設定すると、コンピューターに接続されないようにする方が簡単な場合があります。 ただし、次のことも行う必要があります。

    • HoloLens の IP アドレス を把握します。これは 、[設定 > ] [ネットワーク] & [インターネット > ] Wi-Fi > [詳細オプション] にあります。IPv4 は、使用する必要があるアドレスです。
    • 開発者モードがオンになっていることを確認します「Settings > Update & Security > For developers」で確認できます。

    Visual Studio からソリューションをデプロイします。

  4. ビルドメニューに移り、ソリューションデプロイをクリックし、PCにアプリケーションをサイドロードします。

  5. インストールされたアプリの一覧にこのアプリが表示され、起動できる状態になります。

  6. 起動すると、マイクへのアクセスを認可するように求めるメッセージがアプリに表示されます。 [はい] ボタンをクリックします。

  7. これで翻訳を開始する準備ができました。

完成した Translation Text API アプリケーション

おめでとうございます。これで、Azure Translation Text API を利用して音声を翻訳されたテキストに変換する Mixed Reality アプリを構築できました。

最終製品。

ボーナス演習

演習 1

アプリにテキスト読み上げ機能を追加して、返されたテキストが読み上げられるようにできますか?

演習 2

ユーザーがアプリ自体の内部でソース言語と出力言語 ('from' と 'to') を変更でき、言語を変更するたびにアプリを再構築しなくても済むようにします。