Android 允许应用程序向平台查询语言文件的可用性:只需实例化下面的 Intent 并使用 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
extra,行为会发生变化:根据文档,此 extra 用于向检查某些特定语音的 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 []
为什么?
最佳答案
对于不可用的语音,我使用以下方法:
ArrayList<String> unavailable = data
.getStringArrayListExtra("unavailableVoices");
结果始终采用“eng-GBR”格式或只是“eng”格式。
如果我误解了你的问题并且你想知道为什么你没有得到专门用于搜索“eng-USA-female”的“不可用”输出(而不是根本没有),那么我可以只建议格式不适合过去搜索。我建议搜索“zzz-ZZZ”以查看实际问题所在...
希望对您有所帮助。
关于android - 为什么不可用语音列表总是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524980/