android TextToSpeech;在男声和女声之间切换

问题描述 投票:2回答:1

[我正在尝试开发一个可以在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',所以这让我认为声音已正确存储。

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

我应该知道我想念的东西...?

谢谢大家,

android text-to-speech google-text-to-speech
1个回答
0
投票

游戏晚了四年半,但我自己为此奋斗了。事实证明,只是因为语音显示在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
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.