将StreamDataSource与Sphinx4一起使用

时间:2013-06-27 06:10:42

标签: speech-recognition sphinx4

我正在尝试在Java中使用Sphinx4来通过网络InputStream输入。目前我的程序设置为从网络读取任意数量的数据包到名为all_data的数组。从那里我创建了一个ByteArrayInputStream。我希望能够做到的就是将其传递给Sphinx以获得认可。

我到目前为止的代码是:

InputStream audioToPlay = new ByteArrayInputStream(all_data);
ConfigurationManager cm;
cm = new ConfigurationManager(BTsend.class.getResource("roila.config.xml"));
System.out.println("Loading Recognizer...");
Recognizer recognizer = (Recognizer) cm.lookup("recognizer");
recognizer.allocate();

StreamDataSource streamDataSource = (StreamDataSource) cm.lookup("streamDataSource");
streamDataSource.setInputStream(audioToPlay, "Main Stream");

System.out.println("Start speaking.\n");
Result result = recognizer.recognize();
if (result != null)
{
    String resultText = result.getBestResultNoFiller();
    System.out.println("You said: " + resultText + "\n");
}
else
{
    System.out.println("I can't hear what you said.\n");
    //break;
}

如果我将麦克风用作输入,则相同的代码可以正常工作。我基于以下示例做了我正在做的所有事情:http://roila.org/wp-content/uploads/2010/04/roila_java.txt。该代码确实有效,我所做的就是将麦克风更改为StreamDataSource并试图让它工作。

不幸的是,无论我尝试什么,结果总是返回null,但是当我使用麦克风输入时(参见roila.org上面的示例),它的效果很好!

我在roila.confg.xml文件中添加了以下内容:

<component name="streamDataSource" type="edu.cmu.sphinx.frontend.util.StreamDataSource">
    <property name="sampleRate" value="16000" />
    <property name="bigendianData" value="false" />
</component>

在我添加它之前,我得到一个空指针异常,但之后streamDataSource正在被接收。

任何帮助都表示赞赏 - 我最终希望能够做到的事情被识别为数据不断进入,这样做更容易处理。

1 个答案:

答案 0 :(得分:1)

除了将组件添加到xml文件中之外,还需要将其添加到前端管道中的组件列表中,而不是麦克风组件:

<component name="epFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd">
    <propertylist name="pipeline">
        <item>streamDataSource </item>
        <item>dataBlocker</item>
        <item>....</item>
        <item>featureExtraction </item>
    </propertylist>
</component>

我怀疑你忘记了改变。