项目需要软件报数,且要支持英文,我接手这个项目之前使用的播放录音文件,只有中文,现要求支持英文,没人给录音啊,网上搜索一番文本转语音的方法,最终发现可以使用微软系统自身带的语音库来实现。废话不多说了,直接上代码
#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记得是没有库


鄂公网安备 42018502001427号
发表评论