HoloLens(1세대) 입력 212: 음성

중요

Mixed Reality Academy 자습서는 HoloLens(1세대), Unity 2017 및 Mixed Reality 몰입형 헤드셋을 염두에 두고 설계되었습니다. 따라서 이러한 디바이스 개발에 대한 지침을 계속 찾고 있는 개발자를 위해 이러한 자습서를 그대로 두는 것이 중요합니다. 이러한 자습서는 HoloLens 2 사용되는 최신 도구 집합 또는 상호 작용으로 업데이트되지 않으며 최신 버전의 Unity와 호환되지 않을 수 있습니다. 대신 지원되는 디바이스에서 계속 작동하도록 유지 관리됩니다. HoloLens 2에 대한 새로운 자습서 시리즈가 게시되었습니다.

음성 입력 은 홀로그램과 상호 작용하는 또 다른 방법을 제공합니다. 음성 명령은 매우 자연스럽고 쉬운 방식으로 작동합니다. 음성 명령이 다음과 같이 디자인되도록 디자인합니다.

  • Natural
  • 기억하기 쉬운
  • 적절한 컨텍스트
  • 동일한 컨텍스트 내의 다른 옵션과 충분히 구별됩니다.

MR Basics 101에서는 KeywordRecognizer를 사용하여 두 개의 간단한 음성 명령을 빌드했습니다. MR 입력 212에서 자세히 알아보고 다음 방법을 알아봅니다.

  • HoloLens 음성 엔진에 최적화된 음성 명령을 디자인합니다.
  • 사용 가능한 음성 명령을 사용자에게 알 수 있도록 합니다.
  • 사용자의 음성 명령을 들었습니다.
  • 받아쓰기 인식기를 사용하여 사용자가 말하는 내용을 이해합니다.
  • Grammar Recognizer를 사용하여 SRGS 또는 음성 인식 문법 사양 파일을 기반으로 명령을 수신 대기합니다.

이 과정에서는 MR 입력 210 및 MR 입력 211에서 빌드한 모델 Explorer 다시 살펴보겠습니다.

중요

아래 각 챕터에 포함된 비디오는 이전 버전의 Unity 및 Mixed Reality 도구 키트를 사용하여 녹화되었습니다. 단계별 지침은 정확하고 최신이지만 해당 비디오에서 오래된 스크립트와 시각적 개체를 볼 수 있습니다. 비디오는 후손을 위해 포함 된 상태로 남아 있으며 다루는 개념이 여전히 적용되므로.

디바이스 지원

과정 HoloLens 몰입형 헤드셋
MR 입력 212: 음성 ✔️ ✔️

시작하기 전에

필수 구성 요소

프로젝트 파일

  • 프로젝트에 필요한 파일을 다운로드합니다. Unity 2017.2 이상이 필요합니다.
  • 바탕 화면 또는 기타 쉽게 연결할 수 있는 위치에 파일을 보관 해제합니다.

참고

다운로드하기 전에 소스 코드를 살펴보려면 GitHub에서 사용할 수 있습니다.

Errata 및 Notes

  • 코드의 중단점을 적중하려면 Visual Studio에서 도구 옵션->>디버깅에서 "내 코드만 사용"을 사용하지 않도록 설정(선택 취소)해야 합니다.

Unity 설정

지침

  1. Unity를 시작합니다.
  2. 열기를 선택합니다.
  3. 이전에 보관하지 않은 HolographicAcademy-Holograms-212-Voice 폴더로 이동합니다.
  4. 시작/모델 Explorer 폴더를 찾아 선택합니다.
  5. 폴더 선택 단추를 클릭합니다.
  6. 프로젝트 패널에서 Scenes 폴더를 확장합니다.
  7. ModelExplorer 장면을 두 번 클릭하여 Unity에 로드합니다.

