TTS API 使用


#define SPCAT_VOICES           L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices"
#define SPKEY_ATTRIBUTES         L"Attributes"
#define SPVALUE_LANGUAGE         L"Language"
BOOL CActionCenter::InitializeSAPI()
{
      ReleaseSAPI();

      HRESULT hr;

      hr = m_cpVoice.CoCreateInstance( CLSID_SpVoice );
      if(hr == S_OK)
      {
            ISpObjectToken * pToken;        // NOTE:  Not a CComPtr!  Be Careful.
            CComPtr<IEnumSpObjectTokens> cpEnum;
            hr = SpEnumTokens(SPCAT_VOICES, L"", L"", &cpEnum);
            if (hr == S_OK)
            {
                  bool fSetDefault = false;
                  while (cpEnum->Next(1, &pToken, NULL) == S_OK)
                  {
                        //CSpDynamicString dstrDesc;
                        //hr = SpGetDescription(pToken, &dstrDesc);
                        //if (SUCCEEDED(hr))
                        {
                              m_vecISpToken.push_back(pToken);
                        }

                  }

                  return (m_vecISpToken.size() > 0);
            }
      }

      return FALSE;
}

void CActionCenter::ReleaseSAPI()
{
      vector<ISpObjectToken*>::iterator it;

      for(it=m_vecISpToken.begin(); it!=m_vecISpToken.end(); ++it)
      {
            (*it)->Release();
      }

      m_vecISpToken.clear();
}

void CActionCenter::SetVoice(LANGID lid)
{
      vector<ISpObjectToken*>::iterator it;

      WCHAR wstrLangID[32] = {0};
      swprintf(wstrLangID, L"%X", lid);

      for(it=m_vecISpToken.begin(); it!=m_vecISpToken.end(); ++it)
      {
            ISpObjectToken *pToken = (*it);

            ISpDataKey *pSpDataKeyAttributes = NULL;
            HRESULT hr = pToken->OpenKey(SPKEY_ATTRIBUTES, &pSpDataKeyAttributes);
            if(SUCCEEDED(hr))
            {
                  WCHAR *wstrLanguageID = NULL;
                  hr = pSpDataKeyAttributes->GetStringValue(SPVALUE_LANGUAGE, (WCHAR**)&wstrLanguageID);
                  if(SUCCEEDED(hr))
                  {
                        if(wcsstr((BSTR)wstrLanguageID, (BSTR)wstrLangID))
                        {
                              m_cpVoice->SetVoice(pToken);
                              break;
                        }

                  }

                  pSpDataKeyAttributes->Release();
            }

      }
}
posted @ 2013-07-02 11:35  muzizongheng  阅读(934)  评论(0编辑  收藏  举报
如果我们时时忙着展现自己的知识, 将何从忆起成长所需的无知?