HoloLens (第 1 世代) と Azure 312: ボットの統合

注意

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

このコースでは、Microsoft Bot Framework V4 を使用してボットを作成してデプロイし、Windows Mixed Realityします。

V4 Microsoft Bot Framework V4 は、拡張可能でスケーラブルなボット アプリケーションを構築するためのツールを開発者に提供するように設計された一連の API です。 詳細については、次のページMicrosoft Bot Framework V4 Gitリポジトリ を参照してください

このコースを完了すると、次のWindows Mixed Realityアプリケーションを構築できます。

  1. タップ ジェスチャ を使用して 、ユーザーの声をリッスンするボットを開始します。
  2. ユーザーが何かを言った場合、ボットは応答を提供しようとします。
  3. ボットの応答を、ボットの近くに配置されたテキストとして Unity シーンに表示します。

アプリケーションでは、結果を設計と統合する方法はユーザーが行う必要があります。 このコースは、Azure サービスと Unity プロジェクトを統合する方法を説明するように設計されています。 Mixed Reality アプリケーションを強化するには、このコースで得た知識を使用する必要があります。

デバイス サポート

コース HoloLens イマーシブ ヘッドセット
MR と Azure 312:ボットの統合 ✔️ ✔️

注意

このコースでは主にHoloLensに焦点を当てながら、このコースで学習した情報をイマーシブ (VR) ヘッドセットWindows Mixed Realityに適用できます。 イマーシブ (VR) ヘッドセットにはアクセス可能なカメラが搭載されていないので、PC に接続された外部カメラが必要です。 コースに従って、イマーシブ (VR) ヘッドセットをサポートするために採用する必要がある変更に関するメモが表示されます。

前提条件

注意

このチュートリアルは、Unity と C# の基本的な経験を持つ開発者向けです。 また、このドキュメント内の前提条件と記述された手順は、執筆時点 (2018 年 7 月) にテストおよび検証された結果を表している点にも注意してください。 ツールのインストールに関する記事に記載されている最新のソフトウェアを自由に使用できます。しかし、このコースの情報が、以下に示すよりも新しいソフトウェアで見つかった情報と完全に一致するとは見なされません。

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

開始する前に

  1. このプロジェクトのビルドで問題が発生しないようにするには、このチュートリアルで説明したプロジェクトをルート フォルダーまたはルートに近いフォルダーに作成してください (長いフォルダー パスを使用すると、ビルド時に問題が発生する可能性があります)。
  2. アプリケーションを設定してテストHoloLens。 サポートが必要な場合は、HoloLensセットアップに関する記事HoloLensしてください
  3. 新しい HoloLens アプリの開発を開始するときに、調整とセンサーチューニングを実行するとよい場合があります (ユーザーごとにこれらのタスクを実行するのに役立つ場合があります)。

調整に関するヘルプについては、調整に関する記事のリンクHoloLensしてください

センサー のチューニングについては、センサー チューニングに関する記事のHoloLensリンクを参照してください

第 1 章 – ボット アプリケーションを作成する

