C++语音识别接口快速入门(Microsoft Speech SDK)

                           

版权声明:该博客是本宝宝原创文章,未经博主允许不得转载。

目录(?)[+]

  1. C语音识别接口快速入门Microsoft Speech SDK

    1. 目录
  2. 一安装SDK
  3. 二新建工程配置环境
  4. 三语音识别代码
    1. 文字转语音
    2. 语音转文字
  5. 源代码下载
  6. 参考网站

C++语音识别接口快速入门(Microsoft Speech SDK)

最近毕业设计用到了微软的C++语音识别接口,查找了很多资料,也碰到了很多问题,走了很多弯路。现在把我自己的经验写下来,一是提升自己,二是回报社会。希望大家看了这篇blog之后,5min就学会C++语音识别接口的实现。(采用的平台为win8+VS2013)

目录

  • C语音识别接口快速入门Microsoft Speech SDK

      • 目录
    • 一安装SDK
    • 二新建工程配置环境
    • 三语音识别代码
      • 1文字转语音
      • 2语音转文字
    • 源代码下载
    • 参考网站

一、安装SDK

安装MicrosoftSpeechPlatformSDK.msi,默认路径安装即可。
下载路径:
http://download.csdn.net/detail/michaelliang12/9510691

二、新建工程,配置环境

设置:
1,属性–配置属性–C/C++–常规–附加包含目录:C:\Program Files\Microsoft SDKs\Speech\v11.0\Include(具体路径与安装路径有关)
2,属性–配置属性–链接器–输入–附加依赖项:sapi.lib;

三、语音识别代码

语音识别接口可分为文字转语音和语音转文字

1、文字转语音

需要添加的头文件:

#include <sapi.h> //导入语音头文件
#pragma comment(lib,"sapi.lib") //导入语音头文件库
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

函数:

