MR 및 Azure 303: 자연어 이해 (LUIS)MR and Azure 303: Natural language understanding (LUIS)


참고

Mixed Reality 아카데미 자습서는 HoloLens(1세대) 및 Mixed Reality 몰입형 헤드셋을 염두에 두고 설계되었습니다.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. 따라서 이러한 디바이스 개발에 대한 지침을 계속 찾고 있는 개발자를 위해 이러한 자습서를 그대로 두는 것이 중요합니다.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. 이러한 자습서는 HoloLens 2에 사용되는 최신 도구 집합 또는 상호 작용으로 업데이트되지 않습니다.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. 대신 지원되는 디바이스에서 계속 작동하도록 유지 관리됩니다.They will be maintained to continue working on the supported devices. 향후에는 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. 이 알림은 게시 될 때 해당 자습서에 대 한 링크를 사용 하 여 업데이트 됩니다.This notice will be updated with a link to those tutorials when they are posted.


이 과정에서는 Language Understanding API와 함께 Azure Cognitive Services를 사용 하 여 혼합 현실 응용 프로그램에 Language Understanding를 통합 하는 방법에 대해 설명 합니다.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.

랩 결과

LUIS (Language Understanding) 는 응용 프로그램에서 사용자가 원하는 항목을 자신의 단어로 추출 하는 등 사용자 입력에서 의미를 유지할 수 있는 기능을 제공 하는 Microsoft Azure 서비스입니다.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. 이는 입력 정보를 이해 하 고 학습 한 다음 상세 하 고 관련 된 정보를 사용 하 여 회신할 수 있는 기계 학습을 통해 이루어집니다.This is achieved through machine learning, which understands and learns the input information, and then can reply with detailed, relevant, information. 자세한 내용은 Azure Language Understanding (LUIS) 페이지를 참조 하세요.For more information, visit the Azure Language Understanding (LUIS) page.

이 과정을 완료 하면 다음과 같은 작업을 수행할 수 있는 혼합 현실 모던 헤드셋 응용 프로그램이 만들어집니다.Having completed this course, you will have a mixed reality immersive headset application which will be able to do the following:

  1. 몰입 형 헤드셋에 연결 된 마이크를 사용 하 여 사용자 입력 음성을 캡처합니다.Capture user input speech, using the Microphone attached to the immersive headset.
  2. 캡처된 받아쓰기를 Azure Language Understanding Intelligent Service (LUIS)로 보냅니다.Send the captured dictation the Azure Language Understanding Intelligent Service (LUIS).
  3. LUIS은 전송 정보에서 의미를 추출 하 여 분석 하 고 사용자의 요청 의도를 확인 하려고 시도 합니다.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.

개발에는 사용자가 음성 및/또는 응시를 사용 하 여 장면의 개체 크기와 색을 변경할 수 있는 앱을 만드는 작업이 포함 됩니다.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. 동작 컨트롤러의 사용은 다루지 않습니다.The use of motion controllers will not be covered.

응용 프로그램에서 결과를 디자인과 통합 하는 방법을 사용자가 결정 합니다.In your application, it is up to you as to how you will integrate the results with your design. 이 과정은 Azure 서비스를 Unity 프로젝트와 통합 하는 방법을 배울 수 있도록 설계 되었습니다.This course is designed to teach you how to integrate an Azure Service with your Unity Project. 이 과정에서 얻은 지식을 사용 하 여 혼합 현실 응용 프로그램을 개선 하는 것은 사용자의 작업입니다.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

12 장에서 설명 하는 LUIS을 여러 번 학습 하도록 준비 해야 합니다.Be prepared to Train LUIS several times, which is covered in Chapter 12. LUIS을 더 많이 학습 한 경우 더 나은 결과를 얻을 수 있습니다.You will get better results the more times LUIS has been trained.

디바이스 지원Device support

과정Course HoloLensHoloLens 몰입형 헤드셋Immersive headsets
MR 및 Azure 303: 자연어 이해 (LUIS)MR and Azure 303: Natural language understanding (LUIS) ✔️✔️ ✔️✔️

참고

이 과정에서 주로 Windows Mixed Reality (VR) 헤드셋에 초점을 맞춘 반면,이 과정에서 학습 하는 내용을 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. 과정을 진행할 때 HoloLens를 지원 하기 위해 사용 해야 하는 모든 변경 내용에 대 한 메모를 볼 수 있습니다.As you follow along with the course, you will see notes on any changes you might need to employ to support HoloLens. HoloLens를 사용 하는 경우 음성 캡처 중에 몇 가지 echo를 확인할 수 있습니다.When using HoloLens, you may notice some echo during voice capture.

사전 요구 사항Prerequisites

참고

이 자습서는 Unity 및 c #에 대 한 기본 경험이 있는 개발자를 위해 작성 되었습니다.This tutorial is designed for developers who have basic experience with Unity and C#. 또한이 문서에서 사전 요구 사항 및 작성 된 지침은 작성 시 테스트 되 고 확인 된 내용 (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). 도구 설치 문서에 나와 있는 것 처럼 최신 소프트웨어를 무료로 사용할 수 있지만,이 과정의 정보가 아래 나열 된 것 보다 최신 소프트웨어에서 찾을 수 있는 것으로 간주 하면 안 됩니다.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.

이 과정에는 다음 하드웨어 및 소프트웨어를 권장 합니다.We recommend the following hardware and software for this course:

시작하기 전 확인 사항Before you start

  1. 이 프로젝트를 빌드하는 데 문제가 발생 하지 않도록 하려면 루트 또는 루트 폴더에이 자습서에서 언급 한 프로젝트를 만드는 것이 좋습니다. (긴 폴더 경로는 빌드 시에 문제를 일으킬 수 있습니다.)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. 컴퓨터에서 받아쓰기를 사용 하도록 허용 하려면 Windows 설정 > 개인 정보 > 음성, 필기 & 입력 으로 이동 하 고 단추를 눌러 음성 서비스를 켜고 제안을 입력 합니다.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. 이 자습서의 코드를 사용 하면 컴퓨터에 설정 된 기본 마이크 장치 에서 기록할 수 있습니다.The code in this tutorial will allow you to record from the Default Microphone Device set on your machine. 기본 마이크 장치가 음성을 캡처하는 데 사용할 것으로 설정 되어 있는지 확인 합니다.Make sure the Default Microphone Device is set as the one you wish to use to capture your voice.

  4. 헤드셋에 기본 제공 마이크가 있는 경우 혼합 현실 포털 설정에서 "헤드셋을 착용 할 때 헤드셋 mic로 전환" 옵션이 켜져 있는지 확인 합니다.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.

    모던 헤드셋 설정

1 장-Azure Portal 설정Chapter 1 – Setup Azure Portal

