0

FreeTTS の例を実行すると、次のエラーが発生します。

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

この投稿では、Java での Freetts の問題は
既知の Linux/Java サウンド バグであり、http://forums.sun.com/thread.jspa?threadID=5189363 にリンクされている回避策があると主張しています

しかし、オラクルがそれを台無しにして以来、このリンクはもう機能しません。Archive.org はこのページをアーカイブしていないようです。

FreeTTS の回避策/パッチを持っている人はいますか?

ありがとう、オンドラ

4

3 に答える 3

1

LinuxのALSAは、大きくて複雑なAPIの1つです。OpenJDKとSunのJDKはそれを異なって使用しているようです。最新のLinuxディストリビューションのほとんどはPulseAudioも使用しています。これは、ALSAを仮想化して、すべてのオーディオがソフトウェアミキシングのためにPulseAudioを通過してから、再生のためにALSAに送られるようにします。

サウンドカードにアクセスしているものがなく、Javaが唯一のユーザーである場合、サウンドカードは機能する傾向があります。ただし、他の何かがサウンドカードを開いている場合、Javaアプリは、エラーと「javax.sound.sampled.LineUnavailableException:オーディオデバイスが利用できません」の両方ですぐに壊れます。

考えられる回避策の1つは、システム内のすべてのミキサーをで列挙してから、必要なミキサーAudioSystem.getMixerInfo()のラインを開こうとするAudioSystem.getSourceDataLine(format, mixerInfo)ことです。いくつかは他よりもうまくいくでしょう。特に、「Java SoundAudioEngine」および「default[default]」ミキサーが存在する場合は、それらが機能する傾向があります。

ただし、FreeTTSソースコードを変更したくない場合の唯一の解決策は、pulse-javaをインストールすることです。これにより、ALSA仮想化をバイパスしてPulseAudioに直接アクセスする特別なPulseAudioサウンドプロバイダーが登録されます。UbuntuはこれをOpenJDKパッケージの一部としてインストールします。

誰かが本当にJavaSoundにパッチを当てて、ALSAをより親しみやすい方法で再生する必要があります。plug:1つのALSAデバイス名には、ALSAがサウンドフォーマットとサンプルレートをオンザフライで変換できるようにプレフィックスを付ける必要があります。また、安全なALSAサブセットに関する他のルールにも従う必要があります。

于 2011-05-26T14:20:13.673 に答える
0

うーん、質問をした後、グーグルで検索した方が運がよかったので...: http://workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html 作者に感謝します。

更新:実際には、回線が空くまで FreeTTS を保留にするため、これは適切な回避策ではありません。

FWIU、言及されたパッチにはより良い解決策がありました-排他的アクセスなどを要求しません。

更新: FreeTTS のトラブルシューティングページをまとめました。


Java 用の無料のテキスト読み上げエンジンである FreeTTS に基づくプログラムで、時折エラーが発生していました。

"LINE UNAVAILABLE: Format is ..."

FreeTTS ライブラリ内で発生するこのエラーを検出するための Java 例外またはその他のメカニズムがないことが判明しました。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 では、このコマンドは現在オーディオ デバイスを保持しているプロセスの ID を表示するので、問題のあるプログラムの削除を試みることができます。

/sbin/fuser /dev/dsp
于 2011-02-17T23:10:57.307 に答える
0

オラクルによってねじ込まれたリンクについて-あなたが参照する古いSOの回答が、まだ修正されていない恐ろしいJava Linuxサウンドバグに言及しており、3番目の投稿を確認することを提案していることを考えると、失われたスレッドが次の場所に移行された可能性があります。

  • https://forums.oracle.com/forums/thread.jspa?threadID=2206163
    • 上記のスレッドは、 http: //bugs.sun.com/bugdatabase/view_bug.do?bug_id=4352921_ の JMF バグ 4352921 への参照から始まります。
    • スレッドの 3 番目の投稿では、「はい、API ドキュメントによると、これは「壊滅的な」エラーであり、どのプレイヤーも安全に戻ることはできません。そのため、これほど簡単にトリガーできるのは非常に奇妙です...」
    • 議論された問題の回避策は、6 番目の投稿で次のように説明されています。

      Java はまだ ALSA に対応していないため、OSS ライブラリを使用するように Java に指示する必要があることを示唆するブログ投稿を見つけました。使用するコマンドは、アプリケーションに OSS の使用を強制する「padsp」でした。したがって、「padsp jmstudio」を呼び出すと、オーディオの再生とミキシングが正常に行われます。同じ JVM で多数のプレーヤーをプリフェッチするアプリケーションでも試してみましたが、すべて完全にプリフェッチされました。そのため、今のところ、Linux 上の JMF アプリケーションは padp を介して呼び出す必要があるようです。

于 2011-10-13T09:02:15.143 に答える