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したことがないので、バッチ プロセスを終了する理由がわかりません。

もう 1 つの質問は、バッチ ファイルが継続的に実行されているためです。話されたすべての文が書き起こされた後、Java アプリケーションで出力を取得したいと考えています。バッチプロセスをファイルにリダイレクトしてからファイルを読み取ることができることはわかっていますが、より直接的なプロセスがあるかどうか疑問に思っていました。どこが間違っているのか教えてください。

4

2 に答える 2

5

と を使用Process.getInputStream()Process.getErrorStream()て、出力されるメッセージを確認する必要があります。

すぐに終了する場合は、終了コード ( Process.waitFor()) を取得し、エラー ストリームからエラー ログを確認する必要がある場合があります。

また、コードの一部を投稿していただければ、お役に立てるかもしれません。一般に、これらの問題は、パスまたはコマンド文字列が正しく構成されていないことが原因です。

可能な修正はProcessBuilder、Java 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 で行われたプロセス API の改善点を試す機会はありませんでした。また、Oracle が JDK8 ( JEP 102 ) 用に再び改善しているように見えます。

于 2011-10-10T05:21:31.397 に答える
0

TimerTimerTaskを使用して、バッチ スキャン プロセスをバックグラウンドでスケジュールすることもできます。これを使用して、無限実行タスクを指定できます。

于 2011-10-10T07:04:19.040 に答える