`
kevin19900306
  • 浏览: 446108 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

微软语音SAPI介绍以其及语音识别过程

阅读更多
   SAPI 应用程序接口程序戏剧性的减少了语音识别和语音合成应用中的程序代码,使得语音技术在广泛和蓬勃发展的实际应用中更容易使用。
   SAPI使得应用程序和语音引擎之间高度紧密的结合。SAPI可以实时处理各种语音引擎在底层工作中的细节。
   SAPI的两种基本类型是文本合成语音(TTS)引擎和语音识别(SR)引擎。TTS可以将文本中的字符或文档合成为语音并“说”出来。而SR则可以把人说话的语音转换为易读的字符或文档。

    应用程序可以通过ISpVoice COM接口控制使用TTS。应用程序一旦建立了ISpVoice 对象,它只需调用ISpVoice::Speak来从文本数据生成语音。另外IspVoice接口同样提供了多种方式来改变程序所发出的声音、音调和其他属性,例如ISpVoice::SetRate改变语音速度,ISpVoice::SetVolume改变语音音量,ISpVoice::SetVoice改变当前程序所发出的声音。更有趣的是SAPI还可以控制通过对插入的文本的结合来实时改变合成语音的声音类型、音调、重音、发音速度和音量。

    IspVoice::Speak方法可以同步地(在发音完毕时返回程序)或异步地(在发音时同时返回程序,发音成为后台处理)。当处于异步工作时,可以使用ISpVoice::GetStatus来获得发音状态及文本位置。同样,当处于异步工作时,新的文本发音也可以通过立即终止当前的发音来创建,这个过程是决定于新文本所包含的结束信息由程序自动处理的。

    除了IspVoice接口之外,SAPI同样提供更多的高级TTS应用——通过手动控制COM接口。语音识别应用程序接口:
    类似于IspVoice是主要的语音合成程序接口,ISpRecoContext就是主要的语音识别程序接口。同IspVoice一样,他是一个IspEventSource,也就是说当语音程序接收到一个语音识别请求就会触发一个事件的事件源。

    一个程序拥有两种不同的语音识别引擎(ISpRecognizer)类型。一个是共享的语音识别引擎,由于它可以与其他语音识别应用程序共享其程序资源,所以在大多数场合中被推荐使用。(在共享的语音识别应用中)需要建立一个采用共享语音识别引擎的识别环境(IspRecoContext),应用程序需要调用COM接口位于CoCreateInstance结构上的CLSID_SpSharedRecoContext。然后SAPI会设立一个音频输入流,并把这个音频输入流定义为默认的SAPI音频输入流。对于大型的服务器应用程序,这个过程需要一个独立的系统来完成,因为性能是这时的关键因素,一个独立进程(InProc)的语音识别引擎是最适合的。如果需要创建采用一个独立进程(非共享)语音识别引擎的语音识别环境,应用程序首先需要调用COM接口位于CoCreateInstance结构上的CLSID_SpInprocRecoInstance。然后,应用程序必须调用ISpRecognizer::SetInput来设立一个音频输入流。最后,应用程序通过调用ISpRecognizer::CreateRecoContext来建立它自己的识别环境。

    下一步是为应用程序的识别事件建立消息通知表(IspNotifySource)。同样由于IspRecognizer 也是ISpEventSource,应用程序通过一个从ISpRecoContext 取得的IspNotifySource来判别哪种由IspRecoContext报告的事件源的需要被触发。然后,IspRecognizer需要调用ISpEventSource::SetInterest来创建一个需要被识别的“事件”。其中最重要的事件是SPEI_RECOGNITION,当其被触发,说明已经有一个被IspRecognizer识别的符合当前IspRecoContext要求的识别事件已完成。

    最后,一个语音应用程序必须创建、加载并激活一个识别语法(ISpRecoGrammar),识别语会法从本质上决定哪种发音需要识别,而哪种发音不必理会,(具体有类似)听写或者一个command and control(C&C)语法。首先,应用程序需要通过调用语法接口函数ISpRecoContext::CreateGrammar建立一个IspRecoGrammar,然后应用程序需要加载这个语法(通过调用ISpRecoGrammar::LoadDictation),其目的是建立一个听写或者command and control语法环境。最终为了激活这个识别语法需要调用ISpRecoGrammar::SetDictationState(听写语法环境)或 ISpRecoGrammar::SetRuleIdState、ISpRecoGrammar::SetRuleIdState(C&C语法环境)。

    当识别结果依据IspNotifySource的需要返回给应用程序,SPEVENT数据结构中的lParam就被定义为一个ISpRecoResult,这样应用程序就能决定哪些符合ISpRecoContext.中设立的IspRecoGrammar的语音被识别出来了。无论是共享的(shared)还是独立进程(InProc)的识别引擎,都可以在IspRecoContexts中多进程同时工作,每一个识别引擎也都可以有自己的触发事件源。一个IspRecoContexts也可以有多个IspRecoGrammars同时工作,互相之间并不影响。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics