Android TextToSpeech:检查API是在线还是离线<;21

Android TextToSpeech:检查API是在线还是离线<;21,android,android-5.0-lollipop,text-to-speech,voice,google-text-to-speech,Android,Android 5.0 Lollipop,Text To Speech,Voice,Google Text To Speech,我正在尝试实现一个可以阅读不同语言文本的应用程序。令人惊讶的是,当我使用isLanguageAvailable(Locale loc)方法时,对于Google TTS列表中尚未下载的语言,它返回true。当我调用speak()方法时,它们甚至被播放。我的结论是,这是因为它们是在线声音 文档显示,您可以通过voice对象使用getFeatures()方法了解语音是否在线。然而,语音类是为API>=21实现的。对于API

我正在尝试实现一个可以阅读不同语言文本的应用程序。令人惊讶的是,当我使用isLanguageAvailable(Locale loc)方法时,对于Google TTS列表中尚未下载的语言,它返回true。当我调用speak()方法时,它们甚至被播放。我的结论是,这是因为它们是在线声音

文档显示,您可以通过voice对象使用getFeatures()方法了解语音是否在线。然而,语音类是为API>=21实现的。对于API<21,在TextToSpeech类上还有一个getFeatures(Locale loc)方法,该方法应该返回一个具有不同功能描述的字符串数组。我在不同的引擎和地区尝试了最后一种方法,通常得到的是一个空数组。也许,这是TTS开发人员可以填写或不填写的额外信息


因此,我如何知道tts语言环境是否是API<21的在线语言环境?

谷歌文本语音引擎的独特之处在于,如果用户没有安装额外的“离线”下载,它可以使用网络合成语音

通常情况下,您需要包括:

put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, String.valueOf(shouldNetwork()));
他们的网络合成语音过去的质量明显更高,但最近随着他们的改进,这一点就不那么明显了

API<21提供的文本到语音引擎的信息是毫无希望的,而且通常是错误的,正如您在调用
isLanguageAvailable(Locale loc)
时所注意到的那样,它对大多数引擎的报告都是错误的。新的API试图解决这一问题,因此您将在API<21中挣扎,以获得您可以依赖的详细信息。查看如何查询元素

在撰写本文时,即使使用了新的API,引擎也提供了不正确的信息

例如,当查询
getVoices()
时,IVONA返回类似于:

Voice[Name: en-US, locale: en_US, quality: 300, latency: 300, requiresNetwork: false, features: [embeddedTts]] 
但它忽略了:

Voice[Name: en-US, locale: en_US, quality: 300, latency: 300, requiresNetwork: false, features: [embeddedTts, **notInstalled**]] 
因此,您的代码将假定此引擎将工作,但它不会。。。。这很让人沮丧,还有我给他们的未答复的bug报告

综上所述,当你第一次尝试与引擎对话时,你可能不得不求助于一个简单的通知,当你点击时,就会出现你应用程序的常见问题解答-在常见问题解答中,你会解释如果引擎不说话,请检查安装和下载

令人沮丧的是,我无法为您发布一个简单的代码片段,而这一切都可以正常工作