빌딩

  1. Unity에서 파일 > 빌드 설정을 선택합니다.
  2. Scenes/ModelExplorer빌드의 장면에 나열되지 않은 경우 열린 장면 추가를 클릭하여 장면을 추가합니다.
  3. HoloLens용으로 특별히 개발하는 경우 대상 디바이스HoloLens로 설정합니다. 그렇지 않으면 모든 디바이스에 그대로 둡니다.
  4. 빌드 유형D3D로 설정되고 SDK최신 설치됨(SDK 16299 이상이어야 합니다)으로 설정되어 있는지 확인합니다.
  5. 빌드를 클릭한 다음
  6. "App"이라는 새 폴더 를 만듭니다.
  7. 폴더를 한 번 클릭합니다.
  8. 폴더 선택을 누르면 Unity가 Visual Studio용 프로젝트 빌드를 시작합니다.

Unity가 완료되면 파일 탐색기 창이 나타납니다.

  1. App 폴더를 엽니다.
  2. ModelExplorer Visual Studio Solution을 엽니다.

HoloLens에 배포하는 경우:

  1. Visual Studio에서 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스 로, ARM에서 x86으로 변경합니다.
  2. 로컬 컴퓨터 단추 옆에 있는 드롭다운 화살표를 클릭하고 원격 머신을 선택합니다.
  3. HoloLens 디바이스 IP 주소를 입력하고 인증 모드를 유니버설(암호화되지 않은 프로토콜)로 설정합니다. 선택을 클릭합니다. 디바이스 IP 주소를 모르는 경우 설정 > 네트워크 & 인터넷 > 고급 옵션을 참조하세요.
  4. 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다. 디바이스에 처음 배포하는 경우 Visual Studio와 페어링해야 합니다.
  5. 앱이 배포되면 선택 제스처Fitbox를 해제합니다.

몰입형 헤드셋에 배포하는 경우:

  1. Visual Studio의 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스 로, ARM에서 x64로 변경합니다.
  2. 배포 대상이 로컬 컴퓨터로 설정되어 있는지 확인합니다.
  3. 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다.
  4. 앱이 배포되면 동작 컨트롤러에서 트리거를 끌어 와 Fitbox 를 해제합니다.

참고

Visual Studio 오류 패널에서 빨간색 오류가 표시될 수 있습니다. 무시해도 안전합니다. 출력 패널로 전환하여 실제 빌드 진행률을 확인합니다. 출력 패널의 오류는 수정해야 합니다(대부분 스크립트의 실수로 인해 발생함).

1장 - 인식

목표

  • 음성 명령 디자인 의 Dos 및 Don'ts에 대해 알아봅니다.
  • KeywordRecognizer를 사용하여 응시 기반 음성 명령을 추가합니다.
  • 커서 피드백을 사용하여 사용자가 음성 명령을 인식할 수 있도록 합니다.

음성 명령 디자인

이 챕터에서는 음성 명령 디자인에 대해 알아봅니다. 음성 명령을 만들 때:

DO

  • 간결한 명령을 만듭니다. 해당 명령은 간결하지 않고 사용자가 쉽게 잊어버리기 때문에 "현재 선택한 비디오 재생"을 사용하지 않습니다. 대신 간결하고 음절이 여러 대 있으므로 "비디오 재생"을 사용해야 합니다.
  • 간단한 어휘를 사용합니다. 항상 사용자가 쉽게 검색하고 기억할 수 있는 일반적인 단어와 구를 사용하려고 합니다. 예를 들어 애플리케이션에 표시하거나 보기에서 숨길 수 있는 메모 개체가 있는 경우 "플래카드 표시" 명령은 거의 사용되지 않으므로 사용하지 않을 것입니다. 대신 "메모 표시" 명령을 사용하여 애플리케이션에서 메모를 표시합니다.
  • 일관성을 유지합니다. 음성 명령은 애플리케이션 전체에서 일관되게 유지되어야 합니다. 애플리케이션에 두 장면이 있고 두 장면 모두 애플리케이션을 닫는 단추가 포함되어 있다고 상상해 보세요. 첫 번째 장면에서 "Exit" 명령을 사용하여 단추를 트리거했지만 두 번째 장면에서 "앱 닫기" 명령을 사용한 경우 사용자는 매우 혼란스러워집니다. 동일한 기능이 여러 장면에서 유지되는 경우 동일한 음성 명령을 사용하여 트리거해야 합니다.

