最近关注语音信号处理的东西,顺便看到了微软的TTS引擎,也顺便进行了一些了解,本文就我的了解介绍一下使用微软的SAPI(Sound Applicaion Interface),这套API主要包含了基于Windows 桌面平台的语音识别&语音合成(Text-To-Speech),这里主要介绍一下就是语音合成的我的一些了解。
微软的这套API是基于COM组件的,使得不仅仅是C/C++可以使用这套API,DEPHI,VB都可以使用。下图示出了我下面介绍的SpVoice的接口。
使用COM组件,程序应该使用Unicode编码,这可以在VC的Project->Setting里面的C/C++的预编译里面增加_UNICODE以及UNICODE两个宏定义,然后在Link标签项中Output选项的程序入口设置为wWinMainCRTStartup,以避免_WinMain@16符号没有定义的错误(Unicode程序的入口是wWinMainCRTStartup,不是WinMain)。
然后在stdafx.h文件的#endif前面添加
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
extern CComModule _Module;
#include <atlcom.h>
在类声明中定义:
HRESULT hr;
ISpVoice * pVoice;
然后在对话框的初始化文件里面对COM组件进行初始化:
::CoInitialize(NULL);
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
之后,就可是使用这套语音合成引擎了:
CString str;
GetDlgItemText(IDC_EDIT1,str);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak((TCHAR*)str.GetBuffer(50), 0, NULL);
}
别完了用完了之后要进行销毁:
pVoice->Release();
pVoice = NULL;
::CoUninitialize();
这套引擎还可以使用XML进行格式化,使得声音更加自然。