Unity의 음성 입력Voice input in Unity

참고

아래 정보 대신, 더 나은 음성 정확도 결과를 제공 하는 인식 Speech Services SDK 용 Unity 플러그 인을 사용 하는 것이 좋습니다 .이 경우 대화, 의도 기반 상호 작용, 번역, 텍스트 음성 합성 및 자연어 음성 인식과 같은 음성 텍스트 디코딩 및 고급 음성 기능에 쉽게 액세스할 수 있습니다.Instead of the below information, consider using the Unity plug-in for the Cognitive Speech Services SDK which has much better Speech Accuracy results and provides easy access to speech-to-text decode and advanced speech features like dialog, intent based interaction, translation, text-to-speech synthesis and natural language speech recognition. 샘플을 찾고 여기에서 설명서. https://docs.microsoft.com//azure/cognitive-services/speech-service/quickstart-csharp-unityFind the sample and documentaion here: https://docs.microsoft.com//azure/cognitive-services/speech-service/quickstart-csharp-unity

Unity는 Unity 응용 프로그램에 음성 입력 을 추가 하는 세 가지 방법을 제공 합니다.Unity exposes three ways to add Voice input to your Unity application.

KeywordRecognizer (두 가지 유형의 PhraseRecognizers 중 하나)를 사용 하 여 앱에 수신 대기할 문자열 명령의 배열을 제공할 수 있습니다.With the KeywordRecognizer (one of two types of PhraseRecognizers), your app can be given an array of string commands to listen for. GrammarRecognizer (다른 유형의 PhraseRecognizer)를 사용 하면 수신 대기할 특정 문법을 정의 하는 SRGS 파일이 앱에 제공 될 수 있습니다.With the GrammarRecognizer (the other type of PhraseRecognizer), your app can be given an SRGS file defining a specific grammar to listen for. DictationRecognizer를 사용 하 여 앱은 모든 단어를 수신 대기 하 고 사용자에 게 음성의 메모 또는 다른 표시를 제공할 수 있습니다.With the DictationRecognizer, your app can listen for any word and provide the user with a note or other display of their speech.

참고

받아쓰기 또는 문구 인식을 한 번에 처리할 수 있습니다.Only dictation or phrase recognition can be handled at once. 즉, GrammarRecognizer 또는 KeywordRecognizer가 활성 상태 이면 DictationRecognizer은 활성 상태가 될 수 없으며 그 반대의 경우도 마찬가지입니다.That means if a GrammarRecognizer or KeywordRecognizer is active, a DictationRecognizer can not be active and vice versa.

음성 기능 사용Enabling the capability for Voice

음성 입력을 사용 하려면 앱에 대해 마이크 기능을 선언 해야 합니다.The Microphone capability must be declared for an app to use Voice input.

  1. Unity 편집기에서 "편집 > 프로젝트 설정 > 플레이어"로 이동 하 여 플레이어 설정으로 이동 합니다.In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player"
  2. "Windows 스토어" 탭에서 선택 합니다.Select on the "Windows Store" tab
  3. "게시 설정 > 기능" 섹션에서 마이크 기능을 확인 합니다.In the "Publishing Settings > Capabilities" section, check the Microphone capability

문구 인식Phrase Recognition

앱이 사용자가 말하는 특정 문구를 수신 대기 하도록 하려면 다음 작업을 수행 해야 합니다.To enable your app to listen for specific phrases spoken by the user then take some action, you need to:

  1. KeywordRecognizer 또는 GrammarRecognizer를 사용 하 여 수신할 구를 지정 합니다.Specify which phrases to listen for using a KeywordRecognizer or GrammarRecognizer
  2. OnPhraseRecognized 이벤트를 처리 하 고 인식 된 구에 해당 하는 작업을 수행 합니다.Handle the OnPhraseRecognized event and take action corresponding to the phrase recognized

KeywordRecognizerKeywordRecognizer

네임 스페이스: Unityengine. Windows. SpeechNamespace: UnityEngine.Windows.Speech
유형: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatusTypes: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

몇 가지 using 문을 사용 하 여 몇 가지 키 입력을 저장 해야 합니다.We'll need a few using statements to save some keystrokes:

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

그런 다음 클래스에 몇 개의 필드를 추가 하 여 인식기 및 키워드 >동작 사전을 저장 해 보겠습니다.Then let's add a few fields to your class to store the recognizer and keyword->action dictionary:

KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

이제 Start () 메서드의 경우와 같이 사전에 키워드를 추가 합니다.Now add a keyword to the dictionary, for example in of a Start() method. 이 예에서는 "activate" 키워드를 추가 하 고 있습니다.We're adding the "activate" keyword in this example:

//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
    // action to be performed when this keyword is spoken
});

키워드 인식기를 만들고 인식 하려는 항목을 알려 주세요.Create the keyword recognizer and tell it what we want to recognize:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

이제 OnPhraseRecognized 이벤트에 등록 합니다.Now register for the OnPhraseRecognized event

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

예제 처리기는 다음과 같습니다.An example handler is:

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    System.Action keywordAction;
    // if the keyword recognized is in our dictionary, call that Action.
    if (keywords.TryGetValue(args.text, out keywordAction))
    {
        keywordAction.Invoke();
    }
}

마지막으로 인식을 시작 합니다.Finally, start recognizing!

keywordRecognizer.Start();

GrammarRecognizerGrammarRecognizer

네임 스페이스: Unityengine. Windows. SpeechNamespace: UnityEngine.Windows.Speech
유형: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatusTypes: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

GrammarRecognizer는 SRGS를 사용 하 여 인식 문법을 지정 하는 경우에 사용 됩니다.The GrammarRecognizer is used if you're specifying your recognition grammar using SRGS. 이는 앱에 몇 개의 키워드 이상이 있거나 더 복잡 한 구를 인식 하거나 명령 집합을 쉽게 설정 하 고 해제 하려는 경우에 유용할 수 있습니다.This can be useful if your app has more than just a few keywords, if you want to recognize more complex phrases, or if you want to easily turn on and off sets of commands. 참조: 파일 형식 정보는 SRGS XML을 사용 하 여 문법 만들기 를 참조 하세요.See: Create Grammars Using SRGS XML for file format information.

SRGS 문법이 있고 Streamingassets 폴더의 프로젝트에 있습니다.Once you have your SRGS grammar, and it is in your project in a StreamingAssets folder:

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

GrammarRecognizer을 만들고 SRGS 파일에 대 한 경로를 전달 합니다.Create a GrammarRecognizer and pass it the path to your SRGS file:

private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");

이제 OnPhraseRecognized 이벤트에 등록 합니다.Now register for the OnPhraseRecognized event

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

SRGS 문법에 지정 된 정보를 포함 하는 콜백을 받게 되며, 적절 하 게 처리할 수 있습니다.You'll get a callback containing information specified in your SRGS grammar, which you can handle appropriately. 대부분의 중요 한 정보는 semanticMeanings 배열에서 제공 됩니다.Most of the important information will be provided in the semanticMeanings array.

private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    SemanticMeaning[] meanings = args.semanticMeanings;
    // do something
}

마지막으로 인식을 시작 합니다.Finally, start recognizing!

grammarRecognizer.Start();

받아쓰기Dictation

네임 스페이스: Unityengine. Windows. SpeechNamespace: UnityEngine.Windows.Speech
유형: DictationRecognizer, SpeechError, SpeechSystemStatusTypes: DictationRecognizer, SpeechError, SpeechSystemStatus

DictationRecognizer를 사용 하 여 사용자의 음성을 텍스트로 변환 합니다.Use the DictationRecognizer to convert the user's speech to text. DictationRecognizer는 받아쓰기 기능을 노출 하 고, 가설 및 구가 완료 된 이벤트에 대 한 등록 및 수신 대기를 지원 하므로, 나중에 말할 때 사용자에 게 피드백을 제공할 수 있습니다.The DictationRecognizer exposes dictation functionality and supports registering and listening for hypothesis and phrase completed events, so you can give feedback to your user both while they speak and afterwards. Start () 및 Stop () 메서드는 각각 받아쓰기 인식을 사용 하거나 사용 하지 않도록 설정 합니다.Start() and Stop() methods respectively enable and disable dictation recognition. 인식기를 사용 하 여 작업을 완료 한 후에는 Dispose () 메서드를 사용 하 여 사용 하는 리소스를 해제 해야 합니다.Once done with the recognizer, it should be disposed using Dispose() method to release the resources it uses. 이러한 리소스는 가비지 수집 중에 해제 되지 않은 경우 추가 성능 비용으로 자동으로 해제 됩니다.It will release these resources automatically during garbage collection at an additional performance cost if they aren't released before that.

