参考:http://msdn.microsoft.com/en-us/library/ee125663(v=vs.85).aspx    (sapi5.4 reference)

http://msdn.microsoft.com/zh-cn/library/ms723634    Grammar Format Tags (SAPI 5.3)
http://blog.csdn.net/zhubenfulovepoem/article/details/6803505  语音控制

http://hi.baidu.com/bxybao/item/693fc8098aa36c17acdc704f  sapi5.1介绍

开发步骤:

1 sapi 是基于com的接口,所以应用程序开发需要遵循com调用规则

  1. hr = ::CoInitialize(NULL);
  2. .........
  3. ::CoUninitialize();

2 sapi 语音识别主要接口

(1)   语音识别引擎(ISpRecognizer)接口:用于创建语音识别引擎的实例。语音识别引擎对象有两种:独占(InProcRecognizer)的引擎和共享(SharedRecognizer)的引擎。独占的引擎对象只能由创建的应用程序使用,而共享的引擎可以

供多个应用程序共同使用。

(2)   语音识别上下文(ISpRecoContext)接口:主要用于发送和接收与语音识别相关的消息通知,创建语法规则对象。

(3)   语法规则(ISpRecoGrammar)接口:定义引擎需要识别的具体内容,用于创建、载入和激活识别用的语法规则。而语法规则定义了期望识别的单词、短语和句子,通常有两种语法规则:听写语法(DictationGrammer)和命令控制语法(Command and Control Grammer)。命令控制语法主要用于识别用户在语法文件里自定义的一些特定的命令词汇和句子,这些语法规则以XML文件的格式编写,通过(ISpRecoGrammar)接口载入,并激活。

(4)   识别结果(ISpPhrase)接口:用于获取识别的结果,包括识别的文字,识别的语法规则等。

(5)   语音合成(ISpVoice)接口:主要功能是通过访问TTS引擎实现文本到语音的转换,从而使电脑会说话。

  1. CComPtr<ISpRecoContext> cpRecoCtxt;   //语音识别上下文接口
  2. CComPtr<ISpRecoGrammar> cpGrammar;    //语法规则接口
  3. CComPtr<ISpVoice> cpVoice;            //<span style="font-family: Arial; font-size: 14px; line-height: 26px;">语音合成接口 <span style="font-family: Arial; font-size: 14px; line-height: 26px;">主要功能是通过访问TTS引擎实现文本到语音的转换,从而使电脑会说话。</span></span>
  4. CComPtr<ISpRecognizer> cpRecognizer;  // 语音识别引擎
  5. CComPtr<ISpAudio> m_pAudio;           // 创建进程内语音识别引擎需要的音频接口
  1. CComPtr<ISpRecoResult>

3 example

  1. // cpp_Aes.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. /*
  5. #include "aes.h"
  6. #include <string.h>
  7. using namespace std;
  8. void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
  9. size_t len, const AES_KEY *key,
  10. unsigned char *ivec, const int enc)
  11. int _tmain(int argc, _TCHAR* argv[])
  12. {
  13. unsigned char iv[16] ;
  14. strncpy((char*)iv,"0102030405060708",16);
  15. const  char* intext = "http://www.baidu.com";
  16. AES_KEY key ={0};
  17. AES_set_encrypt_key((unsigned char*)"0102030405060708",128,&key);
  18. unsigned char out[1024] ={0};
  19. unsigned char in[1024] ={0};
  20. memset(in,0x0c,1024);
  21. memcpy(in,intext,20);
  22. AES_cbc_encrypt((unsigned char*)in,out,32,&key,iv,1);
  23. for (int i=0; i < 32 ;i ++)
  24. {
  25. printf("%02X ", out[i]);
  26. }
  27. return 0;
  28. }
  29. */
  30. #include <windows.h>
  31. #include <sapi.h>
  32. #include <stdio.h>
  33. #include <string.h>
  34. #include <atlbase.h>
  35. #include "sphelper.h"
  36. //Copyright (c) Microsoft Corporation. All rights reserved.
  37. inline HRESULT BlockForResult(ISpRecoContext * pRecoCtxt, ISpRecoResult ** ppResult)
  38. {
  39. HRESULT hr = S_OK;
  40. CSpEvent event;
  41. while (SUCCEEDED(hr) &&
  42. SUCCEEDED(hr = event.GetFrom(pRecoCtxt)) &&
  43. hr == S_FALSE)
  44. {
  45. hr = pRecoCtxt->WaitForNotifyEvent(INFINITE);
  46. }
  47. *ppResult = event.RecoResult();
  48. if (*ppResult)
  49. {
  50. (*ppResult)->AddRef();
  51. }
  52. return hr;
  53. }
  54. const WCHAR * StopWord()
  55. {
  56. const WCHAR * pchStop;
  57. LANGID LangId = ::SpGetUserDefaultUILanguage();
  58. switch (LangId)
  59. {
  60. case MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT):
  61. //case MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT):
  62. pchStop = L"}42N86/0b70e50fc0ea0e70fc/05708504608a087046";;
  63. break;
  64. default:
  65. pchStop = L"Stop";
  66. break;
  67. }
  68. return pchStop;
  69. }
  70. void __stdcall SPNOTIFYCALLBACK1(WPARAM wParam, LPARAM lParam)
  71. {
  72. int x = 0;
  73. return ;
  74. }
  75. int main(int argc, char* argv[])
  76. {
  77. HRESULT hr = E_FAIL;
  78. bool fUseTTS = true;            // turn TTS play back on or off
  79. bool fReplay = true;            // turn Audio replay on or off
  80. // Process optional arguments
  81. if (argc > 1)
  82. {
  83. int i;
  84. for (i = 1; i < argc; i++)
  85. {
  86. if (_stricmp(argv[i], "-noTTS") == 0)
  87. {
  88. fUseTTS = false;
  89. continue;
  90. }
  91. if (_stricmp(argv[i], "-noReplay") == 0)
  92. {
  93. fReplay = false;
  94. continue;
  95. }
  96. printf ("Usage: %s [-noTTS] [-noReplay]  ", argv[0]);
  97. return hr;
  98. }
  99. }
  100. if (SUCCEEDED(hr = ::CoInitialize(NULL)))
  101. {
  102. {
  103. CComPtr<ISpRecoContext> cpRecoCtxt;
  104. CComPtr<ISpRecoGrammar> cpGrammar;
  105. CComPtr<ISpVoice> cpVoice;
  106. CComPtr<ISpRecognizer> cpRecognizer;
  107. CComPtr<ISpAudio> m_pAudio;
  108. //hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);
  109. hr = cpRecoCtxt.CoCreateInstance(CLSID_SpInProcRecoContext);
  110. if(SUCCEEDED(hr))
  111. {
  112. hr = cpRecoCtxt->GetVoice(&cpVoice);
  113. }
  114. hr = cpRecoCtxt->GetRecognizer(&cpRecognizer);
  115. hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN,&m_pAudio);
  116. hr = cpRecognizer->SetInput(m_pAudio,TRUE);
  117. cpRecognizer->SetRecoState(SPRST_ACTIVE);
  118. hr = cpRecoCtxt->SetNotifyWin32Event();
  119. hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
  120. hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
  121. hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar);
  122. hr = cpGrammar->LoadCmdFromFile(L"cmd.xml",SPLO_DYNAMIC);
  123. int err = FAILED(hr);
  124. hr = cpGrammar->SetRuleState( NULL,NULL,SPRS_ACTIVE );
  125. //hr = cpRecoCtxt->SetNotifyCallbackFunction(SPNOTIFYCALLBACK,)
  126. /*if (cpRecoCtxt && cpVoice &&
  127. SUCCEEDED(hr = cpRecoCtxt->SetNotifyWin32Event()) &&
  128. SUCCEEDED(hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION))) &&
  129. SUCCEEDED(hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL)) &&
  130. SUCCEEDED(hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar)) &&
  131. SUCCEEDED(hr = cpGrammar->LoadCmdFromFile(L"cmd.xml",SPLO_DYNAMIC)) &&
  132. SUCCEEDED(hr = cpGrammar->SetRuleState( NULL,NULL,SPRS_ACTIVE )))*/
  133. //SUCCEEDED(hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar)) &&
  134. //SUCCEEDED(hr = cpGrammar->LoadDictation(NULL, SPLO_STATIC)) &&
  135. //SUCCEEDED(hr = cpGrammar->SetDictationState(SPRS_ACTIVE)))
  136. {
  137. USES_CONVERSION;
  138. const WCHAR * const pchStop = StopWord();
  139. CComPtr<ISpRecoResult> cpResult;
  140. printf( "I will repeat everything you say. Say \" %s \" to exit. ", W2A(pchStop) );
  141. while(true)
  142. //while (SUCCEEDED(hr = BlockForResult(cpRecoCtxt, &cpResult)))
  143. {
  144. //cpGrammar->SetDictationState( SPRS_INACTIVE );
  145. hr = cpRecoCtxt->WaitForNotifyEvent(INFINITE);
  146. cpGrammar->SetRuleState( NULL,NULL,SPRS_INACTIVE );
  147. CSpDynamicString dstrText;
  148. hr = BlockForResult(cpRecoCtxt, &cpResult);
  149. if (SUCCEEDED(cpResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE,
  150. TRUE, &dstrText, NULL)))
  151. {
  152. printf("I heard:  %s ", W2A(dstrText));
  153. if (fUseTTS)
  154. {
  155. cpVoice->Speak( L"I heard", SPF_ASYNC, NULL);
  156. cpVoice->Speak( dstrText, SPF_ASYNC, NULL );
  157. }
  158. if (fReplay)
  159. {
  160. if (fUseTTS)
  161. cpVoice->Speak( L"when you said", SPF_ASYNC, NULL);
  162. else
  163. printf (" when you said... ");
  164. cpResult->SpeakAudio(NULL, 0, NULL, NULL);
  165. }
  166. cpResult.Release();
  167. }
  168. if (_wcsicmp(dstrText, pchStop) == 0)
  169. {
  170. break;
  171. }
  172. //cpGrammar->SetDictationState( SPRS_ACTIVE );
  173. cpGrammar->SetRuleState( NULL,NULL,SPRS_ACTIVE );
  174. }
  175. }
  176. }
  177. ::CoUninitialize();
  178. }
  179. return hr;
  180. }

