【问题标题】:How to use TTS (TextToSpeech) while string has more then 4000 characters in Android如何在Android中字符串超过4000个字符时使用TTS(TextToSpeech)
【发布时间】:2015-05-15 16:14:23
【问题描述】:

我正在开发一个模块来读取文本文件并使用 TTS 作为语音播放。我已经成功地将 TTS 集成到我的模块中。以及阅读和口语前 4000 个字符。

我有超过 4000 个字符的字符串,它也可能有超过 10000 个字符。目前我无法使用 TTS 读取文件和播放。

我尝试将大字符串拆分为字符串的一小部分。每个字符串部分有 4000 个字符。

当我演奏第一个弦乐部分时,它按要求工作正常。但是在完成第一个字符串部分后,我想立即开始第二部分。但 TTS 没有启动它。

我正在使用

int pos = 0;

while(true) {

            String var = "";

            try {
                var = str.substring(pos, 3999);
                pos += 3999;
            } catch(Exception e) {
                var = str.substring(pos, str.length());
                break;
            }

            HashMap<String, String> map = new HashMap<String, String>();
            map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "utteranceId");
            tts.speak(var, TextToSpeech.QUEUE_ADD, map);
        }

我已经尝试了很多。也在网上搜索,但没有得到任何好的解决方案。

有一个 setOnUtteranceCompletedListener() 我认为这可能很有用。但是谁能帮助我。如何使用 TTS 播放大文本。或任何其他可用的技术?

【问题讨论】:

标签: android pdf text-to-speech onutterancecompleted


【解决方案1】:

我也试图到处寻找,但找不到确切的答案,但肯定得到了一些帮助。你需要把你的长段分成小块的句子。您可以使用下面的方法来做到这一点。

private void speech(String charSequence) {
    ///
    Pattern re = Pattern.compile("[^.!?\\s][^.!?]*(?:[.!?](?!['\"]?\\s|$)[^.!?]*)*[.!?]?['\"]?(?=\\s|$)", Pattern.MULTILINE | Pattern.COMMENTS);
    Matcher reMatcher = re.matcher(charSequence);
    /////
    int position=0 ;
    int sizeOfChar= charSequence.length();
    String testStri= charSequence.substring(position,sizeOfChar);
    while(reMatcher.find()) {
        String temp="";

        try {

            temp = testStri.substring(charSequence.lastIndexOf(reMatcher.group()), charSequence.indexOf(reMatcher.group())+reMatcher.group().length());
            textToSpeech.speak(temp, TextToSpeech.QUEUE_ADD, null,"speak");


        } catch (Exception e) {
            temp = testStri.substring(0, testStri.length());
            textToSpeech.speak(temp, TextToSpeech.QUEUE_ADD, null);
            break;

        }

    }

}

只需在此方法中传递您的文本,它就会读取您的文本。

【讨论】:

    【解决方案2】:

    您可以尝试使用:

    tts.speak(var, TextToSpeech.QUEUE_FLUSH, map);
    

    我想,就像您在发布的代码中所做的那样,在第一次迭代后管道已满,您无法添加其他文本。我认为使用 QUEUE_FLUSH 刷新管道内容并使用新话语调用合成会起作用。

    您可以测试这是否为真,例如将话语长度设置为 1000。如果是我所说的那样,当您开始第四个文本块时,您能够重现 3 个文本块,它应该不再起作用,因为管道是已满。

    我建议您不要拆分 tts 引擎限制。您可以在最近的休息时间进行拆分,这样您就不会遇到延误。 我还建议使用全局变量来定义限制,因为它可能会在未来的版本中发生变化。您可以通过

    获得队列限制
    tts.getMaxSpeechInputLength();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2011-01-22
      相关资源
      最近更新 更多