Azure에서 Language Understanding 서비스를 사용 하려면 응용 프로그램에서 사용할 수 있도록 서비스 인스턴스를 구성 해야 합니다.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. Azure Portal에 로그인합니다.Log in to the Azure Portal.

    참고

    아직 Azure 계정이 없는 경우 새로 만들어야 합니다.If you do not already have an Azure account, you will need to create one. 교실 또는 랩 상황에서이 자습서를 수행 하는 경우 강사 또는 proctors 중 하나에 문의 하 여 새 계정을 설정 하는 데 도움이 될 수 있습니다.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. 로그인 되 면 왼쪽 위 모서리에서 새로 만들기 를 클릭 하 고 Language Understanding 를 검색 한 다음 Enter 키 를 누릅니다.Once you are logged in, click on New in the top left corner, and search for Language Understanding, and click Enter.

    LUIS 리소스 만들기

    참고

    새 단어는 포털에서 리소스 만들기 로 대체 되었을 수 있습니다.The word New may have been replaced with Create a resource, in newer portals.

  3. 오른쪽의 새 페이지는 Language Understanding 서비스에 대 한 설명을 제공 합니다.The new page to the right will provide a description of the Language Understanding service. 이 페이지의 왼쪽 아래에서 만들기 단추를 선택 하 여이 서비스의 인스턴스를 만듭니다.At the bottom left of this page, select the Create button, to create an instance of this service.

    LUIS 서비스 만들기-법적 고 지 사항

  4. 만들기를 클릭 하면 다음을 클릭 합니다.Once you have clicked on Create:

    1. 이 서비스 인스턴스의 원하는 이름을 삽입 합니다.Insert your desired Name for this service instance.

    2. 구독 을 선택합니다.Select a Subscription.

    3. 적절 한 가격 책정 계층 을 선택 하세요. LUIS 서비스 를 처음 만드는 경우 무료 계층 (명명 된 F0)을 사용할 수 있어야 합니다.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. 이 과정에서는 사용 가능한 할당이 충분 해야 합니다.The free allocation should be more than sufficient for this course.

    4. 리소스 그룹을 선택 하거나 새 리소스 그룹 을 만듭니다.Choose a Resource Group or create a new one. 리소스 그룹은 Azure 자산의 컬렉션에 대 한 청구를 모니터링 하 고, 액세스를 제어 하 고, 프로 비전 하 고, 관리 하는 방법을 제공 합니다.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. 단일 프로젝트와 연결 된 모든 Azure 서비스 (예: 이러한 과정)를 공용 리소스 그룹에 유지 하는 것이 좋습니다.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).

      Azure 리소스 그룹에 대 한 자세한 내용을 보려면 리소스 그룹 문서를 참조하세요.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. 새 리소스 그룹을 만드는 경우 리소스 그룹의 위치 를 확인 합니다.Determine the Location for your resource group (if you are creating a new Resource Group). 위치는 응용 프로그램이 실행 되는 영역에 있는 것이 가장 좋습니다.The location would ideally be in the region where the application would run. 일부 Azure 자산은 특정 지역 에서만 사용할 수 있습니다.Some Azure assets are only available in certain regions.

    6. 또한이 서비스에 적용 된 사용 약관을 이해 했는지 확인 해야 합니다.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. 만들기 를 선택합니다.Select Create.

      LUIS 서비스 만들기-사용자 입력

  5. 만들기 를 클릭 한 후에는 서비스를 만들 때까지 기다려야 합니다 .이 작업이 몇 분 정도 걸릴 수 있습니다.Once you have clicked on Create, you will have to wait for the service to be created, this might take a minute.

  6. 서비스 인스턴스를 만든 후 알림이 포털에 표시 됩니다.A notification will appear in the portal once the Service instance is created.

    새 Azure 알림 이미지

  7. 알림을 클릭 하 여 새 서비스 인스턴스를 탐색 합니다.Click on the notification to explore your new Service instance.

    리소스 만들기 성공 알림

  8. 알림에서 리소스로 이동 단추를 클릭 하 여 새 서비스 인스턴스를 탐색 합니다.Click the Go to resource button in the notification to explore your new Service instance. 새 LUIS 서비스 인스턴스로 이동 됩니다.You will be taken to your new LUIS service instance.

    LUIS 키 액세스

  9. 이 자습서에서 응용 프로그램은 서비스에 대 한 호출을 수행 해야 하며, 서비스의 구독 키를 사용 하 여 수행 됩니다.Within this tutorial, your application will need to make calls to your service, which is done through using your service’s Subscription Key.

  10. LUIS API 서비스의 빠른 시작 페이지에서 첫 번째 단계로 이동 하 고 키를 클릭 한 다음 키를 클릭 합니다 .이를 위해 서비스 탐색 메뉴에서 키 아이콘으로 표시 되는 파란색 하이퍼링크 키 를 클릭 하 여이를 수행할 수도 있습니다.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). 이렇게 하면 서비스 가 표시 됩니다.This will reveal your service Keys.

  11. 프로젝트에서 나중에 필요 하므로 표시 된 키 중 하나를 복사 합니다.Take a copy of one of the displayed keys, as you will need this later in your project.

  12. 서비스 페이지에서 LUIS 앱 내에서 새 서비스를 만드는 데 사용할 웹 페이지로 리디렉션되는 Language Understanding 포털 을 클릭 합니다.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.

2 장-Language Understanding 포털Chapter 2 – The Language Understanding Portal

이 섹션에서는 LUIS 포털에서 LUIS 앱을 만드는 방법에 대해 알아봅니다.In this section you will learn how to make a LUIS App on the LUIS Portal.

중요

이 장 내에서 엔터티, 의도길이 발언 를 설정 하는 것은 LUIS 서비스를 빌드하는 첫 번째 단계 일 뿐입니다. 더 정확 하 게 만들려면 서비스를 여러 번 다시 학습 해야 합니다.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. 서비스에 대 한 재 학습은이 과정의 마지막 장에서 설명 하므로 완료 되었는지 확인 합니다.Retraining your service is covered in the last Chapter of this course, so ensure that you complete it.

  1. Language Understanding 포털 에 도달 하면 Azure Portal와 동일한 자격 증명을 사용 하 여 로그인 해야 할 수 있습니다.Upon reaching the Language Understanding Portal, you may need to login, if you are not already, with the same credentials as your Azure portal.

    LUIS 로그인 페이지

  2. LUIS를 처음 사용 하는 경우 시작 페이지의 아래쪽으로 스크롤하여 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.

    LUIS 앱 만들기 페이지

  3. 로그인 한 후 내 앱 (현재 해당 섹션에 있지 않은 경우)을 클릭 합니다.Once logged in, click My apps (if you are not in that section currently). 그런 다음 새 앱 만들기 를 클릭할 수 있습니다.You can then click on Create new app.

    LUIS-내 앱 이미지

  4. 앱에 이름을 지정 합니다.Give your app a Name.

  5. 앱이 영어와 다른 언어를 파악 해야 하는 경우 문화권 을 적절 한 언어로 변경 해야 합니다.If your app is supposed to understand a language different from English, you should change the Culture to the appropriate language.

  6. 여기에서 새 LUIS 앱에 대 한 설명을 추가할 수도 있습니다.Here you can also add a Description of your new LUIS app.

    LUIS-새 앱 만들기

  7. 완료 를 누르면 새 LUIS 응용 프로그램의 빌드 페이지가 입력 됩니다.Once you press Done, you will enter the Build page of your new LUIS application.

  8. 여기에서 이해할 수 있는 몇 가지 중요 한 개념이 있습니다.There are a few important concepts to understand here:

    • 의도 는 사용자의 쿼리 다음에 호출 될 메서드를 나타냅니다.Intent, represents the method that will be called following a query from the user. 의도 에 하나 이상의 엔터티가 있을 수 있습니다.An INTENT may have one or more ENTITIES.
    • 엔터티의도 와 관련 된 정보를 설명 하는 쿼리의 구성 요소입니다.Entity, is a component of the query that describes information relevant to the INTENT.
    • 길이 발언 는 개발자가 직접 학습 하는 데 사용 하는 개발자가 제공 하는 쿼리의 예입니다.Utterances, are examples of queries provided by the developer, that LUIS will use to train itself.

