一个超简单的语音识别编程,听写程序

CSpeechRecognition类封装了语音识别操作所需调用的几个接口,使用它进行语音识别编程很方便,也很简洁。

CSpeechRecognition类的定义如下:

///////////////////////////////////////////////////////////////

// active speech engine

#include <atlbase.h>

extern CComModule _Module;

#include <atlcom.h>

#include <sapi.h>

#include <sphelper.h>

#include <spuihelp.h>

///////////////////////////////////////////////////////////////

// speech message

#define WM_SREVENT   WM_USER+102

 

class CSpeechRecognition 

{

public:

   CSpeechRecognition();

   virtual ~CSpeechRecognition();

 

   // initialize

   BOOL Initialize(HWND hWnd = NULL, BOOL bIsShared = TRUE);

   void Destroy();

 

   // start and stop

   BOOL Start();

   BOOL Stop();

   BOOL IsDictationOn()

   {

       return m_bOnDictation;

   }

 

   // event handler

   void GetText(WCHAR **ppszCoMemText, ULONG ulStart = 0, ULONG nlCount = -1);

 

   // voice training

   HRESULT VoiceTraining(HWND hWndParent);

 

   // microphone setup

   HRESULT MicrophoneSetup(HWND hWndParent);

 

   // token list

   HRESULT InitTokenList(HWND hWnd, BOOL bIsComboBox = FALSE);

 

   // error string

   CString GetErrorString()

   {

       return m_sError;

   }

 

   // interface

     CComPtr<ISpRecognizer> m_cpRecoEngine;  // SR engine

       CComPtr<ISpRecoContext> m_cpRecoCtxt;   //Recognition contextfor dictation

     CComPtr<ISpRecoGrammar> m_cpDictationGrammar;  // Dictation grammar

 

private:

   CString m_sError;

    BOOL    m_bOnDictation;

};

其中定义的消息WM_SREVENT用于指示语音识别事件,该消息将通知到函数指定的响应窗口。

类中定义了3个接口指针m_cpRecoEngine,m_cpRecoCtxt和m_cpDictationGrammar,分别用于引用语音识别引擎的3个重要接口IspRecognizer,ISpRecoContext和IspRecoGrammar

函数Initialize语音识别引擎基本工作环境包括引擎识别上下文语法音频事件等的

BOOL CSpeechRecognition::Initialize(HWND hWnd, BOOL bIsShared)

{

   // com library

   if (FAILED(CoInitialize(NULL)))

   {

       m_sError=_T("Error intialization COM");

       return FALSE;

   }

 

   // SR engine

    HRESULT hr = S_OK;

    if (bIsShared)

    {

        // Shared reco engine.

        // For a shared reco engine, the audio gets setup automatically

        hr = m_cpRecoEngine.CoCreateInstance( CLSID_SpSharedRecognizer );

    }

   else

   {

       hr = m_cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer);

 

   }

 

   // RecoContext

    if( SUCCEEDED( hr ) )

    {

        hr = m_cpRecoEngine->CreateRecoContext( &m_cpRecoCtxt );

    }

 

    // Set recognition notification for dictation

    if (SUCCEEDED(hr))

    {

  hr = m_cpRecoCtxt->SetNotifyWindowMessage( hWnd, WM_SREVENT, 0, 0 );

    }

   

    if (SUCCEEDED(hr))

    {

        // when the engine has recognized something

        const ULONGLONG ullInterest = SPFEI(SPEI_RECOGNITION);

        hr = m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);

    }

 

    // create default audio object

    CComPtr<ISpAudio> cpAudio;

    hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudio);

 

    // set the input for the engine

    hr = m_cpRecoEngine->SetInput(cpAudio, TRUE);

    hr = m_cpRecoEngine->SetRecoState( SPRST_ACTIVE );

 

   // grammar

    if (SUCCEEDED(hr))

    {

        // Specifies that the grammar we want is a dictation grammar.

        // Initializes the grammar (m_cpDictationGrammar)

        hr = m_cpRecoCtxt->CreateGrammar( 0, &m_cpDictationGrammar );

    }

    if  (SUCCEEDED(hr))

    {hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);

    }

    if (SUCCEEDED(hr))

    {

        hr = m_cpDictationGrammar->SetDictationState( SPRS_ACTIVE );

    }

    if (FAILED(hr))

    {

        m_cpDictationGrammar.Release();

    }

 

    return (hr == S_OK);

}

 

释放函数Destroy被类的析构函数调用,释放了类所引用的所有接口:

void CSpeechRecognition::Destroy()

{

   if (m_cpDictationGrammar)

       m_cpDictationGrammar.Release();

   if (m_cpRecoCtxt)

       m_cpRecoCtxt.Release();

   if (m_cpRecoEngine)

       m_cpRecoEngine.Release();

   CoUninitialize();

}

