没有 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)
我能找到的每个 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)