안 함

  • 단일 음절 명령을 사용합니다. 예를 들어 비디오를 재생하는 음성 명령을 만드는 경우 단일 음절일 뿐이며 시스템에서 쉽게 놓칠 수 있으므로 간단한 명령 "Play"를 사용하지 않아야 합니다. 대신 간결하고 음절이 여러 대 있으므로 "비디오 재생"을 사용해야 합니다.
  • 시스템 명령을 사용합니다. "Select" 명령은 현재 포커스가 있는 개체에 대한 Tap 이벤트를 트리거하기 위해 시스템에서 예약합니다. 예상대로 작동하지 않을 수 있으므로 키워드(keyword) 또는 구에서 "Select" 명령을 다시 사용하지 마세요. 예를 들어 애플리케이션에서 큐브를 선택하기 위한 음성 명령이 "큐브 선택"이지만 사용자가 명령을 발화할 때 구를 보고 있는 경우 구가 대신 선택됩니다. 마찬가지로 앱 바 명령은 음성을 사용하도록 설정됩니다. CoreWindow 보기에서 다음 음성 명령을 사용하지 마세요.
    1. 뒤로 이동
    2. 스크롤 도구
    3. 확대/축소 도구
    4. 끌기 도구
    5. Adjust
    6. 제거
  • 비슷한 소리를 사용합니다. 운율 음성 명령을 사용하지 않도록 합니다. 음성 명령으로 "스토어 표시""자세히 표시" 를 지원하는 쇼핑 애플리케이션이 있는 경우 다른 명령이 사용 중일 때 명령 중 하나를 사용하지 않도록 설정하려고 합니다. 예를 들어 "스토어 표시" 단추를 사용하여 스토어를 연 다음 스토어가 표시될 때 해당 명령을 사용하지 않도록 설정하여 "자세히 표시" 명령을 검색에 사용할 수 있습니다.

지침

  • Unity의 계층 구조 패널에서 검색 도구를 사용하여 holoComm_screen_mesh 개체를 찾습니다.
  • holoComm_screen_mesh 개체를 두 번 클릭하여 장면에서 볼 수 있습니다. 이것은 우리의 음성 명령에 응답하는 우주 비행사의 watch.
  • 검사기 패널에서 Speech Input Source(스크립트) 구성 요소를 찾습니다.
  • 키워드 섹션을 확장하여 지원되는 음성 명령인 Communicator 열기를 확인합니다.
  • 오른쪽에 있는 톱바퀴를 클릭한 다음 스크립트 편집을 선택합니다.
  • SpeechInputSource.cs를 탐색하여 KeywordRecognizer를 사용하여 음성 명령을 추가하는 방법을 이해합니다.

빌드 및 배포

  • Unity에서 파일 > 빌드 설정을 사용하여 애플리케이션을 다시 빌드합니다.
  • App 폴더를 엽니다.
  • ModelExplorer Visual Studio Solution을 엽니다.

설정 중에 Visual Studio에서 이 프로젝트를 이미 빌드/배포한 경우 VS의 instance 열고 메시지가 표시되면 '모두 다시 로드'를 클릭할 수 있습니다.

  • Visual Studio에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다.
  • 애플리케이션이 HoloLens에 배포된 후 에어 탭 제스처를 사용하여 맞춤 상자를 닫습니다.
  • 우주 비행사의 watch 응시합니다.
  • watch 포커스가 있는 경우 커서가 마이크로 변경되는지 확인합니다. 그러면 애플리케이션이 음성 명령을 수신 대기하고 있다는 피드백이 제공됩니다.
  • 도구 설명이 watch 표시되는지 확인합니다. 이렇게 하면 사용자가 "Communicator 열기" 명령을 검색할 수 있습니다.
  • watch 응시하는 동안 "Communicator 열기"라고 말하여 커뮤니케이터 패널을 엽니다.

2장 - 승인

목표

  • 마이크 입력을 사용하여 메시지를 기록합니다.
  • 애플리케이션이 음성을 듣고 있다는 피드백을 사용자에게 제공합니다.

참고

