com4j: Events erreichen den Handler nicht (SAPI)

Andibert

Mitglied
Hi ich habe ein Problem mit com4j und Events.

Gegenwärtig steuere ich die Microsoft Speech API über die com4j wrapperklassen, und das ganze funktioniert so weit ganz gut. Jedoch erreichen einige Events nicht die Handler, und ich bin mir nicht sicher ob es mein Fehler ist, ein Fehler in der com4j Implementierung oder die Quelle in der Sapi liegt.

die Handlermethoden von _ISpeechRecoContextEvents werden nie aufgerufen, obwohl ich mich an das Tutorial von der com4j Seite gehalten hab.
die Handlermethoden von _ISpeechVoiceEvents sind da schon erfolgreicher. Hier werden nur phoneme und viseme Events verschluckt.

Ich hoffe irgendjemand hat bereits erfahrungen mir der SAPI und oder com4j und kann mir weiterhelfen

Anbei findet ihr meine Klasse die eigentlich die Recoevents bekommen sollte.
Das ganze ist durch die vielen Eventhandler ziemlich lang, aber kennt man einen, kennt man alle.

MfG
Der Andibert

Java:
package test;

import java.io.File;

import javax.swing.JFrame;

import speech.ClassFactory;
import speech.ISpeechRecoContext;
import speech.ISpeechRecoGrammar;
import speech.ISpeechRecognizer;
import speech.SpeechLoadOption;
import speech.SpeechRecoEvents;
import speech.events._ISpeechRecoContextEvents;

import com4j.EventCookie;

public class RecoEventHandler extends _ISpeechRecoContextEvents {

    static EventCookie cookie;

    public static void main(String[] args) {

        ISpeechRecognizer reco = ClassFactory.createSpSharedRecognizer();
        ISpeechRecoContext context = reco.createRecoContext();

        ISpeechRecoGrammar grammar = context.createGrammar(0);
        File f = new File("C:/testgrammar.xml");
        grammar.cmdLoadFromFile(f.getAbsolutePath(),
                SpeechLoadOption.SLODynamic);

        RecoEventHandler handler = new RecoEventHandler();
        cookie = context.advise(_ISpeechRecoContextEvents.class, handler);
        context.eventInterests(SpeechRecoEvents.SREAllEvents);
        System.out.println(context.eventInterests());
        context.recognizer().emulateRecognition("Command", " ", 0x0409);

        // To keep the thread alive
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        // cookie.close();
    }

    // Overridden Event Handler
    public void startStream(int streamNumber, java.lang.Object streamPosition) {
        System.out.println("startStream");
    }

    public void endStream(int streamNumber, java.lang.Object streamPosition,
            boolean streamReleased) {
        System.out.println("endStream");
    }

    public void bookmark(int streamNumber, java.lang.Object streamPosition,
            java.lang.Object bookmarkId, speech.SpeechBookmarkOptions options) {
        System.out.println("bookmark");
    }

    public void soundStart(int streamNumber, java.lang.Object streamPosition) {
        System.out.println("sound start");
    }

    public void soundEnd(int streamNumber, java.lang.Object streamPosition) {
        System.out.println("sound end");
    }

    public void phraseStart(int streamNumber, java.lang.Object streamPosition) {
        System.out.println("phrase start");
    }

    public void recognition(int streamNumber, java.lang.Object streamPosition,
            speech.SpeechRecognitionType recognitionType,
            speech.ISpeechRecoResult result) {
        System.out.println("RECOGNITION");
    }

    public void hypothesis(int streamNumber, java.lang.Object streamPosition,
            speech.ISpeechRecoResult result) {
        System.out.println("hypothesis");
    }

    public void propertyNumberChange(int streamNumber,
            java.lang.Object streamPosition, java.lang.String propertyName,
            int newNumberValue) {
        System.out.println("property number change");
    }

    public void propertyStringChange(int streamNumber,
            java.lang.Object streamPosition, java.lang.String propertyName,
            java.lang.String newStringValue) {
        System.out.println("property string change");
    }

    public void falseRecognition(int streamNumber,
            java.lang.Object streamPosition, speech.ISpeechRecoResult result) {
        System.out.println("false recognition");
    }

    public void interference(int streamNumber, java.lang.Object streamPosition,
            speech.SpeechInterference interference) {
        System.out.println("interference");
    }

    public void requestUI(int streamNumber, java.lang.Object streamPosition,
            java.lang.String uiType) {
        System.out.println("Request UI");
    }

    public void recognizerStateChange(int streamNumber,
            java.lang.Object streamPosition,
            speech.SpeechRecognizerState newState) {
        System.out.println("recognizer state changed");
    }

    public void adaptation(int streamNumber, java.lang.Object streamPosition) {
        System.out.println("adaption");
    }

    public void recognitionForOtherContext(int streamNumber,
            java.lang.Object streamPosition) {
        System.out.println("reco other context");
    }

    public void audioLevel(int streamNumber, java.lang.Object streamPosition,
            int audioLevel) {
        System.out.println("audio level");
    }

    public void enginePrivate(int streamNumber,
            java.lang.Object streamPosition, java.lang.Object engineData) {
        System.out.println("engine private");
    }
}
 
für alle die in Zukunft mal das gleiche Problem haben:

Der Debugbefehl "-Dcom4j.debug=true" ergab, dass es einen Typemismatch gibt welcher statt des Events ne Exeption wirft, die dann brav von der com4j Laufzeitumgebung abgefangen wird.

Also alle die mit com4j Programmieren: Prüft zuerst ob eure Events funktionieren das erspaart euch viel Arbeit.

Nutze jetzt wahrscheinlich JNI
 
Zurück