이러한 개념을 완벽 하 게 명확 하 게 이해 하지 못하는 경우이 과정에서이 장을 자세히 설명 하므로 걱정 하지 마세요.If these concepts are not perfectly clear, do not worry, as this course will clarify them further in this chapter.

이 과정을 빌드하는 데 필요한 엔터티 를 만드는 것부터 시작 합니다.You will begin by creating the Entities needed to build this course.

  1. 페이지의 왼쪽에서 엔터티 를 클릭 한 다음 새 엔터티 만들기 를 클릭 합니다.On the left side of the page, click on Entities, then click on Create new entity.

    새 엔터티 만들기

  2. 새 엔터티 을 호출 하 고 해당 형식을 Simple 로 설정한 후 Done 을 누릅니다.Call the new Entity color, set its type to Simple, then press Done.

    단순 엔터티 색 만들기

  3. 이 프로세스를 반복 하 여 라는 세 개의 단순 엔터티 (3)를 만듭니다.Repeat this process to create three (3) more Simple Entities named:

    • 업사이징upsize
    • 줄이지downsize
    • 대상target

결과는 아래 이미지와 같아야 합니다.The result should look like the image below:

엔터티 생성 결과

이 시점에서 의도 만들기를 시작할 수 있습니다.At this point you can begin creating Intents.

경고

없음 의도를 삭제 하지 마십시오.Do not delete the None intent.

  1. 페이지의 왼쪽에서 의도 를 클릭 한 다음 새 용도 만들기 를 클릭 합니다.On the left side of the page, click on Intents, then click on Create new intent.

    새 의도 만들기

  2. 의도 changeobjectcolor 를 호출 합니다.Call the new Intent ChangeObjectColor.

    중요

    의도 이름은이 과정의 뒷부분에 나오는 코드 내에서 사용 되므로 최상의 결과를 위해 제공 된 대로 정확 하 게이 이름을 사용 합니다.This Intent name is used within the code later in this course, so for best results, use this name exactly as provided.

이름을 확인 한 후에는 의도 페이지로 리디렉션됩니다.Once you confirm the name you will be directed to the Intents Page.

LUIS-의도 페이지

5 개 이상의 다른 길이 발언 를 입력 하 라는 텍스트 상자가 표시 됩니다.You will notice that there is a textbox asking you to type 5 or more different Utterances.

참고

LUIS는 모든 길이 발언를 소문자로 변환 합니다.LUIS converts all Utterances to lower case.

  1. 맨 위 텍스트 상자에 다음 Utterance 을 삽입 합니다 (현재 텍스트 형식이 5 개 예 인 경우).Insert the following Utterance in the top textbox (currently with the text Type about 5 examples… )를 입력 하 고 enter 키를 누릅니다.), and press Enter:
The color of the cylinder must be red

Utterance 이 아래 목록에 표시 됩니다.You will notice that the new Utterance will appear in a list underneath.

동일한 프로세스를 수행 하 고 다음 6 개 (6) 길이 발언를 삽입 합니다.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

만든 각 Utterance에 대해 LUIS에서 엔터티로 사용할 단어를 식별 해야 합니다.For each Utterance you have created, you must identify which words should be used by LUIS as Entities. 이 예제에서는 모든 색을 엔터티로 레이블과 대상에 대 한 모든 가능한 참조를 대상 엔터티로 표시 해야 합니다.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. 이렇게 하려면 첫 번째 Utterance에서 실린더 단어를 클릭 하 고 대상 을 선택 합니다.To do so, try clicking on the word cylinder in the first Utterance and select target.

    Utterance 대상 식별

  2. 이제 첫 번째 Utterance 빨간색 이라는 단어를 클릭 하 고 을 선택 합니다.Now click on the word red in the first Utterance and select color.

    Utterance 엔터티 식별

  3. 다음 줄에 레이블을 지정 합니다. 여기서 cube대상 이어야 하 고 black 이어야 합니다.Label the next line also, where cube should be a target, and black should be a color. 또한 제공 되는 ' this ', ' it '' this object ' 단어를 사용 하 여 특정 대상 유형을 사용할 수도 있습니다.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. 모든 길이 발언에 레이블이 붙은 엔터티가 있을 때까지 위의 프로세스를 반복 합니다.Repeat the process above until all the Utterances have the Entities labelled. 도움이 필요 하면 아래 이미지를 참조 하세요.See the below image if you need help.

    엔터티로 레이블을 지정할 단어를 선택할 경우 다음을 수행합니다.When selecting words to label them as entities:

    • 한 단어에 대해서만 클릭 하면 됩니다.For single words just click them.
    • 두 개 이상의 단어 집합의 경우 시작 부분을 클릭 한 다음 집합의 끝 부분을 클릭 합니다.For a set of two or more words, click at the beginning and then at the end of the set.

    참고

    토큰 뷰 토글 단추를 사용 하 여 엔터티/토큰 뷰 간을 전환할 수 있습니다.You can use the Tokens View toggle button to switch between Entities / Tokens View!

  5. 결과는 아래 이미지에 표시 된 것과 같이 엔터티/토큰 뷰 를 표시 합니다.The results should be as seen in the images below, showing the Entities / Tokens View:

    토큰 & 엔터티 보기

  6. 이 시점에서 페이지의 오른쪽 위에 있는 학습 단추를 누르고 작은 라운드 표시기가 녹색으로 전환 될 때까지 기다립니다.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. 이는 LUIS가 이러한 의도를 인식할 수 있도록 성공적으로 교육 되었음을 나타냅니다.This indicates that LUIS has been successfully trained to recognize this Intent.

    LUIS 학습

  7. 실습으로, 엔터티 대상, 업사이징다운 크기 를 사용 하 여 changeobjectsize 라는 새로운 의도를 만듭니다.As an exercise for you, create a new Intent called ChangeObjectSize, using the Entities target, upsize, and downsize.

  8. 이전 의도와 동일한 프로세스를 수행 하 여 크기 변경에 대 한 길이 발언 8 (8)을 삽입 합니다.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. 결과는 아래 이미지에 있는 것과 같아야 합니다.The result should be like the one in the image below:

    ChangeObjectSize 토큰/엔터티 설정

  10. 두 의도, Changeobjectcolorchangeobjectcolor 를 모두 만들고 학습 한 후에는 페이지 맨 위에 있는 게시 단추를 클릭 합니다.Once both Intents, ChangeObjectColor and ChangeObjectSize, have been created and trained, click on the PUBLISH button on top of the page.

    LUIS 서비스 게시

  11. 게시 페이지에서 LUIS 앱을 마무리 하 고 게시 하 여 코드에서 액세스할 수 있도록 합니다.On the Publish page you will finalize and publish your LUIS App so that it can be accessed by your code.

    1. 드롭다운을 프로덕션 으로 게시를 설정 합니다.Set the drop down Publish To as Production.

    2. 표준 시간대로 표준 시간대를 설정 합니다.Set the Timezone to your time zone.

    3. 모든 예측 된 의도 점수를 포함 하는 상자를 선택 합니다.Check the box Include all predicted intent scores.

    4. 프로덕션 슬롯에 게시를 클릭 합니다.Click on Publish to Production Slot.

      게시 설정

  12. 리소스 및 키 섹션에서 다음을 수행 합니다.In the section Resources and Keys:

    1. Azure Portal에서 서비스 인스턴스에 대해 설정한 지역을 선택 합니다.Select the region you set for service instance in the Azure Portal.
    2. 아래 Starter_Key 요소를 확인 하 고 무시 합니다.You will notice a Starter_Key element below, ignore it.
    3. 키 추가 를 클릭 하 고 서비스 인스턴스를 만들 때 Azure Portal에서 가져온 를 삽입 합니다.Click on Add Key and insert the Key that you obtained in the Azure Portal when you created your Service instance. Azure와 LUIS 포털이 동일한 사용자에 게 로그인 하는 경우 테 넌 트 이름, 구독 이름 및 사용 하려는 에 대 한 드롭다운 메뉴가 제공 됩니다 (이전에는 azure portal에서 제공한 것과 동일한 이름을 사용).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.

    중요

    끝점 아래에서 삽입 한 키에 해당 하는 끝점의 복사본을 만든 후 코드에서 곧 사용할 수 있습니다.Underneath Endpoint, take a copy of the endpoint corresponding to the Key you have inserted, you will soon use it in your code.

