6

Windows SAPI 5.1 を使用してテキストをメモリ バッファーに "読み上げる" 方法を見つけようとしましたが、これまでのところ成功していません。

合成音声を .wav ファイルにストリーミングする例はありますが、メモリ バッファーにストリーミングする方法の例はありません。

最後に、合成音声を 16 kHz 16 ビット リトルエンディアン PCM 形式の char* 配列にする必要があります。現在、一時的な .wav ファイルを作成し、そこに音声出力をリダイレクトしてから読み取りますが、それはかなりばかげた解決策のようです。

誰もそれを行う方法を知っていますか?

ありがとう!

4

3 に答える 3

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;
}
于 2010-05-11T21:02:57.983 に答える
2

ISpStream を使用してそれを達成しました。ispstream の Setbasestream 関数を使用して istream にバインドし、ispvoice の出力をその ispstream に設定します。

誰かがそれを望むなら、これが私の実用的な解決策です:

https://github.com/itsyash/MS-SAPI-demo

于 2014-06-01T07:03:16.947 に答える
0

メモリ マップト ファイルの作成方法を知っていますか? ISpStreamがそれにバインドされるかどうかを確認できます。

于 2010-05-07T04:13:43.173 に答える