android - 使用 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 等”。但我很难相信某个地方没有一致的显示名称。我错过了吗?有什么想法吗?
解决方案
好像没有这个功能。很傻。
就个人而言,我会让设备/引擎选择“最佳”声音,只让用户指定语言。谷歌引擎将自动选择最高质量和其他各种因素。
但是,如果你真的想让用户从一个列表中选择一个特定的声音,你至少可以做类似“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”可能会突然变成不同的声音。
推荐阅读
- reactjs - 表单提交取消,因为react js中没有连接表单。我哪里错了?
- vba - 运行我所有数据验证列表的按钮
- python-3.x - finding closest dates in DataFrame
- blockchain - 你能告诉我这个 Solidity 是如何工作的吗?
- sql - 如何在单个 sql 查询中获取 7 月份的买卖总量
- c - poll_wait() 和 wake_up_interruptible() 如何同步工作?
- php - Magento2 (PHP) using docker compose up gives 111:connection refused, taking minutes then working after code 0
- asp.net - (de) 使用 System.Text.Json 序列化流
- javascript - Reload the document to reset the game when it running
- python - How to extract table and text from docx?