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。OpenJDK 和 Sun 的 JDK 似乎使用不同。大多数现代 Linux 发行版还使用 PulseAudio,它对 ALSA 进行虚拟化,以便所有音频在进入 ALSA 播放之前通过 PulseAudio 进行软件混音。

当没有任何东西访问声卡并且 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 子集的其他规则。

于 2011-05-26T14:20:13.673 回答
0

嗯,我最好在问完问题后用谷歌搜索,所以......: http : //workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html 非常感谢作者。

更新:实际上,这不是一个很好的解决方法,因为它将保持 FreeTTS 暂停,直到线路空闲。

FWIU,提到的补丁有更好的解决方案——不要求独占访问等。

更新:我已经编译了一个FreeTTS 故障排除页面。


一个基于 FreeTTS(Java 的免费文本到语音引擎)的程序偶尔会出现错误

"LINE UNAVAILABLE: Format is ..."

事实证明,没有 Java 异常或其他机制来检测 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 下,此命令将显示当前持有音频设备的进程的 ID,因此您可以尝试摆脱有问题的程序:

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

关于 Oracle 搞砸的链接 - 鉴于您提到的较旧的 SO 答案提到了仍未修复的可怕的 java linux 声音错误,并建议检查第三篇帖子,丢失的线程很可能已迁移到:

  • https://forums.oracle.com/forums/thread.jspa?threadID=2206163
    • 上面的线程从参考http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4352921_的 JMF 错误 4352921 开始
    • 线程中的第三个帖子说“是的,根据 API 文档,这是一个“灾难性”错误,没有玩家可以安全返回。这就是为什么能够如此轻松地触发它是如此奇怪......”
    • 所讨论问题的解决方法在第六篇文章中描述如下:

      我偶然发现了一篇博客文章,其中建议需要告知 Java 使用 OSS 库,因为它还没有达到 ALSA。要使用的命令是“padsp”,它强制应用程序使用 OSS。因此,如果我调用“padsp jmstudio”,它现在可以很好地播放和混合音频。我也在我的应用程序中进行了尝试,它在同一个 JVM 中预取了多个播放器,并且它们都完美地预取了。因此,目前看来,Linux 上的 JMF 应用程序可能需要通过 padsp 调用。

于 2011-10-13T09:02:15.143 回答