您的位置:首页 > 编程语言 > C#

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

2007-11-04 22:26 441 查看
翻译说明:语音识别中重点翻译"命令识别"[Command recognition],对本人比较有用...



语音识别


语音识别可以使用两种识别器:a shared recogniser(TSpSharedRecognizer) [共享识别器]和 an in-process
recogniser (TSpInprocRecognizer)[独占识别器],独占识别器效率更高但是独占麦克风,其他程序不能接收到语音输入,相对的,共享识别器可以和其它程序共享使用,其他程序可以接收到语音输入,因此使用共享识别器更多

识别器使用一个 继承了TSpInprocRecoContext或TSpSharedRecoContext接口的上下文环境,这一上下文环境允许控制开始/停止识别,设置语法,接受事件等



语法

语法规定了可识别的词,定义了识别规则等,使用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">

<L PROPNAME="colourvalue">

<P VAL="1">红色</P>

<P VAL="2">黄色</P>

<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

希望能有人看这些文章...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: