Observação

Os tutoriais do Mixed Reality Academy foram projetados com o HoloLens (1ª geração) e os headsets imersivos de realidade misturada em mente.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses dispositivos.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Esses tutoriais não serão atualizados com os conjuntos de ferramentas mais recentes nem com as interações usadas para o HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis.They will be maintained to continue working on the supported devices. Haverá uma nova série de tutoriais que serão publicados no futuro, que demonstrarão como desenvolver para o HoloLens 2.There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. Esse aviso será atualizado com um link para esses tutoriais quando eles forem postados.This notice will be updated with a link to those tutorials when they are posted.


Sr e Azure 303: LUIS (reconhecimento de linguagem natural)MR and Azure 303: Natural language understanding (LUIS)

Neste curso, você aprenderá a integrar o Reconhecimento vocal a um aplicativo de realidade misturada usando os serviços cognitivas do Azure, com o API de Reconhecimento Vocal.In this course, you will learn how to integrate Language Understanding into a mixed reality application using Azure Cognitive Services, with the Language Understanding API.

Resultado do laboratório

O reconhecimento vocal (Luis) é um serviço Microsoft Azure, que fornece aos aplicativos a capacidade de fazer o significado da entrada do usuário, como por meio da extração do que uma pessoa pode querer, em suas próprias palavras.Language Understanding (LUIS) is a Microsoft Azure service, which provides applications with the ability to make meaning out of user input, such as through extracting what a person might want, in their own words. Isso é obtido por meio do aprendizado de máquina, que compreende e aprende as informações de entrada e, em seguida, pode responder com informações detalhadas e relevantes.This is achieved through machine learning, which understands and learns the input information, and then can reply with detailed, relevant, information. Para obter mais informações, visite a página reconhecimento vocal do Azure (Luis).For more information, visit the Azure Language Understanding (LUIS) page.

Após concluir este curso, você terá um aplicativo de headset de imersão de realidade misturada que poderá fazer o seguinte:Having completed this course, you will have a mixed reality immersive headset application which will be able to do the following:

  1. Capture a fala de entrada do usuário, usando o microfone anexado ao headset de imersão.Capture user input speech, using the Microphone attached to the immersive headset.
  2. Enviar o ditado capturado do serviço inteligente de reconhecimento vocal do Azure (Luis).Send the captured dictation the Azure Language Understanding Intelligent Service (LUIS).
  3. Faça com que o LUIS extra o significado das informações de envio, que serão analisadas, e a tentativa de determinar a intenção da solicitação do usuário será feita.Have LUIS extract meaning from the send information, which will be analyzed, and attempt to determine the intent of the user’s request will be made.

O desenvolvimento incluirá a criação de um aplicativo em que o usuário poderá usar voz e/ou olhar para alterar o tamanho e a cor dos objetos na cena.Development will include the creation of an app where the user will be able to use voice and/or gaze to change the size and the color of the objects in the scene. O uso de controladores de movimento não será abordado.The use of motion controllers will not be covered.

Em seu aplicativo, cabe a você como você integrará os resultados com seu design.In your application, it is up to you as to how you will integrate the results with your design. Este curso foi projetado para ensinar a você como integrar um serviço do Azure com seu projeto do Unity.This course is designed to teach you how to integrate an Azure Service with your Unity Project. É seu trabalho usar o conhecimento obtido deste curso para aprimorar seu aplicativo de realidade misturada.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Esteja preparado para treinar o LUIS várias vezes, que é abordado no capítulo 12.Be prepared to Train LUIS several times, which is covered in Chapter 12. Você obterá resultados melhores, mais vezes o LUIS foi treinado.You will get better results the more times LUIS has been trained.

Suporte a dispositivosDevice support

CursoCourse HoloLensHoloLens Headsets imersivosImmersive headsets
Sr e Azure 303: LUIS (reconhecimento de linguagem natural)MR and Azure 303: Natural language understanding (LUIS) ✔️✔️ ✔️✔️

Observação

Embora este curso se concentre principalmente em fones de ouvido (VR) de realidade mista do Windows, você também pode aplicar o que aprende neste curso ao Microsoft HoloLens.While this course primarily focuses on Windows Mixed Reality immersive (VR) headsets, you can also apply what you learn in this course to Microsoft HoloLens. Ao acompanhar o curso, você verá observações sobre as alterações que talvez precise empregar para dar suporte ao HoloLens.As you follow along with the course, you will see notes on any changes you might need to employ to support HoloLens. Ao usar o HoloLens, você pode notar um eco durante a captura de voz.When using HoloLens, you may notice some echo during voice capture.

{1>{2>Pré-requisitos<2}<1}Prerequisites

Observação

Este tutorial foi desenvolvido para desenvolvedores que têm experiência básica com o Unity C#e o.This tutorial is designed for developers who have basic experience with Unity and C#. Além disso, lembre-se de que os pré-requisitos e as instruções escritas neste documento representam o que foi testado e verificado no momento da gravação (maio de 2018).Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (May 2018). Você está livre para usar o software mais recente, conforme listado no artigo instalar as ferramentas , embora não seja recomendável que as informações neste curso irão se adequar perfeitamente ao que você encontrará em softwares mais recentes do que as listadas abaixo.You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you'll find in newer software than what's listed below.

Recomendamos o seguinte hardware e software para este curso:We recommend the following hardware and software for this course:

Antes de começarBefore you start

  1. Para evitar problemas de criação desse projeto, é altamente recomendável que você crie o projeto mencionado neste tutorial em uma pasta raiz ou quase raiz (caminhos de pasta longos podem causar problemas em tempo de compilação).To avoid encountering issues building this project, it is strongly suggested that you create the project mentioned in this tutorial in a root or near-root folder (long folder paths can cause issues at build-time).

  2. Para permitir que o computador habilite o ditado, acesse as configurações do Windows > privacidade > fala, digitando a tinta & digitar e pressione o botão ativar os serviços de fala e digitar sugestões.To allow your machine to enable Dictation, go to Windows Settings > Privacy > Speech, Inking & Typing and press on the button Turn On speech services and typing suggestions.

  3. O código neste tutorial permitirá que você registre a partir do conjunto de dispositivos do microfone padrão em seu computador.The code in this tutorial will allow you to record from the Default Microphone Device set on your machine. Verifique se o dispositivo de microfone padrão está definido como aquele que você deseja usar para capturar sua voz.Make sure the Default Microphone Device is set as the one you wish to use to capture your voice.

  4. Se o headset tiver um microfone interno, certifique-se de que a opção "quando eu utilizo meu Headset, mude para MIC do headset" esteja ativada nas configurações do portal da realidade misturada .If your headset has a built-in microphone, make sure the option “When I wear my headset, switch to headset mic” is turned on in the Mixed Reality Portal settings.

    Configurando o headset de imersão

Capítulo 1 – configurar o portal do AzureChapter 1 – Setup Azure Portal

