【问题标题】:android TextToSpeech; switching between male and female voices安卓文本转语音;在男声和女声之间切换
【发布时间】:2015-08-29 23:14:24
【问题描述】:

我正在尝试做一个应用程序,它可以在谷歌默认的英国男声 (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',所以这让我觉得声音被正确存储了。

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

我应该知道我错过了什么......?

谢谢大家,

【问题讨论】:

  • 请在您的帖子中包含what you have tried
  • 我有一个相关的问题,但不是您问题的答案。有没有办法找出代码的含义?我得到诸如“en-gb-x-fis”和“en-GB-fis-network”之类的字符串,并希望为每个声音提供一个显示名称。

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


【解决方案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
    }
}

只要您确实有网络连接,也许您可​​以摆脱使用非本地语音,但我不觉得尝试指定一个后备是值得的,所以我只是将它们从我的列表中删除可用的。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2021-04-21
    • 2012-04-06
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2018-04-28
    相关资源
    最近更新 更多