为什么不可用的声音列表总是空的?

时间:2012-05-09 22:26:49

标签: android text-to-speech

Android使应用程序能够在平台上查询语言文件的可用性:只需实例化下面的意图,然后使用startActivityForResult方法将其发送到异步请求中。

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, TTS_CHECK_DATA_REQUEST_CODE);

通过调用onActivityResult方法返回上述请求的结果:第二个参数是表示上述请求成功或失败的值,第三个参数包含一些其他数据。在其他数据中,有两个列表(可能为空):

  • 可用的声音;

    ArrayList<String> availableVoices = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
    Log.i(LOG_TAG, String.format("Available voices: %s %s", availableVoices.size(), availableVoices.toString()));
    
  • 不可用的声音。

    ArrayList<String> unavailableVoices = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES);
    Log.i(LOG_TAG, String.format("Unavailable voices: %s %s", unavailableVoices.size(), unavailableVoices.toString()));
    

如上所示的简单请求,不可用语音列表为空,而可用语音数组则填充系统上安装的所有语音。

如果添加TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR额外内容,行为会发生变化:根据文档,此附加内容用于向TTS引擎发出检查某些特定语音的说明。以下是源代码的示例:

ArrayList<String> checkVoiceDataFor = new ArrayList<String>(3);
checkVoiceDataFor.add("ita-ITA");   // installed on emulator
checkVoiceDataFor.add("eng-USA-female");  // not installed
checkVoiceDataFor.add("eng-USA");   // installed on emulator
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
checkIntent.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, checkVoiceDataFor);

我希望回复包含:

  • ita-ITA和eng-USA在可用声音列表中;
  • eng-USA-female在不可用的声音列表中。

然而,结果如下:

  • 可用声音:2 [eng-USA ita-ITA]
  • 不可用的声音:0 []

为什么?

1 个答案:

答案 0 :(得分:1)

对于不可用的声音,我使用以下内容:

    ArrayList<String> unavailable = data
            .getStringArrayListExtra("unavailableVoices");

结果始终采用'eng-GBR'或'eng'格式。

如果我误解了你的问题并且你想知道为什么你没有专门为你搜索'eng-USA-female'(而不是根本)而获得'不可用'输出,那么我可以只建议格式不适合过去搜索。我建议搜索'zzz-ZZZ'以查看实际问题所在......

希望有所帮助。