Heim  >  Artikel  >  Backend-Entwicklung  >  C++ ruft Microsofts eigene Spracherkennungsschnittstelle auf, um schnell loslegen zu können

C++ ruft Microsofts eigene Spracherkennungsschnittstelle auf, um schnell loslegen zu können

PHPz
PHPzOriginal
2017-04-03 11:31:583604Durchsuche

Schnellstart mit der C++-Spracherkennungsschnittstelle (Microsoft Speech SDK)

Ich habe kürzlich in meinem Abschlussprojekt die C++-Spracherkennungsschnittstelle von Microsoft verwendet und gesucht Ich hatte auch viele Probleme mit den Materialien und musste viele Umwege in Kauf nehmen. Jetzt schreibe ich meine eigenen Erfahrungen auf. Eine davon besteht darin, mich selbst zu verbessern, und die andere darin, der Gesellschaft etwas zurückzuzahlen. Ich hoffe, dass Sie nach der Lektüre dieses Blogs in 5 Minuten lernen, wie Sie die C++-Spracherkennungsschnittstelle implementieren. (Die verwendete Plattform ist win8+VS2013)

1. SDK installieren

Installieren Sie MicrosoftSpeechPlatformSDK.msi, installieren Sie es einfach im Standardpfad.
Download-Pfad:
download.csdn.net/detail/michaelliang12/9510691

2. Erstellen Sie ein neues Projekt und konfigurieren Sie die Umgebung

Einstellungen:
1, Eigenschaften – Konfigurationseigenschaften –C/C++–Allgemein–Zusätzliches Include-Verzeichnis: C:ProgrammeMicrosoft SDKsSpeechv11.0Include (der spezifische Pfad bezieht sich auf den Installationspfad)
2, Eigenschaften–Konfigurationseigenschaften–Linker–Eingabe–Zusätzliche Abhängigkeiten: sapi .lib;

3. Spracherkennungscode

Die Spracherkennungsschnittstelle kann in Text-zu-Sprache und Sprache-zu-Text unterteilt werden

1 -speech

Kopfzeilen, die hinzugefügt werden müssen Datei:

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

Funktion:

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. Speech to Text

Dies ist eine Etwas problematischer, da eine Echtzeitüberwachung des Mikrofons erforderlich ist und der Nachrichtenmechanismus von Windows verwendet wird.
(1) Legen Sie zunächst die Projekteigenschaften fest:
Eigenschaften – Konfigurationseigenschaften – C/C++ – Präprozessor – Präprozessordefinition: _WIN32_DCOM;

(2) Header-Dateien, die hinzugefügt werden müssen:

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

(3) Definieren Sie Variablen in der .h-Header-Datei des Programms

//定义变量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) Erstellen Sie eine Initialisierungsfunktion für die Spracherkennung (wird aufgerufen, wenn das Programm gerade mit der Ausführung beginnt, z. B das Beispiel am Ende des Artikels Platzieren Sie im Code diese Initialisierungsfunktion im Antwortcode der Dialogbox-Initialisierungsnachricht (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) Definieren Sie die Nachrichtenverarbeitungsfunktion
und benötigen Sie um es mit anderen Nachrichtenverarbeitungscodes zusammenzufügen, z. B. Im Code dieses Artikels wird es am Ende der DlgProc()-Funktion im Beispielcode am Ende des Artikels platziert. Die gesamten anderen Codeblöcke in diesem Artikel können direkt kopiert werden. Sie müssen lediglich das folgende Nachrichtenantwortmodul

//消息处理函数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;
            }
        }
    }

ändern. (6) Ändern Sie die Syntaxdatei.
Ändern Sie die CmdCtrl.xml-Datei kann die Erkennung bestimmter Wörter verbessern, und der Erkennungseffekt der darin enthaltenen Wörter, z. B. der Namen von Personen usw., wird viel besser sein. (Wenn Sie die Exe separat ausführen, müssen Sie diese Datei außerdem im selben Ordner wie die Exe ablegen. Wenn Sie sie nicht ablegen, wird kein Fehler gemeldet, aber der Vokabelerkennungseffekt in der Grammatikdatei wird schlechter )

<?xml version="1.0" encoding="utf-8"?><GRAMMAR LANGID="804">
  <DEFINE>
    <ID NAME="VID_SubName1" VAL="4001"/>
    <ID NAME="VID_SubName2" VAL="4002"/>
    <ID NAME="VID_SubName3" VAL="4003"/>
    <ID NAME="VID_SubName4" VAL="4004"/>
    <ID NAME="VID_SubName5" VAL="4005"/>
    <ID NAME="VID_SubName6" VAL="4006"/>
    <ID NAME="VID_SubName7" VAL="4007"/>
    <ID NAME="VID_SubName8" VAL="4008"/>
    <ID NAME="VID_SubName9" VAL="4009"/>
    <ID NAME="VID_SubNameRule" VAL="3001"/>
    <ID NAME="VID_TopLevelRule" VAL="3000"/>
  </DEFINE>
  <RULE ID="VID_TopLevelRule" TOPLEVEL="ACTIVE">
    <O>
      <L>
        <P>我要</P>
        <P>运行</P>
        <P>执行</P>
      </L>
    </O>
    <RULEREF REFID="VID_SubNameRule" />
  </RULE>
  <RULE ID="VID_SubNameRule" >
    <L PROPID="VID_SubNameRule">
      <P VAL="VID_SubName1">发短信</P>
      <P VAL="VID_SubName2">是的</P>
      <P VAL="VID_SubName3">好的</P>
      <P VAL="VID_SubName4">不用</P>
      <P VAL="VID_SubName5">李雷</P>
      <P VAL="VID_SubName6">韩梅梅</P>
      <P VAL="VID_SubName7">中文界面</P>
      <P VAL="VID_SubName8">英文界面</P>
      <P VAL="VID_SubName9">English</P>

    </L>
  </RULE></GRAMMAR>

Das obige ist der detaillierte Inhalt vonC++ ruft Microsofts eigene Spracherkennungsschnittstelle auf, um schnell loslegen zu können. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn