Java 文本到语音-多个呼叫

Java 文本到语音-多个呼叫,java,text-to-speech,Java,Text To Speech,我正在写一个文本到语音的程序。如果只对类进行一次调用,那么它就可以正常工作,如下所示: Text2Speech obj=new Text2Speech(); obj.dospeak("Hello this actually works","kevin16"); 但当我尝试将同一实例用于另一行时,它会给出一个错误: Text2Speech obj=new Text2Speech(); obj.dospeak("Hello this actually works","kevin16"); obj.

我正在写一个文本到语音的程序。如果只对类进行一次调用,那么它就可以正常工作,如下所示:

Text2Speech obj=new Text2Speech();
obj.dospeak("Hello this actually works","kevin16");
但当我尝试将同一实例用于另一行时,它会给出一个错误:

Text2Speech obj=new Text2Speech();
obj.dospeak("Hello this actually works","kevin16");
obj.dospeak("second line", "kevin16");
java.lang.IllegalThreadStateException>

C:\Users\user'中缺少speech.properties

即使创建一个新对象也会产生同样的错误。同样,它也适用于对dospeak()方法的第一次调用;这是第二行不会被读出的

以下是源代码:

import javax.speech.*;
import java.util.*;
import javax.speech.synthesis.*;

public class Text2Speech{
String speaktext;
public void dospeak(String speak,String  voicename)
{
    speaktext=speak;
    String voiceName = voicename;
    try
    {

        SynthesizerModeDesc desc = new SynthesizerModeDesc(null,"general",  Locale.US,null,null);
        Synthesizer synthesizer =  Central.createSynthesizer(desc);
        synthesizer.allocate();
        desc = (SynthesizerModeDesc)  synthesizer.getEngineModeDesc();
        Voice[] voices = desc.getVoices();
        Voice voice = null;
        for (int i = 0; i < voices.length; i++)
        {
            if (voices[i].getName().equals(voiceName))
            {
                voice = voices[i];
                break;
            }
        }
        synthesizer.getSynthesizerProperties().setVoice(voice);
        synthesizer.resume();
        System.out.print("Speaking : "+speaktext);
        synthesizer.speakPlainText(speaktext, null);
        synthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY);
        synthesizer.deallocate();
        System.setProperty("FreeTTSSynthEngineCentral", "com.sun.speech.freetts.jsapi.FreeTTSEngineCentral");
        System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory");
        Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral");
    }
    catch (Exception e)
    {
        String message = " missing speech.properties indf " + System.getProperty("user.home") + "\n";
        System.out.println(""+e);
        System.out.println(message);
    }
}

public static void main(String[] args)
{
    Text2Speech obj=new Text2Speech()
    obj.dospeak("Hello i am kevin ","kevin16");
    obj.dospeak("second line", "kevin16");
}
}
import javax.speech.*;
导入java.util.*;
导入javax.speech.synthesis.*;
公共类Text2Speech{
字符串speaktext;
公共语音(字符串语音、字符串语音名称)
{
speaktext=说话;
字符串voiceName=voiceName;
尝试
{
synthezermodedesc desc=新的synthezermodedesc(null,“general”,Locale.US,null,null);
合成器合成器=中心.createSynthesizer(desc);
synthesizer.allocate();
desc=(SynthesizerModeDesc)synthesizer.getEngineModeDesc();
Voice[]voices=desc.getVoices();
语音=空;
for(int i=0;i
试试这个而不是“dospeak”。它对我很有用:

 public void dospeak(String speak,String  voicename)
{
    speaktext=speak;
    String voiceName =voicename;

    try
    {   System.setProperty("FreeTTSSynthEngineCentral", "com.sun.speech.freetts.jsapi.FreeTTSEngineCentral");
        System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory");
        Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral");
        SynthesizerModeDesc desc = new SynthesizerModeDesc(null,"general",  Locale.US,null,null);
        Synthesizer synthesizer =  Central.createSynthesizer(desc);
        EngineList engineList = Central.availableSynthesizers(desc);

        EngineCreate creator = (EngineCreate)engineList.get(0);

        List<Synthesizer> bagOfSynthesizers = new LinkedList<Synthesizer>();

        int numberSynthesizers=1;
        for (int i = 0; i < numberSynthesizers; i++) {
            synthesizer = (Synthesizer)creator.createEngine();
            bagOfSynthesizers.add(synthesizer);
            synthesizer.allocate();
            synthesizer.resume();
            desc = (SynthesizerModeDesc)  synthesizer.getEngineModeDesc();
        }




        Voice[] voices = desc.getVoices();
        Voice voice = null;
        for (int i = 0; i < voices.length; i++)
        {
            if (voices[i].getName().equals(voiceName))
            {
                voice = voices[i];
                break;
            }
        }
        synthesizer.getSynthesizerProperties().setVoice(voice);
        System.out.print("Speaking : "+speaktext);
        synthesizer.speakPlainText(speaktext, null);
        synthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY);
        synthesizer.deallocate();


    }
    catch (Exception e)
    {
        String message = " missing speech.properties in " + System.getProperty("user.home") + "\n";
        System.out.println(""+e);
        System.out.println(message);
    }
}
public void-dospeak(字符串语音、字符串语音名称)
{
speaktext=说话;
字符串voiceName=voiceName;
尝试
{System.setProperty(“freettsssynthenginecentral”、“com.sun.speech.freetts.jsapi.FreeTTSEngineCentral”);
System.setProperty(“freetts.voices”、“com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory”);
registerEngineCentral(“com.sun.speech.freetts.jsapi.FreeTTSEngineCentral”);
synthezermodedesc desc=新的synthezermodedesc(null,“general”,Locale.US,null,null);
合成器合成器=中心.createSynthesizer(desc);
EngineList EngineList=Central.AvailablesSynthesizers(描述);
EngineCreate创建者=(EngineCreate)engineList.get(0);
List bagOfSynthesizers=新建LinkedList();
int numberSynthesizers=1;
for(int i=0;i
假设每个可能的异常都是由缺少的
speech.properties造成的,这可能是一个错误。。。Java做堆栈跟踪吗?这能告诉你什么吗?好的,谢谢。从那以后,最有用的错误跟踪是Java线程类“if(threadStatus!=0)throw new IllegalThreadStateException();”这可能是线程问题吗???最好使用openmary,openmary声音听起来也更好。好的,谢谢@NikolayShmyrev,我会记住这一点。但是程序还没有完全运行,当我尝试运行两个类调用时,仍然会出现错误。