3 장-Unity 프로젝트 설정Chapter 3 – Set up the Unity project

다음은 혼합 현실를 사용 하 여 개발 하기 위한 일반적인 설정으로, 다른 프로젝트에 적합 한 템플릿입니다.The following is a typical set up for developing with the mixed reality, and as such, is a good template for other projects.

  1. Unity 를 열고 새로 만들기 를 클릭 합니다.Open Unity and click New.

    새 Unity 프로젝트를 시작 합니다.

  2. 이제 Unity 프로젝트 이름, insert MR_LUIS 를 제공 해야 합니다.You will now need to provide a Unity Project name, insert MR_LUIS. 프로젝트 형식이 3d 로 설정 되었는지 확인 합니다.Make sure the project type is set to 3D. 위치를 적절 한 위치 에 적절 하 게 설정 합니다. 루트 디렉터리에 가까울수록 좋습니다.Set the Location to somewhere appropriate for you (remember, closer to root directories is better). 그런 다음 프로젝트 만들기 를 클릭 합니다.Then, click Create project.

    새 Unity 프로젝트에 대 한 세부 정보를 제공 합니다.

  3. Unity를 연 상태에서 기본 스크립트 편집기Visual Studio 로 설정 되어 있는지 확인 하는 것이 좋습니다.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. > 기본 설정 편집으로 이동한 다음 새 창에서 외부 도구 로 이동 합니다.Go to Edit > Preferences and then from the new window, navigate to External Tools. 외부 스크립트 편집기Visual Studio 2017 로 변경 합니다.Change External Script Editor to Visual Studio 2017. 기본 설정 창을 닫습니다.Close the Preferences window.

    스크립트 편집기 기본 설정을 업데이트 합니다.

  4. 그런 다음 파일 > 빌드 설정 으로 이동 하 고 플랫폼 전환 단추를 클릭 하 여 플랫폼을 유니버설 Windows 플랫폼 로 전환 합니다.Next, go to File > Build Settings and switch the platform to Universal Windows Platform, by clicking on the Switch Platform button.

    빌드 설정 창에서 플랫폼을 UWP로 전환 합니다.

  5. 파일 > 빌드 설정 으로 이동 하 고 다음을 확인 합니다.Go to File > Build Settings and make sure that:

    1. 대상 장치가 모든 장치로 설정 됨Target Device is set to Any Device

      Microsoft HoloLens의 경우 대상 장치HoloLens 로 설정 합니다.For the Microsoft HoloLens, set Target Device to HoloLens.

    2. 빌드 형식이 D3D 로 설정 됩니다.Build Type is set to D3D

    3. SDK최신 설치 로 설정 됨SDK is set to Latest installed

    4. Visual Studio 버전이 최신 설치 로 설정 됨Visual Studio Version is set to Latest installed

    5. 빌드 및 실행로컬 컴퓨터로 설정 됨Build and Run is set to Local Machine

    6. 장면을 저장 하 고 빌드에 추가 합니다.Save the scene and add it to the build.

      1. 이렇게 하려면 열려 있는 장면 추가 를 선택 합니다.Do this by selecting Add Open Scenes. 저장 창이 표시 됩니다.A save window will appear.

        열린 장면 추가 단추를 클릭 합니다.

      2. 이에 대 한 새 폴더를 만들고 나중에 장면을 만든 다음 새 폴더 단추를 선택 하 여 새 폴더를 만들고 이름을 장면을 로 지정한 다음Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        새 스크립트 폴더 만들기

      3. 새로 만든 장면 폴더를 연 다음 파일 이름: 텍스트 필드에 MR_LuisScene 를 입력 하 고 저장 을 누릅니다.Open your newly created Scenes folder, and then in the File name: text field, type MR_LuisScene, then press Save.

        새 장면에 이름을 지정 합니다.

    7. 빌드 설정 의 나머지 설정은 지금은 기본값으로 남겨 두어야 합니다.The remaining settings, in Build Settings, should be left as default for now.

  6. 빌드 설정 창에서 플레이어 설정 단추를 클릭 하면 검사기 가 있는 공간에서 관련 패널이 열립니다.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.

    플레이어 설정을 엽니다.

  7. 이 패널에서 몇 가지 설정을 확인 해야 합니다.In this panel, a few settings need to be verified:

    1. 기타 설정 탭에서 다음을 수행 합니다.In the Other Settings tab:

      1. Scripting Runtime 버전안정적 이어야 합니다 (.net 3.5 해당).Scripting Runtime Version should be Stable (.NET 3.5 Equivalent).

      2. Scripting 백엔드.net 이어야 합니다.Scripting Backend should be .NET

      3. API 호환성 수준은 .net 4.6 이어야 합니다.API Compatibility Level should be .NET 4.6

        다른 설정을 업데이트 합니다.

    2. 게시 설정 탭의 기능 아래에서 다음을 확인 합니다.Within the Publishing Settings tab, under Capabilities, check:

      1. InternetClientInternetClient

      2. 마이크Microphone

        게시 설정을 업데이트 하는 중입니다.

    3. 패널의 아래쪽에서 XR 설정 ( 게시 설정 아래에 있음), 지원 되는 틱 가상 현실, Windows Mixed reality SDK 가 추가 되어 있는지 확인 합니다.Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      X R 설정을 업데이트 합니다.

  8. 빌드 설정 으로 돌아가기 Unity c # 프로젝트는 더 이상 회색으로 표시 되지 않습니다. 이 옆의 확인란을 선택 합니다.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. 빌드 설정 창을 닫습니다.Close the Build Settings window.

  10. 장면 및 프로젝트를 저장 합니다 (파일 > 장면/파일 저장 > 프로젝트 저장).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

