当我第二次尝试调用方法textToMp3()时,我得到了IllegalStateException。我试着只关闭播放器,我只试着结束它,正如你所看到的,它仍然不起作用。当我第一次调用这个方法,并且总是在第二次调用time.Do之后抛出excetion时,它总是起作用。你知道为什么吗?
public class TextToSpeech {
static VoiceManager manager;
static Voice voice;
public TextToSpeech() {
manager = VoiceManager.getInstance();
Voice[] voices = new MbrolaVoiceDirectory().getVoices();
voice = voices[0];
assert voice != null;
voice.allocate();
}
public File textToMp3(String text, String filename) throws IOException {
File dir = new File("atis");
if (!dir.exists()) dir.mkdir();
SingleFileAudioPlayer player = new SingleFileAudioPlayer(dir.getName() + "\\"+ filename, AudioFileFormat.Type.WAVE);
player.setVolume(100);
voice.setAudioPlayer(player);
voice.setRate(125);
voice.speak(text);
voice.deallocate();
player.end();
player.close();
return new File(dir.getName() + "\\"+ filename);
}
}这里有个例外
Trouble while processing utterance java.lang.IllegalStateException: output queue closed
java.lang.IllegalStateException: output queue closed
at com.sun.speech.freetts.OutputQueue.post(OutputQueue.java:53)
at com.sun.speech.freetts.Voice.processUtterance(Voice.java:424)
at com.sun.speech.freetts.Voice.speak(Voice.java:289)
at com.sun.speech.freetts.Voice.speak(Voice.java:235)
at LavaPlayer.TextToSpeech.textToMp3(TextToSpeech.java:42)
at Commands.Atis.onGuildMessageReceived(Atis.java:179)
at net.dv8tion.jda.api.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:463)
at net.dv8tion.jda.api.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:96)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handleInternally(EventManagerProxy.java:88)
at net.dv8tion.jda.internal.hooks.EventManagerProxy.handle(EventManagerProxy.java:70)
at net.dv8tion.jda.internal.JDAImpl.handleEvent(JDAImpl.java:158)
at net.dv8tion.jda.internal.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:97)
at net.dv8tion.jda.internal.handle.SocketHandler.handle(SocketHandler.java:36)
at net.dv8tion.jda.internal.requests.WebSocketClient.onDispatch(WebSocketClient.java:952)
at net.dv8tion.jda.internal.requests.WebSocketClient.onEvent(WebSocketClient.java:839)
at net.dv8tion.jda.internal.requests.WebSocketClient.handleEvent(WebSocketClient.java:817)
at net.dv8tion.jda.internal.requests.WebSocketClient.onBinaryMessage(WebSocketClient.java:990)
at com.neovisionaries.ws.client.ListenerManager.callOnBinaryMessage(ListenerManager.java:385)
at com.neovisionaries.ws.client.ReadingThread.callOnBinaryMessage(ReadingThread.java:276)
at com.neovisionaries.ws.client.ReadingThread.handleBinaryFrame(ReadingThread.java:996)
at com.neovisionaries.ws.client.ReadingThread.handleFrame(ReadingThread.java:755)
at com.neovisionaries.ws.client.ReadingThread.main(ReadingThread.java:108)
at com.neovisionaries.ws.client.ReadingThread.runMain(ReadingThread.java:64)
at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)发布于 2021-04-16 03:31:50
在不太了解您的库的用法的情况下,看起来您正在构造函数中设置一个voice变量,然后在textToMp3方法中调用voice.deallocate。这意味着如果您在同一个Java对象上调用textToMp3两次,它将尝试使用一个已释放的声音。
您还将voiceManager和voice存储为static类字段,但是您使用的代码似乎只有在它们是实例变量的情况下才能工作。您可能应该更改这一点,以便它们被称为实例字段,这样您就可以构造一个类并在每次访问它。
https://stackoverflow.com/questions/67094334
复制相似问题