HoloLens (1-го поколения) и Azure 312: интеграция ботов

Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, в ходе работы с которыми будет показано, как разрабатываться для HoloLens 2. Это уведомление будет обновлено со ссылкой на эти учебники при их публикации.

В этом курсе вы узнаете, как создать и развернуть бот с помощью Microsoft Bot Framework версии 4 и взаимодействовать с ним с помощью приложения Windows Mixed Reality.

Screenshot that shows communication through a Windows Mixed Reality application.

Microsoft Bot Framework версии 4 — это набор ИНТЕРФЕЙСов API, предназначенных для предоставления разработчикам инструментов для создания расширяемого и масштабируемого приложения бота. Дополнительные сведения см. на странице Microsoft Bot Framework или репозитории Git версии 4.

После прохождения этого курса вы создайте приложение Windows Mixed Reality, которое сможет выполнять следующие действия:

  1. Используйте жест касания , чтобы запустить бот, прослушивающий голос пользователей.
  2. Когда пользователь произнес что-то, бот попытается предоставить ответ.
  3. Отображение ответа ботов в виде текста, расположенного рядом с ботом, в сцене Unity.

В приложении вы узнаете, как интегрировать результаты с проектом. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Это ваша работа, чтобы использовать знания, полученные от этого курса, для улучшения приложения смешанной реальности.

Поддержка устройств

Курс HoloLens Иммерсивные гарнитуры
312. Смешанная реальность и Azure: интеграция ботов ✔️ ✔️

Примечание

Хотя этот курс в основном посвящен HoloLens, вы также можете применить то, что вы узнаете в этом курсе, чтобы Windows Mixed Reality иммерсивные гарнитуры (VR). Так как иммерсивные гарнитуры (VR) не имеют доступных камер, вам потребуется внешняя камера, подключенная к компьютеру. При выполнении курса вы увидите примечания о любых изменениях, которые могут потребоваться для поддержки иммерсивных гарнитур (VR).

Предварительные требования

Примечание

Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, помните, что предварительные требования и письменные инструкции в этом документе представляют то, что было проверено и проверено на момент написания статьи (июль 2018 г.). Вы можете использовать последнее программное обеспечение, как указано в статье об установке средств , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.

Для этого курса рекомендуется использовать следующее оборудование и программное обеспечение:

Перед началом работы

  1. Чтобы избежать проблем со сборкой этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызывать проблемы во время сборки).
  2. Настройте и проверьте HoloLens. Если вам нужна поддержка настройки HoloLens, обязательно посетите статью о настройке HoloLens.
  3. Рекомендуется выполнять калибровку и настройку датчиков при разработке нового приложения HoloLens (иногда это может помочь выполнить эти задачи для каждого пользователя).

Дополнительные сведения о калибровке см. по этой ссылке в статье HoloLens калибровки.

Для получения справки по настройке датчика перейдите по этой ссылке на статью о настройке датчика HoloLens.

Глава 1. Создание приложения Бота

Первым шагом является создание бота в качестве локального веб-приложения ASP.Net Core. Завершив и протестив его, вы опубликуете его на портале Azure.

  1. Запустите Visual Studio. Создайте проект, выберите веб-приложение ASP NET Core в качестве типа проекта (его можно найти в подразделе .NET Core) и вызовите MyBot. Нажмите кнопку OK.

  2. В окне, которое появится, выберите "Пустой". Также убедитесь, что целевой объект имеет значение ASP NET Core 2.0 , а для проверки подлинности задано значение "Нет проверки подлинности". Нажмите кнопку ОК.

    Screenshot that shows the New A S P dot N E T Core Web Application window.

  3. Теперь решение откроется. Щелкните правой кнопкой мыши решение Mybot в Обозреватель решений и выберите пункт "Управление пакетами NuGet для решения".

    Screenshot that shows the opened solution with 'MyBot' and 'Manage NuGet Packages for Solution' highlighted.

  4. На вкладке "Обзор " найдите Microsoft.Bot.Builder.Integration.AspNet.Core (убедитесь, что установлен флажок " Включить предварительную версию "). Выберите пакет версии 4.0.1-preview и установите флажки проекта. Затем нажмите кнопку "Установить". Теперь вы установили библиотеки, необходимые для Bot Framework версии 4. Закройте страницу NuGet.

    Screenshot that shows the Nu-Get Solution manager.

  5. Щелкните правой кнопкой мыши ProjectMyBot в Обозреватель решений и выберите команду "Добавить|класс".

    Screenshot that shows the process to add a new class to MyBot.

  6. Назовите класс MyBot и нажмите кнопку "Добавить".

    Screenshot that shows the new class creation 'MyBot'.

  7. Повторите предыдущую точку, чтобы создать другой класс с именем ConversationContext.

  8. Щелкните правой кнопкой мыши wwwroot в Обозреватель решений и выберите команду "Добавить|новый элемент". Выберите HTML-страницу (она будет находиться в разделе "Веб-сайт"). Присвойт файлу имяdefault.html. Нажмите кнопку Добавить.

    Screenshot that shows the creation of a new H T M L page from within the Solution Explorer window.

  9. Список классов и объектов в Обозреватель решений должен выглядеть так, как показано на рисунке ниже.

    Screenshot of the Solution Explorer window with list of classes.

  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. Создание Служба Bot Azure

