#include <windows.h>
#include <sapi.h>
#include <stdio.h>
#include <string.h>
#include <atlbase.h>
#include "sphelper.h"

inline HRESULT BlockForResult(ISpRecoContext * pRecoCtxt, ISpRecoResult ** ppResult)
{

//创建语音识别
    HRESULT hr = S_OK;
 CSpEvent event;

while (SUCCEEDED(hr) &&
           SUCCEEDED(hr = event.GetFrom(pRecoCtxt)) &&
           hr == S_FALSE)
    {
        hr = pRecoCtxt->WaitForNotifyEvent(INFINITE);
    }

*ppResult = event.RecoResult();
    if (*ppResult)
    {
        (*ppResult)->AddRef();

}

return hr;
}

const WCHAR * StopWord()
{
    const WCHAR * pchStop;
   
    LANGID LangId = ::SpGetUserDefaultUILanguage();

switch (LangId)
    {
        case MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT):
            pchStop = L"/x7d42/x4e86///x30b7/x30e5/x30fc/x30ea/x30e7/x30fc//x3057/x3085/x3046/x308a/x3087/x3046";;
            break;

default:
            pchStop = L"Stop";
            break;
    }

return pchStop;
}
           
int _tmain(int argc, TCHAR* argv[])
{
    HRESULT hr = E_FAIL;
    bool fUseTTS = true;            // turn TTS play back on or off
    bool fReplay = true;            // turn Audio replay on or off

TCHAR   szFileName[256];

// Process optional arguments
    if (argc > 1)
    {
        int i;

for (i = 1; i < argc; i++)
        {
            if (_tcsicmp(argv[i], _T("-noTTS")) == 0)
            {
                fUseTTS = false;
                continue;
            }
            if (_tcsicmp(argv[i], _T("-noReplay")) == 0)
            {
                fReplay = false;
                continue;
            }
            if (_tcsicmp(argv[i], _T("-f")) == 0)
            {
                if( ++i < argc )
                {
                    _tcscpy(szFileName, argv[i]);
                    continue;
                }
            }
#ifndef _WIN32_WCE
            printf ("Usage: %s [-noTTS] [-noReplay] /n", argv[0]);
#else
            RETAILMSG(TRUE,(_T("Usage: %s [-noTTS] [-noReplay] /n"), argv[0]));
#endif
            return hr;
        }
    }

if (SUCCEEDED(hr = :: CoInitializeEx(NULL,COINIT_MULTITHREADED)))
    {
        {
            CComPtr<ISpRecoContext> cpRecoCtxt;
            CComPtr<ISpRecoGrammar> cpGrammar;
            CComPtr<ISpVoice> cpVoice;
#ifndef _WIN32_WCE
            hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);
#else
            // CLSID_SpInProcRecoContext is only defined when SAPI_AUTOMATION is
            // defined, as a result, the following line doesn't work on CE.  As a workaround, I
            // create an inproc recognizer and get a reco context from that.
            //cpRecoCtxt.CoCreateInstance(CLSID_SpInProcRecoContext);
            CComPtr<ISpRecognizer> m_cpEngine;
            m_cpEngine.CoCreateInstance(CLSID_SpInprocRecognizer);
            m_cpEngine->CreateRecoContext( &cpRecoCtxt );
#endif
            if(SUCCEEDED(hr))
            {
                hr = cpRecoCtxt->GetVoice(&cpVoice);
            }
          
            if (!cpRecoCtxt || !cpVoice)
            {
                hr = E_FAIL;
            }
            if(SUCCEEDED(hr))
            {
                hr = cpRecoCtxt->SetNotifyWin32Event();
            }
            if(SUCCEEDED(hr))
            {
                hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
            }
            if(SUCCEEDED(hr))
            {
                hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
            }
            if(SUCCEEDED(hr))
            {
                hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar);
            }
            //debug
//            if(SUCCEEDED(hr))
//            {
//                hr = cpGrammar->LoadCmdFromFile( szFileName, SPLO_STATIC );
//            }        
            //debug
            if(SUCCEEDED(hr))
            {
                hr = cpGrammar->LoadDictation(NULL, SPLO_STATIC);
            }
            if(SUCCEEDED(hr))
            {
                hr = cpGrammar->SetDictationState(SPRS_ACTIVE);
            }
            if(SUCCEEDED(hr))
            {
                USES_CONVERSION;
                           
                const WCHAR * const pchStop = StopWord();
                CComPtr<ISpRecoResult> cpResult;

#ifndef _WIN32_WCE
                printf( "I will repeat everything you say./nSay /"%s/" to exit./n", W2A(pchStop) );
#else
                RETAILMSG(TRUE,( _T("I will repeat everything you say./nSay /"%s/" to exit./n"), pchStop));
#endif
                if (fUseTTS)
                {
                    cpVoice->Speak( L"I will repeat everything you say.", SPF_ASYNC, NULL);
                    cpVoice->Speak( L"Say stop to exit.", SPF_ASYNC, NULL);
                    cpVoice->Speak( L"Say <emph> stop </emph> to exit.", SPF_ASYNC | SPF_IS_XML, NULL);
                }

while (SUCCEEDED(hr = BlockForResult(cpRecoCtxt, &cpResult)))
                {
                    cpGrammar->SetDictationState( SPRS_INACTIVE );

CSpDynamicString dstrText;

if (SUCCEEDED(cpResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE,
                                                    TRUE, &dstrText, NULL)))
                    {
#ifndef _WIN32_WCE
                        printf("I heard:  %s/n", W2A(dstrText));
#else
                        RETAILMSG(TRUE,( _T("I heard:  %s/n"), dstrText));
#endif

if (fUseTTS)
                        {
                            cpVoice->Speak( L"I heard", SPF_ASYNC, NULL);
                            cpVoice->Speak( dstrText, SPF_ASYNC, NULL );
                        }

if (fReplay)
                        {
                            if (fUseTTS)
                                cpVoice->Speak( L"when you said", SPF_ASYNC, NULL);
                            else
                            {
#ifndef _WIN32_WCE
                                printf ("/twhen you said.../n");
#else
                                RETAILMSG(TRUE,( _T("/twhen you said.../n")));
#endif
                            }
                            cpResult->SpeakAudio(NULL, 0, NULL, NULL);
                       }

cpResult.Release();
                    }
                    if (_wcsicmp(dstrText, pchStop) == 0)
                    {
                        break;
                    }
                   
                    cpGrammar->SetDictationState( SPRS_ACTIVE );
                }
            }
        }
        ::CoUninitialize();
    }
    return hr;
}

