XSpeechSynthesizerCreate

创建语音合成器。

语法

HRESULT XSpeechSynthesizerCreate(  
         XSpeechSynthesizerHandle* speechSynthesizer  
)  

参数

speechSynthesizer _Out_
类型:XSpeechSynthesizerHandle*

所创建的语音合成器的句柄。

返回值

类型:HRESULT

如果成功,则返回 S_OK;否则返回错误代码。 有关错误代码的列表,请参阅错误代码

备注

注意

在时间敏感线程上调用此函数是不安全的。 有关详细信息,请参阅时间敏感线程

使用此函数创建并接收新语音合成器实例的句柄,这会提供对已安装的语音合成引擎或 voice 的功能的访问权限。

默认情况下,新的语音合成器实例使用当前系统语音。 要枚举和获取有关当前设备上安装的语音的信息,请使用 XSpeechSynthesizerEnumerateInstalledVoices 函数以及 XSpeechSynthesizerInstalledVoicesCallback 回调函数。 对于每个已安装的语音,XSpeechSynthesizerVoiceInformation 结构提供语音 ID、说明、显示文本、性别、语言和其他信息。 调用 XSpeechSynthesizerSetCustomVoice 以使用不同的已安装语音,或调用 XSpeechSynthesizerSetDefaultVoice 以再次使用当前系统语音。

创建语音合成器句柄并指定语音后,使用 XSpeechSynthesizerCreateStreamFromText 函数创建语音合成器流,并从纯文本合成语音。 使用 XSpeechSynthesizerGetStreamDataSizeXSpeechSynthesizerGetStreamData 函数从语音合成器流中获取合成语音的音频数据,然后使用 XSpeechSynthesizerCloseStreamHandle 函数在完成所有未完成的异步操作后关闭语音合成器流。

使用 XSpeechSynthesizerCloseHandle 函数关闭语音合成器,并在使用完语音合成器后释放系统资源。

为防止内存泄漏,请在完成所有使用某个语音合成器句柄的操作后,调用 XSpeechSynthesizerCloseHandle 函数来关闭此句柄。

下面的示例演示如何通过使用语音合成器和已安装的语音从纯文本合成语音,以及如何使用语音合成器流合成音频数据。 XSpeechSynthesizerCreateXSpeechSynthesizerSetCustomVoice 函数创建一个语音合成器实例,(可选)如果在 voiceId 中指定了语音 ID,则向其分配一个自定义语音。 然后,XSpeechSynthesizerCreateStreamFromText 函数会创建一个语音合成器流并从在 textToSpeak 中指定的纯文本合成语音。 创建流后,XSpeechSynthesizerGetStreamDataSizeXSpeechSynthesizerGetStreamData 函数将检索合成语音的音频数据,以便从流中播放。 最后,在播放完音频数据后,XSpeechSynthesizerCloseStreamHandleXSpeechSynthesizerCloseHandle 函数将关闭语音合成器流和语音合成器。

HRESULT Game::SynthesizeSpeech(
    const char* textToSpeak,
    const char* voiceId)
{
    // Create a new speech synthesizer.
    XSpeechSynthesizerHandle ssHandle = nullptr;
    if (FAILED(XSpeechSynthesizerCreate(&ssHandle))) { return E_FAIL; }

    // If a voice ID was specified, attempt to set the speech synthesizer to
    // use the specified voice. Note that voiceId has a default value of nullptr, 
    // as specified in its function declaration.
    if (voiceId != nullptr) 
    {
        if (FAILED(XSpeechSynthesizerSetCustomVoice(ssHandle, voiceId))) { return E_FAIL; }
    }

    // Create a new speech synthesizer stream from the specified text.
    XSpeechSynthesizerStreamHandle ssStreamHandle = nullptr;
    if (FAILED(XSpeechSynthesizerCreateStreamFromText(ssHandle, textToSpeak, &ssStreamHandle))) { return E_FAIL; }

    // Get the size of the buffer needed for the audio data from our stream.
    size_t bufferSize;
    if (FAILED(XSpeechSynthesizerGetStreamDataSize(ssStreamHandle, &bufferSize))) { return E_FAIL; }

    // Define the buffer, then retrieve the audio data from our stream.
    std::vector<char> streamData;
    streamData.resize(bufferSize);
    if (FAILED(XSpeechSynthesizerGetStreamData(ssStreamHandle, bufferSize, streamData.data(), &bufferSize))) { return E_FAIL; }

    // We now have audio data from the speech synthesizer stream, so let's play it. 
    // For the purposes of this example, the sound is played synchronously, so that we don't
    // risk having an outstanding asynchronous operation when we close the stream.
    PlaySoundW(reinterpret_cast<LPCWSTR>(streamData.data()), nullptr, SND_MEMORY);

    // We're done with the speech synthesizer stream, so let's close it.
    if (FAILED(XSpeechSynthesizerCloseStreamHandle(ssStreamHandle))) { return E_FAIL; }

    // We're done with the speech synthesizer, so let's close that, too.
    if (FAILED(XSpeechSynthesizerCloseHandle(ssHandle))) { return E_FAIL; }

    return S_OK;
}

要求

头文件:XSpeechSynthesizer.h

库:xgameruntime.lib

支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机

另请参阅

XAccessibility
XSpeechSynthesizerCloseHandle
XSpeechSynthesizer