Теперь, когда вы создали код для бота, необходимо опубликовать его в экземпляре службы бота веб-приложений на портале Azure. В этой главе показано, как создать и настроить Служба Bot в Azure, а затем опубликовать в нем код.

  1. Сначала войдите на портал Azure (https://portal.azure.com).

    1. Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы следите за этим руководством в учебной или лабораторной ситуации, попросите преподавателя или одного из прокторов помочь в настройке новой учетной записи.
  2. После входа щелкните " Создать ресурс " в левом верхнем углу и найдите бот веб-приложения и нажмите клавишу ВВОД.

    Screenshot of the Microsoft Azure dashboard with 'Create a resource' highlighted in the upper left.

  3. Новая страница предоставит описание службы бота веб-приложений . В левом нижнем углу этой страницы нажмите кнопку "Создать ", чтобы создать связь с этой службой.

    Screenshot of the Web App Bot page and the 'Create' button in the bottom left.

  4. После нажатия кнопки "Создать":

    1. Вставьте нужное имя для этого экземпляра службы.

    2. Выберите подписку.

    3. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется сохранить все службы Azure, связанные с одним проектом (например, эти курсы) в общей группе ресурсов.

      Если вы хотите узнать больше о группах ресурсов Azure, перейдите по этой ссылке.

    4. Определите расположение для группы ресурсов (если вы создаете новую группу ресурсов). В идеале расположение будет находиться в регионе, где будет выполняться приложение. Некоторые ресурсы Azure доступны только в определенных регионах.

    5. Выберите ценовую категорию , соответствующую вам, если это первый раз при создании службы бота веб-приложений , вам должен быть доступен уровень "Бесплатный" (с именем F0).

    6. Имя приложения можно просто оставить так же, как имя бота.

    7. Оставьте шаблон ботабазовым (C#).

    8. План или расположение службы приложений должны быть автоматически заполнены для вашей учетной записи.

    9. Задайте служба хранилища Azure, которые вы хотите использовать для размещения бота. Если у вас ее еще нет, ее можно создать здесь.

    10. Кроме того, необходимо подтвердить, что вы поняли условия, применяемые к этой службе.

    11. Щелкните Создать.

      Screenshot that shows the required fields needed to create the new Service.

  5. После нажатия кнопки "Создать" вам придется подождать, пока служба будет создана, это может занять минуту.

  6. После создания экземпляра службы на портале появится уведомление.

    Screenshot that shows the notification icon highlighted after the Service instance is created.

  7. Щелкните уведомление, чтобы изучить новый экземпляр службы.

    Screenshot that shows deployment succeeded and the 'Go to resources' button.

  8. Нажмите кнопку "Перейти к ресурсу " в уведомлении, чтобы изучить новый экземпляр службы. Вы перейдете в новый экземпляр службы Azure.

    Screenshot of the Resources windows after clicking the 'Go to resources' button in the previous window.

  9. На этом этапе необходимо настроить функцию с именем Direct Line, чтобы разрешить клиентскому приложению взаимодействовать с этим Служба Bot. Щелкните "Каналы", а затем в разделе "Добавление рекомендуемого канала" щелкните "Настроить канал Direct Line".

    Screenshot that shows the Configure Direct Line channel highlighted in MyHoloLensBot.

  10. На этой странице вы найдете секретные ключи , позволяющие клиентскому приложению проходить проверку подлинности с помощью бота. Нажмите кнопку "Показать " и скопируйте один из отображаемых ключей, так как это потребуется позже в проекте.

    Screenshot of the secret keys highlighted in MyHoloLensBot Configure Direct Line channel.

Глава 3. Публикация бота в веб-приложении Azure Служба Bot

Теперь, когда служба готова, необходимо опубликовать код бота, созданный ранее, в только что созданное веб-приложение Служба Bot.

Примечание

Вам придется публиковать бота в службе Azure каждый раз, когда вы вносите изменения в решение или код бота.

  1. Назад в созданное ранее решение Visual Studio.

  2. Щелкните правой кнопкой мыши проект MyBot в Обозреватель решений и выберите команду "Опубликовать".

    Screenshot that shows the 'MyBot' project drop down menu after a right-click.

  3. На странице выбора целевой страницы публикации нажмите кнопку Служба приложений, а затем выберите "Существующий", а затем щелкните "Создать профиль" (может потребоваться щелкнуть стрелку раскрывающегося списка рядом с кнопкой "Опубликовать", если она не видна).

    Screenshot that shows the Pick a publish target page with 'App Service', 'Select Existing', and 'Create Profile' highlighted.

  4. Если вы еще не вошли в учетную запись Майкрософт, это необходимо сделать здесь.

  5. На странице публикации необходимо задать ту же подписку , которая использовалась для создания службы бота веб-приложений . Затем задайте представление как группу ресурсов и в раскрывающемся списке структуры папок выберите созданную ранее группу ресурсов . Нажмите кнопку ОК.

    Screenshot that shows the App Service window with the same Subscription used for the Web App Bot Service creation selected.

  6. Теперь нажмите кнопку "Опубликовать " и дождитесь публикации бота (это может занять несколько минут).

    Screenshot that shows the Publish window with Publish button.

Глава 4. Настройка проекта Unity

Ниже приведен типичный шаблон для разработки с смешанной реальностью, и, как таковой, является хорошим шаблоном для других проектов.

  1. Откройте Unity и нажмите кнопку "Создать".

    Screenshot that shows the Unity Projects window with the 'New' project icon highlighted in the upper right.

  2. Теперь необходимо указать имя проекта Unity. Вставьте бот HoloLens. Убедитесь, что для шаблона проекта задано значение 3D. Задайте расположение в нужном месте (помните, что ближе к корневым каталогам лучше). Затем нажмите кнопку "Создать проект".

    Screenshot that shows the new Unity Project name field highlighted.

  3. При открытии Unity стоит проверить, что редактор скриптов по умолчанию имеет значение Visual Studio. Перейдите в раздел "Изменение > параметров ", а затем в новом окне перейдите к внешним средствам. Измените редактор внешних скриптов на Visual Studio 2017. Закройте окно "Настройки ".

    Screenshot that shows the Unity Preferences window with the required settings.

  4. Затем перейдите к Параметры сборки файлов > и выберите универсальная платформа Windows, а затем нажмите кнопку "Переключить платформу", чтобы применить выбранный фрагмент.

    Screenshot that shows the Build Settings window with the 'Switch Platform' button highlighted.

  5. Оставаясь в Параметры сборки файлов > и убедитесь, что:

    1. Целевое устройство имеет значение HoloLens

      Для иммерсивных гарнитур задайте для целевого устройствалюбое устройство.

    2. Тип сборки имеет значение D3D

    3. Для пакета SDK установлено последнее установленное значение

    4. Visual Studio версия установлена последняя

    5. Для сборки и запуска задано значение "Локальный компьютер"

    6. Сохраните сцену и добавьте ее в сборку.

      1. Для этого выберите "Добавить открытые сцены". Откроется окно сохранения.

        Screenshot that shows the Build Settings window with the 'Add Open Scenes' button highlighted.

      2. Создайте новую папку для этой папки, а также любую будущую сцену, а затем нажмите кнопку "Создать папку ", чтобы создать новую папку, присвойте ей имя "Сцены".

        Screenshot that shows the creation of a new 'Scenes' folder.

      3. Откройте созданную папку "Сцены ", а затем в текстовом поле "Имя файла" введите BotScene и нажмите кнопку "Сохранить".

        Screenshot of the Scenes folder and the newly created file being saved.

    7. Остальные параметры в разделе "Сборка Параметры" должны быть оставлены как значения по умолчанию.

  6. В окне "Сборка Параметры" нажмите кнопку "Проигрыватель Параметры", откроется связанная панель в пространстве, где находится инспектор.

    Screenshot that shows the Build Settings window in the Inspector tab.

  7. На этой панели необходимо проверить несколько параметров:

    1. На вкладке "Другие Параметры":

      1. Версия среды выполнения сценариев должна быть экспериментальной (эквивалент NET 4.6); Для изменения этого параметра потребуется перезапустить редактор.

      2. Серверная часть скриптов должна быть .NET

      3. Уровень совместимости API должен быть .NET 4.6

        Screenshot that shows the Other Settings tab with the required settings.

    2. На вкладке "Публикация Параметры" в разделе "Возможности" проверьте:

      • InternetClient;

      • Микрофон

        Screenshot that shows 'InternetClient' and 'Microphone' enabled in the Publishing Settings tab.

    3. Далее вниз по панели в XR Параметры (см. раздел "Публикация Параметры"), установите флажок "Поддержка виртуальной реальности", убедитесь, что пакет SDK для Windows Mixed Reality добавлен.

      Screenshot that shows Virtual Reality Supported enabled and Windows Mixed Reality S D K added.

  8. Снова в сборке ПараметрыUnity C# Projects больше не выделено серым цветом. Установите флажок рядом с ним.

  9. Закройте окно Build Settings (Параметры сборки).

  10. Сохраните сцену и проект (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Глава 5. Настройка Камера

Важно!

Если вы хотите пропустить компонент настройки Unity этого курса и продолжить прямо в коде, вы можете скачать этот пакет Azure-MR-312-Package.unitypackage, импортировать его в проект как пользовательский пакет, а затем перейти к главе 7.

  1. На панели "Иерархия" выберите main Камера.

  2. После выбора вы сможете просмотреть все компоненты главной Камера на панели инспектора.

    1. Объект Камера должен называться Main Камера (обратите внимание на орфографию).
    2. Для тега Main Камера необходимо задать значение MainCamera (обратите внимание на орфографию)
    3. Убедитесь, что для позиции преобразования задано значение 0, 0, 0
    4. Присвойте флагамсплошной цвет.
    5. Задайте цвет фона компонента Камера черным, альфа-0 (шестнадцатеричный код: #000000000)

    Screenshot that shows all the components of the Main Camera in the Inspector panel.

Глава 6. Импорт библиотеки Newtonsoft

Для десериализации и сериализации объектов, полученных и отправленных в Служба Bot необходимо скачать библиотеку Newtonsoft. Здесь вы найдете совместимую версию, упорядоченную с правильной структурой папок Unity.

Чтобы импортировать библиотеку Newtonsoft в проект, используйте пакет Unity, который входит в этот курс.

  1. Добавьте пакет unitypackage в Unity с помощью пункта меню "Импортнастраиваемого пакета>для импортаресурсов>".

    Screenshot that shows the Assets drop down menu with 'Import Package' then 'Custom Package' selected.

  2. Во всплывающем окне импорта пакета Unity убедитесь, что выбраны все элементы в разделе (и в том числе) подключаемых модулей .

    Screenshot of the Import Unity Package popup box with'Plugins' selected.

  3. Нажмите кнопку "Импорт" , чтобы добавить элементы в проект.

  4. Перейдите в папку Newtonsoft в разделе "Подключаемые модули " в представлении проекта и выберите подключаемый модуль Newtonsoft.

    Screenshot that shows the Newtonsoft folder in the project view.

  5. Если выбран подключаемый модуль Newtonsoft, убедитесь, что снят флажок Any Platform, а затем убедитесь, что WSAPlayer также снят, а затем нажмите кнопку "Применить". Это просто для подтверждения правильности настройки файлов.

    Screenshot that shows the correct selections for the Newtonsoft plugin.

    Примечание

    Пометка этих подключаемых модулей настраивает их только в редакторе Unity. В папке WSA есть другой набор, который будет использоваться после экспорта проекта из Unity.

  6. Затем необходимо открыть папку WSA в папке Newtonsoft . Вы увидите копию того же файла, который вы только что настроили. Выберите файл, а затем в инспекторе убедитесь, что

    • Снят флажок"Любая платформа"
    • УстановлентолькоWSAPlayer
    • Проверкапроцесса Dont

    Screenshot that shows the correct selections for the Newtonsoft plugin in the WSA folder.

Глава 7. Создание BotTag

  1. Создайте объект Tag с именем BotTag. Выберите главную Камера в сцене. Щелкните раскрывающееся меню тега на панели инспектора. Нажмите кнопку "Добавить тег".

    Screenshot of the Main Camera Tag drop down menu in the Inspector panel with 'Add Tag' highlighted.

  2. + Щелкните символ. Присвойте новому тегу имя BotTag, save.

    Screenshot of the Inspector panel with the new BotTag name, plus symbol, and Save button.

Предупреждение

Не применяйтеBotTag к главному Камера. Если вы случайно сделали это, обязательно измените тег Main Камера обратно на MainCamera.

Глава 8. Создание класса BotObjects

Первый скрипт, который необходимо создать, — это класс BotObjects , который является пустым классом, который создан таким образом, чтобы ряд других объектов класса можно было хранить в одном и том же скрипте и обращаться к другим скриптам в сцене.

Создание этого класса является исключительно архитектурным выбором, эти объекты можно разместить в скрипте Бота, который вы создадите позже в этом курсе.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Щелкните правой кнопкой мыши на панели Project и создайте > папку. Назовите папку Scripts.

    Create scripts folder.

  2. Дважды щелкните папку "Скрипты ", чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите "Создать > C# скрипт". Назовите скрипт 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. Щелкните правой кнопкой мыши в папке и создайте > скрипт C#. Вызовите скрипт GazeInput.

  3. Дважды щелкните новый скрипт GazeInput, чтобы открыть его с помощью Visual Studio.

  4. Вставьте следующую строку справа в начало имени класса:

    /// <summary>
    /// Class responsible for the User's gaze interactions
    /// </summary>
    [System.Serializable]
    public class GazeInput : MonoBehaviour
    
  5. Затем добавьте следующие переменные в класс GazeInput над методом Start():

        [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 из Main Камера и отслеживать текущий объект с фокусом.

        /// <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.

Глава 10. Создание класса Bot

Скрипт, который вы собираетесь создать, называется Bot. Это основной класс приложения, в котором хранится следующее:

  • Учетные данные бота веб-приложения
  • Метод, который собирает голосовые команды пользователя.
  • Метод, необходимый для запуска бесед с ботом веб-приложения.
  • Метод, необходимый для отправки сообщений боту веб-приложения

Для отправки сообщений в Служба Bot сопрограмма SendMessageToBot() создаст действие, которое является объектом, распознаваемым Bot Framework как данные, отправленные пользователем.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку "Скрипты ", чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке "Скрипты" и выберите команду "Создать > скрипт C#". Назовите бот скрипта.

  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;
    

    Примечание

    Вставьте секретный ключ бота в переменную botSecret . Вы записали секретный ключ бота в начале этого курса в главе 2, шаг 10.

  6. Теперь необходимо добавить код для Awake() и Start( ).

        /// <summary>
        /// Called on Initialization
        /// </summary>
        void Awake()
        {
            Instance = this;
        }
    
        /// <summary>
        /// Called immediately after Awake method
        /// </summary>
        void Start()
        {
            botState = BotState.ReadyToListen;
        }
    
  7. Добавьте два обработчика, которые вызываются библиотеками речи при начале и завершении записи голоса. ДиктовкаRecognizer автоматически перестанет записывать голос пользователя, когда пользователь перестает говорить.

        /// <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. Следующий обработчик собирает результат голосового ввода пользователя и вызывает сопрограмму, отвечая за отправку сообщения в веб-приложение Служба Bot.

        /// <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. Для начала беседы с ботом вызывается следующая сопрограмма. Вы заметите, что после завершения вызова беседы он будет вызывать SendMessageToCoroutine(), передав ряд параметров, которые задают действие для отправки в Служба Bot как пустое сообщение. Это делается для запроса Служба 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.

        /// <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;
        }
    

    Примечание

    В консоли редактора Unity может появить сообщение об ошибке об отсутствующих класса SceneOrganiser . Игнорируйте это сообщение, так как вы создадите этот класс далее в этом руководстве.

  13. Прежде чем вернуться в Unity, обязательно сохраните изменения в Visual Studio.

Глава 11. Создание класса Interactions

Класс, который вы собираетесь создать, теперь называется Взаимодействием. Этот класс используется для обнаружения HoloLens касания ввода от пользователя.

Если пользователь касается объекта Bot в сцене, а бот готов прослушивать голосовые входные данные, объект Bot изменит цвет на красный и начнет прослушивать голосовые данные.

Этот класс наследуется от класса GazeInput , поэтому он может ссылаться на метод и переменные Start() от этого класса, обозначаемые использованием базового класса.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку "Скрипты ", чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке "Скрипты" и выберите команду "Создать > скрипт 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. Этот класс настроит сцену программным способом, добавив компоненты и скрипты в main Камера и создав соответствующие объекты в сцене.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку "Скрипты ", чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке "Скрипты" и выберите команду "Создать > скрипт 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. Добавьте следующий метод, отвечающий за создание объекта пользовательского интерфейса в сцене, представляющего ответы бота:

        /// <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 в основной Камера. Теперь компонент организатора сцены должен отображаться на объекте Main Камера, как показано на рисунке ниже.

    Screenshot that shows the Scene Organiser script being added to the Main Camera object in the Unity Editor.

Глава 13 . Перед построением

Чтобы выполнить тщательный тест приложения, необходимо загрузить его на HoloLens. Перед выполнением убедитесь, что:

  • Все параметры, упомянутые в главе 4 , заданы правильно.
  • Скрипт SceneOrganiser присоединяется к объекту Main Камера.
  • В классе Bot убедитесь, что вы вставили секретный ключ бота в переменную botSecret .

Глава 14. Сборка и загрузка неопубликованных приложений в HoloLens

Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.

  1. Перейдите к разделу "Сборка Параметры", "Сборка файлов>" Параметры....

  2. В окне "Сборка Параметры" нажмите кнопку "Сборка".

    Building the app from Unity

  3. Если это еще не так, установите флажок Unity C# Projects.

  4. Щелкните Построить. Unity запустит окно проводник, в котором необходимо создать и выбрать папку для сборки приложения. Создайте папку и назовите ее приложением. Затем, выбрав папку приложения , щелкните " Выбрать папку".

  5. Unity начнет создание проекта в папку приложения .

  6. После завершения сборки Unity (может потребоваться некоторое время), откроется окно проводник в расположении сборки (проверьте панель задач, так как она может не всегда отображаться над окнами, но уведомит вас о добавлении нового окна).

Глава 15. Развертывание в HoloLens

Чтобы выполнить развертывание на HoloLens, выполните приведенные далее действия.

  1. Вам потребуется IP-адрес HoloLens (для удаленного развертывания) и убедиться, что HoloLens находится в режиме разработчика. Для этого:

    1. В то время как носить ваш HoloLens, откройте Параметры.
    2. Переход к интернет & - > Wi-Fi > дополнительных параметров
    3. Обратите внимание на IPv4-адрес .
    4. Затем вернитесь к Параметры, а затем перейдите к обновлению & системы безопасности > для разработчиков.
    5. Установите режим разработчика включено.
  2. Перейдите к новой сборке Unity (папке приложения) и откройте файл решения с Visual Studio.

  3. В разделе "Конфигурация решения " выберите "Отладка".

  4. На платформе решения выберите x86, удаленный компьютер.

    Deploy the solution from Visual Studio.

  5. Перейдите в меню "Сборка" и щелкните "Развернуть решение", чтобы загрузить неопубликованное приложение в HoloLens.

  6. Теперь приложение должно отображаться в списке установленных приложений на HoloLens, готовых к запуску!

    Примечание

    Чтобы развернуть в иммерсивной гарнитуре, установите платформу решения на локальный компьютер и задайте для конфигурацииотладку с архитектурой x86 в качестве платформы. Затем разверните на локальном компьютере с помощью меню "Сборка" и выберите "Развернуть решение".

Глава 16. Использование приложения на HoloLens

  • После запуска приложения вы увидите бот как синюю сферу перед вами.

  • Используйте жест касания , пока вы просматриваете сферу, чтобы инициировать беседу.

  • Дождитесь начала беседы (в пользовательском интерфейсе по завершении будет отображаться сообщение). Получив вводное сообщение от бота, снова коснитесь бота, чтобы он станет красным и начнет прослушивать голос.

  • Когда вы перестанете говорить, приложение отправит сообщение боту, и вы быстро получите ответ, который будет отображаться в пользовательском интерфейсе.

  • Повторите процесс, чтобы отправить больше сообщений боту (каждый раз, когда вы хотите sen сообщение).

В этом разговоре показано, как бот может хранить информацию (ваше имя), а также предоставлять известные сведения (например, элементы, которые запасаются).

Некоторые вопросы, которые нужно задать боту:

what do you sell? 

how much are umbrellas?

how much are raincoats?

Готовое приложение бота веб-приложения (версия 4)

Поздравляем, вы создали приложение смешанной реальности, которое использует бот веб-приложения Azure Microsoft Bot Framework версии 4.

Final Product

Дополнительные упражнения

Упражнение 1.

Структура бесед в этой лаборатории очень простая. Используйте Microsoft LUIS, чтобы предоставить боту возможности распознавания естественного языка.

Упражнение 2

Этот пример не включает прекращение диалога и перезапуск нового. Чтобы сделать функцию бота завершенной, попробуйте реализовать закрытие беседы.