转载于:https://www.cnblogs.com/nsoft/archive/2012/06/28/2568625.html

一个基于WinCE平台的语音识别例子,利用微软speechAPI5.0相关推荐

  1. 卡路里计算JAVA_pedometer 这是一个基于android平台的软件,用于计算你走路的步数,算出消耗的卡路里,以达到健 238万源代码下载...

    详细说明:这是一个基于android平台的软件,用于计算你走路的步数,算出消耗的卡路里,以达到健康的管理.-This is an android platform based software, us ...

  2. 一起谈.NET技术,发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)

    发布NGuestBook的动机说明      大约在半年前,我在博客上发表了一个系列文章:<基于.NET平台的分层架构实战>.当时在讲解过程中用到了一个叫NGuestBook的案例,在那以 ...

  3. 发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)

    发布NGuestBook的动机说明 大约在半年前,我在博客上发表了一个系列文章:<基于.NET平台的分层架构实战>.当时在讲解过程中用到了一个叫NGuestBook的案例,在那以后,有很多 ...

  4. 基于HTK中文普通话语音识别DEMO,LilyMandarinSpeechRecognition V1.0

    DEMO简介: 这是一个中文普通话语音识别的最简单DEMO,LilyMandarinSpeechRecognition V1.0. 首先给出这款软件的下载链接: DEMO_LilyMandarinSp ...

  5. 基于android平台的语音机器人服务娱乐系统

    分 类 号:TP311 学校代码:11460 学 号:10130920 本科生毕业论文 基于android平台的语音机器人服务娱乐系统 Robot Entertainment Service Syst ...

  6. 光学模拟 Android,基于Android平台的光学字符识别应用的设计与实现

    摘要: 随着数字化时代的蓬勃发展,信息量以指数级的速度增长,然而手工录入并存储信息的速度远不及信息的产生速度.光学字符识别(OCR)技术能够自动化地检测信息并识别出来,有效地解决了信息录入速度和正确率 ...

  7. java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc

    基于Android平台五子棋游戏最终版 毕业设计(论文)任务书 毕业设计(论文)题目: 基于android平台的五子棋游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.综述国内基于and ...

  8. android控制中心实现,基于Android平台的智能家居系统控制中心的设计与实现

    摘要: 随着科技的发展,人民生活水平的提高,人们对住宅的要求也越来越高,智能家居就是为解决人们的这一要求诞生的.自1984年第一栋智能建筑诞生以来,世界上出现了很多智能家居解决方案,但都或多或少的存在 ...

  9. android手机舆情分析,基于Android平台的环境公共舆情监督系统研究

    摘要: 近年来,随着我国社会经济的持续发展和人民生活水平的不断提高,人们的环境保护意识也在不断增长,其中城市环境质量问题逐渐成为了人们普遍关注的焦点,也成为环保部门和环保从业人员的重点研究方向.环境监 ...

最新文章

  1. 汉字转换成html,汉字与16进制、汉字与Html转义符的转换
  2. Java面试题,深入理解final关键字
  3. 全球及中国智能音箱市场规模产值及发展机遇研究报告2021-2027年
  4. 《系统集成项目管理工程师》必背100个知识点-26项目范围管理
  5. 【转】让itunes下载加速的真正办法,转向至香港台湾澳门苹果服务器 -- 不错不错!!!...
  6. 单机负载告警,数据库与应用分离
  7. 一站式体验腾讯云音视频及融合通信技术
  8. 二维数组求最小值_05-最大子矩形-最大值减去最小值小于或等于num的子数组数量...
  9. js forEach
  10. MySQL innodb每行数据长度的限制
  11. 吴恩达《机器学习》第二章:线性回归
  12. 如何在Mac上的一个“预览”窗口中显示若干文件
  13. 卸载软件时,出现解压缩支持文件时出错,灾难性故障--转载
  14. Oracle项目管理系统P6 EPPM企业级规划方案
  15. QQ坦白说解密解决方案(二)
  16. java包是什么意思_java中的“包”到底是什么意思?
  17. Android系统篇之—-Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)
  18. Errors集锦-数据库-file /usr/share/mysql/czech/errmsg.sys from install of mysql-community-common-5.7.16-1.
  19. 英语美文-不做有才华的穷人
  20. 数据字典(Data Dictionary)

热门文章

  1. linux删除eth2设备_Linux卸载/删除多余网卡
  2. java线程main异常,‘java.lang.NoSuchMethodError:main的原因’线程中的异常“main”’...
  3. 在虚拟机上安装Kali Linux的简易指南
  4. python bytes_Python bytes()
  5. python ftp_Python FTP
  6. java输入一串字符串反转_反转Java中的字符串
  7. __strong、__weak 与 __unsafe_unretained区别
  8. pythoon介绍、安装环境、基础知识、练习题
  9. 《编写高质量代码:改善Python程序的91个建议》读后感
  10. HDOJ 2035 人见人爱A^B