首页 > 解决方案 > 使用 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();

创建一个很好的面向用户的字符串“English, Chinese, Spanish, etc.” 伟大的。

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

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

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

我的问题是:如何正确显示语音名称?Voice 对象上没有方便的 getDisplayName() 或类似功能。Voice 对象的 name 属性是一个不能显示给用户的字符串 "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 等”。但我很难相信某个地方没有一致的显示名称。我错过了吗?有什么想法吗?

标签: androidtext-to-speechgoogle-text-to-speech

解决方案


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

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

但是,如果你真的想让用户从一个列表中选择一个特定的声音,你至少可以做类似“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”可能会突然变成不同的声音。


推荐阅读