2017-03-17 94 views
0

我在這裏創建了一個TS3插件,它使用 System::Speech::Recognition作爲其SpeechRecognitinEngine。現在,我爲SpeechRecognized事件創建一個EventHandler。語音識別不會在C++/CLI DLL中觸發EventHandler

那麼,我的日誌記錄(和插件的操作 - 無)告訴我,事件實際上從來沒有觸發過,即使你開始和停止與(有些)有效的(部分)語法交談。

我不知道這是爲什麼。它發生在用C++ CLI編寫的DLL中。 現在,我的理論是,dll不支持事件handerls ...可能有可能嗎?

void recogn_speech() { 
    uint64 schid = ts3Functions.getCurrentServerConnectionHandlerID(); 

    SpeechRecognitionEngine^ recognizer = gcnew SpeechRecognitionEngine(); 

    System::Speech::Recognition::Grammar^ g = assembleGrammar(); 
    recognizer->LoadGrammar(g); 
    recognizer->SetInputToDefaultAudioDevice(); 

    char pluginPath[PATH_BUFSIZE]; 
    ts3Functions.getPluginPath(pluginPath, PATH_BUFSIZE, pluginID); 
    String^ a = gcnew String(pluginPath); 
    a = a + "vctest_cpp_ts3\\signal_vc_start.wav"; 
    char* newPath = (char*)(void*)Marshal::StringToHGlobalAnsi(a); 
    ts3Functions.playWaveFile(schid, newPath); 
    Marshal::FreeHGlobal((IntPtr)newPath); 

    recognizer->SpeechRecognized += 
     gcnew EventHandler<SpeechRecognizedEventArgs^>(this, &tsapi::sre_SpeechRecognized); 
} 

void sre_SpeechRecognized(Object^ sender, SpeechRecognizedEventArgs^ e) 
{ 
    uint64 schid = ts3Functions.getCurrentServerConnectionHandlerID(); 
    String^ recognRes = e->Result->Text->ToString(); 
    interpretCommand(recognRes); 
} 

全部源代碼上 GitHub

+0

最明顯的原因是它根本無法識別任何東西。驗證語音識別功能通常沒有語法。不明顯的原因是GitHub代碼中缺少的原因。主機程序可能存在於運行此代碼的線程上,並將其聲明爲STA線程,但實際上並未抽取消息循環。 –

+0

那麼我該如何解決這個問題?或者不同:我如何使它工作? –

回答

0

事件處理程序看起來是正確的。在跨DLL的事件處理程序中不存在任何問題:這是所有託管代碼,DLL邊界在這裏並不重要。

然而,有一個可能的問題:

void recogn_speech() { 
    ... 
    SpeechRecognitionEngine^ recognizer = gcnew SpeechRecognitionEngine(); 
    ... 
} 

您可能希望保存在某個地方你SpeechRecognitionEngine對象,因此它不會被垃圾收集。另外,您可能希望切換到更多C++風格的類文件中定義.h文件和.cpp文件中的實現。隨着代碼變得越來越複雜,類需要互相引用,將一個文件中的所有內容都開始成爲問題。

+0

完成在頭文件中聲明函數,也使得識別器不被垃圾收集......仍然不會觸發SpeechRecognized事件。 –

+0

然後它聽起來像你的問題是語音識別,而不是事件處理程序。 –