函数Start和Stop用来控制开始和停止接受及识别语音,它们通过调用引擎接口的SetRecoState方法来实现:

BOOL CSpeechRecognition::Start()

{

   if (m_bOnDictation)

       return TRUE;

 

         HRESULT hr = m_cpRecoEngine->SetRecoState( SPRST_ACTIVE );

   if (FAILED(hr))

         return FALSE;

 

   m_bOnDictation = TRUE;

   return TRUE;

}

 

BOOL CSpeechRecognition::Stop()

{

   if (! m_bOnDictation)

       return TRUE;

 

       HRESULT hr = m_cpRecoEngine->SetRecoState( SPRST_INACTIVE );

   if (FAILED(hr))

return FALSE;

 

   m_bOnDictation = FALSE;

   return TRUE;

}

函数GetText是获取从语音中已识别出的文字的关键,应该在响应识别事件/消息的响应函数中调用,其代码如下所示。

void CSpeechRecognition::GetText(WCHAR **ppszCoMemText, ULONG ulStart, ULONG nlCount)

{

    USES_CONVERSION;

    CSpEvent event;

 

    // Process all of the recognition events

    while (event.GetFrom(m_cpRecoCtxt) == S_OK)

    {

        switch (event.eEventId)

        {

            case SPEI_RECOGNITION:

       // There may be multiple recognition results, so get all of them

                {

                 HRESULT hr = S_OK;

                 if (nlCount == -1)

              event.RecoResult()->GetText(SP_GETWHOLEPHRASE,

SP_GETWHOLEPHRASE, TRUE, ppszCoMemText, NULL);

                 else

                 {

                 ASSERT(nlCount > 0);

                 event.RecoResult()->GetText(ulStart, nlCount, FALSE,

                        ppszCoMemText, NULL);

                 }

                }

                break;

        }

    }

}

函数InitTokenList调用SpInitTokenComboBox和SpInitTokenListBox函数来实现语音语言在列表或组合列表中的列表显示和选择:

HRESULT CSpeechRecognition::InitTokenList(HWND hWnd, BOOL bIsComboBox)

{

   if (bIsComboBox)

       return SpInitTokenComboBox(hWnd, SPCAT_RECOGNIZERS);

   else

       return SpInitTokenListBox(hWnd, SPCAT_RECOGNIZERS);

}

语音识别涉及语音的输入,通常用话筒来输入语音。进行语音识别前,需要判断话筒的位置和设置是否合理,以保证语音识别引擎能获得有效的语音输入。函数MicrophoneSetup调用语音识别引擎接口的DisplayUI方法来显示一个设置话筒的向导,如图11-4所示。示例代码如下所示:

HRESULT CSpeechRecognition::MicrophoneSetup(HWND hWndParent)

{

   return m_cpRecoEngine->DisplayUI(hWndParent, NULL, SPDUI_MicTraining, NULL, 0);

}

语音训练是语音识别的重要基础,为了获得期望的识别效果,必须进行语音训练,以让语音识别引擎熟悉说话者的口音。函数VoiceTraining调用语音识别引擎接口的DisplayUI方法来显示一个语音训练向导,如图11-5所示。示例代码如下所示:

HRESULT CSpeechRecognition::VoiceTraining(HWND hWndParent)

{

   return m_cpRecoEngine->DisplayUI(hWndParent, NULL, SPDUI_UserTraining, NULL, 0);

}

CText2Speech类似,CSpeechRecognition类也提供错误处理机制,由GetErrorString函数可以获得错误信息。

11.3.2  示例:用CSpeechRecognition类编制听写程序

使用CSpeechRecognition类来编写语音识别程序很简单,下面让我们实现一个听写程序Stenotypist,其界面如图11-6所示。

用VisualC++编制Stenotypist的步骤和要点如下:

1)使用AppWizard生成一个基于对话框的项目Stenotypist

2)将SpeechRecognition.H,SpeechRecognition.CPP增加到Stenotypist项目中;

3)在资源编辑器中编辑好响应的控件;

4)用ClassWizard再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/wicnwicnwh/p/10308254.html

时间: 2024-11-05 21:56:12

一个超简单的语音识别编程,听写程序的相关文章

打造支持apk下载和html5缓存的 IIS(配合一个超简单的android APP使用)具体解释

为什么要做这个看起来不靠谱的东西呢? 由于刚学android开发,还不能非常好的熟练控制android界面的编辑和操作,所以我的一个急着要的运用就改为html5版本号了,反正这个运用也是须要从server获取大量数据来展示在手机上面的,也就是说:必须联网,才干正常工作,于是想了一下,反正都要联网获取数据,为什么不直接用我相对熟悉一点的 html来做这个运用呢?省的花费不够用的时间去学习android界面的控制,于是就简单了:用蹩脚的手段做了一个android程序的启动欢迎界面,内页就是一个全屏的