Para usar o serviço de reconhecimento vocal no Azure, você precisará configurar uma instância do serviço a ser disponibilizada para seu aplicativo.To use the Language Understanding service in Azure, you will need to configure an instance of the service to be made available to your application.

  1. Faça logon no portal do Azure.Log in to the Azure Portal.

    Observação

    Se você ainda não tiver uma conta do Azure, será necessário criar uma.If you do not already have an Azure account, you will need to create one. Se você estiver seguindo este tutorial em uma situação de sala de aula ou laboratório, peça ao instrutor ou a uma das proctors para obter ajuda para configurar sua nova conta.If you are following this tutorial in a classroom or lab situation, ask your instructor or one of the proctors for help setting up your new account.

  2. Depois de fazer logon, clique em novo no canto superior esquerdo e procure reconhecimento vocale clique em Enter.Once you are logged in, click on New in the top left corner, and search for Language Understanding, and click Enter.

    Criar recurso LUIS

    Observação

    A palavra novo pode ter sido substituída por criar um recurso, em portais mais recentes.The word New may have been replaced with Create a resource, in newer portals.

  3. A nova página à direita fornecerá uma descrição do serviço Reconhecimento vocal.The new page to the right will provide a description of the Language Understanding service. Na parte inferior esquerda desta página, selecione o botão criar para criar uma instância desse serviço.At the bottom left of this page, select the Create button, to create an instance of this service.

    Criação de serviço LUIS-aviso legal

  4. Depois de clicar em criar:Once you have clicked on Create:

    1. Insira o nome desejado para esta instância de serviço.Insert your desired Name for this service instance.

    2. Selecione uma assinatura.Select a Subscription.

    3. Selecione o tipo de preço apropriado para você, se esta for a primeira vez que criar um serviço Luis, uma camada gratuita (chamada F0) deverá estar disponível para você.Select the Pricing Tier appropriate for you, if this is the first time creating a LUIS Service, a free tier (named F0) should be available to you. A alocação gratuita deve ser mais do que suficiente para este curso.The free allocation should be more than sufficient for this course.

    4. Escolha um grupo de recursos ou crie um novo.Choose a Resource Group or create a new one. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. É recomendável manter todos os serviços do Azure associados a um único projeto (por exemplo, esses cursos) em um grupo de recursos comum).It is recommended to keep all the Azure services associated with a single project (e.g. such as these courses) under a common resource group).

      Se você quiser ler mais sobre grupos de recursos do Azure, visite o artigo grupo de recursos.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. Determine o local do seu grupo de recursos (se você estiver criando um novo grupo de recursos).Determine the Location for your resource group (if you are creating a new Resource Group). O local ideal seria na região em que o aplicativo seria executado.The location would ideally be in the region where the application would run. Alguns ativos do Azure só estão disponíveis em determinadas regiões.Some Azure assets are only available in certain regions.

    6. Você também precisará confirmar que entendeu os termos e condições aplicados a esse serviço.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. Selecione Criar.Select Create.

      Criar serviço LUIS-entrada do usuário

  5. Depois de clicar em criar, você precisará aguardar até que o serviço seja criado, isso pode levar um minuto.Once you have clicked on Create, you will have to wait for the service to be created, this might take a minute.

  6. Uma notificação será exibida no portal assim que a instância do serviço for criada.A notification will appear in the portal once the Service instance is created.

    Nova imagem de notificação do Azure

  7. Clique na notificação para explorar sua nova instância de serviço.Click on the notification to explore your new Service instance.

    Notificação de criação de recursos bem-sucedida

  8. Clique no botão ir para recurso na notificação para explorar sua nova instância de serviço.Click the Go to resource button in the notification to explore your new Service instance. Você será levado à sua nova instância do serviço LUIS.You will be taken to your new LUIS service instance.

    Acessando chaves LUIS

  9. Neste tutorial, seu aplicativo precisará fazer chamadas para seu serviço, o que é feito por meio do uso da chave de assinatura do serviço.Within this tutorial, your application will need to make calls to your service, which is done through using your service’s Subscription Key.

  10. Na página início rápido , do serviço API do Luis , navegue até a primeira etapa, pegue as chavese clique em chaves (você também pode fazer isso clicando nas teclas de hiperlink azul, localizadas no menu de navegação serviços, indicado pelo ícone de chave).From the Quick start page, of your LUIS API service, navigate to the first step, Grab your keys, and click Keys (you can also achieve this by clicking the blue hyperlink Keys, located in the services navigation menu, denoted by the key icon). Isso revelará suas chavesde serviço.This will reveal your service Keys.

  11. Faça uma cópia de uma das chaves exibidas, pois você precisará dela posteriormente em seu projeto.Take a copy of one of the displayed keys, as you will need this later in your project.

  12. Na página serviço , clique em reconhecimento vocal portal para ser redirecionado para a página da Web que você usará para criar seu novo serviço, dentro do aplicativo Luis.In the Service page, click on Language Understanding Portal to be redirected to the webpage which you will use to create your new Service, within the LUIS App.

Capítulo 2 – o portal de Reconhecimento vocalChapter 2 – The Language Understanding Portal

Nesta seção, você aprenderá a criar um aplicativo LUIS no portal do LUIS.In this section you will learn how to make a LUIS App on the LUIS Portal.

Importante

Esteja ciente de que a configuração de entidades, intençõese declarações dentro deste capítulo é apenas a primeira etapa na criação do seu serviço Luis: você também precisará treinar novamente o serviço, várias vezes, para torná-lo mais preciso.Please be aware, that setting up the Entities, Intents, and Utterances within this chapter is only the first step in building your LUIS service: you will also need to retrain the service, several times, so to make it more accurate. O novo treinamento do seu serviço é abordado no último capítulo deste curso, portanto, certifique-se de concluí-lo.Retraining your service is covered in the last Chapter of this course, so ensure that you complete it.

  1. Ao atingir o portal de reconhecimento vocal, talvez seja necessário fazer logon, se você ainda não tiver, com as mesmas credenciais que o portal do Azure.Upon reaching the Language Understanding Portal, you may need to login, if you are not already, with the same credentials as your Azure portal.

    Página de logon do LUIS

  2. Se esta for a primeira vez que você usa o LUIS, você precisará rolar para baixo até a parte inferior da página de boas-vindas, para localizar e clicar no botão criar aplicativo Luis .If this is your first time using LUIS, you will need to scroll down to the bottom of the welcome page, to find and click on the Create LUIS app button.

    Página criar aplicativo LUIS

  3. Depois de conectado, clique em meus aplicativos (se você não estiver na seção no momento).Once logged in, click My apps (if you are not in that section currently). Em seguida, você pode clicar em criar novo aplicativo.You can then click on Create new app.

    LUIS-imagem de meus aplicativos

  4. Dê um nomeao seu aplicativo.Give your app a Name.

  5. Se seu aplicativo deve entender uma linguagem diferente do inglês, você deve alterar a cultura para o idioma apropriado.If your app is supposed to understand a language different from English, you should change the Culture to the appropriate language.

  6. Aqui você também pode adicionar uma Descrição do seu novo aplicativo Luis.Here you can also add a Description of your new LUIS app.

    LUIS-criar um novo aplicativo

  7. Depois de pressionar concluído, você vai inserir a página de compilação do seu novo aplicativo Luis .Once you press Done, you will enter the Build page of your new LUIS application.

  8. Há alguns conceitos importantes a serem compreendidos aqui:There are a few important concepts to understand here:

    • Intenção, representa o método que será chamado após uma consulta do usuário.Intent, represents the method that will be called following a query from the user. Uma intenção pode ter uma ou mais entidades.An INTENT may have one or more ENTITIES.
    • Entidade, é um componente da consulta que descreve as informações relevantes para a intenção.Entity, is a component of the query that describes information relevant to the INTENT.
    • Declarações, são exemplos de consultas fornecidas pelo desenvolvedor, que o Luis usará para se treinar.Utterances, are examples of queries provided by the developer, that LUIS will use to train itself.

Se esses conceitos não estiverem perfeitamente claros, não se preocupe, pois este curso os esclarecerá ainda mais neste capítulo.If these concepts are not perfectly clear, do not worry, as this course will clarify them further in this chapter.

Você começará criando as entidades necessárias para compilar este curso.You will begin by creating the Entities needed to build this course.

  1. No lado esquerdo da página, clique em entidadese, em seguida, clique em criar nova entidade.On the left side of the page, click on Entities, then click on Create new entity.

    Criar nova entidade

  2. Chame a nova corda entidade, defina seu tipo como simplese pressione concluído.Call the new Entity color, set its type to Simple, then press Done.

    Criar entidade-cor simples

  3. Repita esse processo para criar três (3) entidades mais simples chamadas:Repeat this process to create three (3) more Simple Entities named:

    • ampliarupsize
    • diminuirdownsize
    • alvotarget

