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

标签 java android text-to-speech

我正在构建一个应用程序,它可以播放包含当前时间的自定义消息。我注意到有些声音似乎正确解析了时间 - 也就是说,当我传入“现在时间是 7:07”之类的字符串时,它实际上会说成“七-哦-七”。

然而,其他声音坚持说“现在时间是七冒号零七。”自己编写一个函数来解析它很简单,但我正在尝试找到内置的东西,这样我就不必担心本地化问题。我可以在 TTS(可能与属性字符串相关吗?)甚至 Java 库中做一些事情来为我提供时间的本地化“文本”字符串?我翻遍了 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 之外还有很多其他选项,因此如果您正在寻找不同的自定义项,请务必检查一下 - 请注意,没有任何代码示例.

关于java - 强制 Android TTS 将时间解析为文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60992389/

相关文章:

java - 在 Android 上解析 xml 文件时文件过早结束

java - “Cannot find symbol”或 “Cannot resolve symbol”错误是什么意思?

java - 线程联网导致空指针异常

javascript - 跨浏览器文本到语音Javascript库

java - 在 Spring 配置中,用 XML 格式编写 Java 代码有什么好处?

java - 与应用程序服务器的 AJP 和 SSL 通信

java - 从mysql数据库获取 map 标记到android应用程序

android - 使用 Android Parcelable 在 Activity 之间传输数据

html - 使用 Mac VoiceOver 测试网页的辅助功能

speech-recognition - Microsoft.Speech.Synthesis 不适用于文本转语音但 System.Speech.Synthesis 有效。为什么?