C++ Microsoft SAPI:如何将Windows文本到语音输出设置为内存缓冲区?

Vla*_*mir 6 sapi text-to-speech visual-c++

我一直试图弄清楚如何使用Windows SAPI 5.1将文本"说"到内存缓冲区,但到目前为止还没有成功,尽管看起来它应该非常简单.

一个将合成语音流式传输到.wav文件的示例,但没有关于如何将其流式传输到内存缓冲区的示例.

最后,我需要在16*16位小端PCM格式的char*数组中使用合成语音.目前我创建了一个临时.wav文件,在那里重定向语音输出,然后读取它,但它似乎是一个相当愚蠢的解决方案.

谁知道怎么做?

谢谢!

Eri*_*own 7

看看ISpStream :: SetBaseStream.这是一个小帮手:

inline HRESULT SPCreateStreamOnHGlobal(
                    HGLOBAL hGlobal,            //Memory handle for the stream object
                    BOOL fDeleteOnRelease,      //Whether to free memory when the object is released
                    const WAVEFORMATEX * pwfex, //WaveFormatEx for stream
                    ISpStream ** ppStream)      //Address of variable to receive ISpStream pointer
{
    HRESULT hr;
    IStream * pMemStream;
    *ppStream = NULL;
    hr = ::CreateStreamOnHGlobal(hGlobal, fDeleteOnRelease, &pMemStream);
    if (SUCCEEDED(hr))
    {
        hr = ::CoCreateInstance(CLSID_SpStream, NULL, CLSCTX_ALL, __uuidof(*ppStream), (void **)ppStream);
        if (SUCCEEDED(hr))
        {
            hr = (*ppStream)->SetBaseStream(pMemStream, SPDFID_WaveFormatEx, pwfex);
            if (FAILED(hr))
            {
                (*ppStream)->Release();
                *ppStream = NULL;
            }
        }
        pMemStream->Release();
    }
    return hr;
}
Run Code Online (Sandbox Code Playgroud)


egr*_*nin 0

您知道如何创建内存映射文件吗?你可以看看遗嘱是否ISpStream与它绑定。