TextToSpeech Android

时间:2017-08-23 06:14:55

标签: android text-to-speech

是否有可能为TTS设置自定义语音,如女婴的声音?

我尝试过getVoices(),如下所示,

if (Build.VERSION.SDK_INT >= 21) {
    Set<Locale> localeSet = tts.getAvailableLanguages();
    for (Locale locale : localeSet) {
        Log.v(TAG, locale.getDisplayName() + " - " + locale.getDisplayLanguage() + " - " + locale.getCountry());
        if (locale.getDisplayLanguage().equals("Tamil")) {
            result = tts.setLanguage(locale);
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS", "This Language is not supported");
            } else {
                tts.setSpeechRate(0.05f);
                //tts.setPitch(5.0f);
                fabSpeak.setEnabled(true);
                speakOut();
            }
        }
    }

    Set<Voice> voices = tts.getVoices();
    for (Voice voice : voices) {
        Log.v(TAG, voice.getName());
        if (voice.getName().equals("hi-in-x-cfn#female_2-local")) {
            tts.setVoice(voice);
        }
    }
}

但是这个声音取代了语言,所以这段代码不再读泰米尔语了。如果我对setVoice()发表评论,那么就会用默认的男声来读泰米尔语。

我希望这个女性的声音可以阅读这个给定的文字。有可能吗?

1 个答案:

答案 0 :(得分:1)

出现这种情况是因为默认情况下,每个Voice都有一个Locale值,该值会覆盖您在函数上设置的Locale值。我认为您可以通过在for循环中覆盖Locale属性来创建一个与所需设置相同的新Voice实例来覆盖它:

for (Voice voice: voices) {
 Log.v(TAG, voice.getName());
 if (voice.getName().equals("hi-in-x-cfn#female_2-local")) {
  tts.setVoice(new Voice(voice.getName(),
   locale, // YOUR LOCALE GOES HERE
   voice.getQuality(),
   voice.getLatency(),
   voice.isNetworkConnectionRequired(),
   voice.getFeatures()));
 }
}