FreeTTS,Java,Linux:“LINE UNAVAILABLE:格式是……”的解决方法

当我运行FreeTTS示例时,我收到此错误:

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

在这篇文章中, Freetts在Java中存在问题
有人声称这是一个已知的Linux / Java声音错误,并有一个解决方法,链接到http://forums.sun.com/thread.jspa?threadID=5189363 。

但是这个链接不再起作用了,因为Oracle搞砸了它。 Archive.org似乎没有存档此页面。

有没有人有FreeTTS的解决方法/补丁?

谢谢,Ondra

Linux的ALSA是一个庞大而复杂的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声音音频引擎”和“默认[默认]”混音器,如果存在,往往会起作用。

如果您不想修改FreeTTS源代码,唯一的解决方案是安装pulse-java。 这会注册一个特殊的PulseAudio声音提供程序,它绕过ALSA虚拟化并直接进入PulseAudio。 Ubuntu将其作为OpenJDK包的一部分进行安装。

有人应该以更友好的方式修补Java Sound以使用ALSA。 对于一个ALSA设备,名称应该以plug:为前缀,以便让ALSA动态转换声音格式和采样率。 还应遵循安全ALSA子集的其他规则。

嗯,在问这个问题后我有更好的运气谷歌搜索,所以…: http : //workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html非常感谢作者。

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

FWIU,上面提到的补丁有更好的解决方案 – 不要求独家访问等。

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


基于FreeTTS的程序(Java的自由文本到语音引擎)偶尔会出现错误

 "LINE UNAVAILABLE: Format is ..." 

事实certificate,没有Javaexception或其他机制来检测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 

关于由Oracle搞砸的链接 – 考虑到旧的SO回答,你提到了可怕的java linux声音bug仍然没有修复并建议检查第三篇post ,很可能丢失的线程被迁移到:

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

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