Файл Java TTS (преобразование текста в речь) voice.properties

Я работаю над компьютерным помощником, а это значит, что он должен распознавать мой голос и давать обратную связь или делать что-то, обратная связь должна быть голосом, сгенерированным компьютером. Я знаю, что внутри самой 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();
        }
    }

От: преобразование текста в речевой код Java

Когда я выполняю код, это вызывает ошибку, потому что файл voice.properties не найден, он должен быть в моем каталоге пользователей. Проблема в том, что я не знаю, откуда взять этот файл или что должно быть в этом файле, кто-нибудь может мне помочь?

Кроме того, было бы здорово, если бы кто-нибудь мог прислать мне ссылку на хороший учебник по речи, я искал в Интернете, но его трудно найти!


person Tim Visée    schedule 30.12.2012    source источник


Ответы (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");

Эти строки обходят необходимость в этом надоедливом файле voice.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();
    }
}
person Victor Stafusa    schedule 25.01.2013