4 장-장면 만들기Chapter 4 – Create the scene

중요

이 과정의 Unity 설정 구성 요소를 건너뛰고 계속 해 서 코드를 계속 사용 하려면 unitypackage를 다운로드 하 여 프로젝트에 사용자 지정 패키지로가져온 후 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. 계층 패널 의 빈 영역을 마우스 오른쪽 단추로 클릭 하 고 3d 개체 아래에서 평면 을 추가 합니다.Right-click in an empty area of the Hierarchy Panel, under 3D Object, add a Plane.

    평면을 만듭니다.

  2. 계층 구조 내에서 마우스 오른쪽 단추를 클릭 하 여 더 많은 개체를 만들 경우 마지막 개체를 선택한 경우 선택한 개체가 새 개체의 부모가 됩니다.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. 계층 구조 내의 빈 공간을 마우스 왼쪽 단추로 클릭 한 다음 마우스 오른쪽 단추를 클릭 하지 마십시오.Avoid this left-clicking in an empty space within the Hierarchy, and then right-clicking.

  3. 위의 절차를 반복 하 여 다음 개체를 추가 합니다.Repeat the above procedure to add the following objects:

    1. SphereSphere
    2. 실린더Cylinder
    3. CubeCube
    4. 3D 텍스트3D Text
  4. 결과 장면 계층 구조 는 아래 이미지에 있는 것과 같아야 합니다.The resulting scene Hierarchy should be like the one in the image below:

    장면 계층 설정입니다.

  5. 기본 카메라 를 마우스 왼쪽 단추를 클릭 하 여 선택 하 고, 검사기 패널 에서 모든 구성 요소를 포함 하는 카메라 개체를 확인 합니다.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. 검사기 패널 의 맨 아래에 있는 구성 요소 추가 단추를 클릭 합니다.Click on the Add Component button located at the very bottom of the Inspector Panel.

    오디오 소스 추가

  7. 위에 표시 된 것 처럼 오디오 원본 이라는 구성 요소를 검색 합니다.Search for the component called Audio Source, as shown above.

  8. 또한 기본 카메라의 변형 구성 요소가 (0, 0, 0)로 설정 되어 있는지 확인 합니다. 카메라의 변형 구성 요소 옆에 있는 기어 아이콘을 누르고 다시 설정 을 선택 하 여이 작업을 수행할 수 있습니다.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. 변환 구성 요소는 다음과 같습니다.The Transform component should then look like:

    1. Position0, 0, 0으로 설정 됩니다.Position is set to 0, 0, 0.
    2. 회전0, 0, 0 으로 설정 됩니다.Rotation is set to 0, 0, 0.

    참고

    Microsoft HoloLens의 경우 기본 카메라카메라 구성 요소에 포함 된 다음도 변경 해야 합니다.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:

    • 플래그 지우기: 단색입니다.Clear Flags: Solid Color.
    • 배경 ' Black, Alpha 0 ' – 16 진수 색: #00000000.Background ‘Black, Alpha 0’ – Hex color: #00000000.
  9. 평면 을 마우스 왼쪽 단추를 클릭 하 여 선택 합니다.Left click on the Plane to select it. 검사기 패널 에서 변형 구성 요소를 다음 값으로 설정 합니다.In the Inspector Panel set the Transform component with the following values:

    X축X Axis Y축Y Axis Z 축Z Axis
    00 -1-1 00
  10. 구를 마우스 왼쪽 단추를 클릭 하 여 선택 합니다.Left click on the Sphere to select it. 검사기 패널 에서 변형 구성 요소를 다음 값으로 설정 합니다.In the Inspector Panel set the Transform component with the following values:

    X축X Axis Y축Y Axis Z 축Z Axis
    22 11 22
  11. 원통 을 마우스 왼쪽 단추를 클릭 하 여 선택 합니다.Left click on the Cylinder to select it. 검사기 패널 에서 변형 구성 요소를 다음 값으로 설정 합니다.In the Inspector Panel set the Transform component with the following values:

    X축X Axis Y축Y Axis Z 축Z Axis
    -2-2 11 22
  12. 큐브 를 마우스 왼쪽 단추를 클릭 하 여 선택 합니다.Left click on the Cube to select it. 검사기 패널 에서 변형 구성 요소를 다음 값으로 설정 합니다.In the Inspector Panel set the Transform component with the following values:

    변환 위치Transform - Position | 변환- 회전Transform - Rotation
    XX Y ZZ | XX Y ZZ
    00 11 44 | 4545 4545 00
  13. 새 텍스트 개체를 마우스 왼쪽 단추를 클릭 하 여 선택 합니다.Left click on the New Text object to select it. 검사기 패널 에서 변형 구성 요소를 다음 값으로 설정 합니다.In the Inspector Panel set the Transform component with the following values:

    변환 위치Transform - Position | 변환- 배율Transform - Scale
    XX Y ZZ | XX Y ZZ
    -2-2 66 99 | 0.10.1 0.10.1 0.10.1
  14. 텍스트 메시 구성 요소의 글꼴 크기50 로 변경 합니다.Change Font Size in the Text Mesh component to 50.

  15. 텍스트 메시 개체의 이름을 받아쓰기 텍스트로 변경 합니다.Change the name of the Text Mesh object to Dictation Text.

    3D 텍스트 개체 만들기

  16. 이제 계층 구조 패널 구조가 다음과 같이 표시 됩니다.Your Hierarchy Panel structure should now look like this:

    장면 뷰의 텍스트 메시

  17. 최종 장면은 아래 이미지와 같습니다.The final scene should look like the image below:

    장면 뷰입니다.

5 장-MicrophoneManager 클래스 만들기Chapter 5 – Create the MicrophoneManager class

만들려는 첫 번째 스크립트는 MicrophoneManager 클래스입니다.The first Script you are going to create is the MicrophoneManager class. 이를 수행 하 고 나면 Luismanager, 동작 클래스 및 마지막으로 응시 클래스 (각 챕터에 도달 하는 경우에도 적용 됨)를 만듭니다.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).

MicrophoneManager 클래스는 다음을 담당 합니다.The MicrophoneManager class is responsible for:

  • 헤드셋 또는 컴퓨터에 연결 된 기록 장치 검색 (기본 항목 중 하나)Detecting the recording device attached to the headset or machine (whichever is the default one).
  • 오디오 (음성)를 캡처하고 받아쓰기를 사용 하 여 문자열로 저장 합니다.Capture the audio (voice) and use dictation to store it as a string.
  • 음성이 일시 중지 되 면 받아쓰기를 Luismanager 클래스에 제출 합니다.Once the voice has paused, submit the dictation to the LuisManager class.

