Android TTS检查支持的区域设置是否缺少/未下载语音数据

时间:2017-06-18 20:13:57

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

我使用的是Android的TextToSpeech课程。一切正常。但是,默认情况下没有安装语言/语言环境,但TTS引擎支持这些语言/语言环境,我无法捕获丢失语音数据的状态。

启用互联网后,当我尝试将语言设置为其语音数据未下载的新语言环境时,它只需下载语音数据并正常/成功执行发言方法。

然而,在互联网关闭的情况下,当我尝试将语言设置为其语音数据未被下载的新语言环境时,它会尝试下载语音数据。但是没有互联网,它只是表示"下载"关于" TTS语音数据"设置屏幕"语言和输入"对于选定的区域设置,没有任何进展。正如预期的那样,由于语音数据没有被下载,所以说话方法不起作用。当发生这种情况时,我认为TTS方法setLanguage / isLanguageAvailable将返回LANG_MISSING_DATA以便我捕获此状态,但是,它只返回LANG_COUNTRY_AVAILABLE。情况如下图所示:enter image description here

我希望能够检测到所选区域设置的语音数据何时未下载/丢失,并提供Toast消息或直接用户下载它。我看过几篇帖子建议使用isLanguageAvailable这样one。我还查看了android documentation,看起来isLanguageAvailable的返回值应该使用LANG_MISSING_DATA捕获丢失的语音数据的状态。

我还尝试使用ACTION_CHECK_TTS_DATA发送一个intent,以检查我链接的Android文档中建议的丢失数据。但是,resultCode再次没有捕获/指示语音数据丢失(CHECK_VOICE_DATA_FAIL),而是返回CHECK_VOICE_DATA_PASS。

在这种情况下,如何在语音数据丢失的情况下捕获可用/支持的语言/语言环境的状态?我还好奇为什么CHECK_VOICE_DATA_PASS和LANG_MISSING_DATA不是返回的值。当语音数据丢失时,它不应该返回这些值吗?谢谢! 下面是我尝试在没有下载语音数据的语言环境中使用setLanguage和isLanguageAvailable时的返回值(0和1是日志中显示的方法的返回值,-1是对应于缺少语音数据):enter image description here

3 个答案:

答案 0 :(得分:5)

您可以使用以下功能查找设备的所有可用区域设置。希望这段代码可以帮到你。

 Locale loc = new Locale("en");
 Locale[] availableLocales= loc.getAvailableLocales();
 Boolean available=Boolean.FALSE;
 for (int i=0;i<availableLocales.length;i++)
 {
  if(availableLocales[i].getDisplayLanguage().equals("your_locale_language"))
   {
        available=Boolean.TRUE;
        // TODO:  
   }
 }

答案 1 :(得分:1)

看起来这是一个漫长的等待问题,但无论如何。您似乎必须检查语音功能才能找到它:

Set<String> features = voice.getFeatures();
if (features.contains(TextToSpeech.Engine.KEY_FEATURE_NOT_INSTALLED)) {
//Voice data needs to be downloaded
...
}

答案 2 :(得分:1)

我将此实现作为包装类的一部分与TextToSpeech一起使用,希望对您有所帮助:

public boolean isLanguageAvailable(Locale language)
{
    if(language == null) return false;
    boolean available = false;
    switch (tts.isLanguageAvailable(language))
    {
        case TextToSpeech.LANG_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
            if(Build.VERSION.SDK_INT >= 21){
                tts.setLanguage(language);
                Voice voice = tts.getVoice();
                if(voice != null){
                    Set<String> features = voice.getFeatures();
                    if (features != null && !features.contains(TextToSpeech.Engine.KEY_FEATURE_NOT_INSTALLED))
                        available = true;
                } else available = false;
                tts.setLanguage(this.language);
            }
            break;

        case TextToSpeech.LANG_MISSING_DATA:
        case TextToSpeech.LANG_NOT_SUPPORTED:
        default:
            break;
    }
    return available;
}