我使用的是Android的TextToSpeech课程。一切正常。但是,默认情况下没有安装语言/语言环境,但TTS引擎支持这些语言/语言环境,我无法捕获丢失语音数据的状态。
启用互联网后,当我尝试将语言设置为其语音数据未下载的新语言环境时,它只需下载语音数据并正常/成功执行发言方法。
然而,在互联网关闭的情况下,当我尝试将语言设置为其语音数据未被下载的新语言环境时,它会尝试下载语音数据。但是没有互联网,它只是表示"下载"关于" TTS语音数据"设置屏幕"语言和输入"对于选定的区域设置,没有任何进展。正如预期的那样,由于语音数据没有被下载,所以说话方法不起作用。当发生这种情况时,我认为TTS方法setLanguage / isLanguageAvailable将返回LANG_MISSING_DATA以便我捕获此状态,但是,它只返回LANG_COUNTRY_AVAILABLE。情况如下图所示:
我希望能够检测到所选区域设置的语音数据何时未下载/丢失,并提供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是对应于缺少语音数据):
答案 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;
}