最初の手順は、Core Web アプリケーションのローカル ASP.Net 作成します。 完了してテストしたら、Azure Portal に発行します。

  1. Visual Studio を開きます。 新しいプロジェクトを作成し、プロジェクトの種類として [ASP NET Core Web アプリケーション ] を選択し (サブセクション .NET Core の下に表示されます)、それを MyBot と 呼び出します[OK] をクリックします。

  2. 表示されるウィンドウで、[空] を 選択します。 また、ターゲットが ASP NET Core 2.0 に設定され、 [認証] が [認証なし] に 設定されている必要があります[OK] をクリックします。

    ボット アプリケーションを作成する

  3. これで、ソリューションが開きます。 [ソリューション] ウィンドウで [ソリューション Mybot] クリックソリューション エクスプローラーソリューションのパッケージの管理 NuGetをクリックします

    Bot アプリケーションを作成する

  4. [参照 ] タブ、Microsoft.Bot.Builder.Integration.AspNet.Core を検索します ([プレリリースを含める] チェック ボックス をオンにしてください )。 パッケージ バージョン 4.0.1-preview を選択し、プロジェクト ボックスをオンにします。 次に、 [インストール] を クリックします。 これで、v4 のバージョンに必要な ライブラリBot Frameworkしました。 [新しいNuGet閉じます。

    ボット アプリケーションを作成する

  5. プロジェクトの [MyBot] Project を右クリックしソリューション エクスプローラー クラスの 追加]をクリック | します

    Bot アプリケーションを作成する

  6. クラスに MyBot という名前を付け 、[ 追加] を クリックします

    ボット アプリケーションを作成する

  7. 前の点を繰り返して、ConversationContext という名前の別の クラスを作成します

  8. 次のページで wwwroot を右 クリックし ソリューション エクスプローラー[ 新しい項目の追加 ] | をクリックします。 [HTML ページ] を選択します (Web サブセクションの下に表示されます)。 ファイルに という名前 をdefault.htmします[追加] をクリックします。

    ボット アプリケーションを作成する

  9. 次の図に示す ソリューション エクスプローラークラス/ オブジェクトの一覧です。

    ボット アプリケーションを作成する

  10. ConversationContext クラスをダブルクリック します。 このクラスは、ボットが会話のコンテキストを維持するために使用する変数を保持する責任を負います。 アクティビティを受信するごとに MyBot クラスのインスタンスが更新されるので、これらの会話コンテキスト値はこのクラスのインスタンスに保持されます。 このクラスに次のコードを追加します。

    namespace MyBot
    {
        public static class ConversationContext
        {
            internal static string userName;
    
            internal static string userMsg;
        }
    }
    
  11. MyBot クラスをダブルクリック します。 このクラスは、顧客からの受信アクティビティによって呼び出されるハンドラーをホストします。 このクラスでは、ボットと顧客の間の会話を構築するために使用するコードを追加します。 前述のように、アクティビティを受信するごとに、このクラスのインスタンスが初期化されます。 このクラスに次のコードを追加します。

    using Microsoft.Bot;
    using Microsoft.Bot.Builder;
    using Microsoft.Bot.Schema;
    using System.Threading.Tasks;
    
    namespace MyBot
    {
        public class MyBot : IBot
        {       
            public async Task OnTurn(ITurnContext context)
            {
                ConversationContext.userMsg = context.Activity.Text;
    
                if (context.Activity.Type is ActivityTypes.Message)
                {
                    if (string.IsNullOrEmpty(ConversationContext.userName))
                    {
                        ConversationContext.userName = ConversationContext.userMsg;
                        await context.SendActivity($"Hello {ConversationContext.userName}. Looks like today it is going to rain. \nLuckily I have umbrellas and waterproof jackets to sell!");
                    }
                    else
                    {
                        if (ConversationContext.userMsg.Contains("how much"))
                        {
                            if (ConversationContext.userMsg.Contains("umbrella")) await context.SendActivity($"Umbrellas are $13.");
                            else if (ConversationContext.userMsg.Contains("jacket")) await context.SendActivity($"Waterproof jackets are $30.");
                            else await context.SendActivity($"Umbrellas are $13. \nWaterproof jackets are $30.");
                        }
                        else if (ConversationContext.userMsg.Contains("color") || ConversationContext.userMsg.Contains("colour"))
                        {
                            await context.SendActivity($"Umbrellas are black. \nWaterproof jackets are yellow.");
                        }
                        else
                        {
                            await context.SendActivity($"Sorry {ConversationContext.userName}. I did not understand the question");
                        }
                    }
                }
                else
                {
    
                    ConversationContext.userMsg = string.Empty;
                    ConversationContext.userName = string.Empty;
                    await context.SendActivity($"Welcome! \nI am the Weather Shop Bot \nWhat is your name?");
                }
    
            }
        }
    }
    
  12. Startup クラスを ダブルクリック します。 このクラスはボットを初期化します。 このクラスに次のコードを追加します。

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Bot.Builder.BotFramework;
    using Microsoft.Bot.Builder.Integration.AspNet.Core;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace MyBot
    {
    public class Startup
        {
            public IConfiguration Configuration { get; }
    
            public Startup(IHostingEnvironment env)
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
                Configuration = builder.Build();
            }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddSingleton(_ => Configuration);
                services.AddBot<MyBot>(options =>
                {
                    options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);
                });
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseDefaultFiles();
                app.UseStaticFiles();
                app.UseBotFramework();
            }
        }
    }
    
  13. Program クラス ファイルを 開き、その中のコードが次と同じことを確認します。

    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    
    namespace MyBot
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                BuildWebHost(args).Run();
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .Build();
        }
    }
    
  14. 変更を保存するには、ファイルの上部にあるツール バーから [すべて保存] > に移動Visual Studio。

第 2 章 - テンプレートを作成Azure Bot Service

