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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Kinect

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

Q&A

0回答

2040閲覧

KINECTv2の音声認識のエラー

kana_yamamoto

総合スコア7

C++

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

Kinect

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

0グッド

0クリップ

投稿2017/08/22 13:14

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問