我正在使用以下代码段记录当前电话中所有可用(和不可用)的语音:
ArrayList<String> availableVoices = intent.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
String availStr = "";
for (String lang : availableVoices)
availStr += (lang + ", ");
Log.i(String.valueOf(availableVoices.size()) + " available langs: ", availStr);
ArrayList<String> unavailableVoices = intent.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES);
String unavailStr = "";
for (String lang : unavailableVoices)
unavailStr += (lang + ", ");
Log.w(String.valueOf(unavailableVoices.size()) + " unavailable langs: ", unavailStr);
记录的结果令人迷惑不解,因为我可以肯定地知道我安装了多种语言,甚至可以听见TTS用
eng-USA
讲话,但是日志显示:1种可用语言:eng-GBR,
30个不可用的语言:ara-XXX,ces-CZE,dan-DNK,deu-DEU,ell-GRC,
eng-AUS,eng-GBR,eng-USA,spa-ESP,spa-MEX,fin-FIN,fra-CAN,
fra-FRA,hun-HUN,ita-ITA,jpn-JPN,kor-KOR,nld-NLD,nor-NOR,
pol-POL,por-BRA,por-PRT,rus-RUS,slk-SVK,swe-SWE,tur-TUR,
zho-HKG,zho-CHN,zho-TWN,tha-THA,
为什么这种不一致的行为? (请注意,eng-GBR出现在可用列表和不可用列表中……)
最佳答案
事实证明,就Android 2.x中的文本到语音转换而言,这简直就是荒野:每一个已安装的第三方TTS引擎都可以根据自己的意愿修改此EXTRA_AVAILABLE_VOICES
函数的输出,无论默认情况下是选中/未选中还是选中/未选中。
我只是尝试从手机上卸载所有TTS引擎,只保留硬编码的Pico,结果完全符合我的预期:
6种可用声音:deu-DEU,eng-GBR,eng-USA,spa-ESP,fra-FRA,
ITA-ITA
0个不可用的声音:
我不介意此函数的输出动态引用当前选择的(即默认)TTS引擎,但是事实是,一旦安装了第三方TTS引擎,该函数的输出就不会生成any sense,因为忽略任何设置。
另请注意,该名称具有误导性:它是可用的语言,而不是声音!
我正在发布此答案,希望它可以帮助someone节省艰难的发现时间和痛苦。
关于android - EXTRA_AVAILABLE_VOICES始终仅返回eng-GBR。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12079850/