2017-04-20 3 views
1

XWLで作成されたすべての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(); 
    }); 
} 

どのように私はそれが(私の場合には、ホログラフィックのDirectXアプリケーション)XAMLベースのインターフェイスなしで動作するように適応していますか?プログラムで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としました。

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を使用できます。どのスレッドでも実行できます。

関連する問題