android TextToSpeech;切换男女声音

时间:2015-06-14 10:59:52

标签: android text-to-speech google-text-to-speech

我正在尝试使用可在Google默认的英国男声(en-gb-x-rjs-phone-hmm)和女声(en-gb-x-fis)之间切换的应用-phone-HMM)。我正在使用两个Text-To-Speech对象,在为每个对象初始化引擎后,我使用setVoice(语音)为每个对象分配相应的语音。

 mTTS1 = new TextToSpeech(this, onInitListener, packname);
 mTTS2 = new TextToSpeech(this, onInitListener, packname);

在onInit()方法中,当两者都被初始化时:

 mTTS1.setVoice(voice1);
 mTTS2.setVoice(voice2);

' voice1'和' voice2'获得调用getVoices(),当我得到语音名称时,我获得' en-gb-x-rjs-phone-hmm'和' en-gb-x-fis-phone-hmm'因此,这让我觉得声音被正确存储。

当我显示两个按钮让他们说话时,女性的声音在两种情况下说话。我认为这是默认语音的事实。这种情况发生时将女性声音作为默认声音。当我将男性声音设置为默认声音时,恰好相反。

我应该知道我缺少的东西......?

谢谢大家,

1 个答案:

答案 0 :(得分:1)

比赛迟到了四年半,但我自己为此奋斗了。事实证明,只是因为语音显示在getVoices()中,没有被isNetworkConnectionRequired标记,并且TTS isLanguageAvailable()方法不包含LANG_MISSING_DATA或LANG_NOT_SUPPORTED,并不意味着它已经可以使用。而且,如果您尝试设置尚未准备好的声音,则TTS引擎会退回到默认值。

我要做的是检查所有这些,然后确保该声音上没有任何遗漏的功能(在Kotlin中,成功初始化后,tts是我的TextToSpeech对象):

var availableVoices = tts.voices
var availableLocales:List<Locale> = Locale.getAvailableLocales().toList()
for (v:Voice in availableVoices){
    if (v.locale.language == Locale.getDefault().language &&
        availableLocales.contains(v.locale) &&
        !v.isNetworkConnectionRequired &&
        tts.isLanguageAvailable(v.locale)!=TextToSpeech.LANG_MISSING_DATA &&
        tts.isLanguageAvailable(v.locale)!=TextToSpeech.LANG_NOT_SUPPORTED &&
        !(v.features.contains(TextToSpeech.Engine.KEY_FEATURE_NOT_INSTALLED))
    ){
        // voice is ready to use
    }
}

只要您实际上已经建立了网络连接,也许您就可以摆脱使用非本地语音的困扰,但是我并不认为尝试指定后备功能值得您付出努力,因此我只是将它们从清单中删除了可用商品。