Unity의 음성 입력
주의
시작하기 전에 Cognitive Speech Services SDK에 Unity 플러그 인을 사용하는 것이 좋습니다. 플러그 인은 더 나은 음성 정확도 결과와 음성 텍스트 변환 디코딩에 쉽게 액세스할 수 있으며 대화 상자, 의도 기반 상호 작용, 번역, 텍스트 음성 변환 및 자연어 음성 인식과 같은 고급 음성 기능을 제공합니다. 시작하려면 샘플 및 설명서를 검사.
Unity는 Unity 애플리케이션에 음성 입력 을 추가하는 세 가지 방법을 노출하며, 그 중 처음 두 가지는 PhraseRecognizer 유형입니다.
- 는
KeywordRecognizer
수신 대기할 문자열 명령 배열을 앱에 제공합니다. - 는
GrammarRecognizer
수신 대기할 특정 문법을 정의하는 SRGS 파일을 앱에 제공합니다. DictationRecognizer
를 사용하면 앱이 단어를 듣고 사용자에게 음성의 메모 또는 기타 표시를 제공할 수 있습니다.
참고
받아쓰기 및 구 인식은 동시에 처리할 수 없습니다. GrammarRecognizer 또는 KeywordRecognizer가 활성 상태인 경우 DictationRecognizer는 활성 상태일 수 없으며 그 반대의 경우도 마찬가지입니다.
음성에 대한 기능 사용
앱에서 음성 입력을 사용하려면 마이크 기능을 선언해야 합니다.
- Unity 편집기에서 프로젝트 설정 > 플레이어 편집 > 으로 이동합니다.
- Windows 스토어 탭 선택
- 게시 설정 > 기능 섹션에서 마이크 기능을 검사.
- HoloLens 디바이스에서 마이크 액세스 권한을 앱에 부여
- 디바이스 시작 시 이 작업을 수행하라는 메시지가 표시되지만 실수로 "아니요"를 클릭한 경우 디바이스 설정에서 사용 권한을 변경할 수 있습니다.
구 인식
앱이 사용자가 말한 특정 구를 수신 대기하고 몇 가지 작업을 수행하도록 하려면 다음을 수행해야 합니다.
- 또는 를 사용하여 수신 대기할 구를
KeywordRecognizer
지정합니다.GrammarRecognizer
OnPhraseRecognized
이벤트를 처리하고 인식된 구에 해당하는 작업을 수행합니다.
KeywordRecognizer
네임스페이스:UnityEngine.Windows.Speech
형식:KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
몇 가지 키 입력을 저장하려면 몇 가지 using 문이 필요합니다.
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;
그런 다음, 클래스에 몇 가지 필드를 추가하여 인식기 및 키워드(keyword)> 작업 사전을 저장해 보겠습니다.
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
이제 사전에 키워드(keyword) 추가합니다(예: 메서드의 Start()
). 이 예제에서는 "활성화" 키워드(keyword) 추가합니다.
//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
// action to be performed when this keyword is spoken
});
키워드(keyword) 인식기를 만들고 인식할 내용을 알려줍니다.
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
이제 이벤트에 등록 OnPhraseRecognized
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
처리기의 예는 다음과 같습니다.
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();
}
}
마지막으로, 인식하기 시작합니다!
keywordRecognizer.Start();
GrammarRecognizer
네임스페이스:UnityEngine.Windows.Speech
형식: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
GrammarRecognizer는 SRGS를 사용하여 인식 문법을 지정하는 경우에 사용됩니다. 이 기능은 앱에 키워드가 몇 개 이상 있거나, 더 복잡한 구를 인식하려는 경우 또는 명령 집합을 쉽게 켜고 끄려는 경우에 유용할 수 있습니다. 파일 형식 정보는 SRGS XML을 사용하여 문법 만들기 를 참조하세요.
SRGS 문법이 있고 StreamingAssets 폴더의 프로젝트에 있으면 다음을 수행합니다.
<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml
을 GrammarRecognizer
만들고 SRGS 파일에 경로를 전달합니다.
private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");
이제 이벤트에 등록 OnPhraseRecognized
grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;
적절하게 처리할 수 있는 SRGS 문법에 지정된 정보가 포함된 콜백이 표시됩니다. 대부분의 중요한 정보는 배열에 semanticMeanings
제공됩니다.
private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
SemanticMeaning[] meanings = args.semanticMeanings;
// do something
}
마지막으로, 인식하기 시작합니다!
grammarRecognizer.Start();
받아쓰기
네임스페이스:UnityEngine.Windows.Speech
형식: DictationRecognizer, SpeechError, SpeechSystemStatus
DictationRecognizer
를 사용하여 사용자의 음성을 텍스트로 변환합니다. DictationRecognizer는 받아쓰 기 기능을 노출하고 가설 및 구 완료 이벤트를 등록하고 수신 대기할 수 있도록 지원하므로 사용자가 말하는 동안 및 나중에 피드백을 제공할 수 있습니다. Start()
및 Stop()
메서드는 각각 받아쓰기 인식을 사용하거나 사용하지 않도록 설정합니다. 인식기로 완료되면 를 사용하여 Dispose()
삭제하여 사용하는 리소스를 해제해야 합니다. 이전에 릴리스되지 않은 경우 추가 성능 비용으로 가비지 수집 중에 이러한 리소스를 자동으로 해제합니다.
받아쓰기를 시작하는 데 필요한 단계는 몇 가지뿐입니다.
- 새 만들기
DictationRecognizer
- 받아쓰기 이벤트 처리
- DictationRecognizer 시작
받아쓰기 기능 사용
앱에서 받아쓰기를 사용하려면 인터넷 클라이언트 및 마이크 기능을 선언해야 합니다.
- Unity 편집기에서 프로젝트 설정 > 플레이어 편집 > 으로 이동합니다.
- Windows 스토어 탭에서 선택
- 게시 설정 > 기능 섹션에서 InternetClient 기능을 검사.
- 필요에 따라 마이크를 아직 사용하도록 설정하지 않은 경우 마이크 기능을 검사.
- 아직 HoloLens 디바이스에서 마이크 액세스 권한을 앱에 부여하지 않은 경우
- 디바이스 시작 시 이 작업을 수행하라는 메시지가 표시되지만 실수로 "아니요"를 클릭한 경우 디바이스 설정에서 사용 권한을 변경할 수 있습니다.
DictationRecognizer
다음과 같이 DictationRecognizer를 만듭니다.
dictationRecognizer = new DictationRecognizer();
받아쓰기 동작을 구현하기 위해 구독하고 처리할 수 있는 4개의 받아쓰기 이벤트가 있습니다.
DictationResult
DictationComplete
DictationHypothesis
DictationError
DictationResult
이 이벤트는 사용자가 일시 중지한 후 일반적으로 문장 끝에 발생합니다. 여기에서 인식된 전체 문자열이 반환됩니다.
먼저 이벤트를 구독합니다.DictationResult
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
그런 다음, DictationResult 콜백을 처리합니다.
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// do something
}
DictationHypothesis
이 이벤트는 사용자가 통신하는 동안 지속적으로 발생합니다. 인식기가 수신 대기할 때 지금까지 들은 내용의 텍스트를 제공합니다.
먼저 이벤트를 구독합니다.DictationHypothesis
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
그런 다음, DictationHypothesis 콜백을 처리합니다.
private void DictationRecognizer_DictationHypothesis(string text)
{
// do something
}
DictationComplete
이 이벤트는 호출 중인 Stop()에서, 시간 제한 발생 또는 기타 오류 등 인식기가 중지될 때 발생합니다.
먼저 이벤트를 구독합니다.DictationComplete
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
그런 다음, DictationComplete 콜백을 처리합니다.
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// do something
}
DictationError
이 이벤트는 오류가 발생할 때 발생합니다.
먼저 이벤트를 구독합니다.DictationError
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
그런 다음, DictationError 콜백을 처리합니다.
private void DictationRecognizer_DictationError(string error, int hresult)
{
// do something
}
관심 있는 받아쓰기 이벤트를 구독하고 처리한 후에는 받아쓰기 인식기를 시작하여 이벤트 수신을 시작합니다.
dictationRecognizer.Start();
DictationRecognizer를 더 이상 유지하지 않으려면 이벤트에서 구독을 취소하고 DictationRecognizer를 삭제해야 합니다.
dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();
팁
Start()
및Stop()
메서드는 각각 받아쓰기 인식을 사용하거나 사용하지 않도록 설정합니다.- 인식기를 사용하여 완료되면 를 사용하여
Dispose()
삭제하여 사용하는 리소스를 해제해야 합니다. 이전에 릴리스되지 않은 경우 추가 성능 비용으로 가비지 수집 중에 이러한 리소스를 자동으로 해제합니다. - 시간 제한은 설정된 기간 후에 발생합니다. 이벤트에서 이러한 시간 제한에 대한 검사 수 있습니다
DictationComplete
. 다음 두 가지 시간 제한에 유의해야 합니다.- 인식기가 시작되고 처음 5초 동안 오디오가 들리지 않으면 시간이 초과됩니다.
- 인식기가 결과를 제공했지만 20초 동안 무음이 들리면 시간이 초과됩니다.
구 인식 및 받아쓰기 모두 사용
앱에서 구 인식과 받아쓰기를 모두 사용하려면 먼저 하나를 완전히 종료해야 다른 구를 시작할 수 있습니다. 여러 KeywordRecognizer가 실행 중인 경우 다음을 사용하여 모든 키워드를 한 번에 종료할 수 있습니다.
PhraseRecognitionSystem.Shutdown();
를 호출 Restart()
하여 DictationRecognizer가 중지된 후 모든 인식기를 이전 상태로 복원할 수 있습니다.
PhraseRecognitionSystem.Restart();
또한 PhraseRecognitionSystem을 다시 시작하는 KeywordRecognizer를 시작할 수도 있습니다.
Mixed Reality 도구 키트의 음성 입력
다음 데모 장면에서 음성 입력에 대한 MRTK 예제를 찾을 수 있습니다.
다음 개발 검사점
배치한 Unity 개발 검사점 여정을 따르는 경우 다음 작업은 Mixed Reality 플랫폼 기능 및 API를 탐색하는 것입니다.
언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.