gpt4 book ai didi

java - 多个线程不能同时工作

转载 作者:行者123 更新时间:2023-12-01 22:58:32 25 4
gpt4 key购买 nike

我有一个 java 程序,在其中使用 TTS(文本到语音),同时我希望在屏幕上显示一个动画 gif。我正在使用 Netbeans GUI 构建器,因此我创建了一个新的 jpanel 表单,并在该表单(java jpanel 表单)的标签中添加了 gif,之后我添加了这个java作为我的主java文件的jpanel(通过拖放)。但问题是,一旦 TTS 开始说话,GIF 动画就会停止。如何使其协同工作?注意:我使用 freeTTS 将文本转换为语音

代码:

private static final String VOICENAME = "kevin16";
VoiceManager voiceManager = VoiceManager.getInstance();
.....
........
Voice voice;
voice = voiceManager.getVoice(VOICENAME);
voice.allocate();
....//Some code here
t4.setText("" + ran);
voice.speak(t4.getText());
listenanum.setText("" + d);
listenanum.setVisible(false);

最佳答案

我必须查找 FreeTTS Javadoc,它证实了我的想法。

Voice 上的 speak 方法会阻塞,直到语音文本完成。方法 speak(String) 调用 speak(FreeTTSSpeakable talkable),其中包含以下 Javadoc:

Speak the given queue item. This is a synchronous method that does not return until the speakable is completely spoken or has been cancelled.

但是,在 Swing 中,只要您在 UI 线程中做一件事,它就不能做其他事情。因此你的动画将会停止,因为它还需要 UI 线程来重新绘制图像。

也许解决此问题的最佳方法是深入研究语音 API 并使用 Voice 上的 processUtterance(Utterance u) 方法。该方法是异步的;当语音在不同的语音输出线程上完成时,它会立即返回。

但是,一个更简单的解决方案是在不同的线程上调用 speak 方法。

final String textToSpeak = t4.getText();
Thread speechThread = new Thread(new Runnable() {
public void run() {
voice.speak(textToSpeak);
}
});
speechThread.start();

实际上,使用线程池比每次启动一个新线程更好,但这超出了您眼前的问题。您可以搜索 StackOverflow 或查看 java.util.concurrent.ThreadPoolExecutor 了解更多信息。

关于java - 多个线程不能同时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com