最近写了个小程序需要用TTS来发声,现把心得写下来。
下载TTS SDK5.1 然后设置lib和include的路径。
在程序中
#include <sapi.h>
#include <sphelper.h>
我用的是VS2005,在编译sphelper.h的时候发生了问题,有些地方需要改动。
SPPHONEID* pphoneId = (SPPHONEID*)((WCHAR *)dsPhoneId);
pphoneId += wcslen((const wchar_t *)pphoneId) + 1;
const WCHAR * psz = (const WCHAR *)lParam;
for (; *psz; psz++) {}
这样才能编译通过。
下面的代码放到一个Button事件里面就可以了。
//SAPI voice
ISpVoice * pVoice = NULL;
//init COM
if (FAILED(CoInitialize(NULL)))
{
MessageBox(_T("Error to intiliaze COM") );
return FALSE;
}
//init SAPI
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
IEnumSpObjectTokens* cpEnum;
//Enumerate the available voices
if(SUCCEEDED(hr))
//hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
hr = SpEnumTokens(SPCAT_VOICES, L"Name=Microsoft Mary", NULL, &cpEnum);
ISpObjectToken* tok;
cpEnum->Item(0,&tok);//only need set Mary voic here
pVoice->SetVoice(tok);
ULONG ulCount;
//Get the number of voices
if(SUCCEEDED(hr))
hr = cpEnum->GetCount(&ulCount);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak(_T("Test"), 0, NULL);
pVoice->Release();
pVoice = NULL;
}
//release COM
CoUninitialize();