`
kevin19900306
  • 浏览: 448381 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

C++使用SAPI实现语音合成和语音识别的方法和代码

阅读更多
语音合成:

#include <sapi.h> 

#pragma comment(lib,"ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll 
#pragma comment(lib,"sapi.lib") //sapi.lib在SDK的lib目录,必需正确配置 
int main(int argc, char* argv[]) 
{ 
ISpVoice * pVoice = NULL; 

//COM初始化: 
if (FAILED(::CoInitialize(NULL))) 
return FALSE; 

//获取ISpVoice接口: 
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); 
if( SUCCEEDED( hr ) ) 
{ 
hr = pVoice->Speak(L"Hello world", 0, NULL); 
pVoice->Release(); 
pVoice = NULL; 
} 

//千万不要忘记: 
::CoUninitialize(); 
return TRUE; 
} 



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

#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"}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;
}
分享到:
评论
2 楼 lzpong 2015-11-07  
 
运行之后,  win7 打开 自带的语音识别工具了,,,,,,,,,然后,,,,没然后了.....
1 楼 yangdanqing 2015-06-14  
你好,我想问下,那个语音识别的代码,为什么我的报错:CSpEvent不能识别

相关推荐

    C++使用SAPI实现语音合成和语音识别代码

    C++使用SAPI实现语音合成和语音识别代码,语音识别必是手机未来的主流方向。

    微软SAPI语音识别

    总之,微软SAPI是一个强大的工具,它为开发人员提供了丰富的语音技术接口,可以方便地在各种应用程序中实现语音识别和语音合成功能。通过学习和利用SAPI,开发者可以构建出更加智能化和人性化的软件产品。而"Speech ...

    C++语音识别

    在C++中,可以使用`ISpRecoContext::SetRecoState`方法来开始和停止语音识别。 当用户说话时,识别引擎会触发`ISpRecoResultEvents::Recognition`事件,提供识别结果。在事件处理函数中,我们可以获取识别的文本并...

    c#用SAPI实现录音朗读以及语音识别

    以上就是使用C#和SAPI实现录音、语音朗读及语音识别的基本步骤。实际应用中,你可能需要根据需求调整参数,比如添加更多的语音识别规则、设置识别精度、处理多线程问题等。同时,SAPI还支持语音命令识别,可以用于...

    MFC简单语音识别,聊天模拟器,利用SAPI

    总的来说,这个项目是一个基于MFC的C++小程序,使用SAPI进行语音识别和合成,实现了一个简单的语音交互式聊天模拟器。用户可以通过语音提问,程序会尝试理解并给出预先设定好的回答,从而展示了语音技术在人机交互中...

    Visual C++编程的语音合成程序

    在本文中,我们将深入探讨如何使用Visual C++进行语音合成编程,主要基于Microsoft的Speech SDK。这个项目包含了一些关键文件,如VoiceDlg.cpp、Voice.cpp、stdafx.cpp等,这些都是实现语音合成功能的重要组成部分。...

    语音识别C++

    在"语音识别C++"这个主题中,我们将深入探讨如何使用C++这一强大编程语言来实现语音识别功能,尤其是在Visual Studio(vS)环境下。 1. **语音识别的基本原理**: 语音识别通常包括预处理、特征提取、模型匹配和...

    语音合成与识别

    综合以上,开发一个基于Visual C++的语音侦听程序,需要集成语音合成和识别的相关库,编写处理音频输入和输出的代码,并且根据实际需求对识别模型进行训练和优化。通过这样的程序,用户不仅可以听到计算机生成的语音...

    文字转声音.rar,C++调用MicrosoftSpeechPlatformSDK(SAPI)实现文字转语音程序运行包

    它包括了语音合成(TTS)和语音识别(ASR)两大核心组件。 C++是广泛应用于系统级编程和高性能计算的语言,利用C++调用SAPI,开发者可以创建高效、稳定的TTS应用。在C++中调用SAPI,通常需要包含相应的头文件,如`...

    SAPI0_语音合成_微软sapi_

    微软SAPI(Speech Application Programming Interface)是微软提供的一套用于语音识别和语音合成本地API。这个技术使得开发者能够轻松地在应用程序中集成自然语言处理功能,包括将文本转化为语音,也就是我们常说的...

    SAPI的本地识别

    SAPI(Speech Application Programming Interface)是由微软开发的一种用于语音识别和语音合成的API,它使得开发者能够方便地在Windows平台上构建语音应用。SAPI的主要功能包括语音识别(Speech Recognition)和文本...

    基于Speech sdk的语音识别系统

    - `.cpp` 或 `.h` 文件:这是C++源代码文件,包含了实现语音识别功能的类和函数。 - `.dll` 文件:动态链接库文件,可能是Speech SDK的一部分,供程序在运行时调用。 - `.rc` 和 `.res` 文件:资源文件,可能包含了...

    c语言语音识别程序

    在本文中,我们将深入探讨如何使用C++编程语言调用微软的Speech API(应用程序接口)来实现语音识别功能。微软的Speech API,也称为SAPI,是一个强大的工具,允许开发者集成语音识别和合成到他们的应用中。让我们...

    语音识别speech sapi5.1

    2. **语音合成**:与语音识别相对,SAPI5.1也支持将文本转化为语音输出,即TTS(Text To Speech)。这使得计算机能够“读”出屏幕上的文字,如“你好,会自动放歌”。 3. **多语言支持**:SAPI5.1支持多种语言的...

    MFC 使用sapi文字转换为语音

    SAPI是微软提供的一组接口,用于实现语音识别和语音合成技术,它使得开发者能够轻松地在应用程序中集成自然语言处理功能。 首先,我们需要了解MFC。MFC是一个C++类库,它封装了Windows API,为开发者提供了构建...

    VS2010语音识别

    SAPI是微软提供的一套接口,用于开发语音识别和语音合成应用。它包括一系列COM组件,如SpVoice(用于语音合成)和ISpRecognizer(用于语音识别)。在VS2010项目中,我们需要引用Microsoft.Speech库来使用这些组件。 ...

    C#中调用SAPI实现语音识别的2种方法

    通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR。下面我们就介绍并贴出相关代码。主要有两种方式: 1、使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑。...

    计算机语音合成的关键技术及展望

    **SAPI (Speech Application Programming Interface)** 是微软提供的一个用于语音合成和语音识别的标准接口。它允许开发者创建和控制语音合成引擎,实现文字到语音的转换。SAPI 支持多种语音引擎,并且可以通过设置...

    C++ MFC 文字转语音

    这个SDK提供了必要的API和工具,让开发者能够集成语音合成和识别功能到自己的应用中。安装此SDK后,你可以访问多种语言的语音引擎,以及相关的开发资源和文档。 要使用SDK,你需要遵循以下步骤: 1. **安装SDK**:...

    语音识别原代码,VC++版!可以供研究研究

    这个文件很可能是用C++编写的,并且可能使用了特定的语音识别库,比如Microsoft的SAPI(Speech Application Programming Interface),这是一个用于Windows平台的语音识别和合成API。 在实际开发语音识别系统时,...

Global site tag (gtag.js) - Google Analytics