在Java中运行连续批处理

时间:2011-10-10 05:12:21

标签: java sphinx runtime.exec cmusphinx

我有一个批处理文件,它执行收听麦克风并将其转换为文本的操作(我正在使用口袋狮身人面像)。

我用来运行批处理文件的命令是pocketsphinx_continuous.exe -dict <dict name> -lm <language model> -hmm <acoustic model location>。批处理文件启动并继续监听麦克风。每当我们说完一个句子时,它会在命令提示符下将其转换为文本。由于这是持续运行,我们通过 Ctrl - C 终止此任务。

我试图将其变成一个独立的Java应用程序。我想通过Java运行这个批处理文件,所以我使用了Runtime.getRuntime().exec("cmd /c start pocketsphinx_continuous.exe ...")所有参数。但奇怪的是,它在单独的命令提示符中启动批处理,但会立即退出。我尝试使用process.waitfor(),但它只是开始执行批处理然后终止。我没有打电话给process.destroy,所以我无法弄清楚为什么它会退出批处理过程。

另一个问题是,由于批处理文件连续运行,在每个口语句子被转录后,我希望在我的Java应用程序中获得输出。我知道我可以将批处理重定向到一个文件然后读取文件,只是想知道是否有更直接的过程。你能不能帮我弄清楚我犯了什么错误。

2 个答案:

答案 0 :(得分:5)

您应该使用Process.getInputStream()Process.getErrorStream()来查找打印出来的消息。

如果它立即退出,您可能需要获取退出代码(Process.waitFor())并检查错误流中的错误日志。

此外,如果您可以发布一些代码,我们可能会提供帮助。通常,这些问题是由于路径或命令字符串配置不正确造成的。

可能的解决方法是使用Java 1.5中的ProcessBuilder

// Note the lack of "cmd \c" - you shouldn't need to run it in a cmd window!
ProcessBuilder pb = new ProcessBuilder("pocketsphinx_continuous.exe",
                                       "dict", "1121.dic",
                                       "-lm", "1121.lm",
                                       "-hmm", "hub4/hmm");

Process p = pb.start();

// TODO for you:
// 1. Create Threads to handle the input
// 2. Store the Process instance so that you can call p.destroy() later.
// 3. If interested, have a Thread doing p.waitFor() to get the exit code.

正如Joachim Sauer在评论中提到的,这个Javaworld article解释了很多与Process API相关的问题,所以请仔细阅读。我没有机会将JDK7中的改进发挥到Process API,而且看起来Oracle正在为JDK8(JEP 102)再次改进它。

答案 1 :(得分:0)

您还可以使用计时器 TimerTask 在后台安排批量扫描过程。您可以使用它来指定无限运行任务。