2017-03-17 22 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

然后它听起来像你的问题是语音识别,而不是事件处理程序。 –