【问题标题】:Java TTS (Text To Speech) speech.properties fileJava TTS(文本到语音)speech.properties 文件
【发布时间】:2014-08-14 15:21:21
【问题描述】:

我正在开发 PC 助手,这意味着它应该能够识别我的声音并给出反馈或做事,反馈应该是计算机生成的声音。 我知道 Java 本身有一种方法可以实现这一点,例如使用 javax.speech。这个声音质量不是很好,但它不需要各种库,应该很容易使用。我目前有这个原型代码:

    public static void speech(String text) {
        if(text.trim() == "")
            return;

        String voiceName = "kevin16";

        try {
            SynthesizerModeDesc desc = new SynthesizerModeDesc(null, "general", Locale.US, null, null);
            Synthesizer synth = Central.createSynthesizer(desc);
            synth.allocate();
            synth.resume();
            desc = (SynthesizerModeDesc) synth.getEngineModeDesc();
            Voice[] voices = desc.getVoices();
            Voice voice = null;
            for(Voice entry : voices) {
                if(entry.getName().equals(voiceName)) {
                    voice = entry;
                    break;
                }
            }
            synth.getSynthesizerProperties().setVoice(voice);
            synth.speakPlainText(text, null);
            synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
            synth.deallocate();

        } catch(Exception ex) {
            String message = " missing speech.properties in " + System.getProperty("user.home") + "\n";
            System.out.println("" + ex);
            System.out.println(message);
            ex.printStackTrace();
        }
    }

发件人:converting text to speech java code

当我执行代码时它会导致错误,那是因为找不到文件 speech.properties,它应该在我的用户目录中。问题是我不知道从哪里得到这个文件,或者这个文件应该是什么,有人可以帮我吗?

另外,如果有人能给我一个好的演讲教程的链接,那就太好了,我在网上搜索过,但很难找到!

【问题讨论】:

    标签: java speech text-to-speech


    【解决方案1】:

    我可以通过一些更改来修复您的示例。

    首先,我在 try-catch 块的开头添加了这些行:

            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");
    

    这些行绕过了对那个讨厌的 speech.properties 文件的需求。

    其次,语音名称是“kevin16”,而不是“kelvin16”。

    第三,我将synth.resume() 移到synth.getSynthesizerProperties().setVoice(voice) 行之后。这是因为如果没有预定义的声音,它就无法开始说话。

    第四,您的if(text.trim() == "") 不好,因为使用== 比较字符串不是一个好主意。

    这是生成的代码:

    public static void speech(String text) {
        if (text == null || text.trim().isEmpty()) return;
    
        String voiceName = "kevin16";
    
        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 synth = Central.createSynthesizer(desc);
            synth.allocate();
            desc = (SynthesizerModeDesc) synth.getEngineModeDesc();
            Voice[] voices = desc.getVoices();
            Voice voice = null;
            for (Voice entry : voices) {
                if(entry.getName().equals(voiceName)) {
                    voice = entry;
                    break;
                }
            }
            synth.getSynthesizerProperties().setVoice(voice);
            synth.resume();
            synth.speakPlainText(text, null);
            synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
            synth.deallocate();
    
        } catch(Exception ex) {
            String message = " missing speech.properties in " + System.getProperty("user.home") + "\n";
            System.out.println("" + ex);
            System.out.println(message);
            ex.printStackTrace();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2012-04-20
      • 2014-01-18
      相关资源
      最近更新 更多