首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在安卓系统中使用字符串超过4000个字符的TTS (TextToSpeech)

如何在安卓系统中使用字符串超过4000个字符的TTS (TextToSpeech)
EN

Stack Overflow用户
提问于 2015-03-13 16:35:10
回答 2查看 1.8K关注 0票数 6

我正在开发一个模块来阅读文本文件,并发挥作为一个语音使用TTS。我已经成功地在我的模块中集成了TTS。还可以读和说前4000个字符。

我有超过4,000个字符的字符串,它可能有超过10000个字符。此时我无法使用TTS读取文件和播放。

我尝试过将大字符串分割成字符串的一小部分。每个字符串部分有4000个字符。

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

我正在使用

代码语言:javascript
复制
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播放大文本。或任何其他可用的技术?

EN

回答 2

Stack Overflow用户

发布于 2017-09-25 06:31:41

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-06-30 17:20:05

您可以尝试使用:

代码语言:javascript
复制
tts.speak(var, TextToSpeech.QUEUE_FLUSH, map);

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

您可以测试这是否是真的,例如,将话语长度设置为1000。如果这就是我所说的,你可以复制3个文本块,当你开始第四个文本块时,它应该不再工作了,因为管道已经满了。

我建议你不要在tts引擎限制上分裂。您可以在最近的中断限制上拆分,这样您就不会赶上延迟。我还建议使用全局变量来定义限制,因为它可能会在未来的版本中发生变化。您可以使用以下命令获取队列限制

代码语言:javascript
复制
tts.getMaxSpeechInputLength();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29027854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档