微软MFC下做speech sdk语音识别,消息响应的版本

网上虽然有很多语音识别的教程,但是很多是却少一些部分,笔者在综合了几篇之后,做成功了语音识别,下面是教程。

网上的语音识别分成几种,把语音识别消息放入队列中的是一种,笔者认为这个效率比较高,所以用这个。

本文以加在对话框中为例,XXXdlg XXX.h


第一,安装speech sdk 貌似虽然大家用的都是老版本,但是微软最新的是speech sdk 11.在win7以后的系统可以用,C++的程序写法还是和老的5.1一样用。


第二,在工程中设置。

项目->属性->配置属性->C/C++  附加包含目录,输入以下(注意你自己安装在哪里就是 哪里)

"D:\Program Files\Microsoft SDKs\Speech\v11.0\Include"

"X:\XXX\Microsoft SDKs\Speech\v11.0\Include"

(X:\XXX是你的安装目录)

项目->属性->配置属性->链接库 ,输入以下

"D:\Program Files\Microsoft SDKs\Speech\v11.0\Lib"

"D:\Program Files\Microsoft SDKs\Speech\v11.0\Lib"

(X:\XXX是你的安装目录)


D:\Program Files\Microsoft SDKs\Speech\v11.0\前面为你装的speech的目录,具体的自己调整,很坑爹的是好像没有配置这一项,能用,反而加了这个,语音合成出事了,不加是因为在系统默认的include目录下已经包含了头文件,至于版本问题,好像v11和5.3都尝试过,不知道起作用的是哪个版本)


第三,添加自定义消息 和消息映射  还有头文件

如果想在全部应用语音识别 在stdafx.h  里面加 #include "sphelper.h"  或者单独在.h里面加

#include "sphelper.h"

在XXXDlg.h的开头加入消息自定义const int WM_RECORD=WM_USER+100; 

如下

#pragma once
const int WM_RECORD=WM_USER+100; 

与此同时,同在头文件声明自定义消息响应函数,和其他消息响应函数放一起就好了。

afx_msg LRESULT OnRecord(WPARAM wParam,LPARAM lParam);


public:
CComPtr<ISpRecognizer>m_pSREngine;// 语音识别引擎(recognition)的接口。
CComPtr<ISpRecoContext>m_pSRContext;// 识别引擎上下文(context)的接口。
CComPtr<ISpRecoGrammar>m_pSRGrammar;// 识别文法(grammar)的接口。
CComPtr<ISpStream>m_pInputStream;// 流()的接口。
CComPtr<ISpObjectToken>m_pToken;// 语音特征的(token)接口。
CComPtr<ISpAudio>m_pAudio;// 音频(Audio)的接口。(用来保存原来默认的输入流)
ULONGLONG ullGrammerID ;

在XXXDlg.cpp 加入消息和消息响应函数的映射 ON_MESSAGE(WM_RECORD,OnRecord),如下所示

BEGIN_MESSAGE_MAP(CMSsimDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_RECORD,OnRecord)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

