정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 음성 인식 시작

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

Windows.Phone.Speech.Recognition API에는 두 개의 음성 인식기가 포함되어 있습니다. 각 인식기에는 인식 작업을 시작하는 고유한 메서드가 있습니다.

  • SpeechRecognizerUIRecognizeWithUIAsync()SpeechRecognizerUI 개체에 대한 인식을 시작합니다.

  • SpeechRecognizerRecognizeAsync()SpeechRecognizer 개체에 대한 인식을 시작합니다.

인식 작업은 버튼 누름 등 사용자 입력이나 앱 논리에 의해 시작될 수 있습니다.

SpeechRecognizerUIRecognizeWithUIAsync()에 대한 각 호출에서 SpeechRecognizerUI 개체는 사용자의 음성 인식기의 문법 집합에서 사용 가능한 문법과 사용자가 한 말을 일치시킵니다. 사용자의 음성이 성공적으로 인식되도록 지원하기 위해 SpeechRecognizerUIRecognizeWithUIAsync() 메서드는 GUI에 사용자에게 프롬프트를 표시하고 피드백을 제공하며 사용자가 여러 인식 시도를 시작할 수 있도록 하는 화면을 제공합니다.

  • 인식 시도가 실패하면 SpeechRecognizerUI 개체는 사용자가 필요할 경우 추가 인식 시도를 반복적으로 시작하도록 하는 오류 처리 화면을 제공합니다.

  • 사용자가 한 말을 사용 가능한 문법에 정의된 두 개 이상의 구와 거의 일치시킬 수 있는 경우 SpeechRecognizerUI 개체는 사용자가 사용 가능한 일치 항목 중에서 선택할 수 있는 확인 내용화면을 제공합니다.

SpeechRecognizerUISettings 클래스의 속성을 사용하여 사용자에게 프롬프트를 표시하고 확인을 제공하는 화면을 사용자 지정할 수 있습니다. 자세한 내용은 Windows Phone 8의 프롬프트, 확인 및 명확성 옵션 제공을 참조하세요.

RecognizeWithUIAsync 메서드 예제

다음 예제에서는 도시 이름을 인식하는 앱에서 SpeechRecognizerUIRecognizeWithUIAsync()를 사용하고 GUI 화면용 텍스트를 준비하는 방법을 보여 줍니다.

public partial class MainPage : PhoneApplicationPage
{

  // Declare the SpeechRecognizerUI object at the class level.
  SpeechRecognizerUI recoWithUI;

  // Construct the main page.
  public MainPage()
  {
    InitializeComponent();

    // Initialize objects ahead of time to avoid delays when starting recognition.
    recoWithUI = new SpeechRecognizerUI();

    // Set the path to an SRGS-compliant XML file.
    Uri citiesGrammar = new Uri("ms-appx:///CitiesList.grxml", UriKind.Absolute);

    // Add the SRGS grammar to the grammar set.
    recoWithUI.Recognizer.Grammars.AddGrammarFromUri("cities", citiesGrammar);

    // Let the user know what to say.
    recoWithUI.Settings.ListenText = "Fly to what city?";

    // Give an example of expected input.
    recoWithUI.Settings.ExampleText = " 'Barcelona', 'Montreal', 'Santiago' ";
  }

  // Handle the button click event.
  private async void Reco1_Click(object sender, RoutedEventArgs e)
  {
    // Start recognition.
    SpeechRecognitionUIResult recoResult = await recoWithUI.RecognizeWithUIAsync();
  }
}

다음 코드 예제에서는 해당 CitiesList.grxml SRGS 문법 파일을 보여 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<grammar xml:lang="en-US" root="Main" tag-format="semantics/1.0" version="1.0" xmlns="http://www.w3.org/2001/06/grammar">
   <!-- Defines an SRGS grammar for choosing a city for  flight departures and destinations. -->
   <rule id="Main">
      <item repeat ="0-1"> I want to fly to </item>
      <ruleref uri="#Cities" />
   </rule>
   <rule id="Cities" scope="public">
      <one-of>
         <item> Seattle </item>
         <item> Sao Paulo </item>
         <item> Rome </item>
         <item> Tokyo </item>
         <item> Barcelona </item>
         <item> Montreal </item>
         <item> Santiago </item>
      </one-of>
   </rule>
</grammar>

