Поделиться через


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

Примечание.

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

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

Снимок экрана, на котором показан обмен данными с помощью приложения Windows Смешанная реальность.

Microsoft Bot Framework версии 4 — это набор API, предназначенный для предоставления разработчикам средств для создания расширяемого и масштабируемого приложения бота. Дополнительные сведения см. на странице Microsoft Bot Framework или репозитории Git версии 4.

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

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

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

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

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

Примечание.

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: окно нового веб-приложения S P точка N E T Core.

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

    Снимок экрана: открытое решение с выделенным параметром MyBot и

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

    Снимок экрана: диспетчер решений Nu-Get.

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

    Снимок экрана: процесс добавления нового класса в MyBot.

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

    Снимок экрана: создание нового класса MyBot.

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

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

    Снимок экрана: создание новой страницы H T M L в окне Обозреватель решений.

  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

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

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

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

    Снимок экрана: панель мониторинга Microsoft Azure с выделенным элементом

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

    Снимок экрана: страница

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

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

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

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

      Дополнительные сведения о группах ресурсов Azure см. по этой ссылке.

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

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: значок уведомления, выделенный после создания экземпляра службы.

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

    Снимок экрана: успешное развертывание и кнопка

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

    Снимок экрана: окна ресурсов после нажатия кнопки

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

    Снимок экрана: канал

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

    Снимок экрана: ключи секрета, выделенные в канале MyHoloLensBot Configure Direct Line.

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

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

Примечание.

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

  1. Вернитесь к созданному ранее решению Visual Studio.

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

    Снимок экрана: раскрывающееся меню проекта MyBot после щелчка правой кнопкой мыши.

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

    Снимок экрана: страница выбора целевой страницы публикации с выделенными разделами

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

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

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

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

    Снимок экрана: окно публикации с кнопкой

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

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

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

    Снимок экрана: окно

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

    Снимок экрана: выделено новое поле имени проекта Unity.

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

    Снимок экрана: окно

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

    Снимок экрана: окно

  5. Хотя все еще в параметрах сборки файлов > и убедитесь, что:

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

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

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

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

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

    5. Для сборки и запуска задано значение Local Machine

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

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

        Снимок экрана: окно

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

        Снимок экрана: создание новой папки

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

        Снимок экрана: папка

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

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

    Снимок экрана: окно

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

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

      1. Версия среды выполнения сценариев должна быть экспериментальной (ЭКВИВАЛЕНТНАЯ NET 4.6). Для этого потребуется перезапуск редактора.

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

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

        Снимок экрана: вкладка

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

      • InternetClient;

      • Микрофон

        Снимок экрана:

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

      Снимок экрана: включена поддержка виртуальной реальности и добавлена Смешанная реальность S D K Windows.

  8. Вернувшись в параметры сборки проектов C# Unity, больше не отображается серым цветом. Установите флажок рядом с этим.

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

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

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

Внимание

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

  1. На панели иерархии выберите основную камеру.

  2. После выбора вы увидите все компоненты основной камеры на панели инспектора.

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

    Снимок экрана: все компоненты основной камеры на панели инспектора.

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

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

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

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

    Снимок экрана: раскрывающееся меню

  2. В появившемся окне "Импорт пакета Unity" убедитесь, что выбраны все подключаемые модули (и в том числе).

    Снимок экрана: всплывающее окно

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

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

    Снимок экрана: папка Newtonsoft в представлении проекта.

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

    Снимок экрана: правильные выборки для подключаемого модуля Newtonsoft.

    Примечание.

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

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

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

    Снимок экрана: правильные выборы для подключаемого модуля Newtonsoft в папке WSA.

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

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

    Снимок экрана: раскрывающееся меню тега основной камеры на панели инспектора с выделенной кнопкой

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

    Снимок экрана: панель инспектора с новым именем BotTag, а также символом и кнопкой

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

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

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

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

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

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

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

    Создайте папку скриптов.

  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. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

Глава 9. Создание класса GazeInput

Следующий класс, который вы собираетесь создать, — это класс GazeInput . Этот класс отвечает за:

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

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

  1. Перейдите в папку "Скрипты", созданную ранее.

  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. Необходимо добавить метод Code for 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. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

Глава 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. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

Глава 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. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

Глава 12. Создание класса SceneOrganiser

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

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

  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. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

  9. В редакторе Unity перетащите скрипт SceneOrganiser из папки "Скрипты" в главную камеру. Теперь компонент организатора сцены должен отображаться на объекте Main Camera, как показано на рисунке ниже.

    Снимок экрана: скрипт организатора сцены, добавляемый в объект Main Camera в редакторе Unity.

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

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

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

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

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

  1. Перейдите к параметрам сборки, параметрам сборки файлов>....

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

    Создание приложения из Unity

  3. Если это еще не так, обратитесь к проектам C# Unity.

  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, удаленный компьютер.

    Разверните решение из Visual Studio.

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

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

    Примечание.

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

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

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

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

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

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

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

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

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

what do you sell? 

how much are umbrellas?

how much are raincoats?

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

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

Окончательный продукт

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

Упражнение 1

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

Упражнение 2

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