使用VC++6.0+microsoft speech API 实现语音识别示例

 

如何用C++ 来完成一道语音识别的填空题:

 

#include <windows.h>
#include 
<sapi.h>
#include 
<stdio.h>
#include 
<string.h>
#include 
<atlbase.h>
#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
<ISpRecoContext> cpRecoCtxt;
            CComPtr
<ISpRecoGrammar> cpGrammar;
            CComPtr
<ISpVoice> 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
<ISpRecoResult> 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;
}

需要的留下Email,我给大家发

你可能感兴趣的:(api,Microsoft,null,vc++,email,audio)