第四,编写XML文件,并放在响应目录下面,XML怎么编写网上很多,大家自己搜一下
第五,在对话框的 OnInitDialog()函数中,加入以下代码,初始化语音识别的设置。

 OnInitDialog()函数:(类视图-》dlg类右击属性,右边重写标签页选择相应函数。)



	// TODO: 在此添加额外的初始化代码CoInitialize(NULL);HRESULT hr;hr=m_pSREngine.CoCreateInstance ( CLSID_SpInprocRecognizer );if(FAILED(hr)){MessageBox(L"m_pSREngine.CoCreateInstance");}/*else{MessageBox(L"success");}*/hr = m_pSREngine->CreateRecoContext ( &m_pSRContext );//建立上下文if(FAILED(hr)){MessageBox(L" m_pSREngine->CreateRecoContext ");}/*else{MessageBox(L"success");}*///这里是设置事件HWND hwnd=GetSafeHwnd();hr=m_pSRContext->SetNotifyWindowMessage(hwnd,WM_RECORD,0,0);if(FAILED(hr)){MessageBox(L"SetNotifyWindowMessage");}/*else{MessageBox(L"success");}*/hr=m_pSRContext->SetInterest(SPFEI(SPEI_RECOGNITION),SPFEI(SPEI_RECOGNITION));//这里是设置默认的音频输入hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_pAudio);m_pSREngine->SetInput(m_pAudio,true);//这里是加载默认的语法规则ullGrammerID = 1000;hr=m_pSRContext->CreateGrammar(ullGrammerID,&m_pSRGrammar);if(FAILED(hr)){MessageBox(L"CreateGrammar");}/*else{MessageBox(L"success");}*/WCHAR wszXMLFile[20]=L"";MultiByteToWideChar(CP_ACP, 0,(LPCSTR)"res\\main.xml" , -1, wszXMLFile, 256);  //这里修改XML的目录hr=m_pSRGrammar->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);if(FAILED(hr)){MessageBox(L"LoadCmdFromFile");}/*else{MessageBox(L"success");}*///开启语音识别m_pSRGrammar->SetRuleState( NULL,NULL,SPRS_ACTIVE );hr=m_pSREngine->SetRecoState(SPRST_ACTIVE);if(FAILED(hr)){MessageBox(L"SetRecoState");}/*else{MessageBox(L"success");}*/


第五,编写消息映射的函数。

LRESULT CtestSpeechDlg::OnRecord(WPARAM wParam,LPARAM lParam){USES_CONVERSION; CSpEvent event; //MessageBox(L"onrecord");if(m_pSRContext){while(event.GetFrom(m_pSRContext)==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; //这里开始处理语音识别的消息。MessageBox(Recstring);} break; } }}return NULL;
}

六:出错提示


LoadCmdFromFile是文件加载的问题,看看路径有木有问题,还有xml文件的那个编码写得不对也是不行的。


有能力修改转码问题的同学我就不说了,如果没有的话,出现问题可以点击,项目-》属性-》配置属性-》常规-》项目默认-》字符集-》unicode



原文出处:http://blog.csdn.net/artemisrj/article/details/8723095


有人私信问我一个问题,我匿名帖全文了。

“微软MFC下做speech sdk语音识别,消息响应的版本”我按你发布的做了调试,基本成功了,可以加载我自己写的xml语法文件进行识别。

可是只能在打开vc的情况下编译通过后运行才可以进行识别,当我单独的打开Debug中生成的可执行程序时,总是提示LoadCmdFromFile出错!!然后的情况是可以进入界面,但是语音识别是无法进行识别的。

也就是说在单独运行生成的可执行程序时,初始化到LoadCMDFromFile这里就出错了无法加载了!!

这个困扰我有一段时间了 ,不知道你遇到这个情况没有,有没有解决方案!!


这个问题,应该是路径问题, debug用的是相对路径,把xml放进debug文件中看看


对于这个程序,当初也是因为大创项目而做的,也没有怎么精雕细琢,做得很粗糙,但愿能够对大家有用吐舌头


最后有个传送门,是关于对话框切换的

http://blog.csdn.net/artemisrj/article/details/8896360

mxl范例:

http://download.csdn.net/detail/artemisrj/5830307


参考资料:《基于Microsoft Speech SDK的语音程序的设计与实现》骆家伟 2009年5月(有些语法出错了)

基于Speech SDK的机器人语音交互系统》陈景帅,周风余2010年3月 (代码并不全)

网上一份封装在类里面的,感觉很乱,还有一个版本是SRC类的,那个曾经被人用来写在定时器里面,那种用法效率极低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云TRTC服务实现小程序语音/视屏会议

腾讯云TRTC服务的入门 TRTC 是腾讯云主打全平台互通的多人音视频通话和低延时互动直播解决方案。TRTC服务有多种客户端的支持&#xff0c;对于IOS、Android、React native等都支持的比较好&#xff0c;我们主要在于 IOS、Android、Web三端进行处理&#xff0c;其中 TRTC Web S…

