使用 kevin 或 mbrola 时 Freetts 的例外情况
我正在尝试使用 freetts 运行一个程序。我能够编译该程序,但无法使用 kevin 或 mbrola 声音 我在最后得到以下输出消息
系统属性“mbrola.base”未定义。不会使用 MBROLA 声音。
行不可用:格式为 pcm_signed 16000.0 Hz 16 位 1 通道大端
import javax.speech.*;
import javax.speech.synthesis.*;
import java.util.*;
class freetts {
public static void main(String[] args) {
try{
Calendar calendar = new GregorianCalendar();
String sayTime = "It is " + calendar.get(Calendar.HOUR) + " " + calendar.get(Calendar.MINUTE) + " " + (calendar.get(Calendar.AM_PM)==0 ? "AM":"PM");
Synthesizer synth = Central.createSynthesizer(null);
synth.allocate();
synth.resume();
synth.speakPlainText(sayTime, null);
synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
synth.deallocate();
}
catch(Exception e){
e.printStackTrace();
}
}
}
I am trying to run a program using freetts. I am able to compile the program however I am not able to use kevin or mbrola voices I get the follwing output message at the end
System property "mbrola.base" is undefined. Will not use MBROLA voices.
LINE UNAVAILABLE: Format is pcm_signed 16000.0 Hz 16 bits 1 channel big endian
import javax.speech.*;
import javax.speech.synthesis.*;
import java.util.*;
class freetts {
public static void main(String[] args) {
try{
Calendar calendar = new GregorianCalendar();
String sayTime = "It is " + calendar.get(Calendar.HOUR) + " " + calendar.get(Calendar.MINUTE) + " " + (calendar.get(Calendar.AM_PM)==0 ? "AM":"PM");
Synthesizer synth = Central.createSynthesizer(null);
synth.allocate();
synth.resume();
synth.speakPlainText(sayTime, null);
synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
synth.deallocate();
}
catch(Exception e){
e.printStackTrace();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
似乎“要启用对 MBROLA 的 FreeTTS 支持,只需将 mbrola/mbrola.jar 复制到 lib/mbrola.jar。然后,每当您运行任何 FreeTTS 应用程序时,请将“mbrola.base”目录指定为系统属性:
我发现了这个位于:
http://freetts.sourceforge.net/mbrola/README.html
It seems that "To enable FreeTTS support for MBROLA, merely copy mbrola/mbrola.jar to lib/mbrola.jar. Then, whenever you run any FreeTTS application, specify the "mbrola.base" directory as a system property:
I found this at:
http://freetts.sourceforge.net/mbrola/README.html
http://workorhobby.blogspot.com/2011/02 /java-audio-freetts-line-unavailable.html
非常感谢作者。
基于 FreeTTS(Java 的免费文本转语音引擎)的程序偶尔会出现错误
事实证明,没有 Java 异常或其他机制来检测 FreeTTS 库内部发生的此错误。您得到的只是 System.out 上的消息,因此没有好的方法以编程方式做出反应。
解决方法:将 FreeTTS 音频播放器配置为多次尝试访问音频设备,直至成功。本例中使用了0.1秒的短暂延迟,以免错过抢占音频设备的机会;我们继续尝试30秒:
如果音频设备被另一个程序永久使用,当然无法访问。在 Linux 下,此命令将显示当前持有音频设备的进程的 ID,因此您可以尝试删除有问题的程序:
http://workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html
A big thanks to the author.
A program based on FreeTTS, the free text-to-speech engine for Java, was getting occasional errors
Turns out there is no Java Exception or other mechanism to detect this error that occurs inside the FreeTTS library. All you get is the message on System.out, so there is no good way to react programatically.
Workaround: Configure the FreeTTS audio player to attempt accessing the audio device more than once until it succeeds. In this example, a short delay of 0.1 seconds is used to not miss an opportunity to grab the audio device; we keep trying for 30 seconds:
If the audio device is permanently used by another program, there is of course no way to get access. Under Linux, this command will display the ID of the process that is currently holding the audio device, so you can then try to get rid of the offending program:
第二个短语与 mbrola 无关,但与一个可怕的 java linux 声音错误有关,该错误仍未修复。
在这里查看第三篇文章:
https://forums.oracle.com/forums/thread.jspa?threadID= 2206163
发生这种情况是因为 freetts“信任”sourcedataline,而不是在该帖子上执行解决方法。该错误存在于 jdk 中,但可以通过查找 freetts 中发生的位置并插入解决方法来解决此问题。重新编译。
这是一个测试用例
The second phrase has nothing to do with mbrola, but with a horrendous java linux sound bug that is still not fixed.
Check the third post here:
https://forums.oracle.com/forums/thread.jspa?threadID=2206163
That is happening because freetts "trusts" the sourcedataline, instead of doing the workaround on that post. The bug is in the jdk, but can be worked around by finding where in freetts that is happening and inserting the workaround & recompiling.
Here is a testcase
我知道我发布的有点晚了,但这可能会对某人有所帮助。我尝试了凯文和姆布罗拉,这对我有用。请找到下面的代码。
并将以下依赖项添加到您的 pom.xml 文件中。
希望这会有所帮助。
I know i am posting it little late, but this may help someone. I tried with both kevin and mbrola, and it worked for me. Please find the code below.
And add the below dependencies to your pom.xml file.
Hope this will be helpful.