Запуск непрерывного пакетного процесса в Java - PullRequest
3 голосов
/ 10 октября 2011

У меня есть пакетный файл, который выполняет операцию прослушивания микрофона и преобразования его в текст (я использую карманного сфинкса).

Команда, которую я использую для запуска пакетного файла, 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 ]

5 голосов
/ 10 октября 2011

Вы должны использовать 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.

Как отметил в комментариях Йоахим Зауэр, в этой статье Javaworld объясняется множество проблем, связанных с Process API, поэтому прочитайте их. У меня не было возможности поиграть с улучшениями, внесенными в JDK7 для Process API, и, судя по всему, Oracle снова улучшает его для JDK8 ( JEP 102 ).

0 голосов
/ 10 октября 2011

Вы также можете использовать Таймер и TimerTask для планирования процесса пакетного сканирования в фоновом режиме. Вы можете использовать это, чтобы указать бесконечную задачу.

...