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

以下代码来自:http://mmcheng.net/zh/imagespirit/ 


本人仅作提取:


SREngine语音识别引擎封装类:

#pragma once/************************************************************************/
/* Notice: this project is used to support speech recognition of my		*/
/* ImageSpirit project. Please see the corresponding paper for more		*/
/* details. The CORE part of ImageSpirit system will be made public		*/
/* available soon. More resource: http://mmcheng.net/imagespirit/		*/
/* ImageSpirit: Verbal Guided Image Parsing. M.-M. Cheng, S. Zheng,		*/
/* W.-Y. Lin, V. Vineet, P. Sturgess, N. Crook, N. Mitra, P. Torr,		*/
/* ACM TOG, 2014.														*/
/************************************************************************/#include <sphelper.h> // Microsoft Speech API
#pragma comment(lib,"SAPI.lib")class SREngine
{
public://speech variableCComPtr <ISpRecognizer> m_cpRecognizer;CComPtr <ISpRecoContext> m_cpRecoContext;CComPtr <ISpRecoGrammar> m_cpCmdGrammar;//audio variableCComPtr <ISpAudio> m_cpAudio;// Const valuesstatic const UINT WM_RECOEVENT = WM_USER+100;static const UINT MYGRAMMARID = 101;public:HRESULT SetRuleState(const WCHAR * pszRuleName = NULL, BOOL fActivate = SPRS_ACTIVE);HRESULT LoadCmdFromFile(const WCHAR * xmlFileName);HRESULT InitializeSapi(HWND hWnd, UINT Msg = WM_RECOEVENT, const WCHAR *xmlFileName = NULL);
};
#include "stdafx.h"
#include "SREngine.h"HRESULT SREngine::InitializeSapi(HWND hWnd, UINT Msg, const WCHAR *xmlFileName)
{HRESULT hr = S_OK;const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) | SPFEI(SPEI_PHRASE_START) | SPFEI(SPEI_RECOGNITION) | SPFEI(SPEI_FALSE_RECOGNITION) | SPFEI(SPEI_HYPOTHESIS) | SPFEI(SPEI_INTERFERENCE) | SPFEI(SPEI_RECO_OTHER_CONTEXT) | SPFEI(SPEI_REQUEST_UI) | SPFEI(SPEI_RECO_STATE_CHANGE) | SPFEI(SPEI_PROPERTY_NUM_CHANGE) | SPFEI(SPEI_PROPERTY_STRING_CHANGE);V_RETURN(m_cpRecognizer.CoCreateInstance( CLSID_SpInprocRecognizer));V_RETURN(SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_cpAudio));V_RETURN(m_cpRecognizer ->SetInput(m_cpAudio, TRUE));  V_RETURN(m_cpRecognizer->CreateRecoContext(&m_cpRecoContext));  V_RETURN(m_cpRecoContext->SetNotifyWindowMessage(hWnd, Msg, 0, 0));V_RETURN(m_cpRecoContext->SetInterest(ullInterest, ullInterest)); if (xmlFileName != NULL)return LoadCmdFromFile(xmlFileName);return hr;
}HRESULT SREngine::LoadCmdFromFile(const WCHAR *xmlFileName)
{HRESULT hr = S_OK;if (m_cpCmdGrammar != NULL)return hr;V_RETURN(m_cpRecoContext ->CreateGrammar(MYGRAMMARID, &m_cpCmdGrammar));  //Command and control---C&CV_RETURN(m_cpCmdGrammar->LoadCmdFromFile(xmlFileName, SPLO_DYNAMIC));return hr;
}HRESULT SREngine::SetRuleState(const WCHAR *pszRuleName, BOOL fActivate)
{return m_cpCmdGrammar ->SetRuleState(pszRuleName, NULL, fActivate ? SPRS_ACTIVE : SPRS_INACTIVE);
}

界面操作展示类:

#ifndef SPRECOUI_H
#define SPRECOUI_H//#include "ui_SpRecoUI.h"
#include "ui_ImageSpirit.h"class SpRecoUI : public QMainWindow
{Q_OBJECTpublic:SpRecoUI(QWidget *parent = 0, Qt::WindowFlags flags = 0);~SpRecoUI();LRESULT OnRecoEvent();bool nativeEvent(const QByteArray &eventType, void *message, long *result);private slots:void onVoiceStart();void onVoiceStop();private:Ui::SpRecoUIClass ui;// For speech recognitionbool m_bSoundEnd, m_bSoundStart;SREngine m_SREngine;void Recognized(CSpEvent &spEvent);
};#endif // SPRECOUI_H
#include "stdafx.h"
#include "SpRecoUI.h"#include <QtWidgets/QMessageBox>SpRecoUI::SpRecoUI(QWidget *parent, Qt::WindowFlags flags): QMainWindow(parent, flags)
{ui.setupUi(this);connect(ui.pbVoiceInput, SIGNAL(pressed()), this, SLOT(onVoiceStart()));connect(ui.pbVoiceInput, SIGNAL(released()), this, SLOT(onVoiceStop()));	//SAPI initm_bSoundStart = false;m_bSoundEnd = false;	if(FAILED(m_SREngine.InitializeSapi((HWND)this->winId(), SREngine::WM_RECOEVENT, L"./SpeechGrammar.xml")))QMessageBox::information(NULL, "Error", "Initialize speech engine failed!", MB_OK);
}SpRecoUI::~SpRecoUI()
{}void SpRecoUI::onVoiceStart()
{VERIFY_RES(m_SREngine.SetRuleState(NULL, TRUE));setWindowTitle("Sound started");
}void SpRecoUI::onVoiceStop()
{VERIFY_RES(m_SREngine.SetRuleState(NULL, FALSE));setWindowTitle("Sound stopped");
}bool SpRecoUI::nativeEvent(const QByteArray &eventType, void *message, long *result)
{MSG* pMsg = (MSG*) message;setWindowTitle("Control - Debug: winEvent");if(pMsg->message == SREngine::WM_RECOEVENT)*result = this->OnRecoEvent();return false;
}// Speech Recognition Event Process
LRESULT SpRecoUI::OnRecoEvent()
{if (m_SREngine.m_cpRecoContext == NULL)return FALSE;CSpEvent spEvent;HRESULT hr = S_OK;while(spEvent.GetFrom(m_SREngine.m_cpRecoContext) == S_OK) {setWindowTitle("Control - Debug");switch(spEvent.eEventId){case SPEI_SOUND_START: m_bSoundStart = true; break;case SPEI_SOUND_END: m_bSoundEnd = true; break;case SPEI_RECOGNITION: if (m_bSoundStart && m_bSoundEnd) Recognized(spEvent); break;}}return TRUE;
}void SpRecoUI::Recognized(CSpEvent &spEvent)
{USES_CONVERSION;CComPtr<ISpRecoResult> cpResult = spEvent.RecoResult();CSpDynamicString dstrText;cpResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);QString strResult = dstrText.CopyToChar(); //  W2T(dstrText);SPPHRASE* pPhrase = NULL;if (SUCCEEDED(cpResult->GetPhrase(&pPhrase))){strResult += tr(" RuleName:") + QString::fromStdWString(pPhrase->Rule.pszName);strResult += tr(" PropName:") + QString::fromStdWString(pPhrase->pProperties->pszName);		if (pPhrase->pProperties->pNextSibling)strResult += tr(" Sibling:") + QString::fromStdWString(pPhrase->pProperties->pNextSibling->pszName);if (pPhrase->pProperties->pFirstChild)strResult += tr(" Child:") + QString::fromStdWString(pPhrase->pProperties->pFirstChild->pszName);}if (pPhrase)::CoTaskMemFree(pPhrase);	ui.textEdit->insertPlainText(strResult+"\n");
}

SpeechGrammar XML语音命令字配置:

