系统粉 > IT资讯 > 业界资讯

MFC让你的应用发声(TTS)

发布时间:2017-08-16    浏览数:

WIN7之后,Windows系统自带微软语音库,使用语音库变得非常的简单,精简版就不一定了

MFC让你的应用发声(TTS)(1)

MFC让你的应用发声(TTS)(2)MFC让你的应用发声(TTS)(3)

对于win7及以上版本直接包含头文件和链接库

#include "sapi.h" #include "sphelper.h" #pragma comment(lib, "sapi.lib")

//定义三个变量
ISpVoice *m_pISpVoice = NULL;//初始化COM
IEnumSpObjectTokens *m_pIEnumSpObjectTokens=NULL;
ISpObjectToken *m_pISpObjectToken=NULL;


/*
* 函数功能 : 初始化语言包选择组合框控件
*/
void CVoiceTDlg::InitVoicePackageSelComboxCtrl(void)
{
//初始化COM组件
if(FAILED(::CoInitialize(NULL)))
{
MessageBox("初始化COM组件失败!", "提示", MB_OK|MB_ICONWARNING);
return;
}









//枚举所有语音Token
if(SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &m_pIEnumSpObjectTokens)))
{

//得到所有语音Token的个数
ULONG ulTokensNumber = 0;
m_pIEnumSpObjectTokens->GetCount(&ulTokensNumber);

//检测该机器是否安装有语音包
if(ulTokensNumber == 0)
{
MessageBox("该机器没有安装语音包!", "提示", MB_OK|MB_ICONWARNING);
return;
}




//将语音包的名字加入组合框控件
CString strVoicePackageName = _T("");
CString strTokenPrefixText = _T("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\");
for(ULONG i=0; i<ulTokensNumber; i++)
{
m_pIEnumSpObjectTokens->Item(i, &m_pISpObjectToken);
WCHAR* pChar;
m_pISpObjectToken->GetId(&pChar);
strVoicePackageName = pChar;
strVoicePackageName.Delete(0, strTokenPrefixText.GetLength());
m_ComboxVoiceSel.InsertString(i, strVoicePackageName);
}










//设置默认的语音包选择
m_ComboxVoiceSel.SetCurSel(0);
}
}


void CVoiceTDlg::OnBnClickedButton2()
{

InitVoicePackageSelComboxCtrl();
UpdateData(true);

//获取ISpVoice接口
if(FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&m_pISpVoice)))
{
MessageBox("获取ISpVoice接口失败!", "提示", MB_OK|MB_ICONWARNING);
return;
}




//设置语言
m_pIEnumSpObjectTokens->Item(m_ComboxVoiceSel.GetCurSel(), &m_pISpObjectToken);
m_pISpVoice->SetVoice(m_pISpObjectToken);

//设置播放速度
m_pISpVoice->SetRate(/*m_SliderVoiceSpeed.GetPos()*/ 5);

//设置音量大小
m_pISpVoice->SetVolume(100 /*- m_SliderVoiceSize.GetPos()*/);

//检测朗读内容是否为空
if(m_EditContent.IsEmpty())
{
MessageBox("朗读内容不能为空!", "提示", MB_OK|MB_ICONWARNING);
return;
}




//开始进行朗读
m_pISpVoice->Speak(m_EditContent.AllocSysString(), SPF_ASYNC, NULL);
}

/*
* 函数功能 : 播放语音
*/

void CVoiceTDlg::OnBnClickedButton3()
{
//生成WAV文件
CComPtr<ISpStream> cpISpStream;
CComPtr<ISpStreamFormat> cpISpStreamFormat;
CSpStreamFormat spStreamFormat;
m_pISpVoice->GetOutputStream(&cpISpStreamFormat);
spStreamFormat.AssignFormat(cpISpStreamFormat);
HRESULT hResult = SPBindToFile("C:\Users\Administrator\Desktop\Test\test.wav",
SPFM_CREATE_ALWAYS,
&cpISpStream,
&spStreamFormat.FormatId(),
spStreamFormat.WaveFormatExPtr());
if(SUCCEEDED(hResult))
{
m_pISpVoice->SetOutput(cpISpStream, TRUE);
m_pISpVoice->Speak(m_EditContent.AllocSysString(), SPF_DEFAULT, NULL);
MessageBox("生成WAV文件成功!", "提示", MB_OK);
}
else
{
MessageBox("生成WAV文件失败!", "提示", MB_OK|MB_ICONWARNING);
}
}






















/*
* 函数功能 : 暂停/继续播放语音
*/

int i=0;

void CVoiceTDlg::OnBnClickedButton4()//暂停和继续
{
if (i==0)
{
m_pISpVoice->Pause();
i=1;
}
else
{
m_pISpVoice->Resume();
i=0;
}










}

MFC让你的应用发声(TTS)(4)

/*
ISpVoice//成员函数
ISpEventSource继承方法 :ISpEventSource的所有方法都可以从该接口访问
SetOutput :设置当前的输出对象。可以使用NULL值来选择默认音频设备。
GetOutputObjectToken :检索当前音频输出对象的对象标记。
GetOutputStream :检索当前输出流的指针。
Pause :将声音暂停在最近的警报边界并关闭输出设备。
Resume : 将输出设备设置为RUN状态并恢复渲染。
SetVoice :设置用于文本合成的声音的身份。默认情况下,ISPVoice将使用“控制面板”中“语音”属性中设置的语音信息。
GetVoice :检索标识文本合成中使用的声音的对象标记。
Speak :说出文本字符串或文件的内容。
SpeakStream :说出流的内容。
GetStatus :检索与此ISpVoice实例关联的当前呈现和事件状态。
Skip :导致语音向前或向后跳过当前通话文本内的指定数量的项目。
SetPriority :设置语音的优先级。正常,警报,结束。
GetPriority :检索当前语音优先级。
SetAlertBoundary :指定哪个事件应该用作警报的插入点。
GetAlertBoundary :检索当前正用作警报插入点的事件。
SetRate :实时设置文本渲染速率调整。
GetRate :检索当前文本渲染速率调整。
SetVolume :实时设定合成器的输出音量。
GetVolume :检索合成器的当前输出音量。
WaitUntilDone :阻止呼叫者,直到语音完成说话或指定的时间间隔过去了。
SetSyncSpeakTimeout :设置以毫秒为单位的超时时间间隔,此语音同步Speak和SpeakStream调用此超时。
GetSyncSpeakTimeout :检索此ISpVoice实例的同步语音操作的超时间隔。
SpeakCompleteEvent :返回一个事件句柄,当语音完成后,将发出所有待处理的请求信号。
IsUISupported :确定是否支持指定类型的UI。
DisplayUI :显示所请求的UI。
*/





























MFC让你的应用发声(TTS)(5)

MFC让你的应用发声(TTS)(6)热文文,分享你的热文

转发文章就能赚钱的app

点击阅读原文下载

上一篇:Alphacool放出史上最大水冷散热器:420mm怪物 下一篇:诺基亚新一代功能机死灰复燃,价格劲爆,续航强劲,国产品牌慌吗

相关资讯

最新热门应用

电脑问答