Распознавание речи не запускает EventHandler в C++/CLI DLL
У меня есть плагин TS3 в создании прямо здесь, который использует System::Speech::Recognition
для его SpeechRecognitinEngine
, Теперь я создаю EventHandler для SpeechRecognized
событие.
Что ж, мои записи (и действия плагина - Нет) говорят мне, что Событие на самом деле никогда не запускается, даже если вы начинаете и прекращаете говорить с (несколько) действительными (частями) грамматикой.
Я понятия не имею, почему это так. Это происходит в DLL, написанной на C++ CLI. Моя теория заключалась в том, что библиотеки 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);
}
Полный исходный код на GitHub
1 ответ
Ваш обработчик событий выглядит правильно. Нет проблем с наличием событий и обработчиков событий в разных DLL: это весь управляемый код, граница DLL здесь не имеет значения.
Тем не менее, есть одна возможная проблема:
void recogn_speech() {
...
SpeechRecognitionEngine^ recognizer = gcnew SpeechRecognitionEngine();
...
}
Возможно, вы захотите сохранить объект SpeechRecognitionEngine где-нибудь, чтобы он не собирал мусор.
Кроме того, вы можете захотеть перейти к более C++-стилю - иметь определения классов в файлах.h и реализации в файлах.cpp. Поскольку ваш код становится более сложным, и классы должны ссылаться друг на друга, наличие всего в одном файле станет проблемой.