【问题标题】:onRangeStart() stops getting callbacks while reading a paragraph (after encountering a punctuation)onRangeStart() 在阅读段落时停止获取回调(遇到标点符号后)
【发布时间】:2021-03-14 16:42:22
【问题描述】:

我正在尝试使用 Android Text to Speech 功能来阅读文档中的文本并在大声朗读时突出显示单词。我在我的 TTS 对象上使用 setOnUtteranceProgressListener() 设置了一个话语进度侦听器,并在其中覆盖了 onStart()、onDone() 和 onRangeStart() 等函数。期望当我的文本被大声朗读时,onRangeStart(String utteranceId, int start, int end, int frame) 将在 TTS 服务即将用给定的 utteranceId 说出指定范围的话语时给我回调。

这是相同的文档: https://developer.android.com/reference/android/speech/tts/UtteranceProgressListener#onRangeStart(java.lang.String,%20int,%20int,%20int)

我要阅读的文档由多个段落组成,每个段落可以有多个句子。例如:示例段落如下所示:

你好,你好吗?我希望有机会对此进行更多讨论。让我知道你的想法。

期望对于字符串中的每个单词,我应该在 onRangeStart() 中获取事件,但它没有发生。我现在得到的是:

onRangeStart utteranceId: 100000, start: 0, end: 5, frame: 120, text: Hello
onRangeStart utteranceId: 100000, start: 6, end: 11, frame: 6060, text: world
onRangeStart utteranceId: 100000, start: 13, end: 16, frame: 18720, text: how
onRangeStart utteranceId: 100000, start: 17, end: 20, frame: 23760, text: are
onRangeStart utteranceId: 100000, start: 21, end: 24, frame: 26040, text: you

在此之后,onRangeStart() 中不再有回调。我无法理解的是,它在大约 2 周前运行良好,我一直在测试该应用程序,但它突然停止工作。我还检查了 TextToSpeech、UtteranceProgressListener 等文档,但最近没有记录任何更改。

有人可以帮我找出导致此问题的原因吗?

【问题讨论】:

  • 我也为此创建了一个 Google 问题。谷歌团队在 2020 年 12 月的最后一周解决了这个问题,但似乎他们在新的 TTS 版本中再次做出了同样的改变。这是问题所在:issuetracker.google.com/issues/174605128?pli=1

标签: android text-to-speech highlight


【解决方案1】:

onRangeStart() 的实现/行为取决于您用于测试的设备上安装的引擎。

因此,要么您在两个完全不同的引擎上进行测试,其中一个的实现不太理想,要么

您成功测试的引擎在您的测试之间进行了更新,并且在更新中引入了一个实际的错误。

您可以使用以下方法来确定您在测试期间使用的引擎:

private ArrayList<String> whatEnginesAreInstalled(Context context) {
    final Intent ttsIntent = new Intent();
    ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    final PackageManager pm = context.getPackageManager();
    final List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent, PackageManager.GET_META_DATA);
    ArrayList<String> installedEngineNames = new ArrayList<>();
    for (ResolveInfo r : list) {
        String engineName = r.activityInfo.applicationInfo.packageName;
        installedEngineNames.add(engineName);

        // just logging the version number out of interest
        String version = "null";
        try {
            version = pm.getPackageInfo(engineName,
            PackageManager.GET_META_DATA).versionName;
            } catch (Exception e) {
                Log.i("XXX", "try catch error");
            }
        Log.i("XXX", "we found an engine: " + engineName);
        Log.i("XXX", "version: " + version);
    }
    return installedEngineNames;
}

【讨论】:

  • 这就是我初始化 TTS 对象的方式。 tts = new TextToSpeech(getApplicationContext(), status -&gt; { if (status != TextToSpeech.ERROR) { tts.setLanguage(Locale.US); } }, "com.google.android.tts"); 所以从一开始我就一直在使用 Google TTS,所以我的假设是引擎已经在两者之间进行了更新并引入了回归。我还记录了一个关于它的错误:issuetracker.google.com/issues/174605128.
  • 感谢分享代码以检查有关已安装版本的详细信息。我能够确定有关该问题的更多详细信息。似乎此问题开始出现在 Google TTS 最新版本中,即 23.12.333383720 Nov 19th, 2020。此问题仅在此最新版本中引入,因为我尝试从我的设备上卸载此版本并安装了以前的版本,即 22.13.316510576Oct 7th, 2020
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多