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: 음성 | ✔️ | ✔️ |
시작하기 전에
필수 구성 요소
- 올바른 도구가 설치된 Windows 10 PC.
- 몇 가지 기본 C# 프로그래밍 기능.
- MR Basics 101을 완료해야 합니다.
- MR 입력 210을 완료해야 합니다.
- MR 입력 211을 완료해야 합니다.
- 개발을 위해 구성된 HoloLens 디바이스입니다.
프로젝트 파일
- 프로젝트에 필요한 파일을 다운로드합니다. Unity 2017.2 이상이 필요합니다.
- 바탕 화면 또는 기타 쉽게 연결할 수 있는 위치에 파일을 보관 해제합니다.
참고
다운로드하기 전에 소스 코드를 살펴보려면 GitHub에서 사용할 수 있습니다.
Errata 및 Notes
- 코드의 중단점을 적중하려면 Visual Studio에서 도구 옵션->>디버깅에서 "내 코드만 사용"을 사용하지 않도록 설정(선택 취소)해야 합니다.
Unity 설정
지침
- Unity를 시작합니다.
- 열기를 선택합니다.
- 이전에 보관하지 않은 HolographicAcademy-Holograms-212-Voice 폴더로 이동합니다.
- 시작/모델 Explorer 폴더를 찾아 선택합니다.
- 폴더 선택 단추를 클릭합니다.
- 프로젝트 패널에서 Scenes 폴더를 확장합니다.
- ModelExplorer 장면을 두 번 클릭하여 Unity에 로드합니다.
빌딩
- Unity에서 파일 > 빌드 설정을 선택합니다.
- Scenes/ModelExplorer가 빌드의 장면에 나열되지 않은 경우 열린 장면 추가를 클릭하여 장면을 추가합니다.
- HoloLens용으로 특별히 개발하는 경우 대상 디바이스 를 HoloLens로 설정합니다. 그렇지 않으면 모든 디바이스에 그대로 둡니다.
- 빌드 유형이 D3D로 설정되고 SDK가 최신 설치됨(SDK 16299 이상이어야 합니다)으로 설정되어 있는지 확인합니다.
- 빌드를 클릭한 다음
- "App"이라는 새 폴더 를 만듭니다.
- 앱 폴더를 한 번 클릭합니다.
- 폴더 선택을 누르면 Unity가 Visual Studio용 프로젝트 빌드를 시작합니다.
Unity가 완료되면 파일 탐색기 창이 나타납니다.
- App 폴더를 엽니다.
- ModelExplorer Visual Studio Solution을 엽니다.
HoloLens에 배포하는 경우:
- Visual Studio에서 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스 로, ARM에서 x86으로 변경합니다.
- 로컬 컴퓨터 단추 옆에 있는 드롭다운 화살표를 클릭하고 원격 머신을 선택합니다.
- HoloLens 디바이스 IP 주소를 입력하고 인증 모드를 유니버설(암호화되지 않은 프로토콜)로 설정합니다. 선택을 클릭합니다. 디바이스 IP 주소를 모르는 경우 설정 > 네트워크 & 인터넷 > 고급 옵션을 참조하세요.
- 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다. 디바이스에 처음 배포하는 경우 Visual Studio와 페어링해야 합니다.
- 앱이 배포되면 선택 제스처로 Fitbox를 해제합니다.
몰입형 헤드셋에 배포하는 경우:
- Visual Studio의 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스 로, ARM에서 x64로 변경합니다.
- 배포 대상이 로컬 컴퓨터로 설정되어 있는지 확인합니다.
- 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다.
- 앱이 배포되면 동작 컨트롤러에서 트리거를 끌어 와 Fitbox 를 해제합니다.
참고
Visual Studio 오류 패널에서 빨간색 오류가 표시될 수 있습니다. 무시해도 안전합니다. 출력 패널로 전환하여 실제 빌드 진행률을 확인합니다. 출력 패널의 오류는 수정해야 합니다(대부분 스크립트의 실수로 인해 발생함).
1장 - 인식
목표
- 음성 명령 디자인 의 Dos 및 Don'ts에 대해 알아봅니다.
- KeywordRecognizer를 사용하여 응시 기반 음성 명령을 추가합니다.
- 커서 피드백을 사용하여 사용자가 음성 명령을 인식할 수 있도록 합니다.
음성 명령 디자인
이 챕터에서는 음성 명령 디자인에 대해 알아봅니다. 음성 명령을 만들 때:
DO
- 간결한 명령을 만듭니다. 해당 명령은 간결하지 않고 사용자가 쉽게 잊어버리기 때문에 "현재 선택한 비디오 재생"을 사용하지 않습니다. 대신 간결하고 음절이 여러 대 있으므로 "비디오 재생"을 사용해야 합니다.
- 간단한 어휘를 사용합니다. 항상 사용자가 쉽게 검색하고 기억할 수 있는 일반적인 단어와 구를 사용하려고 합니다. 예를 들어 애플리케이션에 표시하거나 보기에서 숨길 수 있는 메모 개체가 있는 경우 "플래카드 표시" 명령은 거의 사용되지 않으므로 사용하지 않을 것입니다. 대신 "메모 표시" 명령을 사용하여 애플리케이션에서 메모를 표시합니다.
- 일관성을 유지합니다. 음성 명령은 애플리케이션 전체에서 일관되게 유지되어야 합니다. 애플리케이션에 두 장면이 있고 두 장면 모두 애플리케이션을 닫는 단추가 포함되어 있다고 상상해 보세요. 첫 번째 장면에서 "Exit" 명령을 사용하여 단추를 트리거했지만 두 번째 장면에서 "앱 닫기" 명령을 사용한 경우 사용자는 매우 혼란스러워집니다. 동일한 기능이 여러 장면에서 유지되는 경우 동일한 음성 명령을 사용하여 트리거해야 합니다.
안 함
- 단일 음절 명령을 사용합니다. 예를 들어 비디오를 재생하는 음성 명령을 만드는 경우 단일 음절일 뿐이며 시스템에서 쉽게 놓칠 수 있으므로 간단한 명령 "Play"를 사용하지 않아야 합니다. 대신 간결하고 음절이 여러 대 있으므로 "비디오 재생"을 사용해야 합니다.
- 시스템 명령을 사용합니다. "Select" 명령은 현재 포커스가 있는 개체에 대한 Tap 이벤트를 트리거하기 위해 시스템에서 예약합니다. 예상대로 작동하지 않을 수 있으므로 키워드(keyword) 또는 구에서 "Select" 명령을 다시 사용하지 마세요. 예를 들어 애플리케이션에서 큐브를 선택하기 위한 음성 명령이 "큐브 선택"이지만 사용자가 명령을 발화할 때 구를 보고 있는 경우 구가 대신 선택됩니다. 마찬가지로 앱 바 명령은 음성을 사용하도록 설정됩니다. CoreWindow 보기에서 다음 음성 명령을 사용하지 마세요.
- 뒤로 이동
- 스크롤 도구
- 확대/축소 도구
- 끌기 도구
- Adjust
- 제거
- 비슷한 소리를 사용합니다. 운율 음성 명령을 사용하지 않도록 합니다. 음성 명령으로 "스토어 표시" 및 "자세히 표시" 를 지원하는 쇼핑 애플리케이션이 있는 경우 다른 명령이 사용 중일 때 명령 중 하나를 사용하지 않도록 설정하려고 합니다. 예를 들어 "스토어 표시" 단추를 사용하여 스토어를 연 다음 스토어가 표시될 때 해당 명령을 사용하지 않도록 설정하여 "자세히 표시" 명령을 검색에 사용할 수 있습니다.
지침
- 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에서 이미 수행되지만 사용자 고유의 프로젝트에 유의하세요.
- Unity 편집기에서 "프로젝트 설정 플레이어 편집 > "으로 이동하여 플레이어 설정 > 으로 이동합니다.
- "유니버설 Windows 플랫폼" 탭을 클릭합니다.
- "게시 설정 > 기능" 섹션에서 마이크 기능을 검사.
지침
- Unity의 계층 구조 패널에서 holoComm_screen_mesh 개체가 선택되어 있는지 확인합니다.
- 검사기 패널에서 우주 비행사 조사식(스크립트) 구성 요소를 찾습니다.
- Communicator Prefab 속성의 값으로 설정된 작은 파란색 큐브를 클릭합니다.
- 이제 프로젝트 패널에서 Communicator 프리팹에 포커스가 있어야 합니다.
- 프로젝트 패널에서 Communicator 프리팹을 클릭하여 검사기에서 해당 구성 요소를 봅니다.
- 마이크 관리자(스크립트) 구성 요소를 살펴보면 사용자의 음성을 녹음할 수 있습니다.
- Communicator 개체에는 메시지 보내기 명령에 응답하기 위한 Speech Input Handler(스크립트) 구성 요소가 있습니다.
- Communicator(스크립트) 구성 요소를 확인하고 스크립트를 두 번 클릭하여 Visual Studio에서 엽니다.
Communicator.cs는 통신 장치에서 적절한 단추 상태를 설정하는 역할을 담당합니다. 이렇게 하면 사용자가 메시지를 기록하고, 재생하고, 우주 비행사에게 메시지를 보낼 수 있습니다. 또한 애니메이션된 웨이브 양식을 시작하고 중지하여 음성이 들렸다는 것을 사용자에게 인정합니다.
- Communicator.cs의 Start 메서드에서 다음 줄(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에서 이미 수행되지만 사용자 고유의 프로젝트에 유의하세요.
- Unity 편집기에서 "프로젝트 설정 플레이어 편집 > "으로 이동하여 플레이어 설정 > 으로 이동합니다.
- "유니버설 Windows 플랫폼" 탭을 클릭합니다.
- "게시 설정 > 기능" 섹션에서 마이크 기능을 검사.
지침
Dictation Recognizer를 사용하도록 MicrophoneManager.cs 를 편집하겠습니다. 다음과 같이 추가하겠습니다.
- 레코드 단추를 누르면 DictationRecognizer가 시작됩니다.
- DictationRecognizer가 이해한 내용의 가설 을 표시합니다.
- DictationRecognizer가 이해한 결과를 잠급니다.
- DictationRecognizer에서 시간 제한을 확인합니다.
- 중지 단추를 누르거나 마이크 세션 시간이 초과되면 DictationRecognizer를 중지합니다.
- 메시지 보내기 명령을 수신 대기하는 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에서 이미 수행되지만 사용자 고유의 프로젝트에 유의하세요.
- Unity 편집기에서 "프로젝트 설정 플레이어 편집 > "으로 이동하여 플레이어 설정 > 으로 이동합니다.
- "유니버설 Windows 플랫폼" 탭을 클릭합니다.
- "게시 설정 > 기능" 섹션에서 마이크 기능을 검사.
지침
- 계층 구조 패널에서 Jetpack_Center 검색하고 선택합니다.
- 검사기 패널에서 Tagalong Action 스크립트를 찾습니다.
- 따라 태그를 지정하는 개체 필드의 오른쪽에 있는 작은 원 을 클릭합니다.
- 팝업 창에서 SRGSToolbox 를 검색하고 목록에서 선택합니다.
- StreamingAssets 폴더의 SRGSColor.xml 파일을 살펴봅니다.
- SRGS 디자인 사양은 W3C 웹 사이트에서 찾을 수 있습니다.
SRGS 파일에는 다음 세 가지 유형의 규칙이 있습니다.
- 12가지 색 목록에서 하나의 색을 말할 수 있는 규칙입니다.
- 색 규칙과 세 도형 중 하나의 조합을 수신 대기하는 세 가지 규칙입니다.
- 세 가지 "color + shape" 규칙의 조합을 수신 대기하는 colorChooser 루트 규칙입니다. 셰이프는 순서에 따라 1개에서 3개까지의 양으로 지정할 수 있습니다. 초기 <문법> 태그에서 파일 맨 위에 있는 루트 규칙으로 지정되므로 수신 대기하는 유일한 규칙입니다.
빌드 및 배포
- Unity에서 애플리케이션을 다시 빌드한 다음, Visual Studio에서 빌드하고 배포하여 HoloLens에서 앱을 경험합니다.
- 에어 탭 제스처로 맞춤 상자를 닫습니다.
- 우주 비행사의 제트팩을 응시하고 에어 탭 제스처를 수행합니다.
- 말하기를 시작합니다. Grammar Recognizer는 음성을 해석하고 인식에 따라 셰이프의 색을 변경합니다. 예제 명령은 "파란색 원, 노란색 사각형"입니다.
- 다른 에어 탭 제스처를 수행하여 도구 상자를 해제합니다.
끝
축하합니다! 이제 MR 입력 212: 음성을 완료했습니다.
- 음성 명령의 Dos 및 Don'ts를 알고 있습니다.
- 사용자가 음성 명령을 인식할 수 있도록 도구 설명이 어떻게 사용되었는지 확인했습니다.
- 사용자의 음성이 수신되었음을 인정하는 데 사용되는 여러 유형의 피드백을 보았습니다.
- 키워드 인식기와 받아쓰기 인식기 간에 전환하는 방법과 이러한 두 기능이 음성을 이해하고 해석하는 방법을 알고 있습니다.
- 애플리케이션에서 음성 인식에 SRGS 파일 및 Grammar Recognizer를 사용하는 방법을 알아보았습니다.