使用 tts 引擎 com.google.android.tts 在 Android 应用程序中向用户显示语音对象的正确方法是什么?

What is the correct way to display a Voice object to the user in an Android app using tts engine com.google.android.tts?

一个 Android 应用程序 运行 API > 21 使用框架 TextToSpeech class。 tts引擎设置为com.google.android.tts.

引擎中所有可用的语言环境都可以通过

获得
Set<Locale> engineLocales = mTts.getAvailableLanguages();

并且

String displayLanguage = locale.getDisplayLanguage();

创建一个很好的面向用户的字符串"English, Chinese, Spanish, etc."太棒了。

引擎中所有可用的声音都可以通过

获得
Set<Voice> engineVoices = mTts.getVoices();

并且可以检查此集合以确定设备上实际安装了哪些语音。完美,得到了一套引擎和设备支持的语音

我的问题是:如何正确显示语音名称? Voice 对象上没有方便的 getDisplayName() 或类似方法。 Voice 对象的名称 属性 是一个字符串,无法向用户显示 "ko-kr-x-kod-local, pt-pt-x-jmn-network, fr-fr-x-frd-local, etc."

我需要对 name:displayName 地图进行硬编码吗?这是不好的做法,因为 Google 可以随时更改名称。它可以作为 "Voice I, Voice II, Voice III, etc." 处理,但我发现很难相信一致的显示名称在某处不可用。我错过了吗?有什么想法吗?

好像没有这个功能。真傻。

就我个人而言,我会让 device/engine 选择 "best" 语音,只让用户指定语言。 Google 引擎将自动 select 最高质量和各种其他因素。

但是,如果你真的想让用户从列表中选择特定的声音,你至少可以做类似 "French 1," "French 2..." 而不是 "Voice 1," "Voice 2..." 并且不需要硬编码名称:

(未经检查的代码只是为了说明这个想法:)

Voice[] frenchVoices = new ArrayList<Voice>();

for (Voice v : engineVoices) {

    if v.name.contains("fr") {
        frenchVoices.add(v);
    }

}

然后当你向用户展示这些声音时,只需迭代并标记它们。但是,如果可用的声音发生变化,那么 "French 1" 可能会突然变成不同的声音。