- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Microsoft Speech SDK提供关于语音(Speech)处理的一套应用程序编程接口SAPI(Speech Application Programming Interface)。SAPI提供了实现文字-语音转换(Text-to-Speech)和语音识别(Speech Recognition)程序的基本函数,大大简化了语音编程的难度,降低了语音编程的工作量。Speech SDK可以免费从如下网址下载:/speech。
由于Speech SDK是以COM接口的方式提供服务的,所以首先介绍COM的有关基础知识。
11.1.1 COM基础
Speech SDK提供了完善的COM接口,所以具备一定的COM编程基础对进行Speech SDK编程来说是非常必要的。笔者将简要介绍COM编程的基础知识。虽然这些知识对阅读本书来说是足够了,但是如果你没有进行过任何的COM编程实践,笔者还是建议你先阅读一本COM的教科书。
1.什么是COM
组件对象模型(Component Object Model,COM)对象是符合COM规范的可重用的软件组件。符合COM规范的COM对象相互之间可以很好地工作,并且可以很容易地集成到应用程序中。从应用的观点来看,一个COM对象就是一个黑箱,应用程序可以使用它来创建一项或多项任务。
COM对象常常用动态链接库(Dynamic Link Libraries,DLLs)的形式来实现。与传统的DLL一样,COM对象暴露其方法,应用程序能调用这些方法来实现对象所支持的功能。应用程序与COM对象的关系就像应用程序与C++对象的关系,但其中也存在一些区别。
1)COM对象执行严格的封装。你不能简单地创建一个对象就调用其中的公用方法。COM对象的公用方法聚合为一个或多个接口。为了使用一个方法,必须先创建一个对象,并从对象中获得相应的接口。一个接口一般包含一组方法,通过它们能使用对象的特定功能。不能通过接口来调用不属于该接口的方法。
2) 创建COM对象的方法与创建C++对象的方法不同。有多种方法可以创建COM对象,但所有的方法都需要使用COM的细节技术。Speech SDK应用程序编程接口(API)包括许多的帮助函数和方法,它们简化了创建大部分Speech对象的工作。
3) 必须使用COM的细节技术来控制对象的生命期。
4) COM对象不需要明确地装载。COM对象一般包含在DLL中。然而,与使用普通DLL中的方法不同,使用COM对象时,不需要明确地装载DLL或链接静态库。每一个COM对象都具有一个惟一的注册标识。用该标识来创建对象时,COM将自动地装载正确的DLL。
5)COM是一种二进制规范。COM对象可用许多种编程语言来编写和调用。对于使用者来说,并不需要了解对象的源程序的任何信息。比如,Microsoft Visual Basic编写的应用程序可以很好地调用C++编写的COM对象。
下面先介绍COM的几个基本概念,包括对象与接口、GUID、HRESULT类型和指针地址等。
(1)对象与接口
理解对象与接口的区别是非常重要的。通常用其主要接口的名称来称呼对象。但是,严格地说,这两个术语是不能互换使用的。
一个对象能暴露任何数量的接口。例如,所有的对象都必须暴露IUnknown接口,它们一般还暴露至少一个其他的接口,它们也可能暴露更多的接口。为了使用一个特定的方法,首先必须获得正确的接口指针。
多个不同的接口可以暴露同一个接口。一个接口就是一组执行特定操作的方法。接口定义只是指定了方法的调用语法和它们的一般功能。任何需要支持一组特定操作的COM对象都可通过暴露一个合适的接口来实现这些特定的操作。有些接口非常专业,仅仅由单一的对象来暴露。有些接口在许多场合下都非常有用,它们可由许多的对象来暴露。最极端的例子是IUnknown接口,所有的COM对象都需要暴露它。
如果一个对象暴露一个接口,它必须支持接口定义的每一个方法。但是,不同的对象实现一个特定方法的方式是不同的。不同的对象可能使用不同的算法来实现最后的结果。有时一个对象暴露一组通用的方法,但往往只需要支持其中的一部分方法。可是其他的未被支持的方法也需要能被成功调用,只是它们都只返回E_NOTIMPL。
COM标准要求接口一旦发布,其定义就不能再改变。例如,不能在一个已有的接口中增加一个新的方法,而必须创建一个新的接口。如果没有限制接口中必须有什么样的方法,通常的做法是在其下一代接口中包括原有接口的所有方法和其他的新方法。
但是一个接口有几代版本的情况并不常见。通常所有的版本实现完全相同的功能,只是在具体实现细节上不同。一个对象经常暴露所有版本的接口。这样做使较老版本的应用程序能继续使用对象的较老版本的接口,而较新版本的应用程序能使用较新版本接口的强大功能。一般
文档评论(0)