앱이 마이크에서 녹음하려면 마이크 기능을 선언해야 합니다. 이 작업은 MR 입력 212에서 이미 수행되지만 사용자 고유의 프로젝트에 유의하세요.

  1. Unity 편집기에서 "프로젝트 설정 플레이어 편집 > "으로 이동하여 플레이어 설정 > 으로 이동합니다.
  2. "유니버설 Windows 플랫폼" 탭을 클릭합니다.
  3. "게시 설정 > 기능" 섹션에서 마이크 기능을 검사.

지침

  • Unity의 계층 구조 패널에서 holoComm_screen_mesh 개체가 선택되어 있는지 확인합니다.
  • 검사기 패널에서 우주 비행사 조사식(스크립트) 구성 요소를 찾습니다.
  • Communicator Prefab 속성의 값으로 설정된 작은 파란색 큐브를 클릭합니다.
  • 이제 프로젝트 패널에서 Communicator 프리팹에 포커스가 있어야 합니다.
  • 프로젝트 패널에서 Communicator 프리팹을 클릭하여 검사기에서 해당 구성 요소를 봅니다.
  • 마이크 관리자(스크립트) 구성 요소를 살펴보면 사용자의 음성을 녹음할 수 있습니다.
  • Communicator 개체에는 메시지 보내기 명령에 응답하기 위한 Speech Input Handler(스크립트) 구성 요소가 있습니다.
  • Communicator(스크립트) 구성 요소를 확인하고 스크립트를 두 번 클릭하여 Visual Studio에서 엽니다.

Communicator.cs는 통신 장치에서 적절한 단추 상태를 설정하는 역할을 담당합니다. 이렇게 하면 사용자가 메시지를 기록하고, 재생하고, 우주 비행사에게 메시지를 보낼 수 있습니다. 또한 애니메이션된 웨이브 양식을 시작하고 중지하여 음성이 들렸다는 것을 사용자에게 인정합니다.

  • Communicator.csStart 메서드에서 다음 줄(81 및 82)을 삭제합니다. 이렇게 하면 통신기에서 '레코드' 단추가 활성화됩니다.
// TODO: 2.a Delete the following two lines:
RecordButton.SetActive(false);
MessageUIRenderer.gameObject.SetActive(false);

빌드 및 배포

  • Visual Studio에서 애플리케이션을 다시 빌드하고 디바이스에 배포합니다.
  • 우주 비행사의 watch 응시하고 "커뮤니케이터 열기"라고 말하여 의사 소통자를 표시합니다.
  • 기록 단추(마이크)를 눌러 우주 비행사에 대한 구두 메시지 녹음을 시작합니다.
  • 말하기를 시작하고, 음성이 들리도록 사용자에게 피드백을 제공하는 통신기에서 웨이브 애니메이션이 재생되는지 확인합니다.
  • 중지 단추(왼쪽 정사각형)를 누르고 웨이브 애니메이션의 실행이 중지되는지 확인합니다.
  • 재생 단추(오른쪽 삼각형)를 눌러 기록된 메시지를 재생하고 장치에서 듣습니다.
  • 중지 단추(오른쪽 정사각형)를 눌러 기록된 메시지의 재생을 중지합니다.
  • "메시지 보내기"라고 말하여 통신자를 닫고 우주 비행사로부터 '메시지 수신' 응답을 받습니다.

3장 - 받아쓰기 인식기 이해

목표

  • 받아쓰기 인식기를 사용하여 사용자의 음성을 텍스트로 변환합니다.
  • 의사 소통자에 받아쓰기 인식기 가설 및 최종 결과를 표시합니다.

이 챕터에서는 받아쓰기 인식기를 사용하여 우주 비행사에 대한 메시지를 만듭니다. 받아쓰기 인식기를 사용하는 경우 다음 사항에 유의하세요.

  • 받아쓰기 인식기가 작동하려면 WiFi에 연결되어 있어야 합니다.
  • 시간 제한은 설정된 기간 후에 발생합니다. 다음 두 가지 시간 제한에 유의해야 합니다.
    • 인식기가 시작되고 처음 5초 동안 오디오가 들리지 않으면 시간 초과됩니다.
    • 인식기가 결과를 제공했지만 20초 동안 무음이 들리면 시간이 초과됩니다.
  • 한 번에 하나의 인식기 유형(키워드 또는 받아쓰기)만 실행할 수 있습니다.