【VS开发】【智能语音处理】Windows下麦克风语音采集

简介 这是我很早以前的大学毕业设计,忽然间找到贴出来以纪念自己的纯真年代...但是因为CSDN不给面子所以导致短短的一篇文章贴了足足7次..他老提时说文章超过了64K,老大,拜托,那是算上了里面的图片大小吧...:-( 本文简单介绍了声卡的工作原理 , 录音的原理以及数字音频的基本知…

【实时语音转文本】PC端实时语音转文本(麦克风外音系统内部音源)

语音转文字这个功能可以应用在视频动态字幕&#xff0c;语音快速输入&#xff0c;实时记录通话内容&#xff0c;高级应用可以在人工智能&#xff0c;语音识别&#xff0c;智能助手方面&#xff0c;还需要一点机器学习可以做出一些好玩的东西&#xff0c;比如PC端AI助理&#xf…

使用微软的语音识别引擎Microsoft Speech API进行语音控制

以下代码来自&#xff1a;http://mmcheng.net/zh/imagespirit/ 本人仅作提取&#xff1a; SREngine语音识别引擎封装类&#xff1a; #pragma once/************************************************************************/ /* Notice: this project is used to support sp…

微软语音合成(tts)服务申请和调用

1、申请账户&#xff1a; https://azure.microsoft.com/zh-cn/free/ 这里有个视频教程&#xff0c;根据此完成申请流程&#xff1a; https://www.bilibili.com/video/BV15a4y1W7re?vd_sourcebf07f28d37849885d215dc3aea189eba 申请完成后&#xff0c;就可以到这里申请资源&am…

英超引入 AI 球探,寻找下一个足球巨星

By 超神经 内容提要&#xff1a;球探对于很多人来说是一个略显神秘的群体&#xff0c;他们对一个球队的建设和发展至关重要。为了提高球探的工作效率&#xff0c;英超伯恩利足球俱乐部最近启用了 AI 球探。 关键词&#xff1a;AI 球探 计算机视觉 姿态识别 最近&#xff0c;中国…

通过whoscored网站对转会球员的评分来比较五大联赛水平高低

我是一个八年级的学生&#xff0c;上学期学习了Python和包括标准差在内的数据统计方法。参考“怕砍不留名”在soccer.hupu.com上的帖子&#xff0c;并且在爸爸的指导下我尝试对欧洲五大足球联赛&#xff08;英超、德甲、西甲、意甲、法甲&#xff09;水平高低做一个比较。 五大…

看卡塔尔世界杯,diff一下足球比赛与软件开发

diff一下足球比赛与软件开发 吐槽世界杯E组&#xff01;类比软件开发与足球比赛教练与架构师的作用 新技术——半自动越位技术世界杯冠军 吐槽世界杯E组&#xff01; 最近博主看了多场世界杯比赛&#xff0c;看的我心力交瘁&#xff0c;欲哭无泪。 从日本与哥斯达黎加那场比赛开…

一个值得关注的技术公众号「腾讯云开发者」

今天向大家推荐的是腾讯云技术社区的公众号&#xff0c;是腾讯官方推出的技术知识分享阵地&#xff0c;每周公开腾讯最新的技术工程方案&#xff08;如微信、健康码、王者荣耀等知名业务的技术架构&#xff09;、ChatGPT 等行业前沿热点解读、研发经验和工作方法等干货&#xf…

踩坑小总结

本来想总结一下自己工作到现在踩过的坑&#xff0c;实在是太多了&#xff0c;自己之前也年轻不懂事&#xff0c;没有记录的习惯&#xff0c;想到多少写多少吧。 1.前、后端分离框架&#xff1a;刚进入工作的时候采用的是easyuissh的框架&#xff0c;前后端一体&#xff0c;后来…

如何调教一个定制化的ChatGPT私人助理,接入自家知识库

大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 我在之前的文章里介绍过&#xff0c;如何利用 OpenAI 开放的 API&#xff0c;将 ChatGPT 接入自己开发的程序&#xff1a; 把 ChatGPT 加到你自己的程序里 当时开放的模型还是 text-davinci-003。 文章发布后没多久…

ROS (roslaunch turtle_tf turtle_tf_demo.launch)报错-已解决(利用CHAT-GPT修bug)

在使用古月居的ROS入门21讲时&#xff0c;使用turtle_tf包学习tf功能时出现报错&#xff0c;网上的报错都是由于python版本的问题&#xff0c;修改后而无法解决。最后利用CHAT-GPT的修bug提示&#xff0c;最后发现是ros缓存导致报错。在文章的最后还会提供修改python版本的链接…

chatgpt赋能python:Python代码扫描:如何编写高质量的代码

Python 代码扫描&#xff1a;如何编写高质量的代码 如果你是一位有着10年的 Python 编程经验的工程师&#xff0c;你一定知道写出高质量的 Python 代码是多么的重要。但是&#xff0c;即使你是一名经验丰富的 Python 开发者&#xff0c;你的代码仍然可能存在一些隐藏的漏洞和低…

福成股份很忙:实控人李福成被罚8万,新董事长李良则要打官司

最近&#xff0c;福成股份&#xff08;SH:600965&#xff09;比较忙。 7月6日&#xff0c;河北福成五丰食品股份有限公司&#xff08;下称“福成股份”&#xff09;发布公告称&#xff0c;其近日收到证监会河北监管局&#xff08;下称“河北证监局”&#xff09;的《行政处罚决…

数据结构实验代码 1.单链表;2树的递归遍历

1.单链表 1.1算法描述 1.2代码 #include <stdio.h> #include<malloc.h> typedef char elemtype; typedef struct lnode { elemtype data; struct lnode *next; }linklist; void initlist (linklist *&L)//创建一个表 { L(linklist *)malloc(sizeof(linkli…

数据结构实验课考试 1.单链表;2树的递归遍历

1.单链表 1.1算法描述 1.2代码 1.3代码运行结果 2.树的递归遍历 2.1算法描述 2.2代码 2.3代码运行结果

vue+uview实现仿微信通讯录(提醒谁看功能)

实现功能如下图&#xff1a;(索引列表加头像和选择框&#xff0c;选择好的好友在顶部展示出来) 首先引入uview里面的索引列表组件&#xff1a;(用于展示好友列表) <view class"" style"width: 700rpx;margin: 0 auto;"> <u-index-lis…

day03_顺丰快递分拣小程序

目录 一、又见str1.1 字符串定义1.2 字符串常用操作1.2.1 str.center(width[, fillchar])1.2.2 str.count(sub, start 0,endlen(string))1.2.3 str.encode(encodingUTF-8,errorsstrict)1.2.4 str.endswith(suffix[, start[, end]])1.2.5 str.find(str, beg0, endlen(string))1.…

PYTHON 顺丰快递分拣小程序-极简9行代码实现分拣

给定一组打乱的快递信息数据&#xff0c;将快递按省份进行分类&#xff0c;最终实现如下格式效果&#xff1a; 数据源如下&#xff1a; [[王*龙, 北京市海淀区苏州街大恒科技大厦南座4层],[庞*飞, 北京市昌平区汇德商厦四楼403],[顾*锐, 江苏省扬州市三垛镇工业集中区扬州市立…

python快递分拣小程

需求 &#xff1a; 分拣出同一省份的信息 格式 省份 : 名字 地址 ...... 完整 代码 noe_list [[王*龙, 北京市海淀区苏州街大恒科技大厦南座4层],[庞*飞, 北京市昌平区汇德商厦四楼403],[顾*锐, 江苏省扬州市三垛镇工业集中区扬州市立华畜禽有限公司],[王*飞, 上海市徐汇区上…