2017-08-23 53 views
2

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

我已经试过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

这种情况的发生是因为默认情况下,每个语音都有一个区域值,该值覆盖您在函数上设置的区域值。我认为你可以通过创建一个新的语音实例来覆盖它,通过覆盖for循环中的语言环境属性来创建一个与你想要的设置相同的语音实例,如下所示:

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