作者:蔡晓楠 | 来源:互联网 | 2023-08-31 15:53
MicrosoftSpeechAPIOverview(SAPI5.4)SAPI程序开发接口(API)大大减少了程序使用语音识别和TTS所需的大量代码。使得语音技术能在应用程序中更广泛的应用
Microsoft Speech API Overview(SAPI 5.4)
SAPI程序开发接口(API)大大减少了程序使用语音识别和TTS所需的大量代码。使得语音技术能在应用程序中更广泛的应用,并且更加健壮。本部分内容覆盖如下主题:
API Overview
API for Text-to-Speech
API for Speech Recognition
1. 微软语音API概述
微软SAPI编程接口提供了一个在应用程序和语音引擎之间的高层接口。SAPI实现了所有底层细节需要控制和管理的各种语音引擎的实时操作。
SAPI引擎的两个基本类型是:text-to-speech(TTS)文本语音转换系统和speech recognizers语音识别。TTS系统使用合成语音,将文本串和文件到发声音频。语音识别将人类说话音频转化为可读的文本字符串和文件。
2. Text-to-Speech文本到语音转换API
应用程序可以使用ISpVoice组件对象模型(COM)接口来控制文本到语音(TTS)。当一个应用程序创建了一个ISpVoice对象,应用程序便只需要调用ISpVoice::Speak来从一些文本数据产生语音输出。同时,ISpVoice接口还提供了一些方法用于改变声音和合成属性,如发音的速度ISpVoice::SetRate,输出音量ISpVoice::SetVolume和改变当前音色的ISpVoice::SetVoice。
一些特定的SAPI控制,可以同输入文本一起被插入,用于改变实时属性,如voice、pitch、重音、语速和音量。这些合成标定sapi.xsd,使用标准的XML格式,是一种简单但功能强的的方法来定制TTS语音,独立于特定的引擎或者当前使用的声音。
ISpVoice::Speak方法,可以进行异步(当完成发音后才返回)或同步(作为背景进程立即处理和发音)的操作。当使用同步发音(SPF_ASYNC)时,实时状态信息,如说话状态和当前文本位置,可以通过ISpVoice::GetStatus获得。同时,当进行同步发音时,新文本可以通过立即中断当前输出,或追加到当前输出的末尾来发音。
另外,作为ISpVoice接口的附加,SAPI还提供了一些实用的COM接口来提高TTS应用程序:
事件Events
SAPI通过发送事件,使用标准回调机制(Windows Message, callback proc or Win32 Event)与应用程序通讯。对于TTS,事件大多数用于同步输出语音的情况。应用程序可以同步于其他事件实时操作,如到达词边界、音素和viseme(嘴唇运动)边界或应用程序定制书签。应用程序可以通过使用ISpNotifySource、ISpNotifySink、ISpNotifyTranslator、ISpEventSink、ISpEventSource和ISpNotifyCallback来初始化和处理这些实时事件。
词汇Lexicons
应用程序可以使用ISpContainerLexicon、ISpLexicon和ISpPhoneConverter方法,为语音合成引擎定制单词发音。
音频Audio
最后,这里还有一个接口用于为一些特殊目的定制音频输出,如用于电话和定制硬件(ISpAudio、ISpMMSysAudio、ISpStream、ISpStreamFormat、ISpStreamFormatConverter)。
3. 语音识别API
ISpVoice是主要的语音合成接口,ISpRecoContext则是语音识别的主要接口。像ISpVoice一样,它也是一个ISpEventSource,意思是说它是语音软件的工具,用于接受语音识别事件的请求工作。
一个应用程序的选择有两种,两种不同类型的语音识别引擎(ISpRecognizer)。一个可以和其他语音识别软件共享的recognizer,这也是推荐大多数识别软件使用的引擎。要为共享ISpRecognizer创建一个ISpRecoContext,应用软件只需要在组件CLSID_SpSharedRecoContext调用COM的CoCreateInstance即可。在此情况下,SAPI将建立一个音频输入流,设置它为SAPI的默认音频输入流。对于大型服务应用程序,可能需要独立运行于一个系统,此时,性能将是关键。一个InProc语音识别引擎更加何时。要创建一个InProc ISpRecognizer的ISpRecoContext,程序必须首先调用CLSID_SpInprocRecoInstance组件的CoCreateInstance来创建自己的InProc ISpRecognizer。接着,程序需要调用ISpRecognizer::SetInput(参见ISpObjectToken)来建立一个音频输入。最后,要调用ISpRecognizer::CreateRecoContext来获得一个ISpRecoContext。
下一步是为应用程序创建感兴趣的事件消息notifications。ISpRecognizer作为ISpEventSource,同样也是一个ISpNotifySource,应用程序从ISpRecoContext中调用ISpNotifySource方法中的一个,来提示ISpRecoContext中的哪些事件需要报告。然后,它要调用ISpEventSource::SetInterest来确定哪些事件需要notified。最重要的事件是SPEI_RECOGNITION,用于提示ISpRecognizer已经为ISpRecoContext识别了一些语音。其他时间的详细介绍可以参见SPEVENTENUM。
最后,语音软件必须创建、加载和激活一个ISpRecoGrammar,which essentially indicates what type of utterances to recognize, i.e., dictation or a command and control grammar.。首先,程序使用ISpRecoContext::CreateGrammar创建一个ISpRecoGrammar。然后,程序加载合适的语法,可以使用ISpRecoGrammar::LoadDictation加载词典,或ISpRecoGrammar::LoadCmdXXX方法的一个用于命令和控制。最后,调用ISpRecoGrammar::SetDictationState、ISpRecoGrammar::SetRuleState或ISpRecoGrammar::SetRuleIdState为词典或命令和控制激活语法,启识识别。
当识别请求处理返回给应用程序时,SPEVENT结构的lParam成员作为ISpRecoResult返回。通过这个结果,应用程序可以决定识别出了什么。
一个ISpRecognizer,不管是共享的或是InProc的,都可以拥有多个ISpRecoContext与其关联。并且,每一个都将有自己的事件提醒通道。ISpRecoContext又可以创建多个ISpRecoGrammar,每个可用于不同类型的utterances。