1

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 []

为什么?

4

1 回答 1

1

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

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

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

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

希望有帮助。

于 2012-05-19T23:37:14.570 回答