利用x64_dbg破解一个最简单的64位小程序

最近在研究学习一些逆向的东西,其实之前也涉及到这方面的东西,只是之前的系统和应用,基本上都是32位的,所以直接用od来分析就行了,这方面的资料在网上很多,随便一搜到处都是,不过随着技术的不断发展,64位系统出现了,随之64位的应用也出现了,而od只能分析32位应用,所以一些64位应用,od是没办法分析逆向的,所以,在这里要提到另一个可以用于分析64位应用的调试软件,名字叫x64_dbg.网上对于这款软件的介绍很少,只是说能分析64位应用,具体用法也找不到,不过我找到了它的一个教程,里面有一个最简

一个超简单的马里奥游戏

理论是需要通过实践来检验的,学了这么多,于是我就试了试采用面向对象的编程思想实现了一个超级简单的马里奥游戏,游戏感觉特傻! 准备素材(图片mario.jpg): 分析: 如何通过按钮控制图片的位置 设计相关的对象 要求:Mario碰到边界给一个提示.(其实还有一个要求就是Mario可以去找另一个物体,没有实现.) 以下为源码: 超级马里奥游戏.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8

一个超简单超简单的表白程序

刷微博的时候看到一个特别有意思的程序,而且特别简单,适合用来表白和套路朋友,真的超级简单. 先看演示 原理我也不太懂,毕竟不是专业对口,直接上操作过程 1.随便新建一个文本文件 2. 打开输入代码 3. 保存.修改文件后缀为vbs 4. 双击打开就可以运行了,但双击打开会有一个exe文件执行的窗口,所以可以发给朋友,在聊天窗口打开就不会有exe文件执行的窗口了 纯属觉得好玩...... 原文地址:https://www.cnblogs.com/huasonglin/p/9215865.html

温故而知新---浅析三层架构(一个超简单的系统登录三层架构实例)

刚开始接触三层架构是在快两个月前,那时候找了好多例子感觉也都看不怎么懂,今天闲着没事,就把以前学的东西翻出来,算是温习温习.由于本人也接触时间不长,所以以下言论有不正确之处,多多海涵. 首先我们先要知道什么是三层架构,个人理解的三层架构就是将业务分为界面层(UI层),业务逻辑层(BLL层)和数据访问层(DAL层),各层之间各司其职,层层传递信息. 优点是可以达到高内聚,低耦合,修改起来比较容易:缺点是会降低系统性能. UI层:就是面向用户的一层,直接与用户交互. BLL层:用于实现业务逻辑,在U

一个超简单的vue商品计算总金额

哈哈哈,花了十几分钟写的一个vue商品总价计算,虽然很简单的.没有写样式. 现在写博客也是为了让自己方便查阅东西.废话不多少 直接上图 这里用到了vue的计算属性-computed 那这里就顺便说下computed这个东西吧. 在计算属性中科院完成各种复杂的的逻辑,包括运算,函数调用,只需要最终返回一个最终的结果.计算属性依赖多个vue实例的数据,只要其中一项数据发生变化,计算属性就会重新的执行,视图也会更新. 下面直接上代码: <!DOCTYPE html><html> <

linux 一个超简单的makefile

makefile 自动化变量: [email protected] : 规则的目标文件名 例如:main:main.o test.o g++ -Wall -g  main.o test.o -o main 可以写成: main:main.o test.o g++ -Wall -g  main.o test.o -o [email protected] $< : 规则的第一个依赖文件名 例如:main.o: main.cpp g++ -Wall -g -c main.cpp -o main.o 可

gulp安装+一个超简单入门小demo

gulp安装參考.gulp安装參考2. 一.NPM npm是node.js的包管理工具.主要功能是管理.更新.搜索.公布node的包. Gulp是通过npm安装的. 所以首先,须要安装node.js.而且升级npm到最新版本号. 安装nodeJS 基本參考传送门戳这里:安装nodeJs.安装nodeJs2.nodeJs下express的安装到执行 1.    从nodejs.org下载最新的nodejs安装包.并安装. 2.    进入nodejs的安装路径下: 天真的以为这样就能够了. wat

Python命令快速临时假设一个超简单的HTTP服务器

今天要给客户端提供静态的Json来配合他们调接口,想到Nginx,但是很麻烦,python提供了一个非常方便的功能 使用下面的命令: python -m SimpleHTTPServer 8000 执行这一个命令即可实现一个HTTP服务器,会将当前目录设为HTTP服务目录,http://ip:8000访问