使用 tts 引擎 com.google.android.tts 在 Android 应用中向用户显示 Voice 对



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

引擎中的所有可用语言环境都可以通过以下方式获得:

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

String displayLanguage = locale.getDisplayLanguage();

创建一个面向用户的漂亮字符串"英语、中文、西班牙语等"。伟大。

引擎中所有可用的语音都可以通过以下方式获得,

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

可以检查此集以确定设备上实际安装了哪些语音。完美,已经获得了引擎和设备上支持的一组声音。

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

我是否需要对名称:显示名称映射进行硬编码?这是不好的做法,因为谷歌可以随时更改名称。它可以处理为"语音 I、语音 II、语音 III 等",但我发现很难相信在某处没有一致的显示名称。我错过了吗?有什么想法吗?

似乎没有这样的函数。 挺傻的。

就个人而言,我只会让设备/引擎选择"最佳"语音,只让用户指定语言。谷歌引擎将自动选择最高质量的和其他各种因素。

但是,如果你真的想允许用户从列表中选择特定的语音,你至少可以做一些像"法语1","法语2..."而不是"语音1","语音2..."之类的操作,并且不需要硬编码名称:

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

Voice[] frenchVoices = new ArrayList<Voice>();
for (Voice v : engineVoices) {
if v.name.contains("fr") {
frenchVoices.add(v);
}
}

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

使用 name:displayName map 确实是一种不好的做法,因为名称可能会更改。

但是,我想要一些友好的名字。我没有将(技术)名称映射到 displayName,而是将其哈希映射到名称数组:

int hashcode = Math.abs(voiceCode.hashCode());
int index = hashcode % localeNames.length;
return localeNames[index];

这些名字都是不分性别的,比如罗宾和李。

使用哈希映射的一个原因是,相同的语音将在设备上获得相同的名称,但它不依赖于每个设备上相同的语音集。

我关注的每个区域设置都使用单独的地图。其余的得到声音I,声音II等。

相关内容

  • 没有找到相关文章

最新更新