O resultado deve ser semelhante à imagem abaixo:The result should look like the image below:

Resultado da criação de entidade

Neste ponto, você pode começar a criar tentativas.At this point you can begin creating Intents.

Aviso

Não exclua a tentativa nenhum .Do not delete the None intent.

  1. No lado esquerdo da página, clique em tentativase, em seguida, clique em criar nova tentativa.On the left side of the page, click on Intents, then click on Create new intent.

    Criar novas tentativas

  2. Chame a nova intenção ChangeObjectColor.Call the new Intent ChangeObjectColor.

    Importante

    Esse nome de intenção é usado no código posteriormente neste curso, para obter melhores resultados, use esse nome exatamente como fornecido.This Intent name is used within the code later in this course, so for best results, use this name exactly as provided.

Depois de confirmar o nome, você será direcionado para a página de tentativas.Once you confirm the name you will be directed to the Intents Page.

LUIS – página de intenções

Você observará que há uma caixa de texto solicitando que você digite 5 ou mais declaraçõesdiferentes.You will notice that there is a textbox asking you to type 5 or more different Utterances.

Observação

LUIS converte todas as declarações em minúsculas.LUIS converts all Utterances to lower case.

  1. Insira o seguinte expressão na caixa de texto superior (atualmente, com o tipo de texto cerca de 5 exemplos...Insert the following Utterance in the top textbox (currently with the text Type about 5 examples… ) e pressione Enter:), and press Enter:
The color of the cylinder must be red

Você notará que o novo expressão aparecerá em uma lista abaixo.You will notice that the new Utterance will appear in a list underneath.

Seguindo o mesmo processo, insira os seis (6) declarações a seguir:Following the same process, insert the following six (6) Utterances:

make the cube black

make the cylinder color white

change the sphere to red

change it to green

make this yellow

change the color of this object to blue

