Как исправить ошибку "невозможно привести к com.sun.speech.freetts.VoiceDirectory"? - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь использовать FreeTTS в моей Java-программе (от https://freetts.sourceforge.io/docs/index.php), и я получаю эту ошибку: java.lang.ClassCastException: com.sun.speech.freetts.en.us.cmu_time_awb.AlanVoiceDirectory cannot be cast to com.sun.speech.freetts.VoiceDirectory

Я попытался повторно добавить файлы JAR Free TTS в мой проект иэто мой код:

import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;

public class TextToSpeech {
//String voiceName = "kevin16";
VoiceManager freeVM;
Voice voice;
public TextToSpeech(String words) {
    freeVM = VoiceManager.getInstance();
    voice = VoiceManager.getInstance().getVoice("kevin16");
    if (voice != null) {
        voice.allocate();//Allocating Voice
    }

    try {
        voice.setRate(190);//Setting the rate of the voice
        voice.setPitch(150);//Setting the Pitch of the voice
        voice.setVolume(3);//Setting the volume of the voice
        SpeakText(words);// Calling speak() method


    } catch (Exception e1) {
        e1.printStackTrace();
    }



}

public void SpeakText(String words) {
    voice.speak(words);
}

Я вызываю конструктор TextToSpeech из другого класса, как этот:

 new TextToSpeech("Hello World");

Буду признателен за любую помощь или совет!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Изменить конструктор TextToSpeech следующим образом:

public TextToSpeech(String words) {
    System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory");
    voice = VoiceManager.getInstance().getVoice("kevin16");
    if (voice != null) {
        voice.allocate();// Allocating Voice
        try {
            voice.setRate(190);// Setting the rate of the voice
            voice.setPitch(150);// Setting the Pitch of the voice
            voice.setVolume(3);// Setting the volume of the voice
            SpeakText(words);// Calling speak() method

        } catch (Exception e1) {
            e1.printStackTrace();
        }

    } else {
        throw new IllegalStateException("Cannot find voice: kevin16");
    }
}

Идея состоит в том, чтобы поручить халявам использовать com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory класс вместо AlanVoiceDirectory класса.

0 голосов
/ 26 октября 2018

Изменения кода:

вместо следующей строки

freeVM = VoiceManager.getInstance();
voice = VoiceManager.getInstance().getVoice("kevin16");

Изменить на

freeVM = VoiceManager.getInstance();
voice = freeVM.getVoice("kevin16");

Ссылка на образец базы кода, приведенный здесь: FreeTTS невозможеннайти любой голос

...