首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用freetts生成2个tts文件时出现异常

尝试使用freetts生成2个tts文件时出现异常
EN

Stack Overflow用户
提问于 2021-04-14 23:10:02
回答 1查看 24关注 0票数 1

当我第二次尝试调用方法textToMp3()时,我得到了IllegalStateException。我试着只关闭播放器,我只试着结束它,正如你所看到的,它仍然不起作用。当我第一次调用这个方法,并且总是在第二次调用time.Do之后抛出excetion时,它总是起作用。你知道为什么吗?

代码语言:javascript
复制
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);
    }
}

这里有个例外

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-04-16 03:31:50

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

您还将voiceManagervoice存储为static类字段,但是您使用的代码似乎只有在它们是实例变量的情况下才能工作。您可能应该更改这一点,以便它们被称为实例字段,这样您就可以构造一个类并在每次访问它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67094334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档