sapi实现TTS,定位音频流如何取到内存BUFF中?

测试230 2013-12-12 03:02:34

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);



这样有问体吗?我这样调用取出来的SIZE不正确。buf1中也没有得到数据。请问如何修改?急
...全文
918 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
奋斗的山核桃 2014-08-14
  • 打赏
  • 举报
回复
请问楼主现在这个问题解决了吗,不知道应该怎么做了
测试230 2013-12-24
  • 打赏
  • 举报
回复
搞不定啊,求救大牛!!!
测试230 2013-12-13
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
干嘛不使用Import进来?
如果Import? SAPI中没看到这样用的?我的目的就是帮TTS产生的音频流放到内存中,然后发到客户端去
测试230 2013-12-13
  • 打赏
  • 举报
回复
引用 1 楼 xuddk727 的回复:
实际size为多少?
但取SIZE只有28000多字节,而且read不出数据,感觉是没有读到流中, 但如果把流bind文件,大小则有90K
测试230 2013-12-13
  • 打赏
  • 举报
回复
引用 5 楼 xuddk727 的回复:
粗看代码似乎没什么问题,我帮你加亮下,等待有大牛有时间帮你调试下。
THX,希望能解决。 我估计还是我调用有问题, 不熟悉没办法啊,只能求教大牛了
测试230 2013-12-13
  • 打赏
  • 举报
回复
引用 6 楼 oyljerry 的回复:
[quote=引用 3 楼 tnt230 的回复:] [quote=引用 1 楼 xuddk727 的回复:] 实际size为多少?
但取SIZE只有28000多字节,而且read不出数据,感觉是没有读到流中, 但如果把流bind文件,大小则有90K[/quote] 那就bind到文件,然后再读入内存buffer[/quote] 我暂时就是这样做的,但作为TTS服务程序,这样设计不太好,如果写文件再读,一次请求就2次文件I/O,我再研究研究,
oyljerry 2013-12-13
  • 打赏
  • 举报
回复
引用 3 楼 tnt230 的回复:
[quote=引用 1 楼 xuddk727 的回复:] 实际size为多少?
但取SIZE只有28000多字节,而且read不出数据,感觉是没有读到流中, 但如果把流bind文件,大小则有90K[/quote] 那就bind到文件,然后再读入内存buffer
许文君 2013-12-13
  • 打赏
  • 举报
回复
粗看代码似乎没什么问题,我帮你加亮下,等待有大牛有时间帮你调试下。
worldy 2013-12-12
  • 打赏
  • 举报
回复
干嘛不使用Import进来?
许文君 2013-12-12
  • 打赏
  • 举报
回复
实际size为多少?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