내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 TTS(텍스트 음성 변환)

2014-06-18

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

 

Windows.Phone.Speech.Synthesis API를 사용하여 Windows Phone 8 앱에서 TTS(텍스트 음성 변환)라고도 하는 합성된 음성을 생성할 수 있습니다. 예를 들어 앱에서는 사용자에게 입력 메시지를 표시하고 메시지 내용을 읽고 검색 결과를 제공할 수 있습니다.

참고참고:

TTS를 사용하려면 앱 매니페스트에서 ID_CAP_SPEECH_RECOGNITION 기능을 설정해야 합니다. 이 기능을 설정하지 않을 경우 앱이 제대로 작동하지 않을 수 있습니다. 자세한 내용은 Windows Phone 8의 앱 기능 및 하드웨어 요구 사항을 참조하세요.

TTS를 생성하는 가장 빠르고 간편한 방법은 일반 텍스트 문자열을 SpeechSynthesizerSpeakTextAsync(String) 메서드에 제공하는 것입니다. 다음 코드 예제에서는 버튼의 Click 이벤트 처리기에서 이렇게 하는 방법을 보여 줍니다.

private async void ButtonSimpleTTS_Click(object sender, RoutedEventArgs e)
{
  SpeechSynthesizer synth = new SpeechSynthesizer();
    
  await synth.SpeakTextAsync("You have a meeting with Peter in 15 minutes.");
}

일반적으로 await 연산자를 SpeakTextAsync 메서드에 적용하고 SpeakTextAsync가 포함된 메서드에서 async 한정자를 사용합니다. 비동기 SpeakTextAsync 메서드는 await 연산자 앞에 나오므로 SpeakTextAsync는 음성 신디사이저가 텍스트 문자열 말하기를 완료할 때까지 기다리지 않고 즉시 반환합니다. 하지만 await 연산자는 SpeakTextAsync가 완료될 때까지 포함 메서드의 실행을 일시 중단합니다.

Windows Phone 8 에는 다양한 언어의 말하기 음성이 포함되어 있습니다. 각 음성은 합성 음성을 특정 국가/지역에서 사용되는 단일 언어로 생성합니다. SpeechSynthesizer 개체를 만든 후 로드할 음성 언어를 지정할 수 있습니다. SpeechSynthesizer 인스턴스는 휴대폰에 설치된 모든 음성을 로드하고 이를 사용하여 음성을 생성할 수 있습니다. 언어를 지정하지 않으면 API에서는 사용자가 휴대폰의 설정/음성에서 선택한 언어와 일치하는 음성을 로드합니다.

다음 예제에서는 음성 신디사이저 인스턴스를 만들고 LINQ 쿼리를 사용하여 해당 언어를 설정합니다. LINQ 쿼리는 설치된 각 음성을 설명하는 VoiceInformation 개체를 검색하여 언어 속성 값이 프랑스에서 사용되는 프랑스어를 나타내는 "fr-FR"인 개체를 찾습니다. 변수 frenchVoices는 암시적으로 VoiceInformation 개체로 입력됩니다.

SpeechSynthesizerSetVoice(VoiceInformation) 메서드에 대한 인수는 LINQ 쿼리에서 반환된 음성의 인덱스를 지정합니다. 각각 여자 및 남자가 말하는 두 가지 프랑스어 음성이 설치되어 있으므로 쿼리에서 두 가지 음성을 반환합니다. 프랑스어를 말하는 여자 또는 남자 음성만 반환하려면 성별을 필터링하는 where 절에 식을 추가합니다.

// Declare the SpeechSynthesizer object at the class level.
SpeechSynthesizer synth;

// Handle the button click event.
private async void SpeakFrench_Click_1(object sender, RoutedEventArgs e)
{
  // Initialize the SpeechSynthesizer object.
  synth = new SpeechSynthesizer();

  // Query for a voice that speaks French.
  IEnumerable<VoiceInformation> frenchVoices = from voice in InstalledVoices.All
                     where voice.Language == "fr-FR"
                     select voice;
            
  // Set the voice as identified by the query.
  synth.SetVoice(frenchVoices.ElementAt(0));

  // Count in French.
  await synth.SpeakTextAsync("un, deux, trois, quatre");
} 