참고

앱이 마이크에서 녹음하려면 마이크 기능을 선언해야 합니다. 이 작업은 MR 입력 212에서 이미 수행되지만 사용자 고유의 프로젝트에 유의하세요.

  1. Unity 편집기에서 "프로젝트 설정 플레이어 편집 > "으로 이동하여 플레이어 설정 > 으로 이동합니다.
  2. "유니버설 Windows 플랫폼" 탭을 클릭합니다.
  3. "게시 설정 > 기능" 섹션에서 마이크 기능을 검사.

지침

Dictation Recognizer를 사용하도록 MicrophoneManager.cs 를 편집하겠습니다. 다음과 같이 추가하겠습니다.

  1. 레코드 단추를 누르면 DictationRecognizer가 시작됩니다.
  2. DictationRecognizer가 이해한 내용의 가설 을 표시합니다.
  3. DictationRecognizer가 이해한 결과를 잠급니다.
  4. DictationRecognizer에서 시간 제한을 확인합니다.
  5. 중지 단추를 누르거나 마이크 세션 시간이 초과되면 DictationRecognizer를 중지합니다.
  6. 메시지 보내기 명령을 수신 대기하는 KeywordRecognizer를 다시 시작합니다.

이제 시작하겠습니다. MicrophoneManager.cs에서 3.a에 대한 모든 코딩 연습을 완료하거나 아래에 있는 완성된 코드를 복사하여 붙여넣습니다.

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Windows.Speech;

namespace Academy
{
    public class MicrophoneManager : MonoBehaviour
    {
        [Tooltip("A text area for the recognizer to display the recognized strings.")]
        [SerializeField]
        private Text dictationDisplay;

        private DictationRecognizer dictationRecognizer;

        // Use this string to cache the text currently displayed in the text box.
        private StringBuilder textSoFar;

        // Using an empty string specifies the default microphone.
        private static string deviceName = string.Empty;
        private int samplingRate;
        private const int messageLength = 10;

        // Use this to reset the UI once the Microphone is done recording after it was started.
        private bool hasRecordingStarted;

        void Awake()
        {
            /* TODO: DEVELOPER CODING EXERCISE 3.a */

            // 3.a: Create a new DictationRecognizer and assign it to dictationRecognizer variable.
            dictationRecognizer = new DictationRecognizer();

            // 3.a: Register for dictationRecognizer.DictationHypothesis and implement DictationHypothesis below
            // This event is fired while the user is talking. As the recognizer listens, it provides text of what it's heard so far.
            dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

            // 3.a: Register for dictationRecognizer.DictationResult and implement DictationResult below
            // This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
            dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

            // 3.a: Register for dictationRecognizer.DictationComplete and implement DictationComplete below
            // This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
            dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

            // 3.a: Register for dictationRecognizer.DictationError and implement DictationError below
            // This event is fired when an error occurs.
            dictationRecognizer.DictationError += DictationRecognizer_DictationError;

            // Query the maximum frequency of the default microphone. Use 'unused' to ignore the minimum frequency.
            int unused;
            Microphone.GetDeviceCaps(deviceName, out unused, out samplingRate);

            // Use this string to cache the text currently displayed in the text box.
            textSoFar = new StringBuilder();

            // Use this to reset the UI once the Microphone is done recording after it was started.
            hasRecordingStarted = false;
        }

        void Update()
        {
            // 3.a: Add condition to check if dictationRecognizer.Status is Running
            if (hasRecordingStarted && !Microphone.IsRecording(deviceName) && dictationRecognizer.Status == SpeechSystemStatus.Running)
            {
                // Reset the flag now that we're cleaning up the UI.
                hasRecordingStarted = false;

                // This acts like pressing the Stop button and sends the message to the Communicator.
                // If the microphone stops as a result of timing out, make sure to manually stop the dictation recognizer.
                // Look at the StopRecording function.
                SendMessage("RecordStop");
            }
        }

