最近在做SAPI方面的工作,比较详细的中文资料不多,遇到各种问题,本来想着做完了项目总结一下,今天看到这篇文章,对于SAPI加载识别语法方面的描述十分详细,先转过来做个备份,谢谢原文博主:djyangmaowei,原文地址:http://blog.csdn.net/djyangmaowei/article/details/5384942

应用程序可以利用SpSharedRecoContext接口创建不同的与语音识别引擎的连接。每一个连接都可以使用各自的事件并且使用不同的语音识别语法(grammars)。每一个基于SAPI语音识别的应用程序必须具有至少一个SpSharedRecoContext接口。

第一种方法: 自己定义Grammar

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

using System.Diagnostics;

using SpeechLib;

namespace WindowsFormsApplication3

{

public partial class Form1 : Form

{

private SpeechLib.ISpeechGrammarRule menuRule = null;

private SpeechLib.SpSharedRecoContext objRecoContext;

private ISpeechRecoGrammar grammar;

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

// 得到一个RecoContext实例.

objRecoContext = new SpeechLib.SpSharedRecoContext();

// 指派一个事件给Hypothesis Event(中间层暂定的识别,即,初级的,临时的识别).

objRecoContext.Hypothesis += new _ISpeechRecoContextEvents_HypothesisEventHandler(Hypo_Event);

// 指派一个事件给语音识别.

objRecoContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(Reco_Event);

//创建grammer实例.

grammar = objRecoContext.CreateGrammar(0);

label1.Text = "Speak Out one of the following./r/n1. 人民 2. 马克思 3. 孙中山 4. 恩格斯/r/n5. 杨茂巍 6. 王芳 7. 世界 8. 成都";

//激活菜单命令.

menuRule = grammar.Rules.Add("MenuCommands", SpeechRuleAttributes.SRATopLevel | SpeechRuleAttributes.SRADynamic, 1);

object PropValue = "";

menuRule.InitialState.AddWordTransition(null, "人民", " ", SpeechGrammarWordType.SGLexical, "人民", 1, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "马克思", " ", SpeechGrammarWordType.SGLexical, "马克思", 2, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "孙中山", " ", SpeechGrammarWordType.SGLexical, "孙中山", 3, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "恩格斯", " ", SpeechGrammarWordType.SGLexical, "恩格斯", 4, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "杨茂巍", " ", SpeechGrammarWordType.SGLexical, "杨茂巍", 5, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "王芳 ", " ", SpeechGrammarWordType.SGLexical, "王芳 ", 6, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "世界", " ", SpeechGrammarWordType.SGLexical, "世界", 7, ref PropValue, 1.0F);

menuRule.InitialState.AddWordTransition(null, "成都", " ", SpeechGrammarWordType.SGLexical, "成都", 8, ref PropValue, 1.0F);

grammar.Rules.Commit();

grammar.CmdSetRuleState("MenuCommands", SpeechRuleState.SGDSActive);

}

private void Reco_Event(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)

{

textBox1.Text = Result.PhraseInfo.GetText(0, -1, true);

}

private void Hypo_Event(int StreamNumber, object StreamPosition, ISpeechRecoResult Result)

{

textBox2.Text = Result.PhraseInfo.GetText(0, -1, true);

}

}

}

第二种方法:
不定义Grammar 利用SAPI自动识别输入语音 准确率不高
public class SpRecognition
     {
          private static SpRecognition _Instance = null ;
          private SpeechLib.ISpeechRecoGrammar isrg ;
          private SpeechLib.SpSharedRecoContextClass ssrContex =null;
          private System.Windows.Forms.Control cDisplay  ;
          private SpRecognition()
         {
              ssrContex = new SpSharedRecoContextClass() ;
              isrg = ssrContex.CreateGrammar(1) ;          
              SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle =
                   new _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition) ;
              ssrContex.Recognition += recHandle ;
         }
         public void BeginRec(Control tbResult)
         {            
              isrg.DictationSetState(SpeechRuleState.SGDSActive) ;
              cDisplay = tbResult ;
         }
         public static SpRecognition instance()
         {
              if (_Instance == null)
                   _Instance = new SpRecognition() ;
              return _Instance ;
         }
         public void CloseRec()
         {
              isrg.DictationSetState(SpeechRuleState.SGDSInactive) ;
         }
          private void ContexRecognition(int iIndex,object obj,SpeechLib.SpeechRecognitionType type,SpeechLib.ISpeechRecoResult result)
         {
              cDisplay.Text += result.PhraseInfo.GetText(0,-1,true) ;
         }
 
     }
