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

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

중요 API: SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint

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

제약 조건 추가

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

여기서는 앱 내에서 사용되는 세 가지 종류의 음성 인식 제약 조건을 다룹니다. (Cortana 음성 명령 제약 조건에 대한 자세한 내용은 Cortana에서 음성 명령으로 포그라운드 앱 시작을 참조하세요.)

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

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

Important

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

웹-검색 문법 지정(SpeechRecognitionTopicConstraint)

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

참고 항목

이제 SpeechRecognitionTopicConstraint와 함께 SpeechRecognitionListConstraint를 사용하여 받아쓰는 동안 사용될 것으로 생각되는 도메인별 키워드 세트를 제공하여 받아쓰기 정확도를 향상시킬 수 있습니다.

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

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 문법을 사용합니다(뒷부분에서 설명). 파일 속성에서 Package ActionContent로 설정되고, Copy to Output DirectoryCopy always로 설정됩니다.

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 속성을 사용합니다.

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

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

무엇을 말할 수 있는지를 사용자에게 요청하려면 SpeechRecognizerUIOptions.AudiblePromptSpeechRecognizerUIOptions.ExampleText 속성을 사용하는데 이것은 SpeechRecognizer.UIOptions 속성을 사용하여 설정됩니다. 사용자가 인식 작업 중에 말할 수 있는 것을 준비하게 하면 활성 제약 조건과 일치할 수 있는 구를 말할 가능성이 높아집니다.

샘플