        /// <summary>
        /// Turns on the dictation recognizer and begins recording audio from the default microphone.
        /// </summary>
        /// <returns>The audio clip recorded from the microphone.</returns>
        public AudioClip StartRecording()
        {
            // 3.a Shutdown the PhraseRecognitionSystem. This controls the KeywordRecognizers
            PhraseRecognitionSystem.Shutdown();

            // 3.a: Start dictationRecognizer
            dictationRecognizer.Start();

            // 3.a Uncomment this line
            dictationDisplay.text = "Dictation is starting. It may take time to display your text the first time, but begin speaking now...";

            // Set the flag that we've started recording.
            hasRecordingStarted = true;

            // Start recording from the microphone for 10 seconds.
            return Microphone.Start(deviceName, false, messageLength, samplingRate);
        }

        /// <summary>
        /// Ends the recording session.
        /// </summary>
        public void StopRecording()
        {
            // 3.a: Check if dictationRecognizer.Status is Running and stop it if so
            if (dictationRecognizer.Status == SpeechSystemStatus.Running)
            {
                dictationRecognizer.Stop();
            }

            Microphone.End(deviceName);
        }

        /// <summary>
        /// This event is fired while the user is talking. As the recognizer listens, it provides text of what it's heard so far.
        /// </summary>
        /// <param name="text">The currently hypothesized recognition.</param>
        private void DictationRecognizer_DictationHypothesis(string text)
        {
            // 3.a: Set DictationDisplay text to be textSoFar and new hypothesized text
            // We don't want to append to textSoFar yet, because the hypothesis may have changed on the next event
            dictationDisplay.text = textSoFar.ToString() + " " + text + "...";
        }

        /// <summary>
        /// This event is fired after the user pauses, typically at the end of a sentence. The full recognized string is returned here.
        /// </summary>
        /// <param name="text">The text that was heard by the recognizer.</param>
        /// <param name="confidence">A representation of how confident (rejected, low, medium, high) the recognizer is of this recognition.</param>
        private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
        {
            // 3.a: Append textSoFar with latest text
            textSoFar.Append(text + ". ");

            // 3.a: Set DictationDisplay text to be textSoFar
            dictationDisplay.text = textSoFar.ToString();
        }

        /// <summary>
        /// This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.
        /// Typically, this will simply return "Complete". In this case, we check to see if the recognizer timed out.
        /// </summary>
        /// <param name="cause">An enumerated reason for the session completing.</param>
        private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
        {
            // If Timeout occurs, the user has been silent for too long.
            // With dictation, the default timeout after a recognition is 20 seconds.
            // The default timeout with initial silence is 5 seconds.
            if (cause == DictationCompletionCause.TimeoutExceeded)
            {
                Microphone.End(deviceName);

                dictationDisplay.text = "Dictation has timed out. Please press the record button again.";
                SendMessage("ResetAfterTimeout");
            }
        }

        /// <summary>
        /// This event is fired when an error occurs.
        /// </summary>
        /// <param name="error">The string representation of the error reason.</param>
        /// <param name="hresult">The int representation of the hresult.</param>
        private void DictationRecognizer_DictationError(string error, int hresult)
        {
            // 3.a: Set DictationDisplay text to be the error string
            dictationDisplay.text = error + "\nHRESULT: " + hresult;
        }

        /// <summary>
        /// The dictation recognizer may not turn off immediately, so this call blocks on
        /// the recognizer reporting that it has actually stopped.
        /// </summary>
        public IEnumerator WaitForDictationToStop()
        {
            while (dictationRecognizer != null && dictationRecognizer.Status == SpeechSystemStatus.Running)
            {
                yield return null;
            }
        }
    }
}

