获取异步 SAPI 调用的输出?

问题描述

我有一个使用 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 (将#修改为@)