2017-04-20 6 views
1

모든 UWP TTS (text-to-speech) 샘플은 XAML로 만든 MediaElement 컨트롤을 사용합니다. 예를 들어, 잘 작동이 같은 :XAML MediaElement없는 UWP 음성 합성

using namespace Windows::Media::SpeechSynthesis; 

//.......... 

void App::MainPage::buttonSpeak_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    create_task(synthesizer->SynthesizeTextToStreamAsync(L"I am ready.")) 
     .then([this](SpeechSynthesisStream ^stream) 
    { 
     MediaElement ^media = mediaElement; //created in a separate XAML file 
     media->AutoPlay = true; 
     media->SetSource(stream, stream->ContentType); 
     media->Play(); 
    }); 
} 

어떻게 그것을 (내 경우에는, 홀로그램의 DirectX 응용 프로그램)을 XAML 기반 인터페이스없이 작동에 적응 하는가? 프로그래밍 방식으로 MediaElement를 만들려고했습니다. 지. MediaElement ^media = ref new MediaElement();, 항상 "The application called an interface that was marshalled for a different thread" 예외가 발생합니다.

+0

설명서는 다음 위치에 있습니다. https://docs.microsoft.com/en-us/uwp/api/windows.media.speechsynthesis.speechsynthesizer – pollaris

답변

0

대신 MediaPlayer을 사용했습니다.

using namespace Windows::Media::SpeechSynthesis; 
using namespace Windows::Media::Playback; 

//... 

SpeechSynthesizer ^synthesizer = ref new SpeechSynthesizer(); 
MediaPlayer ^player = ref new MediaPlayer(); 

//... 
create_task(synthesizer->SynthesizeTextToStreamAsync(L"I am ready.")) 
    .then([this](SpeechSynthesisStream ^stream) 
{ 
    player->SetStreamSource(stream); 
    player->Play(); 
}); 

컴파일러가 SetStreamSource가되지 않습니다 있다는 경고를 제공하고, Source 대신 사용해야합니다,하지만 난 그것을 사용하는 방법을 생각하지 않은 있지만 그것은, 작동합니다.

0

MediaElement은 UI 스레드에서만 작동 할 수 있기 때문에 예외가 발생합니다.

AudioGraph을 사용할 수 있습니다. 모든 스레드에서 실행할 수 있습니다.

관련 문제