받아쓰기를 시작 하는 데 필요한 몇 가지 단계만 있습니다.There are only a few steps needed to get started with dictation:

  1. 새 DictationRecognizer 만들기Create a new DictationRecognizer
  2. 받아쓰기 이벤트 처리Handle Dictation events
  3. DictationRecognizer 시작Start the DictationRecognizer

받아쓰기 기능 사용Enabling the capability for dictation

받아쓰기를 활용 하기 위해 앱에 대해 위에서 언급 한 "마이크" 기능과 함께 "인터넷 클라이언트" 기능을 선언 해야 합니다.The "Internet Client" capability, along with the "Microphone" capability mentioned above, must be declared for an app to leverage dictation.

  1. Unity 편집기에서 "> 프로젝트 설정 > 플레이어 편집" 페이지로 이동 하 여 플레이어 설정으로 이동 합니다.In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player" page
  2. "Windows 스토어" 탭에서 선택 합니다.Select on the "Windows Store" tab
  3. "게시 설정 > 기능" 섹션에서 Internetclient 기능을 확인 합니다.In the "Publishing Settings > Capabilities" section, check the InternetClient capability

DictationRecognizerDictationRecognizer

다음과 같이 DictationRecognizer를 만듭니다.Create a DictationRecognizer like so:

dictationRecognizer = new DictationRecognizer();

받아쓰기 동작을 구현 하기 위해 구독 하 고 처리할 수 있는 받아쓰기 이벤트는 네 가지가 있습니다.There are four dictation events that can be subscribed to and handled to implement dictation behavior.

  1. DictationResultDictationResult
  2. DictationCompleteDictationComplete
  3. DictationHypothesisDictationHypothesis
  4. DictationErrorDictationError

DictationResultDictationResult

이 이벤트는 일반적으로 문장의 끝에 사용자가 일시 중지 한 후에 발생 합니다.This event is fired after the user pauses, typically at the end of a sentence. 여기에는 전체 인식 된 문자열이 반환 됩니다.The full recognized string is returned here.

먼저 DictationResult 이벤트를 구독 합니다.First, subscribe to the DictationResult event:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

그런 다음 DictationResult 콜백을 처리 합니다.Then handle the DictationResult callback:

private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
    // do something
}

DictationHypothesisDictationHypothesis

이 이벤트는 사용자가 통신 하는 동안 지속적으로 발생 합니다.This event is fired continuously while the user is talking. 인식기는 수신 대기 하는 동안 지금까지 수신 하는 내용에 대 한 텍스트를 제공 합니다.As the recognizer listens, it provides text of what it's heard so far.

먼저 DictationHypothesis 이벤트를 구독 합니다.First, subscribe to the DictationHypothesis event:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

그런 다음 DictationHypothesis 콜백을 처리 합니다.Then handle the DictationHypothesis callback:

private void DictationRecognizer_DictationHypothesis(string text)
{
    // do something
}

DictationCompleteDictationComplete

이 이벤트는 인식기가 중지 될 때 발생 합니다. 중지 ()를 호출할 때 발생 하는 시간 초과 또는 다른 오류가 발생 했는지 여부입니다.This event is fired when the recognizer stops, whether from Stop() being called, a timeout occurring, or some other error.

먼저 DictationComplete 이벤트를 구독 합니다.First, subscribe to the DictationComplete event:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

그런 다음 DictationComplete 콜백을 처리 합니다.Then handle the DictationComplete callback:

private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
   // do something
}

DictationErrorDictationError

이 이벤트는 오류가 발생할 때 발생 합니다.This event is fired when an error occurs.

먼저 DictationError 이벤트를 구독 합니다.First, subscribe to the DictationError event:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

그런 다음 DictationError 콜백을 처리 합니다.Then handle the DictationError callback:

private void DictationRecognizer_DictationError(string error, int hresult)
{
    // do something
}

관심이 있는 받아쓰기 이벤트를 구독 하 고 처리 한 후에는 받아쓰기 인식기를 시작 하 여 이벤트 수신을 시작 합니다.Once you've subscribed and handled the dictation events that you care about, start the dictation recognizer to begin receiving events.

dictationRecognizer.Start();