ボットのコードをビルドしたので、それを Azure Portal 上の Web App Bot Service のインスタンスに発行する必要があります。 この章では、Azure でアプリケーションを作成して構成しBot Serviceコードを発行する方法について説明します。

  1. まず、Azure Portal ( にログインします https://portal.azure.com) 。

    1. Azure アカウントをまだ持ってない場合は、作成する必要があります。 このチュートリアルを教室またはラボの状況で行っている場合は、新しいアカウントの設定について、インストラクターまたはそのいずれかの対処を依頼してください。
  2. ログインしたら、左上隅にある [ リソースの作成 ] をクリックし、[ Web アプリボット] を検索して、 Enter キー を押します。

    Azure Bot Service を作成する

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

    Azure Bot Service を作成する

  4. [ 作成:

    1. このサービスインスタンスに必要な 名前 を挿入します。

    2. サブスクリプション を選択します。

    3. リソースグループを選択するか、新しい リソースグループ を作成します。 リソースグループは、Azure 資産のコレクションの課金を監視、制御する方法を提供します。 1つのプロジェクトに関連付けられているすべての Azure サービス (たとえば、これらのコースなど) を共通のリソースグループに保持することをお勧めします。

      Azure リソースグループの詳細については、こちらのリンクを参照 してください。

    4. リソースグループの場所を決定します (新しいリソースグループを作成している場合)。 この場所は、アプリケーションを実行するリージョンに配置するのが理想的です。 一部の Azure 資産は、特定のリージョンでのみ利用できます。

    5. 適切な 価格レベル を選択します。これが Web アプリボット サービスを初めて作成する場合は、free レベル (F0) をご利用いただけます。

    6. アプリ名Bot 名 と同じままにすることができます。

    7. Bot テンプレートBasic (C#) のままにしておきます。

    8. App service プラン/場所 は、アカウントに対して自動入力されている必要があります。

    9. Bot をホストするために使用する Azure Storage を設定します。 まだお持ちでない場合は、ここで作成できます。

    10. また、このサービスに適用されている使用条件を理解していることを確認する必要があります。

    11. [作成] をクリックします。

      Azure Bot Service を作成する

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

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

    Azure Bot Service を作成する

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

    Azure Bot Service を作成する

  8. 通知の [ リソースへのジャンプ ] ボタンをクリックして、新しいサービスインスタンスを探索します。 新しい Azure サービスインスタンスが表示されます。

    Azure Bot Service を作成する

  9. この時点で、クライアントアプリケーションがこのボットサービスと通信できるように、 ダイレクトライン と呼ばれる機能を設定する必要があります。 [ チャンネル] をクリックし、[ おすすめチャネルの追加 ] セクションで、[ ダイレクトラインチャネルの構成] をクリックします。

    Azure Bot Service を作成する

  10. このページでは、クライアントアプリが bot で認証できるようにする 秘密キー を見つけます。 [ 表示 ] ボタンをクリックし、表示されているキーの1つをコピーします。これは、プロジェクトの後半で必要になります。

    Azure Bot Service を作成する

第3章: Bot を Azure Web アプリボットサービスに発行する

サービスの準備ができたので、先ほどビルドした Bot コードを、新しく作成した Web アプリボットサービスに発行する必要があります。

注意

Bot ソリューション/コードに変更を加えるたびに、Bot を Azure サービスに発行する必要があります。

  1. 前に作成した Visual Studio ソリューションに戻ります。

  2. ソリューションエクスプローラーmybot プロジェクトを右クリックし、[発行] をクリックします。

    Bot を Azure Web アプリボットサービスに発行する

  3. [ 発行先の選択 ] ページで、 [App Service] をクリックし、[既存] を 選択 します。最後に、[ プロファイルの作成 ] をクリックします (表示されていない場合は、[ 発行 ] ボタンの横にあるドロップダウンの矢印をクリックする必要があります)。

    Bot を Azure Web アプリボットサービスに発行する

  4. Microsoft アカウントにまだログインしていない場合は、ここで実行する必要があります。

  5. [発行] ページでは、 Web アプリボット サービスの作成に使用したものと同じ サブスクリプション を設定する必要があることがわかります。 次に、 ビューリソースグループ として設定し、ドロップダウンフォルダー構造で、前に作成した リソースグループ を選択します。 [OK] をクリックします。

    Bot を Azure Web アプリボットサービスに発行する

  6. [ 発行 ] ボタンをクリックし、Bot が公開されるまで待ちます (数分かかる場合があります)。

    Bot を Azure Web アプリボットサービスに発行する

章 4-Unity プロジェクトを設定する

次に示すのは、mixed reality で開発するための一般的な設定です。そのため、他のプロジェクトに適したテンプレートです。

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

    Unity プロジェクトを設定する

  2. ここで、Unity プロジェクト名を指定する必要があります。 HoloLens Bot を挿入します。 プロジェクトテンプレートが 3d に設定されていることを確認します。 場所を適切な 場所 に設定します (ルートディレクトリの方が適していることに注意してください)。 次に、[ プロジェクトの作成] をクリックします。

    Unity プロジェクトを設定する

  3. Unity を開いている場合は、既定の スクリプトエディターVisual Studio に設定されていることを確認する必要があります。 [ > の設定の編集 ] に移動し、新しいウィンドウで [ 外部ツール] に移動します。 外部スクリプトエディターVisual Studio 2017 に変更します。 [ 基本設定 ] ウィンドウを閉じます。

    Unity プロジェクトを設定する

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

    Unity プロジェクトを設定する

  5. それでも ファイル > ビルド設定 し、次のことを確認してください。

    1. ターゲットデバイスHoloLens に設定されています

      イマーシブヘッドセットの場合は、 ターゲットデバイス任意のデバイス に設定します。

    2. ビルドの種類D3D に設定されています

    3. SDK は最新の インストール に設定されています

    4. Visual Studio バージョン が、インストールされている最新 バージョンに設定されています

    5. ビルドと実行ローカルコンピューター に設定されています

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

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

        Unity プロジェクトを設定する

      2. この新しいフォルダーを作成し、今後のシーンに加えて、[ 新しいフォルダー ] ボタンを選択します。新しいフォルダーを作成するには、名前を「 シーン」にします。

        Unity プロジェクトを設定する

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

        Unity プロジェクトを設定する

    7. それ以外の設定は、[ビルド設定] の [既定] のままにしておきます。

  6. [ビルド設定] ウィンドウで、[プレーヤー設定] ボタンをクリックします。これにより、インスペクター が配置されている領域の関連パネルが開きます。

    Unity プロジェクトを設定する

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

    1. [その他の設定] タブで次のようにします。

      1. Scripting Runtime のバージョン実験的 (NET 4.6 と同等) である必要があります。これを変更するには、エディターを再起動する必要があります。

      2. バックエンド.net である必要があります

      3. API 互換性レベル.net 4.6 である必要があります

        Unity プロジェクトを設定する

    2. [発行設定] タブの [機能] で、次のことを確認します。

      • InternetClient

      • マイク

        Unity プロジェクトを設定する

    3. パネルの下にある XR 設定([発行設定] の下にあります) で、[サポートされている仮想現実] をティックし、 Windows Mixed Reality SDK が追加されていることを確認します。

      Unity プロジェクトを設定する

  8. ビルドに戻る 設定 Unity C# プロジェクトはグレーで表示されなくなりました。このの横にあるチェックボックスをオンにします。

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

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

第5章–カメラの設定

重要

このコースの Unity セットアップ コンポーネントをスキップし、コードに直接進む場合は、 312 この unitypackageをダウンロードして、 カスタムパッケージとしてプロジェクトにインポートしてから、 第7章から続行することをお勧めします。

  1. [ 階層] パネル で、 メインカメラ を選択します。

  2. 選択すると、 メインカメラ のすべてのコンポーネントが [ インスペクター] パネル に表示されます。

    1. カメラオブジェクトメインカメラ という名前にする必要があります (スペルに注意してください)。
    2. メインカメラ タグmaincamera に設定する必要があります (スペルに注意してください)。
    3. 変換位置0、0、0 に設定されていることを確認します。
    4. クリアフラグ純色 に設定します。
    5. カメラコンポーネントの 背景 色を 黒、アルファ 0 (16 進コード: #00000000) に設定します。

    カメラの設定

Chapter 6 – Newtonsoft ライブラリをインポートする

受信して Bot サービスに送信されたオブジェクトを逆シリアル化およびシリアル化できるようにするには、 Newtonsoft ライブラリをダウンロードする必要があります。 互換性のあるバージョンが、適切な Unity フォルダー構造で既に構成されていることがわかります。

Newtonsoft ライブラリをプロジェクトにインポートするには、このコースに付属している Unity パッケージを使用します。

  1. [ アセット > インポートパッケージ の > カスタムパッケージ] メニューオプションを使用して、unitypackage を Unity に追加します。

    Newtonsoft ライブラリをインポートする

  2. ポップアップ表示された [ Unity パッケージのインポート ] ボックスで、 プラグイン (およびそれを含む) のすべてが選択されていることを確認します。

    Newtonsoft ライブラリをインポートする

  3. [ インポート ] ボタンをクリックして、プロジェクトに項目を追加します。

  4. プロジェクトビューの [プラグイン] の下にある newtonsoft フォルダーにアクセスし、newtonsoft プラグインを選択します。

  5. Newtonsoft プラグインを選択した状態で、 任意のプラットフォームオフ になっていることを確認し、[ wsaplayer ] も オフ になっていることを確認してから、[ 適用] をクリックします。 これは、ファイルが正しく構成されていることを確認するためのものです。

    注意

    これらのプラグインをマークすると、Unity エディターでのみ使用するように構成されます。 WSA フォルダーには、Unity からプロジェクトがエクスポートされた後に使用される、異なるセットがあります。

  6. 次に、 Newtonsoft フォルダー内の WSA フォルダーを開く必要があります。 先ほど構成したものと同じファイルのコピーが表示されます。 ファイルを選択し、インスペクターで次のことを確認します。

    • すべてのプラットフォームオフ になっています
    • wsaplayer のみが チェック されます
    • 処理 されないかどうかを 確認 します

第7章– BotTag を作成する

  1. BotTag という名前の新しい タグ オブジェクトを作成します。 シーンのメインカメラを選択します。 [インスペクター] パネルの [タグ] ドロップダウンメニューをクリックします。 [ タグの追加] をクリックします。

    カメラの設定

  2. シンボルをクリックし + ます。 新しい タグBotTag という名前を 付けて保存 します。

    カメラの設定

警告

メインカメラに BotTag を適用しない ください。 この操作を誤って行った場合は、メインカメラのタグを必ず Maincamera に戻してください。

Chapter 8 – BotObjects クラスを作成する

作成する必要のある最初のスクリプトは、 BotObjects クラスです。このクラスは、他の一連のクラスオブジェクトを同じスクリプト内に格納し、シーン内の他のスクリプトからアクセスできるようにするために作成された空のクラスです。

このクラスの作成は、純粋にアーキテクチャを選択したものです。これらのオブジェクトは、このコースの後半で作成する Bot スクリプトでホストすることができます。

このクラスを作成するには:

  1. Project パネル を右クリックし、[ > フォルダーの作成] をクリックします。 フォルダーに スクリプト の名前を指定します。

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

  2. [ Scripts ] フォルダーをダブルクリックして開きます。 次に、そのフォルダー内でを右クリックし、[ Create > C# Script] を選択します。 スクリプトに BotObjects という名前を指定します。

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

  4. スクリプトの内容を削除し、次のコードに置き換えます。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BotObjects : MonoBehaviour{}
    
    /// <summary>
    /// Object received when first opening a conversation
    /// </summary>
    [Serializable]
    public class ConversationObject
    {
        public string ConversationId;
        public string token;
        public string expires_in;
        public string streamUrl;
        public string referenceGrammarId;
    }
    
    /// <summary>
    /// Object including all Activities
    /// </summary>
    [Serializable]
    public class ActivitiesRootObject
    {
        public List<Activity> activities { get; set; }
        public string watermark { get; set; }
    }
    [Serializable]
    public class Conversation
    {
        public string id { get; set; }
    }
    [Serializable]
    public class From
    {
        public string id { get; set; }
        public string name { get; set; }
    }
    [Serializable]
    public class Activity
    {
        public string type { get; set; }
        public string channelId { get; set; }
        public Conversation conversation { get; set; }
        public string id { get; set; }
        public From from { get; set; }
        public string text { get; set; }
        public string textFormat { get; set; }
        public DateTime timestamp { get; set; }
        public string serviceUrl { get; set; }
    }
    
  5. Unity に戻る前に、 Visual Studio に変更を保存してください。

第9章: GazeInput クラスを作成する

次に作成するクラスは、 GazeInput クラスです。 このクラスの役割は次のとおりです。

  • プレーヤーの 宝石 を表すカーソルを作成する。
  • プレーヤーの見つめによってヒットしたオブジェクトを検出し、検出されたオブジェクトへの参照を保持します。

このクラスを作成するには:

  1. 前に作成した Scripts フォルダーにアクセスします。

  2. フォルダー内を右クリックし、[ Create > C# Script] をクリックします。 スクリプト GazeInput を呼び出します。

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

  4. クラス名の上に次の行を挿入します。

    /// <summary>
    /// Class responsible for the User's gaze interactions
    /// </summary>
    [System.Serializable]
    public class GazeInput : MonoBehaviour
    
  5. 次に、 Start () メソッドの上に、 GazeInput クラス内に次の変数を追加します。

        [Tooltip("Used to compare whether an object is to be interacted with.")]
        internal string InteractibleTag = "BotTag";
    
        /// <summary>
        /// Length of the gaze
        /// </summary>
        internal float GazeMaxDistance = 300;
    
        /// <summary>
        /// Object currently gazed
        /// </summary>
        internal GameObject FocusedObject { get; private set; }
    
        internal GameObject _oldFocusedObject { get; private set; }
    
        internal RaycastHit HitInfo { get; private set; }
    
        /// <summary>
        /// Cursor object visible in the scene
        /// </summary>
        internal GameObject Cursor { get; private set; }
    
        internal bool Hit { get; private set; }
    
        internal Vector3 Position { get; private set; }
    
        internal Vector3 Normal { get; private set; }
    
        private Vector3 _gazeOrigin;
    
        private Vector3 _gazeDirection;
    
  6. Start () メソッドのコードを追加する必要があります。 このは、クラスの初期化時に呼び出されます。

        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        internal virtual void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  7. 見つめカーソルをインスタンス化して設定するメソッドを実装します。

        /// <summary>
        /// Method to create a cursor object.
        /// </summary>
        internal GameObject CreateCursor()
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            newCursor.SetActive(false);
            // Remove the collider, so it does not block Raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
            newCursor.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
            Material mat = new Material(Shader.Find("Diffuse"));
            newCursor.GetComponent<MeshRenderer>().material = mat;
            mat.color = Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
            newCursor.SetActive(true);
    
            return newCursor;
        }
    
  8. メインカメラから Raycast を設定するメソッドを実装します。これにより、現在フォーカスがあるオブジェクトが追跡されます。

        /// <summary>
        /// Called every frame
        /// </summary>
        internal virtual void Update()
        {
            _gazeOrigin = Camera.main.transform.position;
    
            _gazeDirection = Camera.main.transform.forward;
    
            UpdateRaycast();
        }
    
    
        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        private void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                if (_oldFocusedObject.CompareTag(InteractibleTag))
                {
                    // Provide the OnGazeExited event.
                    _oldFocusedObject.SendMessage("OnGazeExited", 
                        SendMessageOptions.DontRequireReceiver);
                }
            }
        }
    
    
        private void UpdateRaycast()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedObject;
            RaycastHit hitInfo;
    
            // Initialize Raycasting.
            Hit = Physics.Raycast(_gazeOrigin,
                _gazeDirection,
                out hitInfo,
                GazeMaxDistance);
            HitInfo = hitInfo;
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                Position = hitInfo.point;
                Normal = hitInfo.normal;
    
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedObject = hitInfo.collider.gameObject;
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedObject = null;
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedObject = null;
    
                // Provide default position for cursor.
                Position = _gazeOrigin + (_gazeDirection * GazeMaxDistance);
    
                // Provide a default normal.
                Normal = _gazeDirection;
            }
    
            // Lerp the cursor to the given position, which helps to stabilize the gaze.
            Cursor.transform.position = Vector3.Lerp(Cursor.transform.position, Position, 0.6f);
    
            // Check whether the previous focused object is this same. If so, reset the focused object.
            if (FocusedObject != _oldFocusedObject)
            {
                ResetFocusedObject();
                if (FocusedObject != null)
                {
                    if (FocusedObject.CompareTag(InteractibleTag))
                    {
                        // Provide the OnGazeEntered event.
                        FocusedObject.SendMessage("OnGazeEntered",
                            SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
        }
    
  9. Unity に戻る前に、 Visual Studio に変更を保存してください。

Chapter 10 – Bot クラスを作成する

ここで作成するスクリプトは Bot と呼ばれます。 これはアプリケーションのコアクラスであり、次のものが格納されます。

  • Web アプリボットの資格情報
  • ユーザーの音声コマンドを収集するメソッド
  • Web アプリボットとのメッセージ交換を開始するために必要なメソッド
  • Web アプリボットにメッセージを送信するために必要なメソッド

Bot サービスにメッセージを送信するために、 Sendmessagetobot () コルーチンはアクティビティを作成します。これは、bot Framework によってユーザーによって送信されたデータとして認識されるオブジェクトです。

このクラスを作成するには:

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

  2. Scripts フォルダー内を右クリックし、[ Create > C# Script] をクリックします。 スクリプト ボット にという名前を指定します。

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

  4. Bot クラスの上部で、次の名前空間を更新します。

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using UnityEngine;
    using UnityEngine.Networking;
    using UnityEngine.Windows.Speech;
    
  5. Bot クラス内で、次の変数を追加します。

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static Bot Instance;
    
        /// <summary>
        /// Material of the sphere representing the Bot in the scene
        /// </summary>
        internal Material botMaterial;
    
        /// <summary>
        /// Speech recognizer class reference, which will convert speech to text.
        /// </summary>
        private DictationRecognizer dictationRecognizer;
    
        /// <summary>
        /// Use this variable to identify the Bot Id
        /// Can be any value
        /// </summary>
        private string botId = "MRBotId";
    
        /// <summary>
        /// Use this variable to identify the Bot Name
        /// Can be any value
        /// </summary>
        private string botName = "MRBotName";
    
        /// <summary>
        /// The Bot Secret key found on the Web App Bot Service on the Azure Portal
        /// </summary>
        private string botSecret = "-- Add your Secret Key here --"; 
    
        /// <summary>
        /// Bot Endpoint, v4 Framework uses v3 endpoint at this point in time
        /// </summary>
        private string botEndpoint = "https://directline.botframework.com/v3/directline";
    
        /// <summary>
        /// The conversation object reference
        /// </summary>
        private ConversationObject conversation;
    
        /// <summary>
        /// Bot states to regulate the application flow
        /// </summary>
        internal enum BotState {ReadyToListen, Listening, Processing}
    
        /// <summary>
        /// Flag for the Bot state
        /// </summary>
        internal BotState botState;
    
        /// <summary>
        /// Flag for the conversation status
        /// </summary>
        internal bool conversationStarted = false;
    

    注意

    Bot シークレットキーbotSecret 変数に挿入していることを確認します。 Bot の秘密鍵 は、このコースの最初に、 第2章の手順 10 で説明しました。

  6. 起動可能な ()Start () のコードを追加する必要があります。

        /// <summary>
        /// Called on Initialization
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start()
        {
            botState = BotState.ReadyToListen;
        }
    
  7. 音声キャプチャの開始時と終了時に speech ライブラリによって呼び出される2つのハンドラーを追加します。 DictationRecognizer は、ユーザーが読み上げを停止したときに、ユーザーの音声のキャプチャを自動的に停止します。

        /// <summary>
        /// Start microphone capture.
        /// </summary>
        public void StartCapturingAudio()
        {
            botState = BotState.Listening;
            botMaterial.color = Color.red;
    
            // Start dictation
            dictationRecognizer = new DictationRecognizer();
            dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
            dictationRecognizer.Start();
        }
    
    
        /// <summary>
        /// Stop microphone capture.
        /// </summary>
        public void StopCapturingAudio()
        {
            botState = BotState.Processing;
            dictationRecognizer.Stop();
        }
    
    
  8. 次のハンドラーは、ユーザーの音声入力の結果を収集し、Web アプリボットサービスへのメッセージの送信を担当するコルーチンを呼び出します。

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// </summary>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // Update UI with dictation captured
            Debug.Log($"User just said: {text}");      
    
            // Send dictation to Bot
            StartCoroutine(SendMessageToBot(text, botId, botName, "message"));
            StopCapturingAudio();
        }     
    
  9. Bot とのメッセージ交換を開始するために、次のコルーチンが呼び出されます。 メッセージ交換の呼び出しが完了すると、Bot サービスに空のメッセージとしてアクティビティが送信されるように設定する一連のパラメーターを渡すことによって、 SendMessageToCoroutine () が呼び出されます。 これは、Bot サービスにダイアログを開始するように求めるメッセージを表示するために行われます。

        /// <summary>
        /// Request a conversation with the Bot Service
        /// </summary>
        internal IEnumerator StartConversation()
        {
            string conversationEndpoint = string.Format("{0}/conversations", botEndpoint);
    
            WWWForm webForm = new WWWForm();
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(conversationEndpoint, webForm))
            {
                unityWebRequest.SetRequestHeader("Authorization", "Bearer " + botSecret);
                unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
    
                yield return unityWebRequest.SendWebRequest();
                string jsonResponse = unityWebRequest.downloadHandler.text;
    
                conversation = new ConversationObject();
                conversation = JsonConvert.DeserializeObject<ConversationObject>(jsonResponse);
                Debug.Log($"Start Conversation - Id: {conversation.ConversationId}");
                conversationStarted = true; 
            }
    
            // The following call is necessary to create and inject an activity of type //"conversationUpdate" to request a first "introduction" from the Bot Service.
            StartCoroutine(SendMessageToBot("", botId, botName, "conversationUpdate"));
        }    
    
  10. Bot サービスに送信されるアクティビティをビルドするために、次のコルーチンが呼び出されます。

        /// <summary>
        /// Send the user message to the Bot Service in form of activity
        /// and call for a response
        /// </summary>
        private IEnumerator SendMessageToBot(string message, string fromId, string fromName, string activityType)
        {
            Debug.Log($"SendMessageCoroutine: {conversation.ConversationId}, message: {message} from Id: {fromId} from name: {fromName}");
    
            // Create a new activity here
            Activity activity = new Activity();
            activity.from = new From();
            activity.conversation = new Conversation();
            activity.from.id = fromId;
            activity.from.name = fromName;
            activity.text = message;
            activity.type = activityType;
            activity.channelId = "DirectLineChannelId";
            activity.conversation.id = conversation.ConversationId;     
    
            // Serialize the activity
            string json = JsonConvert.SerializeObject(activity);
    
            string sendActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId);
    
            // Send the activity to the Bot
            using (UnityWebRequest www = new UnityWebRequest(sendActivityEndpoint, "POST"))
            {
                www.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json));
    
                www.downloadHandler = new DownloadHandlerBuffer();
                www.SetRequestHeader("Authorization", "Bearer " + botSecret);
                www.SetRequestHeader("Content-Type", "application/json");
    
                yield return www.SendWebRequest();
    
                // extrapolate the response Id used to keep track of the conversation
                string jsonResponse = www.downloadHandler.text;
                string cleanedJsonResponse = jsonResponse.Replace("\r\n", string.Empty);
                string responseConvId = cleanedJsonResponse.Substring(10, 30);
    
                // Request a response from the Bot Service
                StartCoroutine(GetResponseFromBot(activity));
            }
        }
    
  11. 次のコサインを呼び出して、アクティビティを要求した後に応答を要求Bot Service。

        /// <summary>
        /// Request a response from the Bot by using a previously sent activity
        /// </summary>
        private IEnumerator GetResponseFromBot(Activity activity)
        {
            string getActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId);
    
            using (UnityWebRequest unityWebRequest1 = UnityWebRequest.Get(getActivityEndpoint))
            {
                unityWebRequest1.downloadHandler = new DownloadHandlerBuffer();
                unityWebRequest1.SetRequestHeader("Authorization", "Bearer " + botSecret);
    
                yield return unityWebRequest1.SendWebRequest();
    
                string jsonResponse = unityWebRequest1.downloadHandler.text;
    
                ActivitiesRootObject root = new ActivitiesRootObject();
                root = JsonConvert.DeserializeObject<ActivitiesRootObject>(jsonResponse);
    
                foreach (var act in root.activities)
                {
                    Debug.Log($"Bot Response: {act.text}");
                    SetBotResponseText(act.text);
                }
    
                botState = BotState.ReadyToListen;
                botMaterial.color = Color.blue;
            }
        } 
    
  12. このクラスに追加する最後のメソッドは、シーンにメッセージを表示するために必要です。

        /// <summary>
        /// Set the UI Response Text of the bot
        /// </summary>
        internal void SetBotResponseText(string responseString)
        {        
            SceneOrganiser.Instance.botResponseText.text =  responseString;
        }
    

    注意

    SceneOrganiser クラスの欠落に関するエラーが Unity エディター コンソールに表示される場合があります。 このクラスはチュートリアルの後半で作成しますので、このメッセージは無視してください。

  13. Unity に戻る前に、必 Visual Studio に変更を保存 してください

