다음을 통해 공유


사용자 지정 인식 제약 조건 정의

음성 인식에 대한 사용자 지정 제약 조건을 정의하고 사용하는 방법을 알아봅니다.

중요 API: SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint

음성 인식에는 인식 가능한 어휘를 정의하기 위해 하나 이상의 제약 조건이 필요합니다. 제약 조건을 지정하지 않으면 유니버설 Windows 앱의 미리 정의된 받아쓰기 문법이 사용됩니다. 음성 인식을 참조하세요.

제약 조건 추가

SpeechRecognizer.Constraints 속성을 사용하여 음성 인식기에서 제약 조건을 추가합니다.

여기서는 앱 내에서 사용되는 세 가지 종류의 음성 인식 제약 조건을 다룹니다. (Cortana 음성 명령 제약 조건의 경우 Cortana를 통해 음성 명령으로 포그라운드 앱 활성화를 참조하세요.)

각 음성 인식기마다 하나의 제약 조건 컬렉션이 있을 수 있습니다. 다음과 같은 제약 조건 조합만 유효합니다.

  • 단일 토픽 제약 조건(받아쓰기 또는 웹 검색)
  • Windows 10 Fall Creators Update(10.0.16299.15) 이상에서는 단일 토픽 제약 조건을 목록 제약 조건과 결합할 수 있습니다.
  • 목록 제약 조건 및/또는 문법 파일 제약 조건의 조합입니다.

중요합니다

인식 프로세스를 시작하기 전에 SpeechRecognizer.CompileConstraintsAsync 메서드를 호출하여 제약 조건을 컴파일합니다.

웹 검색 문법 지정(SpeechRecognitionTopicConstraint)

토픽 제약 조건(받아쓰기 또는 웹 검색 문법)을 음성 인식기의 제약 조건 컬렉션에 추가해야 합니다.

비고

SpeechRecognitionListConstraintSpeechRecognitionTopicConstraint와 함께 사용하여 받아쓰기 중에 사용될 가능성이 있다고 생각되는 도메인별 키워드 집합을 제공하여 받아쓰기 정확도를 높일 수 있습니다.

여기서는 제약 조건 컬렉션에 웹 검색 문법을 추가합니다.

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Listen for audio input issues.
    speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

    // Add a web search grammar to the recognizer.
    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");


    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
    //await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

프로그래밍 목록 제약 조건(SpeechRecognitionListConstraint) 지정

목록 제약 조건은 음성 인식기의 제약 조건 컬렉션에 추가해야 합니다.

다음 사항을 염두에 두어야 합니다.

  • 제약 조건 컬렉션에 여러 목록 제약 조건을 추가할 수 있습니다.
  • 문자열 값을 위해 IIterable<String>을 구현하는 컬렉션을 사용할 수 있습니다.

여기서는 프로그래밍 방식으로 단어 배열을 목록 제약 조건으로 지정하고 음성 인식기의 제약 조건 컬렉션에 추가합니다.

private async void YesOrNo_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // You could create this array dynamically.
    string[] responses = { "Yes", "No" };


    // Add a list constraint to the recognizer.
    var listConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint(responses, "yesOrNo");

    speechRecognizer.UIOptions.ExampleText = @"Ex. 'yes', 'no'";
    speechRecognizer.Constraints.Add(listConstraint);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

SRGS 문법 제약 조건 지정(SpeechRecognitionGrammarFileConstraint)

SRGS 문법 파일을 음성 인식기의 제약 조건 컬렉션에 추가해야 합니다.

SRGS 버전 1.0은 음성 인식을 위한 XML 형식 문법을 만들기 위한 업계 표준 태그 언어입니다. 유니버설 Windows 앱은 음성 인식 문법을 만들기 위해 SRGS를 사용하는 대안을 제공하지만, SRGS를 사용하여 문법을 만들면 특히 더 많은 관련 음성 인식 시나리오에서 최상의 결과를 생성할 수 있습니다.

SRGS 문법은 앱에 대한 복잡한 음성 상호 작용을 설계하는 데 도움이 되는 전체 기능 집합을 제공합니다. 예를 들어 SRGS 문법을 사용하면 다음을 수행할 수 있습니다.

  • 단어와 구를 인식하기 위해 반드시 발음해야 하는 순서를 지정합니다.
  • 인식되도록 여러 목록과 구의 단어를 결합합니다.
  • 다른 문법에 연결합니다.
  • 대체 단어 또는 구에 가중치를 할당하여 음성 입력을 일치시키는 데 사용될 가능성을 높이거나 줄입니다.
  • 선택적 단어 또는 구를 포함합니다.
  • 문법과 일치하지 않는 임의 음성 또는 배경 노이즈와 같이 지정되지 않거나 예기치 않은 입력을 필터링하는 데 도움이 되는 특수 규칙을 사용합니다.
  • 의미 체계를 사용하여 앱에 음성 인식의 의미를 정의합니다.
  • 발음을 지정할 때, 문법 규칙에서 인라인으로 하거나 어휘집에 대한 링크를 통한 방법을 사용할 수 있습니다.