Para cada expressão que você criou, você deve identificar quais palavras devem ser usadas pelo LUIS como entidades.For each Utterance you have created, you must identify which words should be used by LUIS as Entities. Neste exemplo, você precisa rotular todas as cores como uma entidade de cor e toda a referência possível a um destino como uma entidade de destino .In this example you need to label all the colors as a color Entity, and all the possible reference to a target as a target Entity.

  1. Para fazer isso, tente clicar no cilindro de palavras na primeira expressão e selecionar destino.To do so, try clicking on the word cylinder in the first Utterance and select target.

    Identificar destinos de expressão

  2. Agora, clique na palavra vermelho na primeira expressão e selecione cor.Now click on the word red in the first Utterance and select color.

    Identificar entidades expressão

  3. Rotule a próxima linha também, onde o cubo deve ser um destinoe preto deve ser uma cor.Label the next line also, where cube should be a target, and black should be a color. Observe também o uso das palavras ' this ' , ' it ' e ' this Object ' , que estamos fornecendo, por isso também há tipos de destino não específicos disponíveis.Notice also the use of the words ‘this’, ‘it’, and ‘this object’, which we are providing, so to have non-specific target types available also.

  4. Repita o processo acima até que todos os declarações tenham as entidades rotuladas.Repeat the process above until all the Utterances have the Entities labelled. Consulte a imagem abaixo se precisar de ajuda.See the below image if you need help.

    Dica

    Ao selecionar palavras para rotulá-las como entidades:When selecting words to label them as entities:

    • Para palavras únicas, basta clicar nelas.For single words just click them.
    • Para um conjunto de duas ou mais palavras, clique no início e, em seguida, no final do conjunto.For a set of two or more words, click at the beginning and then at the end of the set.

    Observação

    Você pode usar o botão de alternância de exibição de tokens para alternar entre a exibição de entidades/tokens!You can use the Tokens View toggle button to switch between Entities / Tokens View!

  5. Os resultados devem ser mostrados nas imagens abaixo, mostrando a exibição de entidades/tokens:The results should be as seen in the images below, showing the Entities / Tokens View:

    Exibições & entidades de tokens

  6. Neste ponto, pressione o botão treinar na parte superior direita da página e aguarde até que o pequeno indicador de ida e volta fique verde.At this point press the Train button at the top-right of the page and wait for the small round indicator on it to turn green. Isso indica que o LUIS foi treinado com êxito para reconhecer essa intenção.This indicates that LUIS has been successfully trained to recognize this Intent.

    Treinar o LUIS

  7. Como um exercício para você, crie uma nova tentativa chamada ChangeObjectSize, usando as entidades target, upsizee diminuir.As an exercise for you, create a new Intent called ChangeObjectSize, using the Entities target, upsize, and downsize.

  8. Seguindo o mesmo processo que a intenção anterior, insira as oito (8) declarações a seguir para alterar o tamanho :Following the same process as the previous Intent, insert the following eight (8) Utterances for Size change:

    increase the dimensions of that
    
    reduce the size of this
    
    i want the sphere smaller
    
    make the cylinder bigger
    
    size down the sphere
    
    size up the cube
    
    decrease the size of that object
    
    increase the size of this object
    
  9. O resultado deve ser semelhante ao mostrado na imagem abaixo:The result should be like the one in the image below:

    Configurar os tokens/entidades do ChangeObjectSize

  10. Depois que as tentativas, ChangeObjectColor e ChangeObjectSizeforem criadas e treinadas, clique no botão publicar na parte superior da página.Once both Intents, ChangeObjectColor and ChangeObjectSize, have been created and trained, click on the PUBLISH button on top of the page.

    Publicar serviço LUIS

  11. Na página de publicação , você finalizará e publicará seu aplicativo Luis para que ele possa ser acessado pelo seu código.On the Publish page you will finalize and publish your LUIS App so that it can be accessed by your code.

    1. Defina a lista suspensa publicar como produção.Set the drop down Publish To as Production.

    2. Defina o fuso horário para seu fuso horário.Set the Timezone to your time zone.

    3. Marque a caixa incluir todas as pontuações de intenção prevista.Check the box Include all predicted intent scores.

    4. Clique em publicar no slot de produção.Click on Publish to Production Slot.

      Publicar configurações

  12. Na seção recursos e chaves:In the section Resources and Keys:

    1. Selecione a região que você definiu para a instância de serviço no portal do Azure.Select the region you set for service instance in the Azure Portal.
    2. Você observará um elemento Starter_Key abaixo, ignorará-o.You will notice a Starter_Key element below, ignore it.
    3. Clique em Adicionar chave e insira a chave que você obteve no portal do Azure quando você criou sua instância de serviço.Click on Add Key and insert the Key that you obtained in the Azure Portal when you created your Service instance. Se o Azure e o portal do LUIS estiverem conectados ao mesmo usuário, serão fornecidos menus suspensos para nome do locatário, nome da assinaturae a chave que você deseja usar (terá o mesmo nome fornecido anteriormente no portal do Azure.If your Azure and the LUIS portal are logged into the same user, you will be provided drop-down menus for Tenant name, Subscription Name, and the Key you wish to use (will have the same name as you provided previously in the Azure Portal.

    Importante

    Sob o ponto de extremidade, faça uma cópia do ponto de extremidade correspondente à chave que você inseriu, em breve, você o usará em seu código.Underneath Endpoint, take a copy of the endpoint corresponding to the Key you have inserted, you will soon use it in your code.

Capítulo 3 – configurar o projeto do UnityChapter 3 – Set up the Unity project

A seguir está uma configuração típica para o desenvolvimento com a realidade misturada e, como tal, é um bom modelo para outros projetos.The following is a typical set up for developing with the mixed reality, and as such, is a good template for other projects.

  1. Abra o Unity e clique em novo.Open Unity and click New.

    Inicie o novo projeto do Unity.

  2. Agora será necessário fornecer um nome de projeto de Unity, inserir MR_LUIS.You will now need to provide a Unity Project name, insert MR_LUIS. Verifique se o tipo de projeto está definido como 3D.Make sure the project type is set to 3D. Defina o local como algum lugar apropriado para você (Lembre-se de que, mais próximo de diretórios raiz é melhor).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Em seguida, clique em criar projeto.Then, click Create project.

    Forneça detalhes para o novo projeto do Unity.

  3. Com o Unity Open, vale a pena verificar se o Editor de script padrão está definido como Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Vá para editar preferências de > e, em seguida, na nova janela, navegue até Ferramentas externas.Go to Edit > Preferences and then from the new window, navigate to External Tools. Altere o Editor de script externo para o Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Feche a janela preferências .Close the Preferences window.

    Atualize a preferência do editor de script.

  4. Em seguida, vá para arquivo > configurações de Build e alterne a plataforma para plataforma universal do Windowsclicando no botão alternar plataforma .Next, go to File > Build Settings and switch the platform to Universal Windows Platform, by clicking on the Switch Platform button.

    Janela de configurações de compilação, alterne a plataforma para UWP.

  5. Vá para arquivo > configurações de compilação e verifique se:Go to File > Build Settings and make sure that:

    1. O dispositivo de destino está definido para qualquer dispositivoTarget Device is set to Any Device

      Para o Microsoft HoloLens, defina o dispositivo de destino como HoloLens.For the Microsoft HoloLens, set Target Device to HoloLens.

    2. O tipo de compilação está definido como D3DBuild Type is set to D3D

    3. O SDK está definido para o mais recente instaladoSDK is set to Latest installed

    4. A versão do Visual Studio está definida para o mais recente instaladoVisual Studio Version is set to Latest installed

    5. Compilar e executar é definido como computador localBuild and Run is set to Local Machine

    6. Salve a cena e adicione-a à compilação.Save the scene and add it to the build.

      1. Faça isso selecionando Adicionar abrir cenas.Do this by selecting Add Open Scenes. Uma janela salvar será exibida.A save window will appear.

        Clique no botão Adicionar cenas abertas

      2. Crie uma nova pasta para isso e qualquer cena futura, em seguida, selecione o botão nova pasta , para criar uma nova pasta, nomeie-a como cenas.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Criar nova pasta de scripts

      3. Abra sua pasta de cenas recém-criada e, no campo nome do arquivo:, digite MR_LuisScenee pressione salvar.Open your newly created Scenes folder, and then in the File name: text field, type MR_LuisScene, then press Save.

        Dê um nome à nova cena.

    7. As configurações restantes, em configurações de compilação, devem ser deixadas como padrão por enquanto.The remaining settings, in Build Settings, should be left as default for now.

  6. Na janela configurações de compilação , clique no botão configurações do Player , isso abrirá o painel relacionado no espaço onde o Inspetor está localizado.In the Build Settings window, click on the Player Settings button, this will open the related panel in the space where the Inspector is located.

    Abra as configurações do Player.

  7. Nesse painel, algumas configurações precisam ser verificadas:In this panel, a few settings need to be verified:

    1. Na guia outras configurações :In the Other Settings tab:

      1. A versão de tempo de execução de script deve ser estável (.net 3,5 equivalente).Scripting Runtime Version should be Stable (.NET 3.5 Equivalent).

      2. O back-end de script deve ser .netScripting Backend should be .NET

      3. O nível de compatibilidade da API deve ser .NET 4,6API Compatibility Level should be .NET 4.6

        Atualize outras configurações.

    2. Na guia configurações de publicação , em recursos, marque:Within the Publishing Settings tab, under Capabilities, check:

      1. InternetClientInternetClient

      2. PhoneMicrophone

        Atualizando configurações de publicação.

    3. Mais adiante no painel, em configurações de XR (encontradas abaixo de configurações de publicação), suporte à realidade virtualem escala, verifique se o SDK do Windows Mixed Reality foi adicionado.Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Atualize as configurações de X R.

  8. De volta às configurações de Build , os projetos do C# Unity não ficam mais esmaecidos; Marque a caixa de seleção ao lado deste.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Feche a janela configurações de compilação.Close the Build Settings window.

  10. Salve sua cena e projeto (arquivo > salvar cena/arquivo > salvar projeto).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capítulo 4 – criar a cenaChapter 4 – Create the scene

Importante

Se você quiser ignorar o componente de configuração do Unity deste curso e continuar diretamente no código, fique à vontade para baixar esse . unitypackage, importe-o para seu projeto como um pacote personalizadoe, em seguida, continue no capítulo 5.If you wish to skip the Unity Set up component of this course, and continue straight into code, feel free to download this .unitypackage, import it into your project as a Custom Package, and then continue from Chapter 5.

  1. Clique com o botão direito do mouse em uma área vazia do painel hierarquia, em objeto 3D, adicione um plano.Right-click in an empty area of the Hierarchy Panel, under 3D Object, add a Plane.

    Crie um plano.

  2. Lembre-se de que, ao clicar com o botão direito do mouse na hierarquia novamente para criar mais objetos, se você ainda tiver o último objeto selecionado, o objeto selecionado será o pai do novo objeto.Be aware that when you right-click within the Hierarchy again to create more objects, if you still have the last object selected, the selected object will be the parent of your new object. Evite clicar em um espaço vazio dentro da hierarquia e clicar com o botão direito do mouse.Avoid this left-clicking in an empty space within the Hierarchy, and then right-clicking.

  3. Repita o procedimento acima para adicionar os seguintes objetos:Repeat the above procedure to add the following objects:

    1. EsferaSphere
    2. TuboCylinder
    3. SimplesCube
    4. Texto 3D3D Text
  4. A hierarquia de cena resultante deve ser parecida com a da imagem abaixo:The resulting scene Hierarchy should be like the one in the image below:

    Configuração da hierarquia de cena.

  5. Clique com o botão esquerdo na câmera principal para selecioná-lo, examine o painel Inspetor . você verá o objeto Camera com todos os seus componentes.Left click on the Main Camera to select it, look at the Inspector Panel you will see the Camera object with all the its components.

  6. Clique no botão Adicionar componente localizado na parte inferior do painel Inspetor.Click on the Add Component button located at the very bottom of the Inspector Panel.

    Adicionar fonte de áudio

  7. Pesquise o componente chamado fonte de áudio, conforme mostrado acima.Search for the component called Audio Source, as shown above.

  8. Além disso, verifique se o componente de transformação da câmera principal está definido como (0, 0, 0). isso pode ser feito pressionando o ícone de engrenagem ao lado do componente de transformação da câmera e selecionando Redefinir.Also make sure that the Transform component of the Main Camera is set to (0,0,0), this can be done by pressing the Gear icon next to the Camera’s Transform component and selecting Reset. O componente de transformação deve ter a seguinte aparência:The Transform component should then look like:

    1. A posição é definida como 0, 0, 0.Position is set to 0, 0, 0.
    2. A rotação está definida como 0, 0, 0.Rotation is set to 0, 0, 0.

    Observação

    Para o Microsoft HoloLens, você também precisará alterar o seguinte, que fazem parte do componente da câmera , que está em sua câmera principal:For the Microsoft HoloLens, you will need to also change the following, which are part of the Camera component, which is on your Main Camera:

    • Limpar sinalizadores: Cor sólida.Clear Flags: Solid Color.
    • Plano de fundo ' Black, Alpha 0 ' – cor hexadecimal: #00000000.Background ‘Black, Alpha 0’ – Hex color: #00000000.
  9. Clique com o botão esquerdo do plano para selecioná-lo.Left click on the Plane to select it. No painel Inspetor , defina o componente transformação com os seguintes valores:In the Inspector Panel set the Transform component with the following values:

    Transformação- posiçãoTransform - Position
    W.x.y.X IarY ZZ
    00 -1-1 00
  10. Clique com o botão esquerdo do círculo para selecioná-lo.Left click on the Sphere to select it. No painel Inspetor , defina o componente transformação com os seguintes valores:In the Inspector Panel set the Transform component with the following values:

    Transformação- posiçãoTransform - Position
    W.x.y.X IarY ZZ
    22 11 22
  11. Clique com o botão esquerdo do cilindro para selecioná-lo.Left click on the Cylinder to select it. No painel Inspetor , defina o componente transformação com os seguintes valores:In the Inspector Panel set the Transform component with the following values:

    Transformação- posiçãoTransform - Position
    W.x.y.X IarY ZZ
    -2-2 11 22
  12. Clique com o botão esquerdo do cubo para selecioná-lo.Left click on the Cube to select it. No painel Inspetor , defina o componente transformação com os seguintes valores:In the Inspector Panel set the Transform component with the following values:

    Transformação- posiçãoTransform - Position | Transformação- rotaçãoTransform - Rotation
    W.x.y.X IarY ZZ | W.x.y.X IarY ZZ
    00 11 44 | 4545 4545 00
  13. Clique no botão esquerdo do novo objeto de texto para selecioná-lo.Left click on the New Text object to select it. No painel Inspetor , defina o componente transformação com os seguintes valores:In the Inspector Panel set the Transform component with the following values:

    Transformação- posiçãoTransform - Position | Transformar em escalaTransform - Scale
    W.x.y.X IarY ZZ | W.x.y.X IarY ZZ
    -2-2 66 99 | 0,10.1 0,10.1 0,10.1
  14. Altere o tamanho da fonte no componente de malha de texto para 50.Change Font Size in the Text Mesh component to 50.

  15. Altere o nome do objeto de malha de texto para texto de ditado.Change the name of the Text Mesh object to Dictation Text.

    Criar objeto de texto 3D

  16. A estrutura do painel de hierarquia agora deve ser assim:Your Hierarchy Panel structure should now look like this:

    malha de texto na exibição de cena

  17. A cena final deve ser parecida com a imagem abaixo:The final scene should look like the image below:

    A exibição de cena.

Capítulo 5 – criar a classe microphonemanagerChapter 5 – Create the MicrophoneManager class

O primeiro script que você pretende criar é a classe microphonemanager .The first Script you are going to create is the MicrophoneManager class. Depois disso, você criará o LuisManager, a classe de comportamentos e, por fim, a classe olhar (fique à vontade para criar todos eles agora, embora ele seja coberto à medida que você atingir cada capítulo).Following this, you will create the LuisManager, the Behaviours class, and lastly the Gaze class (feel free to create all these now, though it will be covered as you reach each Chapter).

A classe microphonemanager é responsável por:The MicrophoneManager class is responsible for:

  • Detectando o dispositivo de gravação conectado ao headset ou ao computador (o que for o padrão).Detecting the recording device attached to the headset or machine (whichever is the default one).
  • Capture o áudio (voz) e use o ditado para armazená-lo como uma cadeia de caracteres.Capture the audio (voice) and use dictation to store it as a string.
  • Depois que a voz for pausada, envie o ditado para a classe LuisManager .Once the voice has paused, submit the dictation to the LuisManager class.

Para criar esta classe:To create this class:

  1. Clique com o botão direito do mouse no painel Projeto, crie > pasta.Right-click in the Project Panel, Create > Folder. Chame os scriptsda pasta.Call the folder Scripts.

    Criar pasta de scripts.

  2. Com a pasta scripts criada, clique duas vezes nela para abrir.With the Scripts folder created, double click it, to open. Em seguida, dentro dessa pasta, clique com o botão direito do mouse em criar > C# script.Then, within that folder, right-click, Create > C# Script. Nomeie o script microphonemanager.Name the script MicrophoneManager.

  3. Clique duas vezes em microfonemanager para abri-lo com o Visual Studio.Double click on MicrophoneManager to open it with Visual Studio.

  4. Adicione os seguintes namespaces à parte superior do arquivo:Add the following namespaces to the top of the file:

        using UnityEngine;
        using UnityEngine.Windows.Speech;
    
  5. Em seguida, adicione as seguintes variáveis dentro da classe microphonemanager :Then add the following variables inside the MicrophoneManager class:

        public static MicrophoneManager instance; //help to access instance of this object
        private DictationRecognizer dictationRecognizer;  //Component converting speech to text
        public TextMesh dictationText; //a UI object used to debug dictation result
    
  6. O código para os métodos ativo () e Iniciar () agora precisa ser adicionado.Code for Awake() and Start() methods now needs to be added. Eles serão chamados quando a classe for inicializada:These will be called when the class initializes:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
        void Start()
        {
            if (Microphone.devices.Length > 0)
            {
                StartCapturingAudio();
                Debug.Log("Mic Detected");
            }
        }
    
  7. Agora você precisa do método que o aplicativo usa para iniciar e parar a captura de voz e passá-la para a classe LuisManager , que será criada em breve.Now you need the method that the App uses to start and stop the voice capture, and pass it to the LuisManager class, that you will build soon.

        /// <summary>
        /// Start microphone capture, by providing the microphone as a continual audio source (looping),
        /// then initialise the DictationRecognizer, which will capture spoken words
        /// </summary>
        public void StartCapturingAudio()
        {
            if (dictationRecognizer == null)
            {
                dictationRecognizer = new DictationRecognizer
                {
                    InitialSilenceTimeoutSeconds = 60,
                    AutoSilenceTimeoutSeconds = 5
                };
    
                dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
                dictationRecognizer.DictationError += DictationRecognizer_DictationError;
            }
            dictationRecognizer.Start();
            Debug.Log("Capturing Audio...");
        }
    
        /// <summary>
        /// Stop microphone capture
        /// </summary>
        public void StopCapturingAudio()
        {
            dictationRecognizer.Stop();
            Debug.Log("Stop Capturing Audio...");
        }
    
  8. Adicione um manipulador de ditado que será invocado quando a voz pausar.Add a Dictation Handler that will be invoked when the voice pauses. Esse método passará o texto do ditado para a classe LuisManager .This method will pass the dictation text to the LuisManager class.

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// This method will stop listening for audio, send a request to the LUIS service 
        /// and then start listening again.
        /// </summary>
        private void DictationRecognizer_DictationResult(string dictationCaptured, ConfidenceLevel confidence)
        {
            StopCapturingAudio();
            StartCoroutine(LuisManager.instance.SubmitRequestToLuis(dictationCaptured, StartCapturingAudio));
            Debug.Log("Dictation: " + dictationCaptured);
            dictationText.text = dictationCaptured;
        }
    
        private void DictationRecognizer_DictationError(string error, int hresult)
        {
            Debug.Log("Dictation exception: " + error);
        }
    

    Importante

    Exclua o método Update () , pois essa classe não o usará.Delete the Update() method since this class will not use it.

  9. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

    Observação

    Neste ponto, você observará um erro exibido no painel de console do editor do Unity.At this point you will notice an error appearing in the Unity Editor Console Panel. Isso ocorre porque o código faz referência à classe LuisManager , que você criará no próximo capítulo.This is because the code references the LuisManager class which you will create in the next Chapter.

Capítulo 6 – criar a classe LUISManagerChapter 6 – Create the LUISManager class

É hora de criar a classe LuisManager , que fará a chamada para o serviço Luis do Azure.It is time for you to create the LuisManager class, which will make the call to the Azure LUIS service.

A finalidade dessa classe é receber o texto do ditado da classe microphonemanager e enviá-lo para o API de reconhecimento vocal do Azure a ser analisado.The purpose of this class is to receive the dictation text from the MicrophoneManager class and send it to the Azure Language Understanding API to be analyzed.

Essa classe desserializará a resposta JSON e chamará os métodos apropriados da classe de comportamentos para disparar uma ação.This class will deserialize the JSON response and call the appropriate methods of the Behaviours class to trigger an action.

Para criar esta classe:To create this class:

  1. Clique duas vezes na pasta scripts para abri-la.Double click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > C# script.Right-click inside the Scripts folder, click Create > C# Script. Nomeie o script LuisManager.Name the script LuisManager.

  3. Clique duas vezes no script para abri-lo com o Visual Studio.Double click on the script to open it with Visual Studio.

  4. Adicione os seguintes namespaces à parte superior do arquivo:Add the following namespaces to the top of the file:

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Você começará criando três classes dentro da classe LuisManager (dentro do mesmo arquivo de script, acima do método Start () ) que representará a resposta JSON desserializada do Azure.You will begin by creating three classes inside the LuisManager class (within the same script file, above the Start() method) that will represent the deserialized JSON response from Azure.

        [Serializable] //this class represents the LUIS response
        public class AnalysedQuery
        {
            public TopScoringIntentData topScoringIntent;
            public EntityData[] entities;
            public string query;
        }
    
        // This class contains the Intent LUIS determines 
        // to be the most likely
        [Serializable]
        public class TopScoringIntentData
        {
            public string intent;
            public float score;
        }
    
        // This class contains data for an Entity
        [Serializable]
        public class EntityData
        {
            public string entity;
            public string type;
            public int startIndex;
            public int endIndex;
            public float score;
        }
    
  6. Em seguida, adicione as seguintes variáveis dentro da classe LuisManager :Next, add the following variables inside the LuisManager class:

        public static LuisManager instance;
    
        //Substitute the value of luis Endpoint with your own End Point
        string luisEndpoint = "https://westus.api.cognitive... add your endpoint from the Luis Portal";
    
  7. Certifique-se de colocar seu ponto de extremidade do LUIS agora (que você terá do seu portal do LUIS).Make sure to place your LUIS endpoint in now (which you will have from your LUIS portal).

  8. O código para o método ativo () agora precisa ser adicionado.Code for the Awake() method now needs to be added. Esse método será chamado quando a classe inicializar:This method will be called when the class initializes:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  9. Agora você precisa dos métodos que esse aplicativo usa para enviar o ditado recebido da classe microphonemanager para Luise, em seguida, receber e desserializar a resposta.Now you need the methods this application uses to send the dictation received from the MicrophoneManager class to LUIS, and then receive and deserialize the response.

  10. Depois que o valor da intenção e as entidades associadas forem determinados, eles serão passados para a instância da classe de comportamentos para disparar a ação pretendida.Once the value of the Intent, and associated Entities, have been determined, they are passed to the instance of the Behaviours class to trigger the intended action.

        /// <summary>
        /// Call LUIS to submit a dictation result.
        /// The done Action is called at the completion of the method.
        /// </summary>
        public IEnumerator SubmitRequestToLuis(string dictationResult, Action done)
        {
            string queryString = string.Concat(Uri.EscapeDataString(dictationResult));
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(luisEndpoint + queryString))
            {
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Debug.Log(unityWebRequest.error);
                }
                else
                {
                    try
                    {
                        AnalysedQuery analysedQuery = JsonUtility.FromJson<AnalysedQuery>(unityWebRequest.downloadHandler.text);
    
                        //analyse the elements of the response 
                        AnalyseResponseElements(analysedQuery);
                    }
                    catch (Exception exception)
                    {
                        Debug.Log("Luis Request Exception Message: " + exception.Message);
                    }
                }
    
                done();
                yield return null;
            }
        }
    
  11. Crie um novo método chamado AnalyseResponseElements () que lerá o AnalysedQuery resultante e determine as entidades.Create a new method called AnalyseResponseElements() that will read the resulting AnalysedQuery and determine the Entities. Depois que essas entidades forem determinadas, elas serão passadas para a instância da classe de comportamentos a ser usada nas ações.Once those Entities are determined, they will be passed to the instance of the Behaviours class to use in the actions.

        private void AnalyseResponseElements(AnalysedQuery aQuery)
        {
            string topIntent = aQuery.topScoringIntent.intent;
    
            // Create a dictionary of entities associated with their type
            Dictionary<string, string> entityDic = new Dictionary<string, string>();
    
            foreach (EntityData ed in aQuery.entities)
            {
                entityDic.Add(ed.type, ed.entity);
            }
    
            // Depending on the topmost recognized intent, read the entities name
            switch (aQuery.topScoringIntent.intent)
            {
                case "ChangeObjectColor":
                    string targetForColor = null;
                    string color = null;
    
                    foreach (var pair in entityDic)
                    {
                        if (pair.Key == "target")
                        {
                            targetForColor = pair.Value;
                        }
                        else if (pair.Key == "color")
                        {
                            color = pair.Value;
                        }
                    }
    
                    Behaviours.instance.ChangeTargetColor(targetForColor, color);
                    break;
    
                case "ChangeObjectSize":
                    string targetForSize = null;
                    foreach (var pair in entityDic)
                    {
                        if (pair.Key == "target")
                        {
                            targetForSize = pair.Value;
                        }
                    }
    
                    if (entityDic.ContainsKey("upsize") == true)
                    {
                        Behaviours.instance.UpSizeTarget(targetForSize);
                    }
                    else if (entityDic.ContainsKey("downsize") == true)
                    {
                        Behaviours.instance.DownSizeTarget(targetForSize);
                    }
                    break;
            }
        }
    

    Importante

    Exclua os métodos Start () e Update () , pois essa classe não os usará.Delete the Start() and Update() methods since this class will not use them.

  12. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Observação

