没有 XAML MediaElement 的 UWP 语音合成

UWP speech synthesis without a XAML MediaElement

我能找到的每个 UWP 文本转语音示例都使用了用 XAML 创建的 MediaElement 控件。例如,像这样的东西,效果很好:

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,e。 G。 MediaElement ^media = ref new MediaElement();,它总是抛出 "The application called an interface that was marshalled for a different thread" 异常。

它抛出异常是因为 MediaElement 只能在 UI 线程上工作。

您可以使用 AudioGraph。它可以 运行 在任何线程上。

我是用 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代替,但我还没有弄清楚如何使用它。

为了补充 Headcrab 的答案,使用 Source 而不是 SetStreamSource

替换:

player->SetStreamSource(stream);

与:

player->Source = Windows::Media::Core::MediaSource::CreateFromStream(stream, stream->ContentType)