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