Neste ponto, você observará que vários erros aparecem no painel de console do editor do Unity.At this point you will notice several errors appearing in the Unity Editor Console Panel. Isso ocorre porque o código faz referência à classe de comportamentos que você criará no próximo capítulo.This is because the code references the Behaviours class which you will create in the next Chapter.

Capítulo 7 – criar a classe de comportamentosChapter 7 – Create the Behaviours class

A classe de comportamentos irá disparar as ações usando as entidades fornecidas pela classe LuisManager .The Behaviours class will trigger the actions using the Entities provided by the LuisManager class.

Para criar esta classe:To create this class:

  1. Clique duas vezes na pasta scripts para abri-la.Double click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > C# script.Right-click inside the Scripts folder, click Create > C# Script. Nomeie os comportamentosdo script.Name the script Behaviours.

  3. Clique duas vezes no script para abri-lo com o Visual Studio.Double click on the script to open it with Visual Studio.

  4. Em seguida, adicione as seguintes variáveis dentro da classe de comportamentos :Then add the following variables inside the Behaviours class:

        public static Behaviours instance;
    
        // the following variables are references to possible targets
        public GameObject sphere;
        public GameObject cylinder;
        public GameObject cube;
        internal GameObject gazedTarget;
    
  5. Adicione o código do método ativo () .Add the Awake() method code. Esse método será chamado quando a classe inicializar:This method will be called when the class initializes:

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. Os métodos a seguir são chamados pela classe LuisManager (que você criou anteriormente) para determinar qual objeto é o destino da consulta e, em seguida, disparar a ação apropriada.The following methods are called by the LuisManager class (which you have created previously) to determine which object is the target of the query and then trigger the appropriate action.

        /// <summary>
        /// Changes the color of the target GameObject by providing the name of the object
        /// and the name of the color
        /// </summary>
        public void ChangeTargetColor(string targetName, string colorName)
        {
            GameObject foundTarget = FindTarget(targetName);
            if (foundTarget != null)
            {
                Debug.Log("Changing color " + colorName + " to target: " + foundTarget.name);
    
                switch (colorName)
                {
                    case "blue":
                        foundTarget.GetComponent<Renderer>().material.color = Color.blue;
                        break;
    
                    case "red":
                        foundTarget.GetComponent<Renderer>().material.color = Color.red;
                        break;
    
                    case "yellow":
                        foundTarget.GetComponent<Renderer>().material.color = Color.yellow;
                        break;
    
                    case "green":
                        foundTarget.GetComponent<Renderer>().material.color = Color.green;
                        break;
    
                    case "white":
                        foundTarget.GetComponent<Renderer>().material.color = Color.white;
                        break;
    
                    case "black":
                        foundTarget.GetComponent<Renderer>().material.color = Color.black;
                        break;
                }          
            }
        }
    
        /// <summary>
        /// Reduces the size of the target GameObject by providing its name
        /// </summary>
        public void DownSizeTarget(string targetName)
        {
            GameObject foundTarget = FindTarget(targetName);
            foundTarget.transform.localScale -= new Vector3(0.5F, 0.5F, 0.5F);
        }
    
        /// <summary>
        /// Increases the size of the target GameObject by providing its name
        /// </summary>
        public void UpSizeTarget(string targetName)
        {
            GameObject foundTarget = FindTarget(targetName);
            foundTarget.transform.localScale += new Vector3(0.5F, 0.5F, 0.5F);
        }
    
  7. Adicione o método FindTarget () para determinar qual Gameobjects é o destino da tentativa atual.Add the FindTarget() method to determine which of the GameObjects is the target of the current Intent. Esse método padroniza o destino para o gameobject como "gazed" se nenhum destino explícito for definido nas entidades.This method defaults the target to the GameObject being “gazed” if no explicit target is defined in the Entities.

        /// <summary>
        /// Determines which object reference is the target GameObject by providing its name
        /// </summary>
        private GameObject FindTarget(string name)
        {
            GameObject targetAsGO = null;
    
            switch (name)
            {
                case "sphere":
                    targetAsGO = sphere;
                    break;
    
                case "cylinder":
                    targetAsGO = cylinder;
                    break;
    
                case "cube":
                    targetAsGO = cube;
                    break;
    
                case "this": // as an example of target words that the user may use when looking at an object
                case "it":  // as this is the default, these are not actually needed in this example
                case "that":
                default: // if the target name is none of those above, check if the user is looking at something
                    if (gazedTarget != null) 
                    {
                        targetAsGO = gazedTarget;
                    }
                    break;
            }
            return targetAsGO;
        }
    

    Importante

    Exclua os métodos Start () e Update () , pois essa classe não os usará.Delete the Start() and Update() methods since this class will not use them.

  8. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 8 – criar a classe olharChapter 8 – Create the Gaze Class

