質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C++

    4431questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Kinect

    103questions

    Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

KINECTv2の音声認識のエラー

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 617

KINECT v2についての質問です.
現在作成している音声を認識してテキストに起こす為のプログラムが最下部に記載しているエラーで動きません.
環境変数やリンカなどは設定済みです.
デバックした結果,エラーを起こしている個所は,
ERROR_CHECK(CoCreateInstance(CLSID_SpStream, NULL, CLSCTX_INPROC_SERVER, __uuidof(ISpStream),reinterpret_cast<void**>(&speechStream)));
だとわかりました.
しかし,なぜこのようなエラーになっているのかがわかりません.
回答お待ちしています.
プログラム省略あり.

以下,プログラム

#include <iostream>
#include <sstream>

#include<Kinect.h>
#include"KinectAudioStream.h"

#include<opencv2\opencv.hpp>//opencv

#include<atlbase.h>//opencv

//speech
#include<sapi.h>
#pragma warning(disable: 4996) // for error GetVersionExW() of sphelper.h
#include<sphelper.h> // for SpFindBestToken()
#include<locale.h>

//using namespace std;


#define ERROR_CHECK( ret ) \
if ( (ret) != S_OK ){  \
    std::stringstream ss; \
    ss << " failed " #ret " " << std::hex << ret << std::endl; \
    throw std::runtime_error( ss.str().c_str() );\
}





class KinectApp {

    private:

        CComPtr<IKinectSensor>kinect = nullptr;
        CComPtr<IAudioBeamFrameReader> audioBeamFrameReader = nullptr;


        //音声認識の変数宣言
        CComPtr<IAudioBeam> audioBeam;
        CComPtr<IStream> inputStream;
        CComPtr<KinectAudioStream> audioStream;
        CComPtr<ISpStream> speechStream;
        CComPtr<ISpRecognizer> speechRecognizer;
        CComPtr<ISpRecoContext> speechContext;
        std::vector<CComPtr<ISpRecoGrammar>> speechGrammar;
        HANDLE speechEvent;


        float beamAngle;
        float beamAngleConfidence;



        //IKinectSensor* kinect = nullptr;

        IColorFrameReader* colorFrameReader = nullptr;

        std::vector<BYTE> colorBuffer;

        int colorWidth;
        int colorHeight;
        unsigned int colorBytesPerPixel;

        WAITABLE_HANDLE waitableHandle = 0;

        bool isAvailable = false;


    public:

