xag*_*txu 5 android voice text-to-speech google-text-to-speech android-5.0-lollipop
我正在尝试实现一个用不同语言读取文本的应用程序.令人惊讶的是,当我使用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()));
Run Code Online (Sandbox Code Playgroud)
他们的网络合成语音曾经具有明显更高的质量,但随着最近的改进,这一点不太明显。
文本到语音引擎提供的 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]]
Run Code Online (Sandbox Code Playgroud)
但它省略了:
Voice[Name: en-US, locale: en_US, quality: 300, latency: 300, requiresNetwork: false, features: [embeddedTts, **notInstalled**]]
Run Code Online (Sandbox Code Playgroud)
所以,你的代码会假设这个引擎可以工作,但它不会......这非常令人沮丧,还有我向他们提交的未答复的错误报告。
综上所述,当您第一次尝试与引擎对话时,您当前可能必须依靠一个简单的通知,单击该通知后,将导致您的应用程序出现常见问题解答 - 在常见问题解答中,您将解释如果引擎不说话,检查安装和下载......
令人沮丧的是,我无法为您发布一个一切正常的简单代码片段。
归档时间: |
|
查看次数: |
594 次 |
最近记录: |