A última classe que será necessária para concluir esse aplicativo é a classe olhar .The last class that you will need to complete this app is the Gaze class. Essa classe atualiza a referência ao gameobject no momento no foco visual do usuário.This class updates the reference to the GameObject currently in the user’s visual focus.

Para criar esta classe:To create this Class:

  1. Clique duas vezes na pasta scripts para abri-la.Double click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > C# script.Right-click inside the Scripts folder, click Create > C# Script. Nomeie o script olhar.Name the script Gaze.

  3. Clique duas vezes no script para abri-lo com o Visual Studio.Double click on the script to open it with Visual Studio.

  4. Insira o seguinte código para esta classe:Insert the following code for this class:

        using UnityEngine;
    
        public class Gaze : MonoBehaviour
        {        
            internal GameObject gazedObject;
            public float gazeMaxDistance = 300;
    
            void Update()
            {
                // Uses a raycast from the Main Camera to determine which object is gazed upon.
                Vector3 fwd = gameObject.transform.TransformDirection(Vector3.forward);
                Ray ray = new Ray(Camera.main.transform.position, fwd);
                RaycastHit hit;
                Debug.DrawRay(Camera.main.transform.position, fwd);
    
                if (Physics.Raycast(ray, out hit, gazeMaxDistance) && hit.collider != null)
                {
                    if (gazedObject == null)
                    {
                        gazedObject = hit.transform.gameObject;
    
                        // Set the gazedTarget in the Behaviours class
                        Behaviours.instance.gazedTarget = gazedObject;
                    }
                }
                else
                {
                    ResetGaze();
                }         
            }
    
            // Turn the gaze off, reset the gazeObject in the Behaviours class.
            public void ResetGaze()
            {
                if (gazedObject != null)
                {
                    Behaviours.instance.gazedTarget = null;
                    gazedObject = null;
                }
            }
        }
    
  5. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

