FreeTTS, Java, Linux: Обходной путь для «LINE UNAVAILABLE: Формат ...» - PullRequest
0 голосов
/ 18 февраля 2011

Когда я запускаю примеры FreeTTS, я получаю эту ошибку:

LINE UNAVAILABLE: Format is pcm_signed 16000.0 Hz 16 bits 1 channel big endian

В этом посте Проблема с ошибками в Java
кто-то утверждает, что это известная ошибка звука в Linux / Java и имеет обходной путь, ссылка на http://forums.sun.com/thread.jspa?threadID=5189363.

Но эта ссылка больше не работает, так как Oracle ее испортил. Archive.org, похоже, не заархивировал эту страницу.

У кого-нибудь есть обходной путь / патч для FreeTTS?

Спасибо, Ондра

Ответы [ 3 ]

1 голос
/ 26 мая 2011

ALSA для Linux - это один большой и сложный API. OpenJDK и Sun JDK используют его по-разному. В большинстве современных дистрибутивов Linux также используется PulseAudio, который виртуализирует ALSA, так что все аудио проходит через PulseAudio для программного микширования, а затем отправляется в ALSA для воспроизведения.

Когда к звуковой карте ничего не происходит, и Java является единственным пользователем, она имеет тенденцию работать. Однако, когда что-то еще имеет открытая звуковая карта, приложения Java быстро ломаются и с вашей ошибкой и с «javax.sound.sampled.LineUnavailableException: Audio Device Unavailable».

Один из возможных обходных путей - перечислить все микшеры в системе с помощью AudioSystem.getMixerInfo(), а затем попытаться открыть строку с AudioSystem.getSourceDataLine(format, mixerInfo) для нужных микшеров. Некоторые будут работать лучше, чем другие. В частности, микшеры "Java Sound Audio Engine" и "default [default]", если они существуют, имеют тенденцию работать.

Единственное решение, если вы не хотите изменять исходный код FreeTTS, это установить pulse-java. При этом регистрируется специальный поставщик звука PulseAudio, который обходит виртуализацию ALSA и переходит непосредственно к PulseAudio. Ubuntu устанавливает это как часть своего пакета OpenJDK.

Кто-то должен действительно пропатчить Java Sound, чтобы играть с ALSA более дружелюбным способом. Для одного устройства ALSA имена должны иметь префикс plug:, чтобы заставить ALSA преобразовывать форматы звука и частоты дискретизации на лету. И другие правила для безопасного подмножества ALSA также должны соблюдаться.

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

Что касается ссылки, прикрученной Oracle - учитывая, что более старый SO-ответ вы ссылаетесь, упоминаете ужасающую звуковую ошибку Java-Linux, которая до сих пор не исправлена ​​ и предлагает проверить третий пост, вероятно, что потерянный поток был перенесен в:

  • https://forums.oracle.com/forums/thread.jspa?threadID=2206163
    • вышеуказанный поток начинается со ссылки на ошибку JMF 4352921 в http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4352921_
    • третий пост в теме говорит: «Да, согласно документации API, это« катастрофическая »ошибка, из-за которой ни один игрок не может безопасно вернуться. Именно поэтому так странно иметь возможность так легко вызывать ее... "
    • Обходной путь к обсуждаемой проблеме описан в шестом посте следующим образом:

      Я наткнулся на сообщение в блоге, в котором предлагалось указать, что Java нужно использовать библиотеки OSS, так какеще не до ALSA.Команда для использования была "padsp", которая заставляет приложение использовать OSS.Так что, если я назову «padsp jmstudio», он теперь проигрывает и микширует аудио просто отлично.Я также попробовал это с моим приложением, которое предварительно выбирает несколько игроков в одной и той же JVM, и все они отлично выбираются заранее.Похоже, на данный момент JMF-приложения в Linux могут вызываться через padsp.

0 голосов
/ 18 февраля 2011

Хм, мне повезло гуглить после того, как задал вопрос, так что ...: http://workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html Большое спасибо автору.

Обновление: Собственно, этоэто не хороший обходной путь, так как он будет удерживать FreeTTS до тех пор, пока линия не освободится.

FWIU, у упомянутого патча было лучшее решение - не требующий эксклюзивного доступа или тому подобное.

Обновление: Я скомпилировал страницу устранения неполадок FreeTTS .


Программа, основанная на FreeTTS, бесплатном движке преобразования текста в речь для Java, получала случайные ошибки

"LINE UNAVAILABLE: Format is ..."

Оказывается, что нет Java Exception или другого механизма для обнаружения этой ошибки, которая происходит внутри библиотеки FreeTTS.Все, что вы получаете, - это сообщение на System.out, так что нет хорошего способа программно реагировать.

Обходной путь: Сконфигурируйте аудиопроигрыватель FreeTTS, чтобы он пытался получить доступ к аудиоустройству более одного раза, пока он не преуспеет.В этом примере используется короткая задержка в 0,1 секунды, чтобы не упустить возможность захватить аудиоустройство;мы продолжаем попытки в течение 30 секунд:

System.setProperty("com.sun.speech.freetts.audio.AudioPlayer.openFailDelayMs", "100");
System.setProperty("com.sun.speech.freetts.audio.AudioPlayer.totalOpenFailDelayMs", "30000");

Если аудиоустройство постоянно используется другой программой, конечно, нет никакого способа получить доступ.В Linux эта команда отобразит идентификатор процесса, который в данный момент удерживает аудиоустройство, поэтому вы можете попытаться избавиться от программы-нарушителя:

/sbin/fuser /dev/dsp
...