SAPI实现TTS
廢話不多說,直接上代碼
//tts_module.h #ifndef __TTS_MODULE_HH__ #define __TTS_MODULE_HH__#ifdef WIN32 #ifdef TTS_MODULE_EXPORTS #define TTS_MODULE_API __declspec(dllexport) #else #define TTS_MODULE_API __declspec(dllimport) #endif #else #define TTS_MODULE_API #endifclass TTS_MODULE_API TssModule { public:TssModule();~TssModule();int Initialise();int Readout(const char * text);void Uninitialise();private:void* pSpVoice; };#endif //tts_module.cpp #include "tts_module.h" #include <sphelper.h>TssModule::TssModule() {pSpVoice = NULL; }TssModule::~TssModule() {}int TssModule::Initialise() {pSpVoice = NULL;// Initialize COMCoInitialize(NULL);// Create the voice interface objectif (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice))){printf("Fail to create instance of ISpVoice!");return -1;}CComPtr<IEnumSpObjectTokens> cpEnum;CComPtr<ISpObjectToken> cpToken;//if (FAILED(SpEnumTokens(SPCAT_VOICES, L"Name=Ekho Mandarin", NULL, &cpEnum)))if (FAILED(SpEnumTokens(SPCAT_VOICES, L"Name=Microsoft Lili", NULL, &cpEnum))){printf("Fail to get voices!");return -2;}//Get the closest tokenif (FAILED(cpEnum->Next(1, &cpToken, NULL))){printf("Fail to get voice EkhoVoice!");return -3;}//set the voice if (FAILED(((ISpVoice*)pSpVoice)->SetVoice(cpToken))){printf("Fail to set voice EkhoVoice!");return -4;}return 0; }int TssModule::Readout(const char * text) {int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, text, -1, NULL, 0);if (nLen == 0){printf("MultiByteToWideChar get length = 0");return -1;}wchar_t* pResult = new wchar_t[nLen];MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, text, -1, pResult, nLen);((ISpVoice*)pSpVoice)->Speak(pResult, SPF_DEFAULT, NULL);delete pResult;return 0; }void TssModule::Uninitialise() {CoUninitialize(); }總結
- 上一篇: 用setx设置永久环境变量及注意事项
- 下一篇: 请问核物理专业申请研究生美国哪个学校好些