Capítulo 9 – concluindo a configuração da cenaChapter 9 – Completing the scene setup

  1. Para concluir a configuração da cena, arraste cada script que você criou da pasta scripts para o objeto da câmera principal no painel hierarquia.To complete the setup of the scene, drag each script that you have created from the Scripts Folder to the Main Camera object in the Hierarchy Panel.

  2. Selecione a câmera principal e examine o painel Inspetor, você deve ser capaz de ver cada script que você anexou e observará que há parâmetros em cada script que ainda devem ser definidos.Select the Main Camera and look at the Inspector Panel, you should be able to see each script that you have attached, and you will notice that there are parameters on each script that are yet to be set.

    Definindo os destinos de referência da câmera.

  3. Para definir esses parâmetros corretamente, siga estas instruções:To set these parameters correctly, follow these instructions:

    1. Microfonemanager:MicrophoneManager:

      • No painel hierarquia, arraste o objeto de texto ditado para a caixa valor do parâmetro texto do ditado .From the Hierarchy Panel, drag the Dictation Text object into the Dictation Text parameter value box.
    2. Comportamentos, no painel hierarquia:Behaviours, from the Hierarchy Panel:

      • Arraste o objeto de esfera para a caixa destino de referência de esfera .Drag the Sphere object into the Sphere reference target box.
      • Arraste o cilindro para a caixa destino de referência do cilindro .Drag the Cylinder into the Cylinder reference target box.
      • Arraste o cubo para a caixa destino de referência do cubo .Drag the Cube into the Cube reference target box.
    3. Olhar:Gaze:

      • Defina a distância máxima olhar como 300 (se ainda não estiver).Set the Gaze Max Distance to 300 (if it is not already).
  4. O resultado deve ser semelhante à imagem abaixo:The result should look like the image below:

    Mostrando os destinos de referência da câmera, agora definido.

Capítulo 10 – testar no editor do UnityChapter 10 – Test in the Unity Editor

Teste se a configuração de cena está implementada corretamente.Test that the Scene setup is properly implemented.

Certifique-se de que:Ensure that:

  • Todos os scripts são anexados ao objeto da câmera principal .All the scripts are attached to the Main Camera object.
  • Todos os campos no painel principal do Inspetor de câmera são atribuídos corretamente.All the fields in the Main Camera Inspector Panel are assigned properly.
  1. Pressione o botão reproduzir no Editor do Unity.Press the Play button in the Unity Editor. O aplicativo deve estar em execução no headset de imersão anexado.The App should be running within the attached immersive headset.

  2. Experimente alguns declarações, como:Try a few utterances, such as:

    make the cylinder red
    
    change the cube to yellow
    
    I want the sphere blue
    
    make this to green
    
    change it to white
    

    Observação

    Se você vir um erro no console do Unity sobre a alteração do dispositivo de áudio padrão, a cena poderá não funcionar conforme o esperado.If you see an error in the Unity console about the default audio device changing, the scene may not function as expected. Isso ocorre devido à maneira como o portal de realidade misturada lida com microfones internos para fones de ouvido que os têm.This is due to the way the mixed reality portal deals with built-in microphones for headsets that have them. Se você vir esse erro, simplesmente pare a cena e inicie-a novamente e as coisas devem funcionar conforme o esperado.If you see this error, simply stop the scene and start it again and things should work as expected.

Capítulo 11 – criar e sideloadr a solução UWPChapter 11 – Build and sideload the UWP Solution

Depois de garantir que o aplicativo está funcionando no editor do Unity, você estará pronto para compilar e implantar.Once you have ensured that the application is working in the Unity Editor, you are ready to Build and Deploy.

