[我正在尝试开发一个可以在Google默认的英国英语语音(en-gb-x-rjs-phone-hmm)和女性语音(en-gb-x-fis-phone-hmm)之间切换的应用。我正在使用两个Text-To-Speech对象,并且在为每个对象初始化引擎之后,使用setVoice(voice)为每个对象分配相应的语音。
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',所以这让我认为声音已正确存储。
[当我显示两个使它们说话的按钮时,两种情况下女性声音都会说话。我认为这是默认声音的事实。将女性声音作为默认声音会发生这种情况。当我将男性声音设置为默认声音时,情况恰好相反。
我应该知道我想念的东西...?
谢谢大家,
游戏晚了四年半,但我自己为此奋斗了。事实证明,只是因为语音显示在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
}
}
只要您确实有网络连接,也许您就可以摆脱使用非本地语音的麻烦,但是我并不认为尝试指定后备功能值得您付出努力,因此我只是将它们从我的清单中删除了可用。