SpeechRecognizerRecognizeAsync()에 대한 각 호출에서 SpeechRecognizer 개체는 사용자의 음성 인식기의 문법 집합에서 사용 가능한 문법과 사용자가 한 말을 일치시킵니다. 다음 중 하나가 발생하면 인식 작업이 완료됩니다.

  • 인식에 성공했습니다. 사용자의 말이 사용 가능한 문법의 구와 일치했습니다.

  • 인식에 실패했습니다. 사용자의 말을 사용 가능한 문법의 구와 일치시키지 못했습니다.

  • 인식 시간 제한 간격이 만료되었습니다. SpeechRecognizerSettingsInitialSilenceTimeout(), SpeechRecognizerSettingsBabbleTimeout() 또는 SpeechRecognizerSettingsEndSilenceTimeout() 중 하나에 대한 간격이 만료되면 사용 가능한 문법과의 일치 여부와 상관없이 인식 작업이 완료됩니다.

시간 제한 설정에 대한 자세한 내용은 Windows Phone 8의 음성 인식기 설정 사용자 지정을 참조하세요.

인식 작업을 지원하기 위해 GUI가 필요하지 않거나 인식 작업을 지원할 사용자 지정 GUI를 제공하는 경우에는 일반적으로 SpeechRecognizerRecognizeAsync()를 사용하게 됩니다.

RecognizeAsync 메서드 예제

다음 예제에서는 SpeechRecognizerUIRecognizeWithUIAsync()에 대한 호출에 포함될 GUI 화면과 관련된 사용자의 경험과 유사한 인식 흐름을 제공하는 SpeechRecognizerRecognizeAsync()의 사용을 보여 줍니다.

이 앱의 발췌 내용에는 인식 시도 결과를 확인하고 텍스트 블록에서 사용자에게 프롬프트와 확인을 제공하기 위한 코드가 포함됩니다. 이 앱은 SpeechRecognizerAudioCaptureStateChanged() 이벤트도 구독하며 이벤트에 의해 반환된 정보를 사용하여 사용자에게 "듣는 중"과 "생각 중" 메시지를 표시합니다. SpeechRecognizerUIRecognizeWithUIAsync()에 대한 호출에 포함될 동일 검사 외에도, 이 예제는 신뢰도가 낮은 상태로 음성 입력이 인식되었는지 여부를 확인하고 사용자에게 다시 말하라는 프롬프트를 표시합니다. 사용자는 버튼을 탭하여 인식을 시작할 수 있습니다.

public partial class MainPage : PhoneApplicationPage
{

  // Declare the SpeechRecognizer object at the class level.
  SpeechRecognizer myRecognizer;

  // Construct the main page.
  public MainPage()
  {
    InitializeComponent();

    // Initialize the SpeechRecognizer and add the WebSearch grammar.
    myRecognizer = new SpeechRecognizer();
    myRecognizer.Grammars.AddGrammarFromPredefinedType("citySearch", SpeechPredefinedGrammar.WebSearch);

    // Prompt the user for a city name.
    displayText.Text = "What's your destination city?";

    // Subscribe to the AudioCaptureStateChanged event.
    myRecognizer.AudioCaptureStateChanged += myRecognizer_AudioCaptureStateChanged;
  }

  // Detect capture state changes and write the capture state to the text block.
  void myRecognizer_AudioCaptureStateChanged(SpeechRecognizer sender, SpeechRecognizerAudioCaptureStateChangedEventArgs args)
  {
    if (args.State == SpeechRecognizerAudioCaptureState.Capturing)
    {
      this.Dispatcher.BeginInvoke(delegate { displayText.Text = "Listening"; });
    }
    else if (args.State == SpeechRecognizerAudioCaptureState.Inactive)
    {
      this.Dispatcher.BeginInvoke(delegate { displayText.Text = "Thinking"; });
    }
  }

  // Handle the button click event.
  private async void Reco1_Click(object sender, RoutedEventArgs e)
  {

    // Start recognition.
    SpeechRecognitionResult recoResult = await myRecognizer.RecognizeAsync();

    // Check to see if speech input was rejected and prompt the user.
    if (recoResult.TextConfidence == SpeechRecognitionConfidence.Rejected)
    {
      displayText.Text = "Sorry, didn't catch that. \n\nSay again.";
    }

    // Check to see if speech input was recognized with low confidence and prompt the user to speak again.
    else if (recoResult.TextConfidence == SpeechRecognitionConfidence.Low)
    {
      displayText.Text = "Not sure what you said. \n\nSay again.";
    }

    // Check to see if speech input was recognized and confirm the result.
    else if (recoResult.TextConfidence == SpeechRecognitionConfidence.High ||
          recoResult.TextConfidence == SpeechRecognitionConfidence.Medium)
    {
      displayText.Text = "Heard you say: \n\n" + recoResult.Text;
    }
  }
}

표시: