参考: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. Python 多进程 一分钟下载二百张图片 是什么样子的体验

    需要爬取国内某个网站,但是这个网站封ip,没办法,只能用代理了,然后构建自己的代理池,代理池维护了20条进程, 所用的网络是20M带宽,实际的网速能达到2.5M,考虑到其他原因,网速未必能达到那么多. ...

  2. asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台

    分享: 腾讯微博  新浪微博   搜狐微博   网易微博  腾讯朋友  百度贴吧  豆瓣   QQ好友  人人网 作者:王春天  原文地址:http://www.cnblogs.com/spring_ ...

  3. Codeforces Round #262 (Div. 2) C

    题目: C. Present time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  4. Jquery获得子页面中某个元素

    本页面中有子框架iframe1.获取iframe1中元素 $("input[name$='svNo']", window.frames["iframe1"].d ...

  5. C++ function pointer and type cast

    http://www.cprogramming.com/tutorial/function-pointers.html http://www.cplusplus.com/doc/tutorial/ty ...

  6. MySQL数据库如何去掉数据库中重复记录

    对于常规的MySQL数据表中可能存在重复的数据,有些情况是允许重复数据的存在,有些情况是不允许的,这个时候我们就需要查找并删除这些重复数据,以下是具体的处理方法! 方法一:防止表中出现重复数据 当表中 ...

  7. AngularJS官网seed目录结构

    1.AngularJS官网seed目录结构 css/ img/ js/ app.js controllers.js directives.js filters.js services.js lib/ ...

  8. 歌手右侧快速入口ABCD....

    1.通过v-for将右侧内容渲染出来,并绝对定位到右侧 2.给每个li绑定touchStart事件,并绑定自定义属性data-index=index: 3.点击每个li,通过e来获取所绑定的自定义属性 ...

  9. 解决CentOS中/var目录满的问题

    最近服务器的/var目录总是报警说磁盘满了,查看以后发现主要是/var/log/maillog和/var/spool/mail/root和/var/spool/mqueue目录.从搜索的结果看到应该是 ...

  10. android studio 报Error:failed to find Build Tools revision 23.0.0 rc2

    每个项目的build.gradle里可以设置,例如 android { .... buildToolsVersion '23.0.0 rc2' .... } 1 2 3 4 5 如下图,我的Andro ...