빌드 및 배포

  • Visual Studio에서 다시 빌드하고 디바이스에 배포합니다.
  • 에어 탭 제스처로 맞춤 상자를 닫습니다.
  • 우주 비행사의 watch 응시하고 "Open Communicator"라고 말합니다.
  • 녹음/ 녹화 단추(마이크)를 선택하여 메시지를 기록합니다.
  • 말하기를 시작합니다. 받아쓰기 인식기는 음성을 해석하고 통신기에서 가설 텍스트를 표시합니다.
  • 메시지를 기록하는 동안 "메시지 보내기" 라고 말해 보세요. 받아쓰기 인식기가 여전히 활성 상태이므로 Keyword Recognizer 가 응답하지 않습니다.
  • 몇 초 동안 말하기를 중지합니다. 받아쓰기 인식기가 가설을 완료하고 최종 결과를 보여 줍니다.
  • 말하기를 시작한 다음 20초 동안 일시 중지합니다. 이로 인해 받아쓰기 인식기가 시간 초과됩니다.
  • 워드 인식기는 위의 시간 제한 후에 다시 사용하도록 설정됩니다. 이제 커뮤니케이터에서 음성 명령에 응답합니다.
  • "메시지 보내기"라고 말하여 우주 비행사에게 메시지를 보냅니다.

4장 - 문법 인식기

목표

  • Grammar Recognizer를 사용하여 SRGS 또는 음성 인식 문법 사양 파일에 따라 사용자의 음성을 인식합니다.

참고

앱이 마이크에서 녹음하려면 마이크 기능을 선언해야 합니다. 이 작업은 MR 입력 212에서 이미 수행되지만 사용자 고유의 프로젝트에 유의하세요.

  1. Unity 편집기에서 "프로젝트 설정 플레이어 편집 > "으로 이동하여 플레이어 설정 > 으로 이동합니다.
  2. "유니버설 Windows 플랫폼" 탭을 클릭합니다.
  3. "게시 설정 > 기능" 섹션에서 마이크 기능을 검사.

지침

  1. 계층 구조 패널에서 Jetpack_Center 검색하고 선택합니다.
  2. 검사기 패널에서 Tagalong Action 스크립트를 찾습니다.
  3. 따라 태그를 지정하는 개체 필드의 오른쪽에 있는 작은 원 클릭합니다.
  4. 팝업 창에서 SRGSToolbox 를 검색하고 목록에서 선택합니다.
  5. StreamingAssets 폴더의 SRGSColor.xml 파일을 살펴봅니다.
    1. SRGS 디자인 사양은 W3C 웹 사이트에서 찾을 수 있습니다.

SRGS 파일에는 다음 세 가지 유형의 규칙이 있습니다.

  • 12가지 색 목록에서 하나의 색을 말할 수 있는 규칙입니다.
  • 색 규칙과 세 도형 중 하나의 조합을 수신 대기하는 세 가지 규칙입니다.
  • 세 가지 "color + shape" 규칙의 조합을 수신 대기하는 colorChooser 루트 규칙입니다. 셰이프는 순서에 따라 1개에서 3개까지의 양으로 지정할 수 있습니다. 초기 <문법> 태그에서 파일 맨 위에 있는 루트 규칙으로 지정되므로 수신 대기하는 유일한 규칙입니다.

빌드 및 배포

  • Unity에서 애플리케이션을 다시 빌드한 다음, Visual Studio에서 빌드하고 배포하여 HoloLens에서 앱을 경험합니다.
  • 에어 탭 제스처로 맞춤 상자를 닫습니다.
  • 우주 비행사의 제트팩을 응시하고 에어 탭 제스처를 수행합니다.
  • 말하기를 시작합니다. Grammar Recognizer는 음성을 해석하고 인식에 따라 셰이프의 색을 변경합니다. 예제 명령은 "파란색 원, 노란색 사각형"입니다.
  • 다른 에어 탭 제스처를 수행하여 도구 상자를 해제합니다.

축하합니다! 이제 MR 입력 212: 음성을 완료했습니다.

  • 음성 명령의 Dos 및 Don'ts를 알고 있습니다.
  • 사용자가 음성 명령을 인식할 수 있도록 도구 설명이 어떻게 사용되었는지 확인했습니다.
  • 사용자의 음성이 수신되었음을 인정하는 데 사용되는 여러 유형의 피드백을 보았습니다.
  • 키워드 인식기와 받아쓰기 인식기 간에 전환하는 방법과 이러한 두 기능이 음성을 이해하고 해석하는 방법을 알고 있습니다.
  • 애플리케이션에서 음성 인식에 SRGS 파일 및 Grammar Recognizer를 사용하는 방법을 알아보았습니다.