4 配置文件

    1. <GRAMMAR>
    2. <DEFINE>
    3. <ID NAME="TheNumberFive" VAL="5"/>
    4. </DEFINE>
    5. <!-- Note that the ID takes a number, which is actually "5" -->
    6. <RULE ID="TheNumberFive" TOPLEVEL="ACTIVE">
    7. <List>
    8. <P>打开灯源</P>
    9. <P>关闭灯源</P>
    10. <P>开一号灯</P>
    11. <P>开二号灯</P>
    12. <P>关闭一号灯</P>
    13. <P>增亮一号灯</P>
    14. <P>全部关闭</P>
    15. <P>打开厨房灯</P>
    16. </List>
    17. </RULE>
    18. </GRAMMAR>

http://blog.csdn.net/xxq123321/article/details/17262935

win7语音识别开发(sapi)的更多相关文章

  1. 转:基于科大讯飞语音API语音识别开发详解

    原文来自于: http://www.52wulian.org/android_voice/ 最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了And ...

  2. cocos2d-x -3.81+win7+vs2013开发环境创建新的项目

    cocos2d-x -3.81+win7+vs2013开发环境创建新的项目 1.准备阶段 (1) vs2013下载及安装 (2)cocos2d-x 3.8.1下载及解压 (3)python下载及安装( ...

  3. opencv 2.4.9+pcl 1.6+vs2010+win7 32开发环境配置

    最近在做图像方面的开发,需要对软件开发平台进行配置,我查找了关于这些方面的内容,由于软件版本很多,每个人的开发平台又不一样所以在对平台进行搭建过程中遇到了很多问题,下面我将我搭建平台的流程做一个记录. ...

  4. Win7 Python开发环境搭建

    1.  下载Anaconda并安装 地址: https://www.anaconda.com/download/ Anaconda包括Python基础包与一系列科学计算包,安装后不用再单独安装Pyth ...

  5. WPF win7+vs2010开发的打印功能,怎么在XP系统上无法打印

    在wpf 中打印功能很强大,但最近是在win7上可以但是布置到xp上就不可以了,查了好多资料终于知道怎么回事了原来xp里没有.net framework3.5 安装一个就OK了要先安装4.0.

  6. win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面

    错误一: HTTP Error 500.19 - Internal Server Error配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (ov ...

  7. 利用微软Speech SDK 5.1开发语音识别系统主要步骤

    利用微软Speech SDK 5.1开发语音识别系统主要步骤 2009-09-17 10:21:09|  分类: 知识点滴|字号 订阅 微软语音识别分两种模式:文本识别模式和命令识别模式.此两种模式的 ...

  8. win7下安装Sass和compass

    由于项目需要我们使用到sass来编译css文件.本人在win7下开发 由于国内安装sass遇到了一些困难,后来不得不网查询,后来终于解决了,这里介绍一下 1.要安装sass环境必须要先安装rubyIn ...

  9. Android开发环境建立

    一.For windows 7(注:XP会有问题) 1.JDK-Java SE download: http://www.oracle.com/technetwork/java/javase/down ...

随机推荐

  1. MATLAB(4)——图片保存方法汇总及常用指令

    作者:桂. 时间:2017-03-03  19:30:03 链接:http://www.cnblogs.com/xingshansi/p/6498318.html 前言 本文为MATLAB系列第四篇. ...

  2. 使用SQL语句的子查询批量复制表数据

    批量复制表数据这里有两种方法,下面分别来介绍这两种方法: 一.手动创建新表,然后复制数据 如果是要复制整个表的话,可以使用SQL SERVER自动生成CREATE脚本: 然后在脚本中改改表名就可以了, ...

  3. zabbix 源

    http://repo.zabbix.com/ # cat /etc/yum.repos.d/zabbix.repo [zabbix] name=Zabbix Official Repository ...

  4. ORACLE 多列合并成一行数据 WM_CONCAT函数以及REPLACE

    WM_CONCAT()方法 注意字符长度 SELECT BERTHCODE,tpf.freedatetype, ( SELECT WM_CONCAT(SBPT.PARKSTIME||'~'||SBPT ...

  5. Oracle PLSQL Demo - 20.弱类型REF游标[没有指定查询类型,也不指定返回类型]

    declare Type ref_cur_variable IS REF cursor; cur_variable ref_cur_variable; v_ename ); v_deptno ); v ...

  6. Java – Convert IP address to Decimal Number

    In this tutorial, we show you how to convert an IP address to its decimal equivalent in Java, and vi ...

  7. Ubuntu 12.04下jdk的安装与配置

    由于要开始在linux下学习jsp的开发,所以就准备自己动手配置一下jdk和tomcat jdk 下载地址: http://www.oracle.com/technetwork/java/javase ...

  8. windows下好用的markdown编辑器

    Markdown是一种用来写作的轻量级[标记语言],它用简洁的语法代替了排版.字体设置,使我们可以专心写作,目前被越来越多的开发者,写作爱好者使用.Markdown的语法十分简单,常用的标记不超过十个 ...

  9. PPP点到点协议&pap验证

    RA RB

  10. Android——实现欢迎界面的自动跳转(转)

    Android实现欢迎界面的自动跳转,就是打开某一个安卓手机应用,出现的欢迎界面停留几秒钟,自动进入应用程序的主界面.在网上看到很多种实现办法,但是感觉这种方法还是比较简单的. 在onCreate里设 ...