热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用微软的语音识别引擎MicrosoftSpeechAPI进行语音控制

以下代码来自:http:mmcheng.netzhimagespirit本人仅作提取:SREngine语音识别引擎封装类:#pragmao

以下代码来自: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 // Microsoft Speech API
#pragma comment(lib,"SAPI.lib")class SREngine
{
public://speech variableCComPtr m_cpRecognizer;CComPtr m_cpRecoContext;CComPtr m_cpCmdGrammar;//audio variableCComPtr 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 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 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语音命令字配置:


+Activate -the

+Make -the

+Change -the

-from

-to

+Change -the

-from

-to

Move

Repeat

-the

along -the

wall

floor

picture

cabinet

chair

table

window

door

ceiling

lamp

bed

desk

monitor

car

blinds

television

sofa

counter

black

blue

brown

gray

green

orange

pink

purple

red

white

yellow

-in

top-left

top-middle

top-right

center-left

center-middle

center-right

bottom-left

bottom-middle

bottom-right

wood

painted

cotton

paper

glass

brick

metal

leather

plastic

up

down

left

right

lowwer

taller

smaller

larger







推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 标题: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
author-avatar
手机用户2602880745
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有