宁波江北申通快递电话:SPEECH SDK中编程文档 - 骆驼空间站 - 博客园

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 12:36:15

前一段时间,金山公司在全国开展了"红色风暴"营销活动,"金山词霸2000"的销售势头非常强劲。有人也许注意到这次"金山词霸"的升级最大的改进是"采用了世界先进的TTS全程语音系统"(广告语),使得词霸软件能够读取任意的英文词汇、短语、句子等。那么什么是TTS呢?简单地说就是"Text to Speech"(文字到语音)英文缩写,这是Microsoft 公司出品的Speech SDK(语音软件开发工具)中提供的一个API接口功能,在金山词霸2000中就使用了Speech SDK,下面我简单介绍一下什么是Speech SDK。
  计算机软件的接口设计一致是软件设计中的一个重要方面,如何让普通人也能自如地使用计算机是接口设计中要考虑的一个重要问题,随着计算机的普及,采用语音与计算机进行交互操作是未来人机界面设计的一个发展方向。这里的语音技术包括两项内容:语音识别(speech recognition[SR))与语音合成(speech synthesis[SS) 即TTS)。语音识别用于告诉计算机我想让它做什么,而语音合成用于计算机告诉我们它想让我们知道什么。利用这两项技术即可以完成人机交互。既然语音技术那么好,为什么很少有软件采用呢?因为这两项技术很复杂,需要相关的语音引擎(speech engine)来支持,而许多软件厂商都出品过自己的语音合成或语音识别引擎,这些引擎之间并不兼容,如果一个软件要使用语音功能,开发者必须得从众多的语音引擎中挑选一个来使用,如果将来想要换一个语音引擎,就必须为新引擎重新改写程序,这使得许多软件的开发者感到自己的开发没有保证,于是他们干脆就放弃了开发语音功能的计划。为了解决这个问题,微软公司推出了一组新的API(应用程序开发接口)----- The Microsoft Speech API。微软希望这组API能够成为业界标准,让软件设计者利用此API编写语音软件,Speech  API结构在应用软件与语音引擎之间,隔离了应用软件与语音引擎之间的联系,使得语音引擎的更换不会影响到原有应用程序的运行。Speech API只提供了一系列接口,它本身并不能做任何事情,以此API编写的程序还需要语音引擎的支持才能运行。于是微软在此基础上推出Speech SDK这个开发工具,帮助软件开发者开发语音软件,并在此工具中提供了一系列语音引擎(包括SR和SS),使得软件开发人员轻而易举地就能使自己的程序能说又能听。(这是真的么?简直不敢相信)。不过,目前还没有支持中文的语音引擎,所以我们的程序还不能说中文,也不能听中文。不过"面包总是会有的",我想以后中文语音引擎一定会出现的。说到这里是不是有些人已经急不可待地想去试一试了。别着急,我再说说API的具体组织方法。

与其它微软新推出的API一样,这套API是架构在COM(Component Object Model)组件基础之上,用对象的方式提供编程接口。(什么?你不知道什么叫COM?我肯定这两年你一定是生活在深山当中!这是未来编写WINDOWS程序的基础,比较复杂,我只有另文介绍了),这使得用VB、C++、Delphi以及其它任何可以支持COM编程的语言都可以运用Speech API。而且在COM组件基础之上微软还提供了Activex Control控件(ActiveX 控件是以COM组件技术为基础的一种组件控件技术,可以嵌入浏览器以及OFFICE当中使用),这更方便了软件编程者在网页上使用SPEECH API 的功能,可以想象让自己的网页发声是多么激动人心啊!而且Activex控件也能在VBA(VB FOR APPLICATION )中使用,在Excel里也能够利用Speech API,让你的图表会说话。这些技术给软件开发者提供了广泛的应用领域。如果你对COM组件感到陌生的话,可以使用微软提供的C++ WRAPPERS,它用C++类重新封装了Speech SDK 的COM对象,让你无须与直接COM打交道,看来微软已经是做到了"仁至义尽"了,为各种开发人员都做了准备。
  Speech API 本身分两层结构,高级对象及低级对象,高级对象为编程者提供较高级的接口形式,使得编制程序很容易,而低级对象则为编程者提供了较低级的控制方式,可以更灵活地控制语音引擎,但也使得编制程序变得较为复杂。在一般情况下,程序设计利用高级对象就足够了,但如果更深层次地使用Speech API,就必须使用低级对象。其结构可参看图一。
 图一

以下是各个组COM对象的简介。
一、高级对象(HIGH LEVER SPEECH OBJECT):
1. Voice Commands API:功能是对应用程序进行控制,一般在语言识别系统识别了一个命令后,会调用此接口使某个应用程序完成一定的功能,如果你的程序想使用语音控制功能就必须使用此组对象
2. voice Dictation API:功能是进行听写输入,即语音识别。
3. Voice Text API :此组对象完成从文字到语音的转换功能,即语音合成。后面 的例子会用到此对象。
4. Voice Telephony API :它把语音识别与语音合成综合利用到了电话系统之上,利用此对象可以建立一个电话应答系统,甚至可以通过电话控制你的计算机。
5. Audio Objects API :主要封装了计算机上的发音系统。

以下是一个报时钟表的程序,在这个程序中采用了Voice Text API对象,当你按下按钮时这个程序会报时间, 同时它还有一个编辑框,当你在里面输入英文单词以后,只要按一下按钮,它也会把单词读出来。程序比较简单,主要让你有一个感性的认识。具体代码如下:
//源程序文件clock.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "resource.h"

#include

PIVOICETEXT gpIVTxt;

BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static char tmpbuf[128];//存放时间的字符。
switch (uMsg) {
case WM_INITDIALOG:
{
SetTimer(hWnd,1,1000,NULL);//建立定时器
break;
}
case WM_TIMER:
{
_tzset();

/* Display operating system-style date and time. */
_strtime( tmpbuf );
SetDlgItemText(hWnd,IDC_STATICCLOCK,LPCSTR(tmpbuf));//显示时间到对话框上。
break;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDSPEAK:
{
char* pSpeak;
pSpeak=(char *)malloc(1024*64);//64KB

// Speak
GetDlgItemText(hWnd,IDC_EDIT, LPTSTR(pSpeak), 64*1024-1);//获取编辑框内的字符,最大长度必须限制在64kb-1内。
gpIVTxt->Speak(LPTSTR(pSpeak), VTXTST_QUESTION | VTXTSP_NORMAL, NULL); //读出编辑框中的字符
free(pSpeak);
return TRUE;
}
case IDCANCEL:
{ KillTimer(hWnd,1);
EndDialog (hWnd, IDCANCEL);
return TRUE;
}
case IDC_CLOCKSPEAK:
{gpIVTxt->Speak(LPCSTR(tmpbuf),VTXTST_QUESTION | VTXTSP_NORMAL, NULL);//读出现在的时间
return TRUE;
}
case IDC_STOP:
{gpIVTxt->StopSpeaking();//停止发音
return TRUE;
}

}
break;
};

return FALSE; // didn't handle
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{

CoInitialize(NULL);


if(CoCreateInstance(CLSID_VTxt,NULL, CLSCTX_LOCAL_SERVER,IID_IVoiceText, (LPVOID *) &gpIVTxt) != S_OK)
return 0;
gpIVTxt->Register(NULL,"Clock",NULL, IID_IVTxtNotifySink,NULL,NULL);
//必须使用这个注册函数
// Bring up the dialog box

DialogBox(hInstance,MAKEINTRESOURCE(IDD_CLOCK), NULL, (DLGPROC) DialogProc);//启动对话框

gpIVTxt->Release();//释放接口

CoUninitialize();
return 0;
}
  资源文件clock.rc与资源头文件resource.h在此省略,在VC中可以利用资源编辑器制作一个对话框,VC会自动生成这两个文件,为了与上述代码配合,对话框的ID为IDD_CLOCK。其它对话框上的控件的ID如下所示:
注意在编译以前,要把SDK的头文件路径在VC中设置好。
二、低级对象(LOW LEVER SPEECH OBJECT):
1. DirectSpeechRecognition API :提供了更强大的语音识别控制功能,包括枚举语音引擎等功能。
2. DirectTextToSpeech API:提供了更强大的语音合成功能。
  如果我们用DirectTextToSpeech API修改发声钟表程序,将会为该程序提供更强大的功能,甚至可以调节发音频率,发音者的年龄等,由于其应用很复杂,我这里不再举例。有兴趣的人可以查阅SPEECH SDK中编程文档。
那么如何获得这个SDK 呢?是不是得花很多钱呢?NO!微软公司免费提供此SDK,大家可以到www.microsoft.com 网站上下载此程序。
  通过以上介绍,我们只是看到了Speech SDK这个巨大冰山中的一个小角,如果要想全面掌握它就必须仔细阅读Speech SDK自身的参考文档。它的应用前景是广阔的,我们可以利用它制作会说话的程序,虽然是只能说英文,但是毕竟是一个崭新的功能,势必会使你的程序更加引人注目,而且你还可以编写英语听写软件以及英语学习软件,使自己的程序轻而易举地就具有了多媒体的功能,不用再去费劲心思地去编写语音识别与语音合成引擎,而在windows 2000当中,语音识别与语音合成功能和windows 2000结合在一起成为标准配置,我想用不了多久,带有语音人机界面的程序将会大量出现。
  最后我想再谈谈在Delphi中使用Speech SDK时需注意的几个问题,因为Delphi目前在国内拥有广泛的用户。
  1.如何Delphi中使用Activex 控件:在Delphi 3.0中(其它版本我没有试过)使用Speech SDK提供的Activex控件会产生一些问题,在往Delphi中Import Activex 控件之后,如果你往窗体上放置控件,Delphi就会弹出一个错误信息如图二。

 

图二

  我经过仔细研究之后,初步判断这可能是在窗体在调用控件提供的IVIEWOBJECT接口绘画控件的图案时,Delphi 与控件的自绘发生了冲突。解决的方法是修改控件的注册表信息,改变控件自绘方式。注意:修改注册表不当,会导致WINDOWS启动失常,因此我强烈建议在修改前备份注册表文件。步骤如下:
  ①启动"REGEDIT.EXE"。查找某个控件的DLL文件,例如"Voice Text Control"的DLL文件名叫"VTEXT.DLL",在查找对话框里输入"VTEXT.DLL",然后开始查找。查找会在此处停下,如图三。

图三

  ②选择miscstatus子键,修改其default的值,改为4。
  ③选择miscstatus的子键1,按DEL键删除它,然后给miscstatus加入一个新的子键,名称为4。这样你就可以把Voice Text Control加到Delphi中的窗体上去了。其它的控件也可依法进行修改,只是每次查找时需确定要修改控件所对应的DLL文件名。
  2.使用COM接口。在Delphi中也可以直接使用COM接口,但是由于SPEECH SDK只提供了接口的C语言的头文件,使得DELPHI无法直接使用,必须把这个文件翻译成PASCAL语言,幸好这个工作已经有人做了,读者可以上网到www.delphi-jedi.org 中下载一个文件,解压缩之后按照说明使用即可。另外需说的是,在Delphi 中只使用ActiveX控件的读者最好也能下载这个PASCAL 头文件,这会更加方便你使用控件中的一些方法以及属性。