Java Sphinx动态设置语法规则

时间:2014-02-04 01:48:12

标签: java sphinx4

我正在使用Sphinx库进行项目,我想动态修改语法规则。例如,假设我想添加规则open (Safari|Firefox),但我想在事情发生后添加它。在我在JSGFGrammer源文件中发现此评论之前,我认为这是不可能的:

  

与JSAPI识别器不同,JSGF语法只维护一个   规则语法。这种限制将来可能会放松。该   在识别过程中不应修改语法   对JSGFGrammar.loadJSGF的调用将加载一个全新的   语法,折腾任何旧语法或变化。没有调用commitChanges   是必要的(虽然这样的呼吁在这方面是无害的   情况)。 RuleGrammars可以通过调用来修改   RuleGrammar.setEnabled和RuleGrammar.setRule)。为了这些   要发生变化,必须在之后调用JSGFGrammar.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();
    }

0 个答案:

没有答案