我正在尝试实现一个用不同语言读取文本的应用程序.令人惊讶的是,当我使用isLanguageAvailable(Locale loc)方法时,对于尚未下载的Google TTS列表中的语言,它返回true.当我调用speak()方法时,它们甚至被播放.我的结论是,这是因为它们是在线声音.
文档显示您可以通过Voice对象使用方法getFeatures()来了解语音是否在线.但是,Voice类是针对API> = 21实现的.对于API< 21,在TextToSpeech类上还有一个getFeatures(Locale loc)方法,它应该返回一个具有不同特征描述的字符串数组.我在不同的引擎和语言环境中尝试了最后一种方法,我通常得到一个空数组.可能这是TTS开发人员可以填写或不填写的额外信息...... 那么,我怎么知道tts-locale是否是API的在线版本< 21?
通常要求这个,你会包括:
put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS,String.valueOf(shouldNetwork()));
他们的网络合成声音过去质量明显较高,但最近他们的改进并不那么明显.
文本到语音引擎提供的信息API< 21是无望的和一般的错误,正如你从isLanguageAvailable(Locale loc)的调用中注意到的那样,大多数引擎都报错了.新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,features: [embeddedTts,**notInstalled**]]
因此,您的代码将假设此引擎将工作,它不会….这是非常令人沮丧的,以及我的未答复的错误报告给他们.
以上所述,您可能目前不得不在第一次尝试与引擎通话时使用简单通知,单击时会显示应用程序的常见问题解答 – 在常见问题解答中,您将解释如果引擎不说话,检查安装和下载…….
令人沮丧的是,我无法为您发布一切简单的代码片段.