2017-03-17 1 views
0

Ich habe ein TS3-Plugin in der Erstellung hier, die System::Speech::Recognition für seine SpeechRecognitinEngine verwendet. Jetzt erstelle ich einen EventHandler für das Ereignis SpeechRecognized.Spracherkennung löst EventHandler nicht in C++/CLI DLL

Nun, mein Logging (und die Aktionen des Plugins - None) sagen mir, dass das Event tatsächlich nie ausgelöst wird, auch wenn Sie anfangen und aufhören mit den (etwas) gültigen Grammatik zu sprechen.

Ich habe keine Ahnung, warum das ist. Es geschieht in einer DLL, die in C++ CLI geschrieben wird. Nun war meine Theorie, dass DLLs Event-Handlerls nicht unterstützen ... Könnte das möglich sein?

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); 
} 

Vollsourcecode auf GitHub

+0

Der offensichtlichste Grund ist, dass es einfach nichts erkennt. Stellen Sie sicher, dass die Spracherkennung im Allgemeinen ohne Grammatik funktioniert. Der nicht offensichtliche Grund ist, was im GitHub-Code fehlt. Das Host-Programm könnte über den Thread, auf dem dieser Code ausgeführt wird, liegen und es als STA-Thread deklarieren, ohne jedoch tatsächlich eine Nachrichtenschleife zu pumpen. –

+0

Also, wie repariere ich das? Oder anders: Wie mache ich das? –

Antwort

0

Ihre Event-Handler sieht richtig. Es gibt kein Problem mit Ereignissen & Event-Handler über DLLs: Es ist alles verwalteten Code, die DLL-Grenze spielt hier keine Rolle.

Allerdings gibt es eine mögliche Ausgabe:

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

Sie möchten vielleicht irgendwo Ihr SpeechRecognitionEngine Objekt speichern, damit es nicht Müll bekommt gesammelt.

Sie können auch auf den C++ - Stil von Klassendefinitionen in .h-Dateien und Implementierungen in .cpp-Dateien wechseln. Wenn Ihr Code komplexer wird und sich die Klassen aufeinander beziehen müssen, wird das Problem in einer Datei zu einem Problem.

+0

Fertig deklariert die Funktionen in der Header-Datei, auch gemacht Recognizer nicht Müll gesammelt werden ... Noch löst nicht das SpeechRecognized-Ereignis. –

+0

Dann klingt es wie Ihr Problem ist mit der Spracherkennung, nicht mit dem Event-Handler. –