2

我正在使用以下代码段记录当前电话上所有可用(和不可用)的声音:

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 出现在可用和不可用列表中......)

4

1 回答 1

1

事实证明,就 Android 2.x 中的文本到语音转换而言,这是狂野的西部:每个安装的第 3 方 TTS 引擎都可以根据需要修改此EXTRA_AVAILABLE_VOICES函数的输出,无论是否选中/默认未选中或选中/未选中。

我刚刚尝试从手机中卸载所有 TTS 引擎,只留下硬编码的Pico,结果完全符合我的预期:

6 种可用声音:deu-DEU、eng-GBR、eng-USA、spa-ESP、fra-FRA、ita-ITA、

0 个不可用的声音:

我不介意这个函数的输出动态引用当前选择的(即默认)TTS引擎,但事实是一旦安装了第3方TTS引擎,这个函数的输出没有任何意义,因为它忽略了任何设置。

另请注意,名称具有误导性:它是可用的语言,而不是声音!

我发布这个答案是希望它能帮助某人节省时间和痛苦地发现这个问题。

于 2012-08-22T19:38:12.870 回答