Events 语音识别不会触发C++/CLI动态链接库

Events 语音识别不会触发C++/CLI动态链接库,events,dll,c++-cli,speech-recognition,teamspeak,Events,Dll,C++ Cli,Speech Recognition,Teamspeak,我在这里创建了一个TS3插件,它使用 系统::语音::识别用于其语音识别引擎。现在,我为SpeechRecognized事件创建一个EventHandler 嗯,我的日志记录(以及plugin-None的操作)告诉我,事件实际上从未被触发,即使您开始和停止使用(某种程度上)有效的(部分)语法 我不知道这是为什么。它发生在一个用C++ CLI编写的DLL中。 现在,我的理论是DLL不支持事件句柄。。。这可能吗 void recogn_speech() { uint64 schid = ts

我在这里创建了一个TS3插件,它使用
系统::语音::识别
用于其
语音识别引擎
。现在,我为
SpeechRecognized
事件创建一个EventHandler

嗯,我的日志记录(以及plugin-None的操作)告诉我,事件实际上从未被触发,即使您开始和停止使用(某种程度上)有效的(部分)语法

我不知道这是为什么。它发生在一个用C++ CLI编写的DLL中。 现在,我的理论是DLL不支持事件句柄。。。这可能吗

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);
}
void recogn\u speech(){
uint64 schid=ts3Functions.getCurrentServerConnectionHandlerID();
SpeechRecognitionEngine^识别器=gcnew SpeechRecognitionEngine();
系统::语音::识别::语法^g=assembleGrammar();
识别器->加载语法(g);
识别器->SetInputOdeFaultAudioDevice();
char pluginPath[PATH_BUFSIZE];
getPluginPath(pluginPath,PATH_BUFSIZE,pluginID);
字符串^a=gcnew字符串(pluginPath);
a=a+“vctest\u cpp\u ts3\\signal\u vc\u start.wav”;
char*newPath=(char*)(void*)封送:StringToHGlobalAnsi(a);
ts3Functions.PlayWave文件(schid,newPath);
Marshal::FreeHGlobal((IntPtr)newPath);
识别器->语音识别+=
gcneweventhandler(这个,&tsapi::sre_speechrecogned);
}
void sre_SpeechRecognized(对象^sender,SpeechRecognizedEventArgs ^e)
{
uint64 schid=ts3Functions.getCurrentServerConnectionHandlerID();
字符串^recognRes=e->Result->Text->ToString();
解释命令(recognRes);
}
上的完整源代码
您的事件处理程序看起来是正确的。跨DLL使用事件和事件处理程序没有问题:这都是托管代码,DLL边界在这里并不重要

然而,有一个可能的问题:

void recogn_speech() {
    ...
    SpeechRecognitionEngine^ recognizer = gcnew SpeechRecognitionEngine();
    ...
}
您可能希望将SpeechRecognitionEngine对象保存在某个位置,这样它就不会被垃圾收集


此外,您可能希望切换到更具C++风格的.h文件中包含类定义,而.cpp文件中包含实现。随着代码变得越来越复杂,类需要相互引用,将所有内容都放在一个文件中将开始成为一个问题。

在头文件中声明完函数后,识别器也不会被垃圾收集。。。仍然不会触发SpeechReceigned事件。那么听起来您的问题是语音识别,而不是事件处理程序。最明显的原因是它根本无法识别任何东西。验证语音识别在没有语法的情况下是否正常工作。不明显的原因是GitHub代码中缺少什么。宿主程序可能对运行此代码的线程撒谎,将其声明为STA线程,但实际上并没有泵送消息循环。那么我该如何解决这个问题呢?或者不同:我如何让它工作?