>  기사  >  백엔드 개발  >  C++는 Microsoft의 자체 음성 인식 인터페이스를 호출하여 빠르게 시작합니다.

C++는 Microsoft의 자체 음성 인식 인터페이스를 호출하여 빠르게 시작합니다.

PHPz
PHPz원래의
2017-04-03 11:31:583538검색

C++ 음성 인식 인터페이스 빠른 시작(Microsoft 음성 인식 SDK)

최근 졸업 프로젝트에서 Microsoft의 C++ 음성 인식 인터페이스를 사용하여 검색해 보았습니다. 재료에도 많은 문제가 있었고 우회도 많이 했습니다. 이제 나는 내 경험을 적는다. 하나는 나 자신을 향상시키는 것이고, 다른 하나는 사회에 보답하는 것이다. 이 블로그를 읽은 후 5분 안에 C++ 음성 인식 인터페이스를 구현하는 방법을 배울 수 있기를 바랍니다. (사용된 플랫폼은 win8+VS2013입니다.)

1. SDK 설치

MicrosoftSpeechPlatformSDK.msi를 설치하고, 기본 경로에 설치하면 됩니다.
다운로드 경로:
download.csdn.net/detail/michaelliang12/9510691

2. 새 프로젝트 생성 및 환경 구성

설정:
1, 속성 – 구성 속성 –C/C++–일반–추가 포함 디렉터리: C:Program FilesMicrosoft SDKsSpeechv11.0Include(특정 경로는 설치 경로와 관련됨)
2, 속성–구성 속성–링커–입력–추가 종속성: sapi .lib;

3. 음성 인식 코드

음성 인식 인터페이스는 텍스트-음성, 음성-텍스트

1. -speech

추가해야 할 헤더 파일:

#include <sapi.h> //导入语音头文件#pragma comment(lib,"sapi.lib") //导入语音头文件库

기능:

void  CBodyBasics::MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调用此函数即可将文字转为语音{
    ISpVoice *pVoice = NULL;    //初始化COM接口

    if (FAILED(::CoInitialize(NULL)))
        MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);    //获取SpVoice接口

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);    if (SUCCEEDED(hr))
    {
        pVoice->SetVolume((USHORT)100); //设置音量,范围是 0 -100
        pVoice->SetRate(2); //设置速度,范围是 -10 - 10
        hr = pVoice->Speak(speakContent, 0, NULL);

        pVoice->Release();

        pVoice = NULL;
    }    //释放com资源
    ::CoUninitialize();
}

2. 음성을 텍스트로

이게 좀 더 귀찮습니다. 이를 위해서는 마이크의 실시간 모니터링이 필요하며 Windows의 메시징 메커니즘이 필요합니다.
(1) 먼저 프로젝트 속성을 설정합니다.
속성 – 구성 속성 – C/C++ – 전처리기 – 전처리기 정의:

(2) 추가해야 할 헤더 파일:

#include <sapi.h> //导入语音头文件#pragma comment(lib,"sapi.lib") //导入语音头文件库#include //语音识别头文件#include //要用到CString#pragma onceconst int WM_RECORD = WM_USER + 100;//定义消息

(3) 프로그램의 .h 헤더 파일에

//定义变量CComPtr<ISpRecognizer>m_cpRecoEngine;// 语音识别引擎(recognition)的接口。CComPtr<ISpRecoContext>m_cpRecoCtxt;// 识别引擎上下文(context)的接口。CComPtr<ISpRecoGrammar>m_cpCmdGrammar;// 识别文法(grammar)的接口。CComPtr<ISpStream>m_cpInputStream;// 流()的接口。CComPtr<ISpObjectToken>m_cpToken;// 语音特征的(token)接口。CComPtr<ISpAudio>m_cpAudio;// 音频(Audio)的接口。(用来保存原来默认的输入流)ULONGLONG  ullGrammerID;

