1

当我textToMp3()第二次尝试调用方法时,我得到了 IllegalStateException。我试着只关闭播放器,我只尝试结束它,你可以看到它仍然不起作用。它总是适用于我第一次调用该方法并且在第二次调用后总是抛出异常。你知道为什么吗?

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)
4

1 回答 1

0

在不了解您的库的使用情况的情况下,您似乎voice在构造函数中设置了一个变量,然后在textToMp3您调用的方法中设置了voice.deallocate. 这意味着如果您textToMp3在同一个 Java 对象上调用两次,它将尝试使用已释放的语音。

您还将voiceManagerand存储voicestatic类字段,但看起来您使用的代码只有在它们是实例变量的情况下才能工作。您可能应该更改它,以便将它们称为实例字段,以便您可以构造一个类并每次都访问它。

于 2021-04-15T19:31:50.290 回答