我正在尝试使用TextToSpeech.synthesizeToFile方法向mp3写一些语音。文本长度超过4000个字符,因此我不得不将其分解为大块。问题在于,只有最后一块文本最终以音频文件结尾,该方法似乎是覆盖文件而不是添加文件。
int maxLength = 1000; // TextToSpeech.getMaxSpeechInputLength() - 1; smaller chunks = start streaming sooner?
String fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/test_p.mp3";
File file = new File(fileName);
final String utteranceId = "fooo";
for (int i = 0; i < elementListJson.length(); i++) {
JSONArray elArray = elementListJson.getJSONArray(i);
nodeType = elArray.get(0).toString();
nodeText = elArray.get(1).toString();
ArrayList<String> chunkedNodeText = StringHelper.splitToLineLengthWithoutBreakingWords(nodeText, maxLength);
for(String chunk : chunkedNodeText) {
Log.d("TTSW", "p"+partsProcessed+" = "+chunk);
int speechStatus = textToSpeech.synthesizeToFile(
chunk
, null, file, utteranceId);
if (speechStatus == TextToSpeech.ERROR) {
showNotificationHint("Error converting text to speech! #1");
}
}
}
这段代码可与speak()方法和QUEUE参数一起使用,但我需要将其写入单个文件中,以允许用户暂停/快退/快进控件。我找不到告诉synthesizeToFile排队的参数,但根据文档,它仍然应该排队工作。
最佳答案
我尝试了一下,但是有点像潘多拉魔盒!
似乎没有办法使用synthesizeToFile()将新话语“添加”到现有文件中-它将始终重写该文件。
因此,看来您要完成的唯一方法是:
A)编写所有单独的文件(file1,file2,file3等),然后在完成所有创建之后按顺序合并它们。
B)对于每个连续的发声,使用循环将其写入“临时”文件,并在每次迭代时将临时文件合并到“主”文件中。但是,由于sythesizeToFile()是异步的,因此您需要使用UtteranceProgressListener暂停/控制此循环的流程,以防止临时文件被过早覆盖。
其他注意事项:
1)即使您将其命名为mp3,synthesizeToFile()也只会产生WAV。
2)*-synthesizeToFile()是异步的,因此您不可避免地需要使用UtteranceProgressListener来防止过早覆盖。
3)WAV文件很大,因此您需要清理它们。