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;
그런 다음, 클래스에 몇 가지 필드를 추가하여 인식기 및 키워드> 작업 사전을 저장해 보겠습니다.
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
이제 메서드와 같이 사전에 키워드를 Start()
추가합니다. 이 예제에서는 "activate" 키워드를 추가합니다.
//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
// action to be performed when this keyword is spoken
});
키워드 인식기를 만들고 인식할 내용을 알려줍니다.
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
SRGS GrammarRecognizer
파일을 만들고 해당 경로를 전달합니다.
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();
DictationRecognizer가 중지된 후 모든 인식기를 이전 상태로 복원하도록 호출 Restart()
할 수 있습니다.
PhraseRecognitionSystem.Restart();
또한 PhraseRecognitionSystem을 다시 시작하는 KeywordRecognizer를 시작할 수도 있습니다.
Mixed Reality Toolkit의 음성 입력
다음 데모 장면에서 음성 입력에 대한 MRTK 예제를 찾을 수 있습니다.
다음 개발 검사점
배치한 Unity 개발 검사점 과정을 따르는 경우 다음 작업은 Mixed Reality 플랫폼 기능 및 API를 탐색하는 것입니다.
언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.