【问题标题】:Android TTS in-text controls? Are they available or any equivalent technique?Android TTS 文本控件?它们是否可用或任何等效技术?
【发布时间】:2017-04-11 15:04:04
【问题描述】:

我正在尝试将使用文本控制标签的 TTS 应用程序从桌面/网络/iOS 移植到 Android。该应用程序制作一个文本文件,其中包含要说出的文本和说出的单词之间的静默时间段。静默句点用文本控制标记表示,例如 SAPI TTS <silence msec="1000"/> 标记或用于静默的 iOS TTS 引擎文本控制标记 [[slnc 10000]]

发送到 SAPI TTS 语音合成器的文本如下所示:

Text one <silence msec="750"/> text two <silence msec="1000"/> text three <silence msec="500"/> Text four <silence msec="600"/> Text five.....

同样,对于 iOS TTS,用于静音的文本控制标签是 [[slnc 10000]],要发送到语音合成器的文本如下所示:

Text one [[slnc 750]] text two [[slnc 10000]] text three [[slnc 500]] text four [[slnc 600]] text five......

Android TTS 似乎没有为语音合成器使用文本控制标签。此外,speech() 方法的以下两种变体使用 google 网络服务,以便实现从语音合成器服务器返回的语音文本的准确计时,并且代码中的静音时段的计时可能是不可能的或充其量是不可靠的。

speak(speech, TextToSpeech.QUEUE_FLUSH, null);

speak(speech, TextToSpeech.ADD_ADD, null);

我欢迎任何专注于保持口语之间无声时段的准确计时的 Android 解决方案。

【问题讨论】:

  • 你读过Android TTS documentation吗?有playSilence() 和更新的playSilentUtterance() 方法可以做到这一点。而speak() 不使用任何网络服务。
  • 感谢@MarkusKauppinen,因此答案将是交替 speak() 和 playSilence() 与 QUEUE_ADD 以不断添加到队列中。我打算为用户提供一个 stop(),所以不需要 isSpeaking()。我喜欢。至于在线离线语音合成,似乎默认方法是向谷歌服务器发送请求。或者,用户可以通过手机上的设置下载引擎以供离线使用。可以提前通知用户进行这些更改,包括设置默认语音和语言。太棒了:)

标签: android text-to-speech vb4android


【解决方案1】:

Android TTS engine 具有已弃用的playSilence() 和更新的playSilentUtterance() 方法,可用于在给定的时间内暂停语音输出。

如果应用的目标是 API 级别 21,即 Android 5.0 作为最低要求,则应使用playSilentUtterance()。否则,已弃用的 playSilence() 仍然可用。

playSilentUtterance方法的完整方法签名是:

int playSilentUtterance (long durationInMs, int queueMode, String utteranceId)

这里的durationInMs 是静音的持续时间,以毫秒为单位。

queueMode 可以是 QUEUE_ADD,这意味着在 TTS 引擎完成当前正在讲话的内容以及已添加到队列中的内容之后播放静音,QUEUE_FLUSH 首先停止一切并清除队列,因此立即播放静音。

最后,utteranceId 是要朗读的文本(或在本例中为静音)的可选唯一标识符,如果使用 UtteranceProgressListener,则很有用。

【讨论】:

  • 我是新来的,我想我已经找到了问题的答案。不确定我是否需要关闭它、将其标记为已回答、保持原样?
  • 如果您对答案感到满意,您可以接受。没有必要对这个问题做任何事情。它将与答案一起保留在存档中,遇到相同问题的人可以稍后通过搜索找到它。
  • 为了与 SAPI 文本内静音标签行为兼容,需要创建一种新方法,例如playSAPIText() 将剖析文本并对文本应用 speak() 方法,在静默期应用 playSilentUtterance()playSilence()(对于 API 级别 21 之前)。 queueMode 在这种情况下应该是 QUEUE_ADD 以提供不间断的音频流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多