<?xml version="1.0"?>
<!-- Refer to `Grammar XML Schema' for details about how to generate this file.  -->
<GRAMMAR LANGID="409"><DEFINE><ID NAME="Activate" VAL="1010"/><ID NAME="MkDeform" VAL="1011"/><ID NAME="ChangeMatCmd" VAL="1012"/><ID NAME="ChangeClrCmd" VAL="1013"/><ID NAME="MoveCmd" VAL="1014"/></DEFINE><RULE NAME="Activate" ID="Activate" TOPLEVEL="ACTIVE"><P>+Activate -the</P><RULEREF NAME="ObjectAndDescription" PROPNAME="ObjDes"/></RULE><RULE NAME="MkDeform" ID="MkDeform" TOPLEVEL="ACTIVE"><P>+Make -the</P><RULEREF NAME="ObjectAndDescription" PROPNAME="ObjDes"/><RULEREF NAME="DeformType" PROPNAME="DType"/></RULE><RULE NAME="ChangeClrCmd" ID="ChangeClrCmd" TOPLEVEL="ACTIVE"><P>+Change -the</P><RULEREF NAME="ObjectAndDescription" PROPNAME="ObjDes"/><OPT>-from</OPT><RULEREF NAME="ColorAtri" PROPNAME="Color1"/><P>-to</P><RULEREF NAME="ColorAtri" PROPNAME="Color2"/></RULE><RULE NAME="ChangeMatCmd" ID="ChangeMatCmd" TOPLEVEL="ACTIVE"><P>+Change -the</P><RULEREF NAME="ObjectAndDescription" PROPNAME="ObjDes"/><OPT>-from</OPT><RULEREF NAME="MaterialAtri" PROPNAME="Material1"/><P>-to</P><RULEREF NAME="MaterialAtri" PROPNAME="Material2"/></RULE><RULE NAME="MoveCmd" ID="MoveCmd" TOPLEVEL="ACTIVE"><L><P>Move</P><P>Repeat</P></L><P>-the</P><RULEREF NAME="ObjectAndDescription" PROPNAME="ObjDes"/><RULEREF NAME="MoveDirection" PROPNAME="MvDir"/><OPT><P>along -the</P><RULEREF NAME="ObjectAndDescription" PROPNAME="ObjDes2"/></OPT></RULE><RULE NAME="ObjectAndDescription"><RULEREF NAME="ColorAtri" PROPNAME="ClrAtri"/><RULEREF NAME="MaterialAtri" PROPNAME="MaterAtri"/><RULEREF NAME="ObjectName" PROPNAME="ObjName"/><RULEREF NAME="PositionAtri" PROPNAME="PosAtri"/></RULE><RULE NAME="ObjectName" DYNAMIC="TRUE"><L><P PROPNAME="NUMBER" VAL="0">wall</P><P PROPNAME="NUMBER" VAL="1">floor</P><P PROPNAME="NUMBER" VAL="2">picture</P><P PROPNAME="NUMBER" VAL="3">cabinet</P><P PROPNAME="NUMBER" VAL="4">chair</P><P PROPNAME="NUMBER" VAL="5">table</P><P PROPNAME="NUMBER" VAL="6">window</P><P PROPNAME="NUMBER" VAL="7">door</P><P PROPNAME="NUMBER" VAL="8">ceiling</P><P PROPNAME="NUMBER" VAL="9">lamp</P><P PROPNAME="NUMBER" VAL="10">bed</P><P PROPNAME="NUMBER" VAL="11">desk</P><P PROPNAME="NUMBER" VAL="12">monitor</P><P PROPNAME="NUMBER" VAL="13">car</P><P PROPNAME="NUMBER" VAL="14">blinds</P><P PROPNAME="NUMBER" VAL="15">television</P><P PROPNAME="NUMBER" VAL="16">sofa</P><P PROPNAME="NUMBER" VAL="17">counter</P></L></RULE><RULE NAME="ColorAtri"><OPT><L><P PROPNAME="NUMBER" VAL="0">black</P><P PROPNAME="NUMBER" VAL="1">blue</P><P PROPNAME="NUMBER" VAL="2">brown</P><P PROPNAME="NUMBER" VAL="3">gray</P><P PROPNAME="NUMBER" VAL="4">green</P><P PROPNAME="NUMBER" VAL="5">orange</P><P PROPNAME="NUMBER" VAL="6">pink</P><P PROPNAME="NUMBER" VAL="7">purple</P><P PROPNAME="NUMBER" VAL="8">red</P><P PROPNAME="NUMBER" VAL="9">white</P><P PROPNAME="NUMBER" VAL="10">yellow</P></L></OPT></RULE><RULE NAME="PositionAtri"><OPT><P>-in</P><L><P PROPNAME="NUMBER" VAL="0">top-left</P><P PROPNAME="NUMBER" VAL="1">top-middle</P><P PROPNAME="NUMBER" VAL="2">top-right</P><P PROPNAME="NUMBER" VAL="3">center-left</P><P PROPNAME="NUMBER" VAL="4">center-middle</P><P PROPNAME="NUMBER" VAL="5">center-right</P><P PROPNAME="NUMBER" VAL="6">bottom-left</P><P PROPNAME="NUMBER" VAL="7">bottom-middle</P><P PROPNAME="NUMBER" VAL="8">bottom-right</P></L></OPT></RULE><RULE NAME="MaterialAtri"><OPT><L><P PROPNAME="NUMBER" VAL="0">wood</P><P PROPNAME="NUMBER" VAL="1">painted</P><P PROPNAME="NUMBER" VAL="2">cotton</P><P PROPNAME="NUMBER" VAL="3">paper</P><P PROPNAME="NUMBER" VAL="4">glass</P><P PROPNAME="NUMBER" VAL="5">brick</P><P PROPNAME="NUMBER" VAL="6">metal</P><P PROPNAME="NUMBER" VAL="7">leather</P><P PROPNAME="NUMBER" VAL="8">plastic</P></L></OPT></RULE><RULE NAME="MoveDirection"><L><P>up</P><P>down</P><P>left</P><P>right</P></L></RULE><RULE NAME="DeformType"><L><P>lowwer</P><P>taller</P><P>smaller</P><P>larger</P></L></RULE>
</GRAMMAR>


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

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

相关文章

微软语音合成(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],[顾*锐, 江苏省扬州市三垛镇工业集中区扬州市立华畜禽有限公司],[王*飞, 上海市徐汇区上…

重磅!2020国家科学技术奖全名单公布!

来源&#xff1a;软科 2021年11月3日&#xff0c;2020年度国家科学技术奖励大会在人民大会堂正式召开。 备受关注的国家最高科学技术奖&#xff0c;授予了中国航空工业集团有限公司顾诵芬院士和清华大学王大中院士。国家最高科学技术奖自2000年正式设立&#xff0c;是中国科技…

谷歌又闹大乌龙!Jeff Dean参与的新模型竟搞错Hinton生日

【导读】最近&#xff0c;谷歌研究员发布了关于指令微调的最新工作&#xff01;然而却宣传图中出现了可笑的乌龙。 几个小时之前&#xff0c;谷歌大脑的研究员们非常开心地晒出了自己最新的研究成果&#xff1a; 「我们新开源的语言模型Flan-T5&#xff0c;在对1,800多种语言…

汽车电子的AI时刻

来源&#xff1a;《中国电子商情》 感谢Imagination汽车产品业务发展和市场总监陈竹女士、芯擎科技业务拓展经理邵楠女士、中汽中心工程院网联与线控底盘室主任郭蓬女士和国创中心电子电子电气部部长李秋霞女士对本文的贡献与支持&#xff0c;本文观点均来自上述四位行业人士对…

DriveGPT、车企订单背后,为什么毫末每年都能搞出新东西?

作者 | 祥威 编辑 | 德新 4月11日&#xff0c;毫末智行正式发布自动驾驶生成式大模型 DriveGPT&#xff0c;中文名 雪湖海若&#xff0c;可以提升自动驾驶认知能力&#xff0c;最终提升规控效率。 雪湖海若的核心&#xff0c;是将各种驾驶场景作为Token输入到模型中&…