TextToSpeech:检查它是否在线或离线用于API< 21

时间:2016-06-06 17:42:07

标签: 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< 21, getFeatures(Locale loc)方法以及 TextToSpeech 类,它应该返回一个具有不同特征描述的字符串数组。我在不同的引擎和语言环境中尝试了最后一种方法,我通常得到一个空数组。可能这是TTS开发人员可以填写或不填写的额外信息......

那么,我怎么知道tts-locale是否是API的在线版本< 21?

1 个答案:

答案 0 :(得分:3)

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

通常要请求此项,您需要包含:

put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, String.valueOf(shouldNetwork()));

他们的网络合成声音过去质量明显较高,但最近这些声音的改进并不那么明显。

Text to Speech引擎提供的信息API<正如你在isLanguageAvailable(Locale loc)的电话中注意到大多数引擎报错的情况一样,21是绝望和一般错误的。新API尝试解决此问题,因此您将难以使用API​​< 21获取您可以信赖的详细信息。查看my answer on this question,了解如何查询元素。

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

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

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**]] 

所以,你的代码会认为这个引擎会起作用而且它不会......这非常令人沮丧,还有我未经回答的错误报告给他们。

上述所有内容都说明,当您第一次尝试使用引擎时,您可能需要依靠简单的通知,点击时会显示您应用的常见问题解答 - 在常见问题解答中您将解释为如果引擎不说话,请检查安装和下载.......

令人沮丧的是,我无法为您发布一切简单的代码片段。