3

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

我用来运行批处理文件的命令是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 应用程序中获得输出。我知道我可以将批处理重定向到文件然后读取文件,只是想知道是否有更直接的过程。你能帮我弄清楚我在哪里犯了错误。

4

2 回答 2

5

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

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

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

一个可能的解决方法是这样使用ProcessBuilderJava 1.5 中的:

// 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 文章解释了很多与 Process API 相关的问题,所以请通读一下。我还没有机会体验 JDK7 中对 Process API 所做的改进,而且从外观上看,Oracle 正在为 JDK8(JEP 102)再次改进它。

于 2011-10-10T05:21:31.397 回答
0

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

于 2011-10-10T07:04:19.040 回答