1

私はPCアシスタントに取り組んでいます。つまり、PCアシスタントは私の声を認識してフィードバックを提供したり、何かをしたりする必要があります。フィードバックはコンピューターで生成された音声である必要があります。たとえばjavax.speechを使用して、これを実現する方法がJava自体の内部にあることを私は知っています。この音声は実際には高品質ではありませんが、すべての種類のライブラリを必要とせず、使いやすいはずです。私は現在このプロトタイプコードを持っています:

    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();
        }
    }

From:テキストを音声合成Javaコードに変換する

コードを実行するとエラーが発生します。これは、speech.propertiesファイルが見つからないため、usersディレクトリにあるはずです。問題は、このファイルをどこから取得するか、またはこのファイルに何を含めるべきかわからないことです。誰かが私を助けてくれますか?

また、誰かが私に良いスピーチチュートリアルへのリンクを送ってくれるといいのですが、私はウェブを検索しましたが、見つけるのは難しいです!

4

1 に答える 1

4

ほんの少しの変更であなたの例を修正することができます。

まず、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();
    }
}
于 2013-01-25T20:38:25.350 に答える