我正在开发一个模块来读取文本文件并使用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);
}
我也在网上搜索过,但没有得到任何好的解决方案。
有一个 setOnUtteranceCompleteListener() 我认为这可能是有用的。 但是怎么有人能帮我。 如何使用 TTS 播放大文本。 或任何其他可用的技术?
我也试图到处寻找,但找不到确切的答案,但肯定得到了一些帮助。您需要将长段落分成一小块句子。您可以使用以下方法执行此操作。
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;
}
}
}
只需在此方法中传递文本,它就会读取您的文本。
您可以尝试使用:
tts.speak(var, TextToSpeech.QUEUE_FLUSH, map);
我想,就像您在发布的代码中所做的那样,在第一次迭代后,管道已满,您无法添加其他文本。我认为用QUEUE_FLUSH刷新管道内容并使用新话语调用合成会起作用。
可以测试这是否为真,例如将话语长度设置为 1000。如果这是我说的,当您开始第四个文本块时,您可以重现 3 个文本块,它应该不再工作,因为管道已满。
我建议您不要在tts引擎限制上分裂。您可以在最近的极限休息时拆分,这样您就不会遇到延误。我还建议使用全局变量来定义限制,因为也许它会在未来的版本中发生变化。您可以通过以下方式获取队列限制
tts.getMaxSpeechInputLength();