项目需要软件报数,且要支持英文,我接手这个项目之前使用的播放录音文件,只有中文,现要求支持英文,没人给录音啊,网上搜索一番文本转语音的方法,最终发现可以使用微软系统自身带的语音库来实现。废话不多说了,直接上代码
#include <sapi.h> #include <sphelper.h> #pragma comment(lib,"sapi.lib") #define LANG_CH 0 #define LANG_EN 1 ISpVoice * pVoice = NULL; //初始化COM //初始化 BOOL InitTTS(int nLang) { if (FAILED(CoInitialize(NULL))) { AfxMessageBox(_T("COM库初始化失败")); } //初始化SAPI HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); ISpObjectToken * pSpObjectToken = NULL; WCHAR* pReqAttr = NULL; if (nLang == LANG_CH) { pReqAttr = L"language=804"; } else if (nLang == LANG_EN) { pReqAttr = L"language=409"; } if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, pReqAttr, NULL, &pSpObjectToken)))//804代表中文 409英文 { pVoice->SetVoice(pSpObjectToken); pVoice->SetRate(0);//语速 -5~5 pSpObjectToken->Release(); } else { AfxMessageBox(_T("没有安装微软语音库!")); return FALSE; } if( SUCCEEDED( hr ) ) { return TRUE; } return TRUE; } //用完释放资源 void ReleaseTTS() { if (pVoice) { pVoice->Release(); pVoice = NULL; } CoUninitialize(); } //在需要朗读的地方调用Speak即可 pVoice->Speak(L"我会说话啦", 0, NULL);
简单明了,代码不用过多解释了吧。SpFindBestToken函数的第二个参数 使用 language=804为中文 409英文
需要注意的是,Speak朗读的时候会阻塞线程,如果在主线程里运行,会卡界面的哟。
本人使用的VS2008
源码下载:链接: https://pan.baidu.com/s/1bN3Iea 密码: 3mix
程序让测试妹子在各个干净的系统上跑了下,win7、win10都正常,vista好像也行,时间久了忘了,xp记得是没有库
发表评论