이 클래스를 만들려면:To create this class:

  1. 프로젝트 패널 을 마우스 오른쪽 단추로 클릭 하 > 폴더를 만듭니다.Right-click in the Project Panel, Create > Folder. 폴더 스크립트 를 호출 합니다.Call the folder Scripts.

    스크립트 폴더를 만듭니다.

  2. Scripts 폴더를 만든 다음 두 번 클릭 하 여 엽니다.With the Scripts folder created, double click it, to open. 그런 다음 해당 폴더 내에서 마우스 오른쪽 단추를 클릭 하 > c # 스크립트를 만듭니다.Then, within that folder, right-click, Create > C# Script. 스크립트 이름을 MicrophoneManager 로 합니다.Name the script MicrophoneManager.

  3. MicrophoneManager 를 두 번 클릭 하 여 Visual Studio 에서 엽니다.Double click on MicrophoneManager to open it with Visual Studio.

  4. 파일의 맨 위에 다음 네임 스페이스를 추가 합니다.Add the following namespaces to the top of the file:

        using UnityEngine;
        using UnityEngine.Windows.Speech;
    
  5. 그런 다음 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. 이제 활성 ()Start () 메서드에 대 한 코드를 추가 해야 합니다.Code for Awake() and Start() methods now needs to be added. 이러한 작업은 클래스가 초기화 될 때 호출 됩니다.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. 이제 앱이 음성 캡처를 시작 및 중지 하는 데 사용 하는 메서드를 사용 하 여 곧 빌드 될 Luismanager 클래스에 전달 해야 합니다.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. 음성이 일시 중지 될 때 호출 되는 받아쓰기 처리기 를 추가 합니다.Add a Dictation Handler that will be invoked when the voice pauses. 이 메서드는 받아쓰기 텍스트를 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);
        }
    

    중요

    이 클래스는 사용 하지 않으므로 Update () 메서드를 삭제 합니다.Delete the Update() method since this class will not use it.

  9. Unity 로 반환 하기 전에 Visual Studio 에서 변경 내용을 저장 해야 합니다.Be sure to save your changes in Visual Studio before returning to Unity.

    참고

    이 시점에서 Unity 편집기 콘솔 패널 에 오류가 나타납니다.At this point you will notice an error appearing in the Unity Editor Console Panel. 코드는 다음 챕터에서 만들 Luismanager 클래스를 참조 하기 때문입니다.This is because the code references the LuisManager class which you will create in the next Chapter.

6 장 – LUISManager 클래스 만들기Chapter 6 – Create the LUISManager class

Azure LUIS 서비스에 대 한 호출을 수행 하는 Luismanager 클래스를 만들 때입니다.It is time for you to create the LuisManager class, which will make the call to the Azure LUIS service.

이 클래스의 목적은 MicrophoneManager 클래스에서 받아쓰기 텍스트를 받고 분석 될 Azure Language Understanding API 로 보내는 것입니다.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.

이 클래스는 JSON 응답을 deserialize 하 고 동작 클래스의 적절 한 메서드를 호출 하 여 작업을 트리거합니다.This class will deserialize the JSON response and call the appropriate methods of the Behaviours class to trigger an action.

이 클래스를 만들려면:To create this class:

  1. 스크립트 폴더를 두 번 클릭 하 여 엽니다.Double click on the Scripts folder, to open it.

  2. Scripts 폴더 내부를 마우스 오른쪽 단추로 클릭 하 고 > c # 스크립트 만들기 를 클릭 합니다.Right-click inside the Scripts folder, click Create > C# Script. 스크립트 이름을 Luismanager 로 합니다.Name the script LuisManager.

  3. 스크립트를 두 번 클릭 하 여 Visual Studio에서 엽니다.Double click on the script to open it with Visual Studio.

  4. 파일의 맨 위에 다음 네임 스페이스를 추가 합니다.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. 먼저 Azure에서 deserialize 된 JSON 응답을 나타내는 동일한 스크립트 파일 ( Start () 메서드 위에 있는)의 luismanager 클래스 내에서 세 개의 클래스를 만듭니다.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. 그런 다음, 다음 변수를 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. LUIS 끝점을 지금 (LUIS 포털에서 수행할 수 있도록)에 두어야 합니다.Make sure to place your LUIS endpoint in now (which you will have from your LUIS portal).

  8. 이제 해제 () 메서드에 대 한 코드를 추가 해야 합니다.Code for the Awake() method now needs to be added. 이 메서드는 클래스가 초기화 될 때 호출 됩니다.This method will be called when the class initializes:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  9. 이제이 응용 프로그램에서 MicrophoneManager 클래스 로부터 받은 받아쓰기를 LUIS 로 보낸 다음 응답을 수신 및 deserialize 하는 데 사용 하는 메서드가 필요 합니다.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. 의도 및 연결 된 엔터티의 값이 확인 되 면 동작 클래스의 인스턴스에 전달 되어 의도 된 동작을 트리거합니다.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. 결과 AnalysedQuery 를 읽고 엔터티를 확인 하는 AnalyseResponseElements () 라는 새 메서드를 만듭니다.Create a new method called AnalyseResponseElements() that will read the resulting AnalysedQuery and determine the Entities. 이러한 엔터티가 결정 되 면 작업에서 사용할 동작 클래스의 인스턴스에 전달 됩니다.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;
            }
        }
    

    중요

    Start ()Update () 메서드는이 클래스에서 사용 하지 않으므로 삭제 합니다.Delete the Start() and Update() methods since this class will not use them.

  12. Unity 로 반환 하기 전에 Visual Studio 에서 변경 내용을 저장 해야 합니다.Be sure to save your changes in Visual Studio before returning to Unity.

참고

이 시점에서 Unity 편집기 콘솔 패널 에 몇 가지 오류가 표시 됩니다.At this point you will notice several errors appearing in the Unity Editor Console Panel. 코드는 다음 챕터에서 만들 동작 클래스를 참조 하기 때문입니다.This is because the code references the Behaviours class which you will create in the next Chapter.

7 장 – 동작 클래스 만들기Chapter 7 – Create the Behaviours class

동작 클래스는 luismanager 클래스에서 제공 하는 엔터티를 사용 하 여 작업을 트리거합니다.The Behaviours class will trigger the actions using the Entities provided by the LuisManager class.