SSML(Speech Synthesis Markup Language)을 사용하여 특정 언어의 말하기 음성을 선택할 수도 있습니다. 자세한 내용은 SSML(Speech Synthesis Markup Language) 참조를 참조하세요.

음성 신디사이저는 일반 텍스트 또는 SSML(Speech Synthesis Markup Language) 버전 1.0을 준수하는 태그가 포함된 텍스트를 말합니다. 코드에 SSML 태그를 인라인으로 삽입하거나 코드에서 독립 실행형 SSML 문서를 참조할 수 있습니다. 음성 합성 API에는 각각 허용되는 소스 형식 중 하나를 말하는 음성 출력을 시작하는 세 가지 메서드가 있습니다.

  • SpeechSynthesizerSpeakTextAsync(String). 메서드에 대한 인수로 제공하는 일반 텍스트의 문자열을 말합니다. 자세한 내용은 이 항목의 맨 위에 있는 코드 예제를 참조하세요.

  • SpeechSynthesizerSpeakSsmlAsync(String). 메서드에 대한 인수로 제공하는 SSML 태그가 있는 텍스트의 문자열을 말합니다.

  • SpeechSynthesizerSpeakSsmlFromUriAsync(Uri). 메서드에 대한 인수에서 참조하는 독립 실행형 SSML 문서의 콘텐츠를 말합니다.

SpeakSsmlAsync 코드 예제

다음 코드 예제에서는 SpeakSsmlAsync 메서드를 사용하여 SSML 태그가 있는 텍스트의 문자열을 말하는 방법을 보여 줍니다.

// Speaks a string of text with SSML markup.
private async void SpeakSsml_Click(object sender, RoutedEventArgs e)
{
   SpeechSynthesizer synth = new SpeechSynthesizer();

   // Build an SSML prompt in a string.
   string ssmlPrompt = "<speak version=\"1.0\" ";
   ssmlPrompt += "xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\">";
   ssmlPrompt += "This voice speaks English. </speak>";

   // Speak the SSML prompt.
   await synth.SpeakSsmlAsync(ssmlPrompt);
}

SpeakSsmlFromUriAsync 코드 예제

다음 코드 예제에서는 SpeakSsmlFromUriAsync 메서드를 사용하여 독립 실행형 SSML 문서의 콘텐츠를 말하는 방법을 보여 줍니다.

// Speaks the content of a standalone SSML file.
private async void SpeakSsmlFromFile_Click(object sender, RoutedEventArgs e)
{
   SpeechSynthesizer synth = new SpeechSynthesizer();

   // Set the path to the SSML-compliant XML file.
   string path = Package.Current.InstalledLocation.Path + "\\ChangeVoice.ssml";
   Uri changeVoice = new Uri(path, UriKind.Absolute);

   // Speak the SSML prompt.
   await synth.SpeakSsmlFromUriAsync(changeVoice);
}

SSML 프롬프트 파일이 제대로 배포되었는지 확인하려면 솔루션 탐색기에서 추가 -> 기존 항목 명령을 사용하여 파일을 솔루션에 추가합니다. 파일의 빌드 작업 속성을 콘텐츠로 설정하고 출력 디렉터리로 복사 속성을 변경된 내용만 복사로 설정합니다. 그런 다음 위의 코드 예제에 제공된 경로 구문을 사용하여 SSML 프롬프트를 참조합니다.

기능을 사용할 때 TTS 오류 및 예외가 발생할 수 있습니다. 이러한 오류 및 예외에 대한 자세한 내용은 Windows Phone 8용 음성 앱에서 오류 처리를 참조하세요.

표시:
© 2014 Microsoft