변수를 정의합니다. (4) 음성 인식 초기화 함수를 만듭니다(프로그램이 막 실행되기 시작할 때 호출됩니다. 예를 들어 기사 마지막에 있는 예제 코드, 이 초기화 함수는 대화 상자 초기화 메시지 WM_INITDIALOG의 응답 코드에 배치됩니다.

//语音识别初始化函数void  CBodyBasics::MSSListen()
{    //初始化COM接口

    if (FAILED(::CoInitialize(NULL)))
        MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);


    HRESULT hr = m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);//创建Share型识别引擎
    if (SUCCEEDED(hr))
    {


        hr = m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);//创建识别上下文接口

        hr = m_cpRecoCtxt->SetNotifyWindowMessage(m_hWnd, WM_RECORD, 0, 0);//设置识别消息

        const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) | SPFEI(SPEI_RECOGNITION);//设置我们感兴趣的事件
        hr = m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);

        hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_cpAudio);
        m_cpRecoEngine->SetInput(m_cpAudio, true);        //创建语法规则
        //dictation听说式
        //hr = m_cpRecoCtxt->CreateGrammar(GIDDICTATION, &m_cpDictationGrammar);
        //if (SUCCEEDED(hr))
        //{
        //  hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);//加载词典
        //}

        //C&C命令式,此时语法文件使用xml格式
        ullGrammerID = 1000;
        hr = m_cpRecoCtxt->CreateGrammar(ullGrammerID, &m_cpCmdGrammar);

        WCHAR wszXMLFile[20] = L"";//加载语法
        MultiByteToWideChar(CP_ACP, 0, (LPCSTR)"CmdCtrl.xml", -1, wszXMLFile, 256);//ANSI转UNINCODE
        hr = m_cpCmdGrammar->LoadCmdFromFile(wszXMLFile, SPLO_DYNAMIC);        //MessageBox(NULL, (LPCWSTR)L"语音识别已启动!", (LPCWSTR)L"提示", MB_CANCELTRYCONTINUE );
        //激活语法进行识别
        //hr = m_cpDictationGrammar->SetDictationState(SPRS_ACTIVE);//dictation
        hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE);//C&C
        hr = m_cpRecoEngine->SetRecoState(SPRST_ACTIVE);

    }    else
    {
        MessageBox(NULL, (LPCWSTR)L"语音识别引擎启动出错!", (LPCWSTR)L"警告", MB_OK);        exit(0);
    }    //释放com资源
    ::CoUninitialize();    //hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_INACTIVE);//C&C}

(5) 메시지 처리 함수 정의
는 다음과 함께 배치되어야 합니다. 예를 들어, 이 기사의 코드에서 기사 끝에 있는 샘플 코드의 DlgProc() 함수 끝입니다. 이 글의 다른 전체 코드 블록은 다음 메시지 응답 모듈만 변경하면 됩니다.

//消息处理函数USES_CONVERSION;
    CSpEvent event;    if (m_cpRecoCtxt)
    {        while (event.GetFrom(m_cpRecoCtxt) == S_OK){            switch (event.eEventId)
            {            case SPEI_RECOGNITION:
            {                                     //识别出了语音
                                     m_bGotReco = TRUE; 

                                     static const WCHAR wszUnrecognized[] = L"<Unrecognized>";

                                     CSpDynamicString dstrText;                                     ////取得识别结果 
                                     if (FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL)))
                                     {
                                         dstrText = wszUnrecognized;
                                     }

                                     BSTR SRout;
                                     dstrText.CopyToBSTR(&SRout);
                                     CString Recstring;
                                     Recstring.Empty();
                                     Recstring = SRout;                                    //做出反应(*****消息反应模块*****)
                                    if (Recstring == "发短信")
                                     {                                         //MessageBox(NULL, (LPCWSTR)L"好的", (LPCWSTR)L"提示", MB_OK);
                                         MSSSpeak(LPCTSTR(_T("好,马上发短信!")));

                                     }                                     else if (Recstring == "李雷")
                                     {
                                         MSSSpeak(LPCTSTR(_T("好久没看见他了,真是 long time no see")));
                                     }   

            }                break;
            }
        }
    }

(6) 구문 파일을 수정하세요.
CmdCtrl을 수정하세요. .xml 파일을 사용하면 특정 단어의 인식을 향상할 수 있으며 사람 이름 등 내부 단어의 인식 효과가 훨씬 향상됩니다. (또한 별도로 exe를 실행할 경우에도 이 파일을 exe와 같은 폴더에 넣어야 합니다. 넣지 않으면 에러는 발생하지 않으나 문법 파일 내 어휘 인식 효과는 꽝이 됩니다. 더 나쁘다)

아아아

위 내용은 C++는 Microsoft의 자체 음성 인식 인터페이스를 호출하여 빠르게 시작합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.