SAPI 5.1 语音合成 和 语音识别 [C#][4]

翻译说明:语音识别中重点翻译"命令识别"[Command recognition],对本人比较有用...

语音识别

语音识别可以使用两种识别器: a shared recogniser(TSpSharedRecognizer) [共享识别器]和 an in-process recogniser (TSpInprocRecognizer)[独占识别器],独占识别器效率更高但是独占麦克风,其他程序不能 接收 到语音输入,相对的,共享识别器可以和其它程序共享使用,其他程序可以接收到语音输入,因此使用共享识别器更多
识别器使用一个 继承了 TSpInprocRecoContextTSpSharedRecoContext接口的上下文环境,这一上下文环境允许控制开始/停止识别,设置语法,接受事件等

语法
语法规定了可识别的词,定义了识别规则等,使用XML来描述语法,一个简单的例子如下

< GRAMMAR  LANGID ="809" >
  
< DEFINE >
    
< ID  NAME ="RID_start"  VAL ="1" />
  
</ DEFINE >
  
< RULE  NAME ="start"  ID ="RID_start"  TOPLEVEL ="ACTIVE" >
    
< P > colour </ P >
    
< RULEREF  NAME ="colour"   />
    
< O > please </ O >
  
</ RULE >
  
< RULE  NAME ="colour" >
    
< L >
      
< P > red </ P >
      
< P > blue </ P >
      
< P > green </ P >
    
</ L >
  
</ RULE >
</ GRAMMAR >
在这个例子中,下面的内容可以被识别
colour red colour red please colour blue colour blue please colour green colour green please
更多关于此的内容见SAPI的帮助

[待续,该熄灯了...]
[继续]
连续识别

这个功能很便于使用,我们需要放置一个为共享识别器设置上下文环境SpSharedRecoContext
Note:识别器可自动被创建,不必手动创建,如果需要直接使用识别器,可以手动创建SpSharedRecognizerClass或 SpInprocRecognizerClass对象
下面是个简单的例子
private void button1_Click(object sender,EventArgs e)
{                    
ssrc = new SpSharedRecoContext();            
srg =ssrc.CreateGrammar(0);
srg.DictationSetState(SpeechRuleState.SGDSActive);
}
[尊重原文,原文这里给出了这个例子,个人认为没什么用...,比较有用的还是后面C & C的例子]

语法事件
[这一节以复述为主,翻译实在是有点罗嗦,个人认为说明的不是特别清楚]
主要提到两个事件 OnRecognition和 OnHypothesis
OnRecognition ,顾名思义,在识别出一个元素后激发
OnHypothesis,原文的意思不是很好理解,这里引用微软帮助上的说明
A hypothesis is an interim recognition result.
Each time the engine attempts a recognition it
generates an interim results and Hypothesis events are sent out
意思就是"假设"是识别的一个中间结果,每次识别时,系统产生一个中间结果集并激发这一事件
第二个时间具体的例子不举了,一般用不上,原文有个例子,只是把中间结果集输出,可以用于理解一下工作原理

Engine Dialogs
主要是原文例子的一个设计,这里没有做这个例子,所以...略

Command and Control Recognition
命令识别
这节没什么好说的,举个例子就可以了,不举原文的例子,写了个识别中文的例子,如要调试此例,请看完文后的"乱七八糟"

定义XML命令配置文件XMLRules.xml
< GRAMMAR  LANGID ="804" > <!-- 此为语音号,中文为804 -->
  
<!--  Rule definitions  -->
  
< RULE  NAME ="start"  TOPLEVEL ="ACTIVE" >
    
< O > 颜色 </ O >
    
< RULEREF  NAME ="colour"  PROPNAME ="chosencolour" />     
  
</ RULE >

  
< RULE  NAME ="colour" >
    
< PROPNAME ="colourvalue" >
      
< VAL ="1" > 红色 </ P >
      
< VAL ="2" > 黄色 </ P >
      
< VAL ="3" > 绿色 </ P >
    
</ L >
  
</ RULE >
</ GRAMMAR >


         private  SpeechLib.SpSharedRecoContext ssrc;
        
private  ISpeechRecoGrammar srg;
        
private   void  button1_Click( object  sender, EventArgs e)
        {         
            ssrc 
=   new  SpSharedRecoContext();            
            srg 
= ssrc.CreateGrammar( 0 );
            srg.CmdLoadFromFile(
" g:\\XMLRules.xml " , SpeechLoadOption.SLODynamic); // 读入规则
            ssrc.EventInterests  =  SpeechRecoEvents.SREAllEvents; // 在"语音事件"中有说明
            ssrc.Recognition  +=   new  _ISpeechRecoContextEvents_RecognitionEventHandler(ssrc_Recognition); // 添加识别事件            srg.CmdSetRuleState(srg.Rules.Item(0).Name, SpeechRuleState.SGDSInactive); // 激活规则            
        }

        
void  ssrc_Recognition( int  StreamNumber,  object  StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
        {
            MessageBox.Show(Result.PhraseInfo.Elements.Item(
0 ).DisplayText);
        }


最后的乱七八糟
译了个不像样子,总想按自己的理解写,毕竟英语译过来不像中国话
最后几点注意事项,要是没看调试程序出错只能怪自己了
1]一定要进行语音训练,控制面板-语音-语音识别-训练配置文件
2]如最后一例,使用了中文识别,会调试出错,因为没指定中文识别器
指定方法:控制面板-语音-语音识别-语言-Microsoft Simplified Chinese Recognizer


希望能有人看这些文章...

转载于:https://www.cnblogs.com/Tachikoma/archive/2007/11/04/949198.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值