2017-04-20 82 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。它可以在任何线程上运行。