void  CBodyBasics::MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调用此函数即可将文字转为语音
{ISpVoice *pVoice = NULL;//初始化COM接口if (FAILED(::CoInitialize(NULL)))MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);//获取SpVoice接口HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);if (SUCCEEDED(hr)){pVoice->SetVolume((USHORT)100); //设置音量,范围是 0 -100pVoice->SetRate(2); //设置速度,范围是 -10 - 10hr = pVoice->Speak(speakContent, 0, NULL);pVoice->Release();pVoice = NULL;}//释放com资源::CoUninitialize();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2、语音转文字

这个稍微麻烦一点,因为需要实时监控麦克风,涉及到windows的消息机制。
(1)首先设置工程属性:
属性–配置属性–C/C++–预处理器–预处理器定义:_WIN32_DCOM;

(2)需要添加的头文件:

#include <sapi.h> //导入语音头文件
#pragma comment(lib,"sapi.lib") //导入语音头文件库
#include <sphelper.h>//语音识别头文件
#include <atlstr.h>//要用到CString#pragma once
const int WM_RECORD = WM_USER + 100;//定义消息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(3)在程序的.h头文件中定义变量

//定义变量
CComPtr<ISpRecognizer>m_cpRecoEngine;// 语音识别引擎(recognition)的接口。
CComPtr<ISpRecoContext>m_cpRecoCtxt;// 识别引擎上下文(context)的接口。
CComPtr<ISpRecoGrammar>m_cpCmdGrammar;// 识别文法(grammar)的接口。
CComPtr<ISpStream>m_cpInputStream;// 流()的接口。
CComPtr<ISpObjectToken>m_cpToken;// 语音特征的(token)接口。
CComPtr<ISpAudio>m_cpAudio;// 音频(Audio)的接口。(用来保存原来默认的输入流)
ULONGLONG  ullGrammerID;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(4)创建语音识别初始化函数(程序刚开始执行的时候调用,例如文末示例代码中,将此初始化函数放在对话框初始化消息WM_INITDIALOG的响应代码里)

//语音识别初始化函数
void  CBodyBasics::MSSListen()
{//初始化COM接口if (FAILED(::CoInitialize(NULL)))MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);HRESULT hr = m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);//创建Share型识别引擎if (SUCCEEDED(hr)){hr = m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);//创建识别上下文接口hr = m_cpRecoCtxt->SetNotifyWindowMessage(m_hWnd, WM_RECORD, 0, 0);//设置识别消息const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) | SPFEI(SPEI_RECOGNITION);//设置我们感兴趣的事件hr = m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_cpAudio);m_cpRecoEngine->SetInput(m_cpAudio, true);//创建语法规则//dictation听说式//hr = m_cpRecoCtxt->CreateGrammar(GIDDICTATION, &m_cpDictationGrammar);//if (SUCCEEDED(hr))//{//  hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);//加载词典//}//C&C命令式,此时语法文件使用xml格式ullGrammerID = 1000;hr = m_cpRecoCtxt->CreateGrammar(ullGrammerID, &m_cpCmdGrammar);WCHAR wszXMLFile[20] = L"";//加载语法MultiByteToWideChar(CP_ACP, 0, (LPCSTR)"CmdCtrl.xml", -1, wszXMLFile, 256);//ANSI转UNINCODEhr = m_cpCmdGrammar->LoadCmdFromFile(wszXMLFile, SPLO_DYNAMIC);//MessageBox(NULL, (LPCWSTR)L"语音识别已启动!", (LPCWSTR)L"提示", MB_CANCELTRYCONTINUE );//激活语法进行识别//hr = m_cpDictationGrammar->SetDictationState(SPRS_ACTIVE);//dictationhr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE);//C&Chr = m_cpRecoEngine->SetRecoState(SPRST_ACTIVE);}else{MessageBox(NULL, (LPCWSTR)L"语音识别引擎启动出错!", (LPCWSTR)L"警告", MB_OK);exit(0);}//释放com资源::CoUninitialize();//hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_INACTIVE);//C&C}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

(5)定义消息处理函数
需要和其他的消息处理代码放在一起,如本文代码中,放在文末示例代码的DlgProc()函数尾部。本文整个其他的代码块都可以直接照搬,只需要更改如下的消息反应模块即可

//消息处理函数
USES_CONVERSION;CSpEvent event;if (m_cpRecoCtxt){while (event.GetFrom(m_cpRecoCtxt) == S_OK){switch (event.eEventId){case SPEI_RECOGNITION:{//识别出了语音m_bGotReco = TRUE; static const WCHAR wszUnrecognized[] = L"<Unrecognized>";CSpDynamicString dstrText;////取得识别结果 if (FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL))){dstrText = wszUnrecognized;}BSTR SRout;dstrText.CopyToBSTR(&SRout);CString Recstring;Recstring.Empty();Recstring = SRout;//做出反应(*****消息反应模块*****)if (Recstring == "发短信"){//MessageBox(NULL, (LPCWSTR)L"好的", (LPCWSTR)L"提示", MB_OK);MSSSpeak(LPCTSTR(_T("好,马上发短信!")));}else if (Recstring == "李雷"){MSSSpeak(LPCTSTR(_T("好久没看见他了,真是 long time no see")));}   }break;}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

(6)修改语法文件
修改CmdCtrl.xml文件,可以提高某些词汇的识别度,对里面的词识别效果会很好多,如人名等。(此外,单独运行exe时也需要将此文件和exe放在同一文件夹内,不放也不会报错,只是语法文件里的词汇识别效果变差)

<?xml version="1.0" encoding="utf-8"?>
<GRAMMAR LANGID="804"><DEFINE><ID NAME="VID_SubName1" VAL="4001"/><ID NAME="VID_SubName2" VAL="4002"/><ID NAME="VID_SubName3" VAL="4003"/><ID NAME="VID_SubName4" VAL="4004"/><ID NAME="VID_SubName5" VAL="4005"/><ID NAME="VID_SubName6" VAL="4006"/><ID NAME="VID_SubName7" VAL="4007"/><ID NAME="VID_SubName8" VAL="4008"/><ID NAME="VID_SubName9" VAL="4009"/><ID NAME="VID_SubNameRule" VAL="3001"/><ID NAME="VID_TopLevelRule" VAL="3000"/></DEFINE><RULE ID="VID_TopLevelRule" TOPLEVEL="ACTIVE"><O><L><P>我要</P><P>运行</P><P>执行</P></L></O><RULEREF REFID="VID_SubNameRule" /></RULE><RULE ID="VID_SubNameRule" ><L PROPID="VID_SubNameRule"><P VAL="VID_SubName1">发短信</P><P VAL="VID_SubName2">是的</P><P VAL="VID_SubName3">好的</P><P VAL="VID_SubName4">不用</P><P VAL="VID_SubName5">李雷</P><P VAL="VID_SubName6">韩梅梅</P><P VAL="VID_SubName7">中文界面</P><P VAL="VID_SubName8">英文界面</P><P VAL="VID_SubName9">English</P></L></RULE>
</GRAMMAR>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

源代码下载

注意,本代码是在原来的项目中截取出来的,但可以独立运行。
Microsoft Speech SDK 安装包下载:
http://download.csdn.net/detail/michaelliang12/9510691
文中示例程序下载(之前下载分数太高,我已经重新上传了新版本,也解决了kincect20.lib报错的问题。由于自己经常在csdn上下东西,也需要积分,需要还是需要各位捧场,2积分。。):
http://download.csdn.net/detail/michaelliang12/9766783

存在的bug:每次运行完程序,Windows的语音识别助手不会自动关闭,需要自己手动关闭。若不关闭,则下次启动程序可能会出错。大家如果有好的解决办法,请联系我,谢了!

参考网站

1,http://www.cnblogs.com/eping/archive/2010/05/23/1742201.html
2,http://blog.csdn.net/pamchen/article/details/7856207
3,http://blog.csdn.net/jmxiaocai/article/details/7036033
4,http://blog.csdn.net/buaalei/article/details/5372544(主要参考)
5,http://blog.csdn.net/itcastcpp/article/details/5313204
6,http://blog.csdn.net/artemisrj/article/details/8723095(MFC的消息处理响应版本)

C++语音识别接口快速入门相关推荐

  1. C++语音识别接口快速入门(Microsoft Speech SDK)——文字转语音

    C++语音识别接口快速入门(Microsoft Speech SDK) 尤其注意其中的宽字符串转化 #include <iostream> #include <sapi.h> ...

  2. Microsoft c++ Speech 识别接口快速入门

    安装microsoft speech sdk: 1.下载路径:http://download.csdn.net/detail/michaelliang12/9510691: 2.安装 直接执行安装 3 ...

  3. 快速入门脑机接口:BCI基础(二)

    关于脑机接口的分类可以查看<快速入门脑机接口:BCI基础(一)> 组成成分 脑活动 神经系统由两个主要部分组成:中枢神经系统和周围神经系统.大脑是中枢神经系统的主要器官,它包含约1000亿 ...

  4. java day29【DBC基本概念 、快速入门 、对JDBC中各个接口和类详解】

    第一章   JDBC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 * JDBC本质:其实是官方(sun公司)定义的一套操作所有关系 ...

  5. 带你快速入门AXI4总线--AXI4-Full篇(3)----XILINX AXI4-Full接口IP源码仿真分析(Master接口)

    写在前面 接slave接口篇,本文继续打包一个AXI4-Full-Master接口的IP,学习下源码,再仿真看看波形. 带你快速入门AXI4总线--AXI4-Full篇(2)----XILINX AX ...

  6. 全网最详细中英文ChatGPT接口文档(六)30分钟快速入门ChatGPT——使用策略和API数据使用策略

    30分钟快速入门使用ChatGPT--使用策略和API数据使用策略 Usage policies使用策略 Disallowed usage of our models 禁止使用我们的模型 API da ...

  7. OpenAI API及ChatGPT系列教程1:快速入门

    系列文章目录: OpenAI API及ChatGPT系列教程1:快速入门 OpenAI API及ChatGPT系列教程2:使用手册 OpenAI API及ChatGPT系列教程3:API参考(Pyth ...

  8. 微信小程序wepy框架快速入门

    微信小程序wepy框架快速入门 微信小程序简介 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一 ...

  9. 1.TensorFlow快速入门

    TensorFlow 2.0 前言 Tensorflow是Google推出的机器学习开源神器,对Python有着良好的语言支持,支持CPU,GPU和Google TPU等硬件,并且已经拥有了各种各样的 ...

最新文章

  1. 利用box-shadow绘图
  2. Docker从入门到实践
  3. unicode and utf-8
  4. 为什么我的resharper控件安装之后没有显示
  5. Android开发之自定义输入框无法弹起键盘输入法的解决方法
  6. 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contai
  7. Codeforces 827D Best Edge Weight 倍增 + 并查集 || 倍增 + 压倍增标记 (看题解)
  8. Web服务器的配置与管理(1) IIS的安装与基本设置
  9. wordpress提高访问速度
  10. swf背景透明,并显示背景图片
  11. 机器学习笔记 - EfficientNet论文解读
  12. Python 学习笔记 列表 for 循环 xxx XXX
  13. python中shelf对象_shelve 用来持久化任意的Python对象实例代码_python_脚本之家
  14. python画五角星代码_Python使用turtule画五角星的方法
  15. 《转》openstack中删除虚拟主机,状态一直deleting
  16. Java获取下周一、下周日、下个月第一天和次年第一天
  17. java自动发图文微博_使用node搭建自动发图文微博机器人的方法
  18. Vue笔记(8) - 案例
  19. 自由度和剧情新颖的单机游戏
  20. DreamSpark

热门文章

  1. html里h标签的三个作用,h标签是什么,如何正确使用?
  2. Consumer unit 消费单元
  3. 客户端认证服务端证书的过程
  4. 无法停止通用卷设备的解决方法
  5. 无法停止‘通用卷’设备 解决方法
  6. Mindjet MindManager密钥激激活码网盘磁力免费下载安装
  7. Netflix DGS Note
  8. 在线html过滤,在线Html编辑器粘贴过滤技术详解(二)
  9. nodejs 使用npm install express报错解决方案
  10. 不识最大自然数等使课本有一系列重大根本错误