이 클래스를 만들려면:To create this class:

  1. 스크립트 폴더를 두 번 클릭 하 여 엽니다.Double click on the Scripts folder, to open it.

  2. Scripts 폴더 내부를 마우스 오른쪽 단추로 클릭 하 고 > c # 스크립트 만들기 를 클릭 합니다.Right-click inside the Scripts folder, click Create > C# Script. 스크립트 이름을 동작 로 합니다.Name the script Behaviours.

  3. 스크립트를 두 번 클릭 하 여 Visual Studio 에서 엽니다.Double click on the script to open it with Visual Studio.

  4. 그런 다음 동작 클래스 안에 다음 변수를 추가 합니다.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. 활성 () 메서드 코드를 추가 합니다.Add the Awake() method code. 이 메서드는 클래스가 초기화 될 때 호출 됩니다.This method will be called when the class initializes:

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. 다음 메서드는 이전에 만든 Luismanager 클래스에서 호출 되어 쿼리의 대상인 개체를 확인 한 다음 적절 한 작업을 트리거합니다.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. Findtarget () 메서드를 추가 하 여 현재 의도의 대상인 gameobject 를 확인 합니다.Add the FindTarget() method to determine which of the GameObjects is the target of the current Intent. 이 메서드는 엔터티에 명시적 대상이 정의 되어 있지 않은 경우 대상의 기본값을 "gazed"로 GameObject 합니다.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;
        }
    

    중요

    Start ()Update () 메서드는이 클래스에서 사용 하지 않으므로 삭제 합니다.Delete the Start() and Update() methods since this class will not use them.

  8. Unity 로 반환 하기 전에 Visual Studio 에서 변경 내용을 저장 해야 합니다.Be sure to save your changes in Visual Studio before returning to Unity.

8 장-응시 클래스 만들기Chapter 8 – Create the Gaze Class

이 앱을 완료 하는 데 필요한 마지막 클래스는 응시 클래스입니다.The last class that you will need to complete this app is the Gaze class. 이 클래스는 현재 사용자의 시각적 포커스에 있는 GameObject 에 대 한 참조를 업데이트 합니다.This class updates the reference to the GameObject currently in the user’s visual focus.

이 클래스를 만들려면:To create this Class:

  1. 스크립트 폴더를 두 번 클릭 하 여 엽니다.Double click on the Scripts folder, to open it.

  2. Scripts 폴더 내부를 마우스 오른쪽 단추로 클릭 하 고 > c # 스크립트 만들기 를 클릭 합니다.Right-click inside the Scripts folder, click Create > C# Script. 스크립트 이름을 응시 로 합니다.Name the script Gaze.

  3. 스크립트를 두 번 클릭 하 여 Visual Studio 에서 엽니다.Double click on the script to open it with Visual Studio.

  4. 이 클래스에 대해 다음 코드를 삽입 합니다.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. Unity 로 반환 하기 전에 Visual Studio 에서 변경 내용을 저장 해야 합니다.Be sure to save your changes in Visual Studio before returning to Unity.

9 장-장면 설정 완료Chapter 9 – Completing the scene setup

  1. 장면의 설정을 완료 하려면 Scripts 폴더에서 만든 각 스크립트를 계층 패널기본 카메라 개체로 끕니다.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. 주 카메라 를 선택 하 고 검사기 패널 에서 연결 된 각 스크립트를 볼 수 있어야 하며, 아직 설정 하지 않은 각 스크립트에 대 한 매개 변수가 있다는 것을 알 수 있습니다.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.

    카메라 참조 대상을 설정 합니다.

  3. 이러한 매개 변수를 올바르게 설정 하려면 다음 지침을 따르세요.To set these parameters correctly, follow these instructions:

    1. MicrophoneManager:MicrophoneManager:

      • 계층 패널 에서 받아쓰기 텍스트 개체를 받아쓰기 텍스트 매개 변수 값 상자로 끌어옵니다.From the Hierarchy Panel, drag the Dictation Text object into the Dictation Text parameter value box.
    2. 계층 패널 에서 동작:Behaviours, from the Hierarchy Panel:

      • 개체를 참조 대상 상자로 끌어 옵니다.Drag the Sphere object into the Sphere reference target box.
      • 원통을 원통 참조 대상 상자로 끌어 옵니다.Drag the Cylinder into the Cylinder reference target box.
      • 큐브를 큐브 참조 대상 상자로 끌어 옵니다.Drag the Cube into the Cube reference target box.
    3. 응시:Gaze:

      • 응시 최대 거리300 (아직 없는 경우)로 설정 합니다.Set the Gaze Max Distance to 300 (if it is not already).
  4. 결과는 아래 이미지와 같아야 합니다.The result should look like the image below:

    카메라 참조 대상을 표시 합니다 (이제 설정).

10 장-Unity 편집기에서 테스트Chapter 10 – Test in the Unity Editor

장면 설정이 제대로 구현 되었는지 테스트 합니다.Test that the Scene setup is properly implemented.

다음 사항을 확인합니다.Ensure that:

  • 모든 스크립트는 주 카메라 개체에 연결 됩니다.All the scripts are attached to the Main Camera object.
  • 기본 카메라 검사기 패널 의 모든 필드가 제대로 할당 됩니다.All the fields in the Main Camera Inspector Panel are assigned properly.
  1. Unity 편집기 에서 재생 단추를 누릅니다.Press the Play button in the Unity Editor. 앱은 연결 된 모던 헤드셋 내에서 실행 되어야 합니다.The App should be running within the attached immersive headset.

  2. 다음과 같은 몇 가지 길이 발언 시도 합니다.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
    

    참고

    Unity 콘솔에 기본 오디오 장치 변경에 대 한 오류가 표시 되 면 장면이 예상 대로 작동 하지 않을 수 있습니다.If you see an error in the Unity console about the default audio device changing, the scene may not function as expected. 이는 혼합 현실 포털이이를 포함 하는 헤드셋의 기본 제공 마이크를 처리 하는 방식 때문입니다.This is due to the way the mixed reality portal deals with built-in microphones for headsets that have them. 이 오류가 표시 되 면 장면을 중지 하 고 다시 시작 하 고 예상 대로 작동 해야 합니다.If you see this error, simply stop the scene and start it again and things should work as expected.

11 장-UWP 솔루션 빌드 및 테스트용으로 로드Chapter 11 – Build and sideload the UWP Solution

Unity 편집기에서 응용 프로그램이 작동 하는지 확인 한 후에는 빌드 및 배포할 준비가 된 것입니다.Once you have ensured that the application is working in the Unity Editor, you are ready to Build and Deploy.

빌드:To Build:

  1. 파일 > 저장 을 클릭 하 여 현재 장면을 저장 합니다.Save the current scene by clicking on File > Save.

  2. 파일 > 빌드 설정 으로 이동 합니다.Go to File > Build Settings.

  3. Unity c # 프로젝트 라고 하는 상자입니다 (UWP 프로젝트를 만든 후 코드를 보고 디버깅 하는 데 유용).Tick the box called Unity C# Projects (useful for seeing and debugging your code once the UWP project is created.

  4. 열려 있는 장면 추가 를 클릭 한 다음 빌드 를 클릭 합니다.Click on Add Open Scenes, then click Build.

    빌드 설정 창

  5. 솔루션을 빌드하는 데 사용할 폴더를 선택 하 라는 메시지가 표시 됩니다.You will be prompted to select the folder where you want to build the Solution.

  6. 빌드 폴더를 만들고 해당 폴더 내에서 원하는 적절 한 이름을 사용 하 여 다른 폴더를 만듭니다.Create a BUILDS folder and within that folder create another folder with an appropriate name of your choice.

  7. 폴더 선택 을 클릭 하 여 해당 위치에서 빌드를 시작 합니다.Click Select Folder to begin the build at that location.

    빌드 폴더 만들기  빌드 폴더 선택Create Builds Folder Select Builds Folder

  8. Unity가 빌드를 완료 하면 (시간이 걸릴 수 있음) 빌드 위치에서 파일 탐색기 창을 열어야 합니다.Once Unity has finished building (it might take some time), it should open a File Explorer window at the location of your build.

