我正在尝试使用可在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'因此,这让我觉得声音被正确存储。
当我显示两个按钮让他们说话时,女性的声音在两种情况下说话。我认为这是默认语音的事实。这种情况发生时将女性声音作为默认声音。当我将男性声音设置为默认声音时,恰好相反。
我应该知道我缺少的东西......?
谢谢大家,
答案 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
}
}
只要您实际上已经建立了网络连接,也许您就可以摆脱使用非本地语音的困扰,但是我并不认为尝试指定后备功能值得您付出努力,因此我只是将它们从清单中删除了可用商品。