展会信息港展会大全

基于微软语音识别引擎的C++语音识别代码
来源:互联网   发布日期:2011-12-04 20:26:28   浏览:32108次  

导读:微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接...
微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接近的一个选项。说得通俗一些:第一种是填空题,第二种是选择题目。
今天我们就一起来学习如何用C++ 来完成一道语音识别的填空题:
 

代码如下:

#include 
#include 
#include 
#include 
#include 
#include "sphelper.h"
//Copyright (c) Microsoft Corporation. All rights reserved.

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"}42N86\0b70e50fc0ea0e70fc/05708504608a087046";;
             break;

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

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

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

         for (i = 1; i < argc; i++)
          {
             if (_stricmp(argv[i], "-noTTS") == 0)
              {
                 fUseTTS = false;
                 continue;
             }
             if (_stricmp(argv[i], "-noReplay") == 0)
              {
                 fReplay = false;
                 continue;
             }       
             printf ("Usage: %s [-noTTS] [-noReplay] ", argv[0]);
             return hr;
         }
     }

     if (SUCCEEDED(hr = ::CoInitialize(NULL)))
      {
          {
             CComPtr cpRecoCtxt;
             CComPtr cpGrammar;
             CComPtr cpVoice;
             hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);
             if(SUCCEEDED(hr))
              {
                 hr = cpRecoCtxt->GetVoice(&cpVoice);
             }
            
             if (cpRecoCtxt && cpVoice &&
                 SUCCEEDED(hr = cpRecoCtxt->SetNotifyWin32Event()) &&
                 SUCCEEDED(hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION))) &&
                 SUCCEEDED(hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL)) &&
                 SUCCEEDED(hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar)) &&
                 SUCCEEDED(hr = cpGrammar->LoadDictation(NULL, SPLO_STATIC)) &&
                 SUCCEEDED(hr = cpGrammar->SetDictationState(SPRS_ACTIVE)))
              {
                 USES_CONVERSION;
                             
                 const WCHAR * const pchStop = StopWord();
                 CComPtr cpResult;

                 printf( "I will repeat everything you say. Say "%s" to exit. ", W2A(pchStop) );

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

                     CSpDynamicString dstrText;

                     if (SUCCEEDED(cpResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, 
                                                     TRUE, &dstrText, NULL)))
                      {
                         printf("I heard: %s ", W2A(dstrText));

                         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
                                 printf (" when you said... ");
                             cpResult->SpeakAudio(NULL, 0, NULL, NULL);
                        }

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

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港