Para compilar:To Build:

  1. Salve a cena atual clicando em arquivo > salvar.Save the current scene by clicking on File > Save.

  2. Vá para arquivo > configurações de Build.Go to File > Build Settings.

  3. Marque a caixa chamada projetos C# do Unity (útil para ver e depurar seu código assim que o projeto UWP for criado.Tick the box called Unity C# Projects (useful for seeing and debugging your code once the UWP project is created.

  4. Clique em Adicionar e abrir cenase em Compilar.Click on Add Open Scenes, then click Build.

    Janela de configurações de compilação

  5. Você será solicitado a selecionar a pasta na qual deseja criar a solução.You will be prompted to select the folder where you want to build the Solution.

  6. Crie uma pasta Builds e dentro dessa pasta crie outra pasta com um nome apropriado de sua escolha.Create a BUILDS folder and within that folder create another folder with an appropriate name of your choice.

  7. Clique em Selecionar pasta para iniciar a compilação nesse local.Click Select Folder to begin the build at that location.

    criar a pasta builds selecionar a pasta buildsCreate Builds Folder Select Builds Folder

  8. Depois de concluir a compilação do Unity (pode levar algum tempo), ele deve abrir uma janela do Explorador de arquivos no local de sua compilação.Once Unity has finished building (it might take some time), it should open a File Explorer window at the location of your build.

Para implantar no computador local:To Deploy on Local Machine:

  1. No Visual Studio, abra o arquivo de solução que foi criado no capítulo anterior.In Visual Studio, open the solution file that has been created in the previous Chapter.

  2. Na plataforma da solução, selecione x86, computador local.In the Solution Platform, select x86, Local Machine.

  3. Na configuração da solução , selecione depurar.In the Solution Configuration select Debug.

    Para o Microsoft HoloLens, você pode achar mais fácil definir isso como computador remoto, para que você não esteja vinculado ao seu computador.For the Microsoft HoloLens, you may find it easier to set this to Remote Machine, so that you are not tethered to your computer. No entanto, também será necessário fazer o seguinte:Though, you will need to also do the following:

    • Conheça o endereço IP do seu HoloLens, que pode ser encontrado dentro das configurações > rede & Internet > Wi-Fi > opções avançadas; o IPv4 é o endereço que você deve usar.Know the IP Address of your HoloLens, which can be found within the Settings > Network & Internet > Wi-Fi > Advanced Options; the IPv4 is the address you should use.
    • Verificar se o modo de desenvolvedor está ativado; encontrado em configurações > atualização & > de segurança para desenvolvedores.Ensure Developer Mode is On; found in Settings > Update & Security > For developers.

    Implantar aplicativo

  4. Vá para o menu Compilar e clique em implantar solução para Sideload o aplicativo em seu computador.Go to the Build menu and click on Deploy Solution to sideload the application to your machine.

  5. Seu aplicativo agora deve aparecer na lista de aplicativos instalados, pronto para ser iniciado!Your App should now appear in the list of installed apps, ready to be launched!

  6. Depois de iniciado, o aplicativo solicitará que você autorize o acesso ao microfone.Once launched, the App will prompt you to authorize access to the Microphone. Use os controladores de movimentoou a entrada de vozou o teclado para pressionar o botão Sim .Use the Motion Controllers, or Voice Input, or the Keyboard to press the YES button.

Capítulo 12 – melhorando seu serviço LUISChapter 12 – Improving your LUIS service

Importante

Este capítulo é incrivelmente importante e pode precisar ser iterado várias vezes, pois isso ajudará a melhorar a precisão do seu serviço LUIS: Certifique-se de concluir isso.This chapter is incredibly important, and may need to be iterated upon several times, as it will help improve the accuracy of your LUIS service: ensure you complete this.

Para melhorar o nível de compreensão fornecido pelo LUIS, você precisa capturar novos declarações e usá-los para treinar novamente seu aplicativo LUIS.To improve the level of understanding provided by LUIS you need to capture new utterances and use them to re-train your LUIS App.

Por exemplo, você pode ter treinado LUIS para entender "aumentar" e "upsizing", mas não iria querer que seu aplicativo também entenda palavras como "ampliar"?For example, you might have trained LUIS to understand “Increase” and “Upsize”, but wouldn’t you want your app to also understand words like “Enlarge”?

Depois de usar seu aplicativo algumas vezes, tudo o que você disse será coletado pelo LUIS e disponível no PORTAL do LUIS.Once you have used your application a few times, everything you have said will be collected by LUIS and available in the LUIS PORTAL.

  1. Acesse o aplicativo do portal seguindo este linke faça logon.Go to your portal application following this LINK, and Log In.

  2. Depois de fazer logon com suas credenciais do MS, clique no nome do aplicativo.Once you are logged in with your MS Credentials, click on your App name.

  3. Clique no botão examinar ponto de extremidade declarações à esquerda da página.Click the Review endpoint utterances button on the left of the page.

    Examinar declarações

  4. Você verá uma lista dos declarações que foram enviados ao LUIS pelo seu aplicativo de realidade misturada.You will be shown a list of the Utterances that have been sent to LUIS by your mixed reality Application.

    Lista de declarações

Você observará algumas entidadesrealçadas.You will notice some highlighted Entities.

Ao focalizar cada palavra realçada, você pode examinar cada expressão e determinar qual entidade foi reconhecida corretamente, quais entidades estão erradas e quais entidades estão ausentes.By hovering over each highlighted word, you can review each Utterance and determine which Entity has been recognized correctly, which Entities are wrong and which Entities are missed.

No exemplo acima, foi detectado que a palavra "Spear" foi realçada como um destino, portanto, é necessário corrigir o erro, o que é feito ao passar pela palavra com o mouse e clicar em remover rótulo.In the example above, it was found that the word “spear” had been highlighted as a target, so it necessary to correct the mistake, which is done by hovering over the word with the mouse and clicking Remove Label.

verificar declarações remover imagem de rótuloCheck utterances Remove Label Image

  1. Se encontrar declarações que estejam completamente errados, você poderá excluí-los usando o botão excluir no lado direito da tela.If you find Utterances that are completely wrong, you can delete them using the Delete button on the right side of the screen.

    Excluir declarações incorretos

  2. Ou se sentir que o LUIS interpretou o expressão corretamente, você poderá validar sua compreensão usando o botão Adicionar à intenção alinhada .Or if you feel that LUIS has interpreted the Utterance correctly, you can validate its understanding by using the Add To Aligned Intent button.

    Adicionar à intenção alinhada

  3. Depois de classificar todos os declarações exibidos, tente e recarregue a página para ver se há mais informações disponíveis.Once you have sorted all the displayed Utterances, try and reload the page to see if more are available.

  4. É muito importante repetir esse processo tantas vezes quanto possível para melhorar a compreensão do seu aplicativo.It is very important to repeat this process as many times as possible to improve your application understanding.

Divertir-se!Have fun!

Seu aplicativo LUIS Integrated concluídoYour finished LUIS Integrated application

Parabéns, você criou um aplicativo de realidade misturada que aproveita o serviço do Azure Reconhecimento vocal Intelligence, para entender o que um usuário diz e agir sobre essas informações.Congratulations, you built a mixed reality app that leverages the Azure Language Understanding Intelligence Service, to understand what a user says, and act on that information.

Resultado do laboratório

Exercícios de bônusBonus exercises

Exercício 1Exercise 1

Ao usar esse aplicativo, você pode notar que, se olhar no objeto Floor e pedir para alterar sua cor, ele fará isso.While using this application you might notice that if you gaze at the Floor object and ask to change its color, it will do so. Você pode solucionar como impedir que seu aplicativo altere a cor do piso?Can you work out how to stop your application from changing the Floor color?

Exercício 2Exercise 2

Tente estender os recursos de LUIS e de aplicativo, adicionando funcionalidades adicionais para objetos em cena; como exemplo, crie novos objetos no ponto de acesso olhar, dependendo do que o usuário diz e, em seguida, use esses objetos junto com os objetos de cena atuais, com os comandos existentes.Try extending the LUIS and App capabilities, adding additional functionality for objects in scene; as an example, create new objects at the Gaze hit point, depending on what the user says, and then be able to use those objects alongside current scene objects, with the existing commands.