로컬 컴퓨터에 배포 하려면 다음을 수행 합니다.To Deploy on Local Machine:

  1. Visual Studio 에서 이전 챕터에서 만든 솔루션 파일을 엽니다.In Visual Studio, open the solution file that has been created in the previous Chapter.

  2. 솔루션 플랫폼 에서 X86, 로컬 컴퓨터 를 선택 합니다.In the Solution Platform, select x86, Local Machine.

  3. 솔루션 구성 에서 디버그 를 선택 합니다.In the Solution Configuration select Debug.

    Microsoft HoloLens의 경우 컴퓨터에 테더 링 된 하지 않도록 원격 컴퓨터 를 설정 하는 것이 더 쉬울 수 있습니다.For the Microsoft HoloLens, you may find it easier to set this to Remote Machine, so that you are not tethered to your computer. 그러나 다음을 수행 해야 합니다.Though, you will need to also do the following:

    • HoloLens의 IP 주소 를 알고 있습니다 .이 주소는 설정 > 네트워크 & 인터넷 > Wi-Fi > 고급 옵션 에서 찾을 수 있습니다. IPv4는 사용 해야 하는 주소입니다.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.
    • 개발자 모드가 설정 되어 있는지 확인 합니다. 개발자를 위한 업데이트 & 보안 > > 설정 에서 찾을 수 있습니다.Ensure Developer Mode is On; found in Settings > Update & Security > For developers.

    앱 배포

  4. 빌드 메뉴로 이동 하 여 솔루션 배포 를 클릭 하 여 응용 프로그램을 컴퓨터에 테스트용으로 로드.Go to the Build menu and click on Deploy Solution to sideload the application to your machine.

  5. 이제 앱이 설치 된 앱 목록에 표시 되어 시작 될 준비가 되었습니다.Your App should now appear in the list of installed apps, ready to be launched!

  6. 앱이 시작 되 면 마이크 에 대 한 액세스 권한을 부여 하 라는 메시지가 표시 됩니다.Once launched, the App will prompt you to authorize access to the Microphone. 동작 컨트롤러 또는 음성 입력 을 사용 하거나 키보드 를 사용 하 여 단추를 누릅니다.Use the Motion Controllers, or Voice Input, or the Keyboard to press the YES button.

12 장-LUIS 서비스 개선Chapter 12 – Improving your LUIS service

중요

이 장은 매우 중요 하며, LUIS 서비스의 정확도를 향상 시키는 데 도움이 되므로 몇 번 반복 해야 할 수 있습니다 .이 작업을 완료 해야 합니다.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.

LUIS에서 제공 하는 이해 수준을 개선 하려면 새로운 길이 발언을 캡처하고 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.

예를 들어 "증가" 및 "업사이징"을 이해 하기 위해 학습 된 LUIS가 있을 수 있지만, 앱에서 "확대"와 같은 단어를 이해 하 고 싶으세요?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”?

응용 프로그램을 몇 번 사용한 후에는 LUIS에 의해 수집 되며 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. 링크를 따라 포털 응용 프로그램으로 이동 하 여 로그인 합니다.Go to your portal application following this LINK, and Log In.

  2. MS 자격 증명을 사용 하 여 로그인 하면 앱 이름을 클릭 합니다.Once you are logged in with your MS Credentials, click on your App name.

  3. 페이지 왼쪽에서 endpoint 길이 발언 검토 단추를 클릭 합니다.Click the Review endpoint utterances button on the left of the page.

    길이 발언 검토

  4. 혼합 현실 응용 프로그램에 의해 LUIS로 전송 된 길이 발언 목록이 표시 됩니다.You will be shown a list of the Utterances that have been sent to LUIS by your mixed reality Application.

    길이 발언 목록

일부 강조 된 엔터티 를 확인할 수 있습니다.You will notice some highlighted Entities.

강조 표시 된 각 단어를 마우스로 가리키면 각 Utterance를 검토 하 고 올바르게 인식 된 엔터티, 잘못 된 엔터티 및 누락 된 엔터티를 확인할 수 있습니다.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.

위의 예에서는 "스피어" 라는 단어가 대상으로 강조 표시 된 것을 발견 했으므로 실수를 수정 해야 합니다 .이 작업은 단어를 마우스로 가리키고 레이블 제거 를 클릭 하 여 수행 됩니다.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.

길이 발언  제거 레이블 이미지를 선택 합니다.Check utterances Remove Label Image

  1. 완전히 잘못 된 길이 발언를 찾으면 화면 오른쪽에 있는 삭제 단추를 사용 하 여 삭제할 수 있습니다.If you find Utterances that are completely wrong, you can delete them using the Delete button on the right side of the screen.

    잘못 된 길이 발언 삭제

  2. 또는 LUIS가 Utterance를 올바르게 해석 한 경우 정렬 된 의도에 추가 단추를 사용 하 여 해당 이해의 유효성을 검사할 수 있습니다.Or if you feel that LUIS has interpreted the Utterance correctly, you can validate its understanding by using the Add To Aligned Intent button.

    정렬 된 의도에 추가

  3. 표시 된 모든 길이 발언를 정렬 한 후 페이지를 다시 로드 하 여 더 많은 사용 가능한 지 확인 합니다.Once you have sorted all the displayed Utterances, try and reload the page to see if more are available.

  4. 응용 프로그램 이해를 향상 시키기 위해 가능한 한 많은 횟수로이 프로세스를 반복 하는 것이 매우 중요 합니다.It is very important to repeat this process as many times as possible to improve your application understanding.

즐거운 시간 보내세요!Have fun!

완성 된 LUIS 통합 응용 프로그램Your finished LUIS Integrated application

축 하 합니다. Azure Language Understanding Intelligence 서비스를 활용 하 여 사용자에 게 표시 되는 내용을 이해 하 고 해당 정보에 대해 조치를 취하는 혼합 현실 앱을 빌드 했습니다.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.

랩 결과

보너스 연습Bonus exercises

연습 1Exercise 1

이 응용 프로그램을 사용 하는 동안 개체를 응시 하 고 색을 변경 하도록 요청 하면이 작업을 수행 하는 것을 알 수 있습니다.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. 응용 프로그램이 바닥 색을 변경 하는 것을 중지 하는 방법을 알아볼 수 있나요?Can you work out how to stop your application from changing the Floor color?

연습 2Exercise 2

LUIS 및 앱 기능을 확장 하 여 장면의 개체에 대 한 기능을 추가 해 보세요. 예를 들어 사용자에 게 표시 되는 내용에 따라 응시 적중 지점에서 새 개체를 만든 다음 기존 명령과 함께 현재 장면 개체와 함께 해당 개체를 사용할 수 있습니다.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.