DictationRecognizer을 더 이상 유지 하지 않으려면 이벤트를 구독 취소 하 고 DictationRecognizer를 삭제 해야 합니다.If you no longer want to keep the DictationRecognizer around, you need to unsubscribe from the events and Dispose the DictationRecognizer.

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

Tips

  • Start () 및 Stop () 메서드는 각각 받아쓰기 인식을 사용 하거나 사용 하지 않도록 설정 합니다.Start() and Stop() methods respectively enable and disable dictation recognition.
  • 인식기를 사용 하 여 작업을 완료 한 후에는 Dispose () 메서드를 사용 하 여 해당 리소스를 해제 해야 합니다.Once done with the recognizer, it must be disposed using Dispose() method to release the resources it uses. 이러한 리소스는 가비지 수집 중에 해제 되지 않은 경우 추가 성능 비용으로 자동으로 해제 됩니다.It will release these resources automatically during garbage collection at an additional performance cost if they aren't released before that.
  • 시간 제한은 설정 된 시간 후에 발생 합니다.Timeouts occur after a set period of time. DictationComplete 이벤트에서 이러한 시간 제한을 확인할 수 있습니다.You can check for these timeouts in the DictationComplete event. 다음 두 가지 제한 시간을 인식 합니다.There are two timeouts to be aware of:
    1. 인식기가 시작 되 고 처음 5 초 동안 오디오가 들리지 않으면 시간이 초과 됩니다.If the recognizer starts and doesn't hear any audio for the first five seconds, it will time out.
    2. 인식기에서 결과를 제공 했지만 20 초 동안 침묵를 듣게 되 면 시간이 초과 됩니다.If the recognizer has given a result, but then hears silence for 20 seconds, it will time out.

구 인식과 받아쓰기 모두 사용Using both Phrase Recognition and Dictation

앱에서 구 인식과 받아쓰기를 모두 사용 하려는 경우에는 다른 항목을 시작 하기 전에 하나를 완전히 종료 해야 합니다.If you want to use both phrase recognition and dictation in your app, you'll need to fully shut one down before you can start the other. 여러 KeywordRecognizers를 실행 하는 경우 다음을 사용 하 여 한 번에 모두 종료할 수 있습니다.If you have multiple KeywordRecognizers running, you can shut them all down at once with:

PhraseRecognitionSystem.Shutdown();

모든 인식기를 이전 상태로 복원 하기 위해 DictationRecognizer가 중지 된 후 다음을 호출할 수 있습니다.In order to restore all recognizers to their previous state, after the DictationRecognizer has stopped, you can call:

PhraseRecognitionSystem.Restart();

KeywordRecognizer를 시작할 수도 있습니다. 그러면 PhraseRecognitionSystem도 다시 시작 됩니다.You could also just start a KeywordRecognizer, which will restart the PhraseRecognitionSystem as well.

마이크 도우미 사용Using the microphone helper

GitHub의 Mixed Reality 도구 키트에는 시스템에 사용할 수 있는 마이크가 있는 경우 개발자에 게 힌트에 대 한 마이크 도우미 클래스가 포함 되어 있습니다.The Mixed Reality Toolkit on GitHub contains a microphone helper class to hint at developers if there's a usable microphone on the system. 한 가지 용도는 응용 프로그램에서 음성 상호 작용 힌트를 표시 하기 전에 시스템에 마이크가 있는지 확인 하는 것입니다.One use for it's where one would want to check if there's microphone on system before showing any speech interaction hints in the application.

마이크 도우미 스크립트는 입력/스크립트/유틸리티 폴더에서 찾을 수 있습니다.The microphone helper script can be found in the Input/Scripts/Utilities folder. GitHub 리포지토리에는 도우미를 사용 하는 방법을 보여 주는 작은 샘플 도 포함 되어 있습니다.The GitHub repo also contains a small sample demonstrating how to use the helper.

Mixed Reality Toolkit의 음성 입력Voice input in Mixed Reality Toolkit

이 장면에서 음성 입력의 예제를 찾을 수 있습니다.You can find the examples of the voice input in this scene.

다음 개발 검사점Next Development Checkpoint

앞서 설명한 Unity 개발 검사점 경험을 팔로 하는 경우 다음 작업은 혼합 현실 플랫폼 기능과 Api를 탐색 하는 것입니다.If you're following the Unity development checkpoint journey we've laid out, you're next task is exploring the Mixed Reality platform capabilities and APIs:

언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.You can always go back to the Unity development checkpoints at any time.