2012-02-02 70 views
0

我創建了一個解決方案,它使用Microsoft SAPI來識別語法文件中定義的語音。Kinect + SpCreateDefaultObjectFromCategoryId = SPERR_NOT_FOUND

就其本身而言,此代碼正常工作。然而,當我與正在運行的Kinect SDK相同的程序集成,它無法上線:

hr = cpRecognizer->SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN,&pAudioToken); 
//At this point, HR == -2147200966 == SPERR_NOT_FOUND 

我試圖在話筒是外部的Kinect成爲一個可用麥克風端口,設置堵漏它是默認的麥克風。這也沒有給我帶來任何喜悅。

然後我使用pAudioToken調用cpRecognizer-> SetInput(pAudioToken,TRUE);

回答

1

您需要考慮的一件事是桌面SAPI識別器和服務器SAPI識別器之間的區別。不幸的是,確定(從視覺檢查)你包括哪一個是非常棘手的 - 它們都被命名爲sapi.h,但是類別ID是不同的。

一個簡單的區別是,SAPI_VER對於服務器版本是0x055,對於桌面而言是0x054或更低。

但是,這裏的關鍵區別在於SPCAT_AUDIOIN(音頻輸入類別)在服務器SAPI標頭和桌面SAPI標頭中的命名方式不同,並且對於音頻輸入類別完全可能沒有默認標記服務器識別器

插入麥克風並不會改變服務器識別器的關於默認輸入是什麼的想法,儘管它會改變桌面識別器的默認輸入。

我會推薦使用SpEnumTokens幫助程序遍歷音頻輸入類別來查看哪些輸入設備可用。

+0

這非常有幫助,謝謝。我會給這個去看看交易是什麼 - 目前雖然,我無法找到SAPI_VER常量... – 2012-02-09 03:38:42

+0

當我撥打以下電話: hr = SpEnumTokens(SPCAT_AUDIOIN,NULL,NULL,&cpEnum); // hr == S_OK hr = cpEnum-> GetCount(&ulNumTokens); // ulNumTokens == 0 – 2012-02-09 03:43:35

+0

好的,讓我們稍微退一步。你真正需要的是從Kinect音頻輸入中進行語音識別,對嗎?如果是這樣的話,那麼應該使用流接口(ISpStream,ISpStreamFormat,ISpAudio),而不是使用ISpObjectToken。由於我不熟悉Kinect SDK,因此您可以使用哪些音頻接口? – 2012-02-11 08:47:47