2

私は Sphinx ライブラリを使用するプロジェクトに取り組んでおり、文法規則を動的に変更したいと考えていました。たとえば、ルールを追加したいopen (Safari|Firefox)が、何かが起こった後にのみ追加したいとします。JSGFGrammerソースファイルで次のコメントに出くわすまで、これが可能だとは思いませんでした。

JSAPI レコグナイザーとは異なり、JSGF Grammar は 1 つの Rule Grammar のみを維持します。この制限は将来的に緩和される可能性があります。認識の進行中は、文法を変更しないでください。JSGFGrammar.loadJSGF を呼び出すと、完全に新しい文法が読み込まれ、古い文法や変更が破棄されます。commitChanges への呼び出しは必要ありません (ただし、このような呼び出しはこの状況では無害です)。RuleGrammars は、RuleGrammar.setEnabled および RuleGrammar.setRule への呼び出しによって変更できます)。これらの変更を行うには、すべての文法変更が行われた後に JSFGGrammar.commitChanges を呼び出す必要があります。

これを Sphinx 関連のオブジェクトの構築に追加しようとしました。

public SphinxBridge() {
        this.cm = new ConfigurationManager(SphinxBridge.class.getResource("input.config.xml"));
        this.recognizer = (Recognizer) cm.lookup("recognizer");
        this.microphone = (Microphone) cm.lookup("microphone");

        try {
            JSGFGrammar grammar = (JSGFGrammar) cm.lookup("jsgfGrammar");
            grammar.getRuleGrammar().setRule("test", new JSGFRule(), true);
            grammar.commitChanges();
        }
        catch (Exception e) { e.printStackTrace(); }

        recognizer.allocate();
    }

単語をルールとして追加したいtestので、それを認識します。ただし、開始すると、に関連するルックアップ行につながる NullPointerException が発生しjsgfGrammarます。これを正しく行うにはどうすればよいですか?


更新 1 :

微調整を行った後、次の行に NPE が表示されるようになりました。

grammar.getRuleGrammar().setRule("test", new JSGFRule(), true);

いくつかのテストを行ったところ、getRuleGrammar()null が返されていることがわかりました。私は何をしますか?


更新 2 :

文法を割り当てることで NPE を取り除くことができることを発見しました。ただし、次の例外が発生します。

edu.cmu.sphinx.jsgf.JSGFGrammarException: Unknown rule type
    at edu.cmu.sphinx.jsgf.JSGFRuleGrammar.resolveRule(JSGFRuleGrammar.java:459)
    at edu.cmu.sphinx.jsgf.JSGFRuleGrammar.resolveAllRules(JSGFRuleGrammar.java:396)
    at edu.cmu.sphinx.jsgf.JSGFRuleGrammarManager.linkGrammars(JSGFRuleGrammarManager.java:62)
    at edu.cmu.sphinx.jsgf.JSGFGrammar.commitChanges(JSGFGrammar.java:618)
    at me.nrubin29.jtalk.SphinxBridge.<init>(SphinxBridge.java:28)

これは新しいコードです:

public SphinxBridge() {
        this.cm = new ConfigurationManager(SphinxBridge.class.getResource("input.config.xml"));
        this.recognizer = (Recognizer) cm.lookup("recognizer");
        this.microphone = (Microphone) cm.lookup("microphone");

        try {
            JSGFGrammar grammar = (JSGFGrammar) cm.lookup("jsgfGrammar");
            grammar.allocate();
            grammar.getRuleGrammar().setRule("test", new JSGFRule(), true); // "test" is the name.
            grammar.commitChanges();
        }
        catch (Exception e) { e.printStackTrace(); }

        recognizer.allocate();
    }
4

0 に答える 0