Я пытался выяснить, как "говорить" текст в буфер памяти с помощью Windows SAPI 5.1, но до сих пор никакой успех, даже при том, что это кажется им, не должен быть довольно простым.
Существует пример потоковой передачи синтезированной речи в .wav файл, но никакие примеры того, как передать его потоком к буферу памяти.
В конце у меня должна быть синтезированная речь в символе* массив в 16-разрядном формате PCM с прямым порядком байтов на 16 кГц. В настоящее время я создаю временный файл .wav файл, перенаправляю речевой вывод там, затем читаю его, но это, кажется, довольно глупое решение.
Кто-либо знает, как сделать это?
Спасибо!
Вы знаете, как создать файл с отображением в память? Вы можете увидеть, будет ли к нему привязан ISpStream
.
Посмотрите в 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;
}