问题描述
我有一个使用 Windows text-to-speech API 的工作示例,但问题是当输入大量文本时它会冻结。
为了解决这个问题,我想让这个过程异步。我找到了 SpeechVoiceSpeakFlags::SVSFlagsAsync
标志,但是如何获得之前提交的请求的结果?
这是我的代码:
char* TextToWavInner( const wchar_t* voicerequiredAttributes,const wchar_t* voiceOptionalAttributes,long rate,const wchar_t* textToRender,ULONG* pBytesRead )
{
HRESULT hr;
CComPtr<ISpVoice> cpVoice; //Will send data to ISpStream
CComPtr<ISpStream> cpstream; //Will contain IStream
CComPtr<IStream> cpBaseStream; //raw data
ISpObjectToken* cpToken( NULL ); //Will set voice characteristics
GUID guidFormat;
WAVEFORMATEX* pWavFormatEx = nullptr;
hr = cpVoice.CoCreateInstance( CLSID_SpVoice );
if ( Failed( hr ) )
return NULL;
hr = SpFindBestToken( SPCAT_VOICES,voicerequiredAttributes,voiceOptionalAttributes,&cpToken );
if ( Failed( hr ) )
return NULL;
hr = cpVoice->SetVoice( cpToken );
cpToken->Release();
if ( Failed( hr ) )
return NULL;
cpVoice->SetRate( rate );
hr = cpstream.CoCreateInstance( CLSID_SpStream );
if ( Failed( hr ) )
return NULL;
hr = CreateStreamOnHGlobal( NULL,true,&cpBaseStream );
if ( Failed( hr ) )
return NULL;
hr = SpConvertStreamFormatEnum( SPSF_44kHz16BitMono,&guidFormat,&pWavFormatEx );
if ( Failed( hr ) )
return NULL;
hr = cpstream->SetBaseStream( cpBaseStream,guidFormat,pWavFormatEx );
if ( Failed( hr ) )
return NULL;
hr = cpVoice->Setoutput( cpstream,false );
if ( Failed( hr ) )
return NULL;
SpeechVoiceSpeakFlags voiceFlags = ( SpeechVoiceSpeakFlags ) ( SpeechVoiceSpeakFlags::SVSFlagsAsync | SpeechVoiceSpeakFlags::SVSFPurgeBeforeSpeak );
hr = cpVoice->Speak( textToRender,voiceFlags,NULL );
if ( Failed( hr ) )
return NULL;
LARGE_INTEGER a = { 0 };
hr = cpstream->Seek( a,STREAM_SEEK_SET,NULL );
if ( Failed( hr ) )
return NULL;
STATSTG stats;
cpstream->Stat( &stats,STATFLAG_NONAME );
ULONG sSize = stats.cbSize.LowPart;
char* pBuffer = new char[ sSize ];
cpstream->Read( pBuffer,sSize,pBytesRead );
return pBuffer;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)