3,245
社区成员
发帖
与我相关
我的任务
分享
CComPtr<ISpStream> cpWavISpStream;
CComPtr<IStream> cpIStream;
CComPtr<IStream> cpNewIStream;
CComPtr<ISpStreamFormat> cpOldStream;
::CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice,
(void **)&pVoice);
//get format from OldStream
hr = pVoice->GetOutputStream( &cpOldStream );
WAVEFORMATEX fmt;
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nSamplesPerSec = 48000;
fmt.wBitsPerSample = 16;
fmt.nChannels = 1;
fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample / 8;
fmt.nAvgBytesPerSec = fmt.nSamplesPerSec * fmt.nBlockAlign;
fmt.cbSize = 0;
BYTE* pcontent = new BYTE[1024*1000];
//cpIStream = SHCreateMemStream(pcontent, 1024*1000);
cpIStream = SHCreateMemStream(NULL, 0);
hr = cpWavISpStream->SetBaseStream(
cpIStream,
SPDFID_WaveFormatEx,
&fmt
);
//tansfer audio to cpWavISpStream
hr = pVoice->SetOutput(cpWavISpStream, TRUE);
hr = pVoice->Speak(L"hello",SPF_ASYNC | SPF_IS_NOT_XML,0);
pVoice->WaitUntilDone(INFINITE );
//reset Stream
hr = pVoice->SetOutput( cpOldStream, FALSE );
//get buf from ISpStream
hr = cpWavISpStream->GetBaseStream(&cpNewIStream);
ULARGE_INTEGER StreamSize;
StreamSize.LowPart = 0;
hr = IStream_Size(cpIStream,&StreamSize);
DWORD dwSize = StreamSize.QuadPart;
byte *buf1 = new byte[dwSize+1];
hr = IStream_Read(cpIStream,buf1,dwSize);