        void initialize()
        {


        void updateAudioFrame()
        {

            //音声認識で使用
                ResetEvent(speechEvent);
                HANDLE events[1] = { speechEvent };
                DWORD objects = MsgWaitForMultipleObjectsEx(ARRAYSIZE(events), events, 50, QS_ALLINPUT, MWMO_INPUTAVAILABLE);
                switch (objects) {
                case WAIT_OBJECT_0:
                    //結果を取得表示
                    result();
                    break;

                defalt:
                    break;
                }



        }



        void run() {
            while (1) {

                update();
                initializeAudio();
                start();
                updateAudioFrame();
                stop();
                draw();

                auto key = cv::waitKey(10);

                if (key == 'q') {
                    break;
                }
            }
        }
    public:


    //音声認識の関数


    inline void initializeAudio() {
    //Audio Sourceの取得
        CComPtr<IAudioSource> audioSource;
        ERROR_CHECK(kinect->get_AudioSource(&audioSource));

        //Audio Beam Listの取得、Audio Beamを開く
        CComPtr<IAudioBeamList> audioBeamList;
        ERROR_CHECK(audioSource->get_AudioBeams(&audioBeamList));
        ERROR_CHECK(audioBeamList->OpenAudioBeam(0,&audioBeam));

        //Audio Input Streamを開く
        ERROR_CHECK(audioBeam->OpenInputStream(&inputStream));
        audioStream = new KinectAudioStream(inputStream);

        //Speech Streamの初期化
        initializeSpeechStream();

        //Speech Streamの作成
        //"en-US" ... English, "ja-JP"... Japanese
        createSpeechRecognizer("ja-JP");

        //ファイル(*.grxml)からspeech Recognition Grammarを読み込む
        //Grammer ID, Grammar File Name (*.grxml)
        loadSpeechGrammar(0, L"Grammar_jaJP.grxml");
       // loadSpeechGrammar( 1, L"Grammar_Additional.grxml"); 
    }

    inline void initializeSpeechStream() {
        //Speech Streamインスタンスの作成
        ERROR_CHECK(CoCreateInstance(CLSID_SpStream, NULL, CLSCTX_INPROC_SERVER, __uuidof(ISpStream),reinterpret_cast<void**>(&speechStream)));

        //マイクのWave Formatを設定
        WORD AudioFormat = WAVE_FORMAT_PCM;
        WORD AudioChannels = 1;
        DWORD AudioSamplePerSecond = 16000;
        DWORD AudioAverageBytesPerSecond = 32000;
        WORD AudioBlockAlign = 2;
        WORD AudioBitsPerSample = 16;

        WAVEFORMATEX waveFormat = {
        AudioFormat,
        AudioChannels,
        AudioSamplePerSecond,
        AudioAverageBytesPerSecond,
        AudioBlockAlign,
        AudioBitsPerSample,
        0
        };

        //Speech Streamの初期化
        ERROR_CHECK(speechStream->SetBaseStream(audioStream,SPDFID_WaveFormatEx,&waveFormat) );
    }

    inline void createSpeechRecognizer(const std::string& language = "en-US") {
        //Speech Recognizerインスタンスの作成
        ERROR_CHECK(CoCreateInstance(CLSID_SpInprocRecognizer, NULL, CLSCTX_INPROC_SERVER, __uuidof(ISpRecognizer), reinterpret_cast<void**>(&speechRecognizer)));

        //Speech RecognizerののInput Streamを登録
        ERROR_CHECK(speechRecognizer->SetInput(speechStream, TRUE));

        //Recognizer Engineの言語の属性を取得
        //kinect for windows SDK 2.0 Language packs
        //http//www.microsoft.com/en-us/download/details.aspx?id=43662
        //*L"Language=409;kinect=True"
        //...English | United States(MSKinectLangPack_jaJP.msi)
        //*L"Language=411;kinect=True"
        //... Japanese | Japan (MSKinectLangpack_jaJP.msi)
        std::wstring attribute;
        if (language == "en-US") {
            attribute = L"Language=409; kinect = True";
        }
        else if (language == "ja-JP") {
            attribute = L"Language=409;Kinect=True";
        }
        else {
            throw std::runtime_error("failed" __FUNCTION__);
        }

        //Localの設定
        setlocale(LC_CTYPE, language.c_str());

        //Speech Recognizer Engineの取得、登録
        CComPtr<ISpObjectToken> engineToken;
        ERROR_CHECK(SpFindBestToken(SPCAT_RECOGNIZERS, attribute.c_str(), NULL, &engineToken));
        ERROR_CHECK(speechRecognizer->SetRecognizer(engineToken));

        //Speech Recognizer Contextの作成
        ERROR_CHECK(speechRecognizer->SetRecognizer(engineToken));

        //音響モデルの適応をOFF(0)に設定
        //(For Long Time(few hours~) Runningu Program of Speech Recognition)
        ERROR_CHECK(speechRecognizer->SetPropertyNum(L"AdaptatiOn", 0));
    }


        inline void loadSpeechGrammar(const ULONGLONG id, const std::wstring& grammar) {
            //ファイル(*.grxml)からSpeech Recognition Grammarを読み込む
            speechGrammar.push_back(nullptr);
            ERROR_CHECK(speechContext->CreateGrammar(id, &speechGrammar.back()));
            ERROR_CHECK(speechGrammar.back()->LoadCmdFromFile(grammar.c_str(), SPLOADOPTIONS::SPLO_STATIC));
        }


        void start(){
            std::cout << "start speech recognition..." << std::endl;

            //Audio Input Streamを開始
            audioStream->SetSpeechState(true);

            //Speech Recognitionを有効化
            for (const CComPtr<ISpRecoGrammar> grammar : speechGrammar) {
                ERROR_CHECK(grammar->SetRuleState(NULL, NULL, SPRULESTATE::SPRS_ACTIVE));

                //RecognitionStateをアクティブに設定
                ERROR_CHECK(speechRecognizer->SetRecoState(SPRECOSTATE::SPRST_ACTIVE_ALWAYS));

                //Eventの発生タイミングを設定(SpeechRecognition完了時)
                ERROR_CHECK(speechContext->SetInterest(SPFEI(SPEVENTENUM::SPEI_RECOGNITION), SPFEI(SPEVENTENUM::SPEI_RECOGNITION)));

                //Speech Recognitionの開始
                ERROR_CHECK(speechContext->Resume(0));

                //SpeechRecognition Event Handleの取得
                speechEvent = speechContext->GetNotifyEventHandle();
            }



        }


        inline void result() {

            //Retrive Events
            SPEVENT eventStatus;
            ULONG eventFetch;
            const double confidenceThreshold = 0.6;
            ERROR_CHECK(speechContext->GetEvents(1, &eventStatus, &eventFetch));
            bool Exit = exit;    //自作
                 Exit = false;    //自作

            while (eventFetch > 0) {
                switch (eventStatus.eEventId) {
                case SPEVENTENUM::SPEI_RECOGNITION:
                    if (eventStatus.elParamType == SPET_LPARAM_IS_OBJECT) {
                        //speech Recognitionの結果を取得
                        CComPtr<ISpRecoResult> speechResult = reinterpret_cast<ISpRecoResult*>(eventStatus.lParam);

                        //Phraseの取得、表示
                        //<tag>PHRASE</tag>
                        SPPHRASE* phrase;
                        ERROR_CHECK(speechResult->GetPhrase(&phrase));
                        const SPPHRASEPROPERTY* semantic = phrase->pProperties->pFirstChild;
                        if (semantic->SREngineConfidence > confidenceThreshold) {
                            std::wstring tag = semantic->pszValue;
                            std::wcout << L" Phrase : " << tag;
                            if (tag == L"EXIT") {
                                Exit = true; //本来はこの文は、exit = true
                            }
                        }
                        else {
                            std::wcout << L"Phrase : ";
                        }
                        CoTaskMemFree(phrase);

                        //Textの取得、表示
                        //<item>Text</item>
                        wchar_t* text;
                        ERROR_CHECK(speechResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, FALSE, &text, NULL));
                        std::wcout << L"\tText : " << text << std::endl;
                        CoTaskMemFree(text);
                    }
                    break;
                default:
                    break;
                }
                ERROR_CHECK(speechContext->GetEvents(1, &eventStatus, &eventFetch));
            }
        }


        void stop() {
        //Audio Input Stremの停止
            audioStream->SetSpeechState(false);

        //Recognition Statusを無効化
            ERROR_CHECK(speechRecognizer->SetRecoState(SPRECOSTATE::SPRST_INACTIVE_WITH_PURGE));

        //Speech Recognitionの停止
            ERROR_CHECK(speechContext->Pause(0));

        //Speech Recognition Event Handleを閉じる
            CloseHandle(speechEvent);

        }

    };

    void main() {
        try {
            KinectApp app;
            app.initialize();
            app.run();            

        }
        catch (std::exception& ex) {
            std::cout << ex.what() << std::endl;
        }
    }

エラー

 failed CoCreateInstance(CLSID_SpStream, NULL, CLSCTX_INPROC_SERVER, __uuidof(ISpStream),reinterpret_cast<void**>(&speechStream)) 800401f0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • C++

    4431questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Kinect

    103questions

    Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。