第三种方法:
外界读入xml grammar (c://1.xml)
 private SpeechLib.SpSharedRecoContext ssrc;
        private ISpeechRecoGrammar srg;
        private void button1_Click(object sender, EventArgs e)
        {
            ssrc = new SpSharedRecoContext();
            srg = ssrc.CreateGrammar(1);
            srg.CmdLoadFromFile("c://1.xml", SpeechLoadOption.SLODynamic);//读入规则
           // ssrc.EventInterests = SpeechRecoEvents.SREAllEvents;//在"语音事件"中有说明
            ssrc.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(ssrc_Recognition);//添加识别事件     
            ssrc.Hypothesis += new _ISpeechRecoContextEvents_HypothesisEventHandler(Hypo_Event);
            srg.CmdSetRuleState(srg.Rules.Item(0).Name, SpeechRuleState.SGDSActive);//激活规则       
        }
        private void button2_Click(object sender, EventArgs e)
        {
          
        }
        private void button3_Click(object sender, EventArgs e)
        {
           
        }
        void ssrc_Recognition(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
        {
            textBox1.Text = Result.PhraseInfo.GetText(0, -1, true);
        }
        private void Hypo_Event(int StreamNumber, object StreamPosition, ISpeechRecoResult Result)
        {
            textBox2.Text = Result.PhraseInfo.GetText(0, -1, true);
        }
 
1.xml
<?xml version="1.0" encoding="gb2312" ?> 
<GRAMMAR LANGID="804"> 
<RULE NAME="命令" TOPLEVEL="ACTIVE"> 
<L> 
<P>口令结束</P> 
<P>放大</P> 
<P>Home</P> 
<p>End</p> 
<P>上一页</P> 
<P>下一页</P> 
<P>向上</P> 
<P>向下</P> 
<P>左窗口</P> 
<P>右窗口</P> 
<P>关闭</P> 
<P>撤消</P> 
<P>刷新</P> 
</L> 
</RULE> 
</GRAMMAR>
如要源代码 请留下邮箱 

Sapi 添加语法的文章(转载)的更多相关文章

  1. 【前端】向blog或网站中添加语法高亮显示代码方法总结

    向blog或网站中添加语法高亮显示的代码方法总结 文章目录 预备知识 目标 第一类方法:嵌入 第二类方法:外部引用 第三类方法:忽略HTML和PHP 最近在写代码时遇到一个问题,就是如何让代码像在ID ...

  2. 文章转载利用border、transparent实现微风

    微风效果预览 微风源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  3. 文章转载至CSDN社区罗升阳的安卓之旅,原文地址:

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6720261 前面我们在分析Activity启动 ...

  4. thymeleaf 添加语法提示

    thymeleaf 添加语法提示: xmlns:th="http://www.thymeleaf.org"

  5. wordpress添加post_type自定义文章类型

    wordpress很强大,能当博客也能进行二次开发出很完善的内容管理系统满足企业运营需求,比如可以添加products产品模型.汽车模型等,如何实现呢?添加post_type自定义文章类型就可以了 p ...

  6. 用 highlight.js 为文章中的代码添加语法高亮

    来源:http://www.ghostchina.com/adding-syntax-highlighting-to-ghost-using-highlight-js/ --------------- ...

  7. Perl的基本语法<总结> (转载)

    前言:这篇文章是花了我很多时间.费了我很多心血才完成的,虽然连我自己都觉得无法达到尽善尽美的境界,但希望能帮助大家入门,稍微了解到Perl 到底是个什么样的东西,Perl到底有那些强大的功能,那么这篇 ...

  8. Eclipse 如何添加 更换字体(转载)

    1. 打开eclipse-->Window-->Preferences-->General-->appearance-->Colors and Fonts, 点开后选择B ...

  9. Android性能优化文章转载

    今天看到几篇比较好的文章就转了!(链接如下) 转载注明出处:Sunzxyong Android性能优化之Bitmap的内存优化 Android性能优化之常见的内存泄漏 Android最佳实践之Syst ...

随机推荐

  1. java 调用微信截图工具

  2. GTD时间管理(3)---梳理总结

    一:收集箱   1:灵感和想法 2:交代事情 3:任何困扰你的事     二:清单容器     1:通过行动性和非行动性原则 2:通过2分钟原则 3:通过人员性质原则  三:组织 (人,事,时 的组合 ...

  3. latextools \cite 自动补全

    最近在用latex写毕业论文,编辑环境用的是Sublime Text 2 加 latextools 插件,在使用latextools的\cite命令来引用参考文献时,我们希望输入\cite{ 后自动弹 ...

  4. Git教程学习(五)

    14. 解决冲突 14.1. 场景 当分支A和分支B在同一个文件上都有修改时会出现冲突.常见的情况是从master分支的基础上生成了新分支dev,然后在dev上进行了修改并add&commit ...

  5. 笔记 - 本地拦截genymotion或者Android模拟器的网络请求

    我们在主机上面运行了Burp或者fiddler,那么代理已经监听在本机的8080端口了. 那么我们需要在模拟器中进行如下设置: 1.在设置中,长按当前连接的wifi网络,弹出如下: 2. 点击修改网络 ...

  6. (转)Python rsa 签名与验证 sign and verify

    转自:http://wawehi.blog.163.com/blog/static/143780306201371361120515/ 网上一搜一大把的 python rsa 相关的东西,python ...

  7. OsmocomBB && Motorora C118

    OsmocomBB 编译安装: http://www.cnblogs.com/hangxin1940/p/3375216.html ##准备: C118 ![C118](http://images.c ...

  8. VS2010运行类向导提示“未实现该方法或操作”

    因为解决方案中包含有安装项目,将这些项目排除掉,即可打开类向导.

  9. windows下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创文章,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4535459.html android 程序打包成apk,如果在是命令行方式,一般都要经过如下步骤: 1.用a ...

  10. solr searcher

    solr searcher 前面我配置好了solr,并且数据库建立索引也完成了. 为php添加搜索 首先下载solrphp http://wiki.apache.org/solr/SolPHP 在so ...