第 11 章 – 相互作用クラスを作成する

ここで作成するクラスは、"相互作用" と呼 ばれる名前です。 このクラスは、ユーザーからの [入力] HoloLensを検出するために使用されます。

ユーザーがシーン内の Bot オブジェクトを見ている間にタップし、ボットが音声入力をリッスンする準備ができている場合、Bot オブジェクトは色を赤に変更し、音声入力のリッスンを開始します。

このクラスは GazeInput クラスから継承されます。そのため、基本 の を使用して、そのクラスから Start() メソッドと変数を参照 できます

このクラスを作成するには:

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

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

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

  4. 名前空間とクラスの継承を 、Interactions クラスの上部にある次のように更新します。

    using UnityEngine.XR.WSA.Input;
    
    public class Interactions : GazeInput
    {
    
  5. Interactions クラス 内に 、次の変数を追加します。

        /// <summary>
        /// Allows input recognition with the HoloLens
        /// </summary>
        private GestureRecognizer _gestureRecognizer;
    
  6. 次に 、Start() メソッドを追加 します。

        /// <summary>
        /// Called on initialization, after Awake
        /// </summary>
        internal override void Start()
        {
            base.Start();
    
            //Register the application to recognize HoloLens user inputs
            _gestureRecognizer = new GestureRecognizer();
            _gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap);
            _gestureRecognizer.Tapped += GestureRecognizer_Tapped;
            _gestureRecognizer.StartCapturingGestures();
        }
    
  7. ユーザーがカメラの前でタップ ジェスチャを実行するときにトリガーされるハンドラーをHoloLensします

        /// <summary>
        /// Detects the User Tap Input
        /// </summary>
        private void GestureRecognizer_Tapped(TappedEventArgs obj)
        {
            // Ensure the bot is being gazed upon.
            if(base.FocusedObject != null)
            {
                // If the user is tapping on Bot and the Bot is ready to listen
                if (base.FocusedObject.name == "Bot" && Bot.Instance.botState == Bot.BotState.ReadyToListen)
                {
                    // If a conversation has not started yet, request one
                    if(Bot.Instance.conversationStarted)
                    {
                        Bot.Instance.SetBotResponseText("Listening...");
                        Bot.Instance.StartCapturingAudio();
                    }
                    else
                    {
                        Bot.Instance.SetBotResponseText("Requesting Conversation...");
                        StartCoroutine(Bot.Instance.StartConversation());
                    }                                  
                }
            }
        }
    
  8. Unity に戻る前に、必 Visual Studio に変更を保存 してください

