language = 409 ,说明我们要创建的是一个 English 的 TTS engine 。
指定TTS的language的多种方法:
(一)
CComPtr<ISpVoice> cpVoice;
CComPtr<ISpObjectToken> cpVoiceToken;
//--like last step
SpFindBestToken(SPCAT_VOICES, L"Language=409", NULL, &cpVoiceToken);
//--now create object
//SpCreateObjectFromToken(cpVoiceToken, &cpVoice);
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)& cpVoice );
cpVoice ->SetVoice(cpVoiceToken); // 设置 english TTS Voic 。
(二)
CcomPtr<IEnubjectTokens> cpIEnum;
hr = SpEnumTokens(SPCAT_VOICES, L"Language=409", NULL
, &pEnum);
CComPtr<ISpObjectToken> cpVoiceToken;
hr = cpEnum->Next( 1, &cpVoiceToken, NULL );
ISpVoice * pVoice = NULL;
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
pVoice->SetVoice(cpVoiceToken); // 设置 english TTS Voic 。
(三)
ISpVoice * pVoice = NULL;
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
hr = pVoice->Speak(L"< voice required='Language=409'/ >Hi, <voice required='Language=804'/> 欢迎来到中国。 ", SPF_IS_XML, NULL);
( 四 )
ISpVoice * pVoice = NULL;
HRESULT hr = S_OK;
CComPtr<ISpDataKey> cpTokenKey;
CComPtr<ISpObjectToken> cpVoiceToken;
CComPtr<IEnumSpObjectTokens> cpEnum;
ULONG ulCount = 0;
if (FAILED(::CoInitialize(NULL)))
return FALSE;
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
//Enumerate the available voices
if(SUCCEEDED(hr))
hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
//Get the number of voices
if(SUCCEEDED(hr))
hr = cpEnum->GetCount(&ulCount);
BOOL bFind = FALSE;
LANGID lid = 0x409; // 指定 voice 为 English 。
// Obtain a list of available voice tokens, set the voice to the token, and call Speak
while (SUCCEEDED(hr) && ulCount -- )
{
cpVoiceToken.Release();
if(SUCCEEDED(hr))
hr = cpEnum->Next( 1, &cpVoiceToken, NULL );
WCHAR *strTemp = NULL;
int iIndex = 0;
cpTokenKey.Release();
HRESULT hr2 = cpVoiceToken->OpenKey(_T("Attributes"), &cpTokenKey);
if (SUCCEEDED(hr2))
{
cpTokenKey->GetStringValue(_T("Language"), &strTemp);
::CoTaskMemFree(strTemp);
LANGID lTempID = (LANGID)wcstol(strTemp, NULL, 16);
if (lTempID == lid)
{
pVoice->SetVoice(cpVoiceToken);
break;
}
}
}