SRGS 요소 및 특성에 대한 자세한 내용은 SRGS 문법 XML 참조를 참조하세요 . SRGS 문법 만들기를 시작하려면 기본 XML 문법을 만드는 방법을 참조하세요.

다음 사항을 염두에 두어야 합니다.

  • 제약 조건 컬렉션에 여러 문법 파일 제약 조건을 추가할 수 있습니다.
  • SRGS 규칙을 준수하는 XML 기반 문법 문서에 .grxml 파일 확장자를 사용합니다.

이 예제에서는 srgs.grxml이라는 파일에 정의된 SRGS 문법을 사용합니다(나중에 설명). 파일 속성에서 패키지 작업콘텐츠로 설정되며 출력 디렉터리로 복사항상 복사로 설정됩니다.

private async void Colors_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Add a grammar file constraint to the recognizer.
    var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Colors.grxml"));
    var grammarFileConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionGrammarFileConstraint(storageFile, "colors");

    speechRecognizer.UIOptions.ExampleText = @"Ex. 'blue background', 'green text'";
    speechRecognizer.Constraints.Add(grammarFileConstraint);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

이 SRGS 파일(srgs.grxml)에는 의미 체계 해석 태그가 포함됩니다. 이러한 태그는 문법 일치 데이터를 앱에 반환하는 메커니즘을 제공합니다. 문법은 W3C(World Wide Web 컨소시엄) SISR(의미 체계 해석) 1.0 사양을 준수해야 합니다.

여기서는 "예"와 "아니요"의 변형을 듣습니다.

<grammar xml:lang="en-US" 
         root="yesOrNo"
         version="1.0" 
         tag-format="semantics/1.0"
         xmlns="http://www.w3.org/2001/06/grammar">

    <!-- The following rules recognize variants of yes and no. -->
      <rule id="yesOrNo">
         <one-of>
            <item>
              <one-of>
                 <item>yes</item>
                 <item>yeah</item>
                 <item>yep</item>
                 <item>yup</item>
                 <item>un huh</item>
                 <item>yay yus</item>
              </one-of>
              <tag>out="yes";</tag>
            </item>
            <item>
              <one-of>
                 <item>no</item>
                 <item>nope</item>
                 <item>nah</item>
                 <item>uh uh</item>
               </one-of>
               <tag>out="no";</tag>
            </item>
         </one-of>
      </rule>
</grammar>

제약 조건 관리

제약 조건 컬렉션을 인식용으로 로드한 후 앱은 제약 조건의 IsEnabled 속성을 true 또는 false로 설정하여 인식 작업에 사용할 수 있는 제약 조건을 관리할 수 있습니다. 기본 설정은 true입니다.

일반적으로 각 인식 작업에 대한 제약 조건을 로드, 언로드 및 컴파일하는 대신 필요에 따라 제약 조건을 한 번 로드하고 사용하도록 설정하고 사용하지 않도록 설정하는 것이 더 효율적입니다. 필요에 따라 IsEnabled 속성을 사용합니다.

제약 조건 수를 제한하면 음성 인식기가 음성 입력을 검색하고 일치시키는 데 필요한 데이터의 양을 제한할 수 있습니다. 이렇게 하면 음성 인식의 성능과 정확도를 모두 향상시킬 수 있습니다.

앱이 현재 인식 작업의 컨텍스트에서 예상할 수 있는 문구에 따라 활성화할 제약 조건을 결정합니다. 예를 들어 현재 앱 컨텍스트가 색을 표시하는 경우 동물의 이름을 인식하는 제약 조건을 사용하도록 설정할 필요가 없습니다.

사용자에게 말할 내용을 요청하려면 SpeechRecognizer.UIOptions 속성을 통해 설정된 SpeechRecognizerUIOptions.AudiblePromptSpeechRecognizerUIOptions.ExampleText 속성을 사용하십시오. 사용자가 인식 작업 중에 말할 수 있는 내용을 준비하면 활성 제약 조건과 일치할 수 있는 구를 말할 가능성이 높아집니다.

Samples