5

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

文档显示,您可以通过 Voice 对象使用方法getFeatures()来了解语音是否在线。但是,Voice类是为 API >= 21 实现的。对于 API < 21,还有一个getFeatures(Locale loc)方法,它覆盖TextToSpeech类,它应该返回一个具有不同特征描述的字符串数组。我已经在不同的引擎和语言环境上尝试了最后一种方法,但我通常得到一个空数组。大概,这是TTS开发者可以填写或不填写的额外信息……

那么,我怎么知道 tts 语言环境是否是 API < 21 的在线语言环境?

4

1 回答 1

3

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

通常要请求这个,你会包括:

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

他们的网络合成声音过去具有明显更高的质量,但随着最近的改进,这一点变得不那么明显了。

文本到语音引擎提供的 API < 21 的信息是无望的,而且一般是错误的,正如您从isLanguageAvailable(Locale loc)大多数引擎报告错误的调用中所注意到的那样。新的 API 试图解决这个问题,因此您将努力 API < 21 来获取您可以依赖的详细信息。查看我对这个问题的回答,了解如何查询元素。

在撰写本文时,即使使用了新的 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**]] 

所以,你的代码会假设这个引擎可以工作,但它不会......这非常令人沮丧,还有我给他们的未答复的错误报告。

综上所述,当您第一次尝试与引擎对话时,您目前可能不得不依靠一个简单的通知,点击后会导致您的应用出现常见问题解答 - 在常见问题解答中,您将解释如果引擎不说话,检查安装和下载......

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

于 2016-06-08T08:58:04.937 回答