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

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/

10-10 09:36