第 12 章 – SceneOrganiser クラスを作成する

このラボで必要な最後のクラスは 、SceneOrganiser と呼ばれる名前です。 このクラスでは、コンポーネントとスクリプトをメイン カメラに追加し、シーン内に適切なオブジェクトを作成することで、シーンをプログラムで設定します。

このクラスを作成するには:

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

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

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

  4. SceneOrganiser クラス内に、次の変数を追加します。

        /// <summary>
        /// Static instance of this class
        /// </summary>
        public static SceneOrganiser Instance;
    
        /// <summary>
        /// The 3D text representing the Bot response
        /// </summary>
        internal TextMesh botResponseText;
    
  5. 次に 、Awake() メソッドと Start() メソッドを 追加します。

        /// <summary>
        /// Called on Initialization
        /// </summary>
        private void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start ()
        {
            // Add the GazeInput class to this object
            gameObject.AddComponent<GazeInput>();
    
            // Add the Interactions class to this object
            gameObject.AddComponent<Interactions>();
    
            // Create the Bot in the scene
            CreateBotInScene();
        }
    
  6. 次のメソッドを追加します。シーンで Bot オブジェクトを作成し、パラメーターとコンポーネントを設定します。

        /// <summary>
        /// Create the Sign In button object in the scene
        /// and sets its properties
        /// </summary>
        private void CreateBotInScene()
        {
            GameObject botObjInScene = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            botObjInScene.name = "Bot";
    
            // Add the Bot class to the Bot GameObject
            botObjInScene.AddComponent<Bot>();
    
            // Create the Bot UI
            botResponseText = CreateBotResponseText();
    
            // Set properties of Bot GameObject
            Bot.Instance.botMaterial = new Material(Shader.Find("Diffuse"));
            botObjInScene.GetComponent<Renderer>().material = Bot.Instance.botMaterial;
            Bot.Instance.botMaterial.color = Color.blue;
            botObjInScene.transform.position = new Vector3(0f, 2f, 10f);
            botObjInScene.tag = "BotTag";
        }
    
  7. 次のメソッドを追加します。シーン内に UI オブジェクトを作成し、ボットからの応答を表します。

        /// <summary>
        /// Spawns cursor for the Main Camera
        /// </summary>
        private TextMesh CreateBotResponseText()
        {
            // Create a sphere as new cursor
            GameObject textObject = new GameObject();
            textObject.transform.parent = Bot.Instance.transform;
            textObject.transform.localPosition = new Vector3(0,1,0);
    
            // Resize the new cursor
            textObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
    
            // Creating the text of the Label
            TextMesh textMesh = textObject.AddComponent<TextMesh>();
            textMesh.anchor = TextAnchor.MiddleCenter;
            textMesh.alignment = TextAlignment.Center;
            textMesh.fontSize = 50;
            textMesh.text = "Hi there, tap on me and I will start listening.";
    
            return textMesh;
        }
    
  8. Unity に戻る前に、必 Visual Studio に変更を保存 してください

  9. Unity エディターで 、SceneOrganiser スクリプトを Scripts フォルダーからメイン カメラにドラッグします。 次の図に示すように、Scene SceneEr コンポーネントがメイン カメラ オブジェクトに表示されます。

    アプリケーションを作成Azure Bot Service

