强制 Android TTS 将时间解析为文本?

Force Android TTS to parse time as text?

我正在构建一个应用程序,它会说出包含当前时间的自定义消息。我注意到有些声音似乎正确地解析了时间——也就是说,当我传入一个像 "The time is now 7:07" 这样的字符串时,它实际上说的是 "seven-oh-seven."

然而,其他声音坚持说"the time is now seven colon zero seven."自己写一个函数来解析它就足够简单了,但我正在努力寻找内置的东西,这样我就不用担心了关于本地化。我可以在 TTS(可能是与属性字符串相关的吗?)或 Java 库中做些什么来为我提供本地化的 "text" 字符串?我翻阅了 TTS 文档但没有找到任何东西,而且我看到的所有 Java 时间格式模式都是数字,没有文字。

明白了 - TtsSpan 是所需要的。我花了一些时间才弄好格式;关于如何执行此操作的示例基本上为零。以下是对我有用的基础知识,如果其他人遇到同样的需求(在 kotlin 中):

var h:Int = Calendar.getInstance().get(Calendar.HOUR)
if (DateFormat.is24HourFormat(ApplicationContext))
    h = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)
val m:Int = Calendar.getInstance().get(Calendar.MINUTE)
val whenStr = getFormattedTime() // internal function I'm using to format it visually
wholeString = message.replace("|TIME|",whenStr) // my time doesn't always appear at the same place in the custom message
val spannedMsg:Spannable = SpannableString(wholeString)
val span:TtsSpan = TtsSpan.TimeBuilder(h, m).build()
spannedMsg.setSpan(span, wholeString.inexOf(whenStr),wholeString.indexOf(whenStr) + whenStr.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
tts.speak(spannedMsg, TextToSpeech.QUEUE_FLUSH, params, "UTT_ID")

根据 TtsSpan 文档页面,除了 TimeBuilder 之外还有许多其他选项,因此如果您正在寻找不同的自定义设置,请务必检查一下 - 请注意没有任何其他选项代码示例。