C ++ Microsoft SAPI: Как настроить вывод текста в речь Windows в буфер памяти? - PullRequest
6 голосов
/ 07 мая 2010

Я пытался выяснить, как «произносить» текст в буфер памяти с помощью Windows SAPI 5.1, но пока безуспешно, даже если кажется, что это должно быть довольно просто.

Существует пример потоковой передачи синтезированной речи в файл .wav, но нет примеров того, как передать ее в буфер памяти.

В конце мне нужно получить синтезированную речь в массиве char * в 16-битном 16-битном формате PCM 16 кГц. В настоящее время я создаю временный файл .wav, перенаправляю туда речевой вывод, затем читаю его, но это кажется довольно глупым решением.

Кто-нибудь знает, как это сделать?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

Посмотрите на 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;
}
2 голосов
/ 01 июня 2014

Я сделал это с помощью ISpStream. Используйте функцию Setbasestream ispstream, чтобы связать его с istream, а затем установить вывод ispvoice для этого ispstream.

Вот мое рабочее решение, если кто-нибудь захочет:

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

0 голосов
/ 07 мая 2010

Знаете ли вы, как создать файл с отображением в памяти? Вы могли видеть, будет ли ISpStream привязываться к нему.

...