参考: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. mysql (已解决)Access denied for user 'root'@'localhost' (using password: NO)

    找到mysql中的my.ini,在最后一行加入 skip-grant-tables 在“管理工具”-”服务” 中重启mysql 解决问题

  2. 开发Yii2过滤器并通过behaviors()行为调用(转)

    在Yii2的几乎每个controller中,我们都会看到一个函数behaviors(),通常,我们用这个函数来配置控制器的权限,例如:public function behaviors()    {  ...

  3. ubuntu中pip安装redis-py及pip的使用

    安装redis-py的前提是已经将redis成功安装,redis安装过程请看博文 ubuntu14安装redis 1.安装pip sudo apt-get install python-pip 2.使 ...

  4. ios网络层优化深入浅出

    网络层是iOS开发必须掌握的部分,苹果已经将网络请求封装得非常易用了,看看NSURLRequest和NSURLConnection的文档,你就知道怎么用了,这里我就不细讲了.本文主要讲网络层的调用逻辑 ...

  5. 客户端负载均衡:Ribbon

    Ribbon是一个客户端的负载均衡器,可以提供很多HTTP和TCP的控制行为.Feign已经使用了Ribbon,所以如果你使用了@FeignClient,Riboon也同样被应用了. Ribbon核心 ...

  6. 批处理学习笔记12 - 拷贝大文件到特定目录 Copy命令

    ~z 获取文件容量大小,配合变量使用 copy 拷贝命令, copy 原地址 新地址 ok,下面上代码 @echo off setlocal enabledelayedexpansion for %% ...

  7. ISE和Modelsim联合仿真(详细步骤讲解)

    ISE和Modelsim联合仿真(转) 地址:http://www.cnblogs.com/feitian629/archive/2013/07/13/3188192.html 相信很多人会遇到过这个 ...

  8. 使用python的email、smtplib、poplib模块收发邮件

    使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...

  9. ngApp指令,也就是ng-app属性

    翻译:https://docs.angularjs.org/api/ng/directive/ngApp 使用这个指令去 自动引导 一个AngularJS 应用程序.  ngApp 指令规定了html ...

  10. 基于CSS3图片悬停放大特效

    今天我们要来分享一款很酷的CSS3图片特效,这款图片特效可以利用鼠标滑过图片使其悬停放大,并使图片的周围出现发光的效果.配合黑色的背景,这款CSS3图片悬停放大效果显得更加立体大气,非常适合产品图片的 ...