第 13 章 – 構築前

アプリケーションの完全なテストを実行するには、アプリケーションをアプリケーションにサイドロードする必要HoloLens。 実行する前に、次のことを確認してください。

  • 第 4 章に記載されている 設定はすべて 正しく設定されています。
  • スクリプト SceneOrganiser は 、Main Camera オブジェクトにアタッチ されます。
  • Bot クラス **、botSecret** 変数に Bot Secret Key が挿入されている必要があります。

第 14 章 – ビルドとサイドロードを行HoloLens

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

  1. [Build 設定]、> Build 設定... に移動します

  2. [ビルド]ウィンドウで設定 をクリック します

    Unity からアプリを構築する

  3. まだ行ってない場合は 、[Unity C# プロジェクト] をオンにしてください

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

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

  6. Unity のビルドが完了すると (時間がかかる場合があります)、ビルドの場所に エクスプローラー ウィンドウが開きます (常にウィンドウの上に表示されるとは限りないが、新しいウィンドウの追加を通知するタスク バーを確認します)。

第 15 章 – デプロイしてHoloLens

次の方法でHoloLens。

  1. アプリケーションの IP アドレス (リモートデプロイの場合HoloLens)、アプリケーションが開発者モードHoloLensを 確認する必要があります。 これを行うには、次の手順を実行します。

    1. お使HoloLensしている間に、を開 設定。
    2. [Network & Internet > Wi-Fi > の詳細オプション] に移動します
    3. IPv4 アドレスをメモ します。
    4. 次に、 に戻 り、 設定 に戻り、 [Update & Security > For Developers]に移動します。
    5. [開発者モード] を [オン] に設定します。
  2. 新しい Unity ビルド (App フォルダー) に移動し、 を使用してソリューション ファイル Visual Studio。

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

  4. ソリューション プラットフォーム **、x86 、リモート マシン** を 選択します

    アプリケーションからソリューションをデプロイVisual Studio。

  5. [ビルド]メニューに移動し、 [ソリューションの配置] をクリックして、アプリケーションをアプリケーションにサイドロードHoloLens。

  6. これで、アプリがアプリにインストールされているアプリの一覧に表示され、HoloLens準備が整いました。

    注意

    イマーシブ ヘッドセットにデプロイするには、[ソリューションプラットフォーム] を [ローカルコンピューター] に設定し、[構成] を [デバッグ] に設定し 、x86 をプラットフォーム として設定 します。 次に、[ビルド] メニューの [ソリューションの配置] を 選択して、 ローカル コンピューター にデプロイします

第 16 章 – アプリケーションをアプリケーションで使用HoloLens

  • アプリケーションを起動すると、目の前に青い球としてボットが表示されます。

  • 会話を 開始するには 、タップ ジェスチャを使用して球を見ながら操作します。

  • 会話が開始するまで待ちます (メッセージが発生すると UI にメッセージが表示されます)。 ボットから入門メッセージを受け取った後、ボットを再度タップして赤に変え、音声のリッスンを開始します。

  • 会話を停止すると、アプリケーションからボットにメッセージが送信され、UI に表示される応答が表示されます。

  • プロセスを繰り返して、ボットにさらにメッセージを送信します (メッセージを送信するごとにタップする必要があります)。

この会話では、ボットが情報 (自分の名前) を保持しながら、既知の情報 (在庫のある項目など) を提供する方法を示します。

ボットに質問する必要がある質問:

what do you sell? 

how much are umbrellas?

how much are raincoats?

完成した Web アプリ ボット (v4) アプリケーション

おめでとうございます。Azure Web App Bot を活用する Mixed Reality アプリを v4 Microsoft Bot Frameworkしました。

最終製品

ボーナス演習

演習 1

このラボの会話構造は非常に基本的です。 Microsoft LUIS を使用して、ボットに自然言語の理解機能を提供します。

演習 2

この例には、会話の終了と新しいメッセージの再起動は含まれます。 ボット機能を完了するには、会話のクロージャを実装してみてください。