【问题标题】:What is the correct way to display a Voice object to the user in an Android app using tts engine com.google.android.tts?使用 tts 引擎 com.google.android.tts 在 Android 应用程序中向用户显示 Voice 对象的正确方法是什么?
【发布时间】:2019-06-18 08:46:42
【问题描述】:

运行 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, etc 。”

我需要硬编码 name:displayName 地图吗?这是不好的做法,因为 Google 可以随时更改名称。可以处理为“Voice I、Voice II、Voice III 等”。但我很难相信在某处没有一致的显示名称。我错过了吗?有什么想法吗?

【问题讨论】:

    标签: android text-to-speech google-text-to-speech


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。您的解决方案很好……使用罗马数字 I、II、III 作为标签匹配 Android 系统设置。
    • 不客气。我在这里有很多其他与 TTS 相关的问题/答案。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多