0

我正在尝试Sphinx4在 Java 中使用来自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被拾取。

感谢您提供任何帮助 - 我最终希望能够做的是识别数据,因为如果这样做可以更轻松地处理此数据,则会不断输入数据。

4

1 回答 1

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>

我怀疑你忘记了那个改变。

于 2013-06-27T07:55:20.350 回答