SpeechToText synthesizeToFile不排队

时间:2019-09-08 08:20:31

标签: android text-to-speech google-text-to-speech

我正在尝试使用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排队的参数,但根据文档建议,它还是应该将工作排队。

1 个答案:

答案 0 :(得分:1)

我尝试了一下,但是有点像潘多拉魔盒!

似乎没有任何方法可以使用synthesizeToFile()将新话语“添加”到现有文件中-它将始终重写该文件。

因此,看来您要完成的唯一方法是:

A)写入所有单独的文件(文件1,文件2,文件3等),然后在完成创建之后按顺序合并它们。

B)对于每个连续的发声,使用循环将其写入“临时”文件,并在每次迭代时将临时文件合并到“主”文件中。但是,由于sythesizeToFile()是异步的,因此您需要使用UtteranceProgressListener暂停/控制此循环的流程,以防止临时文件被过早覆盖。

其他注意事项:

1)即使您将其命名为mp3,synthesizeToFile()也只会产生WAV。

2)*-synthesizeToFile()是异步的,因此您不可避免地需要使用UtteranceProgressListener来防止过早覆盖。

3)WAV文件很大,因此您需要清理它们。