2017-04-20 84 views
1

我能找到的每個UWP文本到語音樣本都使用了使用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(); 
    }); 
} 

如何適應它沒有基於XAML的工作界面(全息DirectX程序,在我的情況)?我已經嘗試以編程方式創建MediaElement,例如。 G。 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代替了MediaElement

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。它可以在任何線程上運行。