Android 中的 synthesizeToFile 时 TextToSpeech 花费太多时间
TextToSpeech takes too much time while synthesizeToFile in Android
我使用下面的代码将 .txt
文件合成为 .mp3
文件,使用 Android 内置TTS Engine
.
代码:
textToSpeech.synthesizeToFile(readFileText, utterParam, destinationFileName);
textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(final String utteranceId) {
Log.e(TAG, "onStart...");
}
@Override
public void onDone(final String utteranceId) {
Log.e(TAG, "onDone...");
}
@Override
public void onError(String utteranceId) {
Log.e(TAG, "onError...");
}
});
以上是示例代码。
这是应用程序执行的流程:
- 从 SD 卡获取文件
- 将文件合成为 mp3
- 播放 mp3 文件
问题: 当文件合成完成后,只有我可以播放 mp3 文件。即使是 1 MB 大小的文件也需要大约 1 分钟。
有什么我可以改进的地方吗?
注意: 我们需要使用 MediaPlayer
因为我们需要 play/pause reader.
谢谢。
我已经解决了这个问题,将整个文件转换成段落块并将段落添加到 TTS 引擎中并直接播放。
public static String[] convertFileToParagraph(String fileContent) {
// String pattern = "(?<=(rn|r|n))([ \t]*$)+";
String pattern = "([ \t\r]*\n[ \t\r]*)+";
return Pattern.compile(pattern, Pattern.MULTILINE).split(fileContent);
}
/**
* Divides files in to paragraphs
*/
private void divideFileToChunks() {
try {
currentFileChunks = convertFileToParagraph(fileContent);
currentFileChunks = makeSmallChunks(currentFileChunks);
addChunksToTTS();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Divides file paragraphs into sentences of 200 characters
*
* @param currentFileChunks : list of paragraphs
* @return : list of divided file
*/
private String[] makeSmallChunks(String[] currentFileChunks) {
try {
ArrayList<String> smallChunks = new ArrayList<>();
for (int i = 0; i < currentFileChunks.length; i++) {
String chunk = currentFileChunks[i];
if (chunk != null && chunk.length() > 200) {
int length = chunk.length();
int count = length / 200;
int modulo = length % 200;
for (int j = 0; j < count; j++) {
smallChunks.add(chunk.substring(200 * j, (200 * j) + 199));
}
if (modulo > 0) {
smallChunks.add(chunk.substring(chunk.length() - 1 - modulo, chunk.length() - 1));
}
} else {
smallChunks.add(chunk);
}
}
return smallChunks.toArray(new String[smallChunks.size()]);
} catch (Exception e) {
e.printStackTrace();
return currentFileChunks;
}
}
/**
* Add all chunks to TTS(Text to Speech) Engine
*/
private void addChunksToTTS() {
try {
String[] chunks = getCurrentFileChunks();
if (chunks != null && chunks.length > 0) {
for (int i = currentChunk; i < chunks.length; i++) {
utterParam.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));
textToSpeech.speak(chunks[i], TextToSpeech.QUEUE_ADD, utterParam);
imgBtnT2SPlay.setImageResource(R.drawable.icon_pause_white);
edtT2SFileContents.setEnabled(false);
isPlaying = true;
}
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
} catch (Exception e) {
e.printStackTrace();
}
}
谢谢。
我使用下面的代码将 .txt
文件合成为 .mp3
文件,使用 Android 内置TTS Engine
.
代码:
textToSpeech.synthesizeToFile(readFileText, utterParam, destinationFileName);
textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(final String utteranceId) {
Log.e(TAG, "onStart...");
}
@Override
public void onDone(final String utteranceId) {
Log.e(TAG, "onDone...");
}
@Override
public void onError(String utteranceId) {
Log.e(TAG, "onError...");
}
});
以上是示例代码。 这是应用程序执行的流程:
- 从 SD 卡获取文件
- 将文件合成为 mp3
- 播放 mp3 文件
问题: 当文件合成完成后,只有我可以播放 mp3 文件。即使是 1 MB 大小的文件也需要大约 1 分钟。
有什么我可以改进的地方吗?
注意: 我们需要使用 MediaPlayer
因为我们需要 play/pause reader.
谢谢。
我已经解决了这个问题,将整个文件转换成段落块并将段落添加到 TTS 引擎中并直接播放。
public static String[] convertFileToParagraph(String fileContent) {
// String pattern = "(?<=(rn|r|n))([ \t]*$)+";
String pattern = "([ \t\r]*\n[ \t\r]*)+";
return Pattern.compile(pattern, Pattern.MULTILINE).split(fileContent);
}
/**
* Divides files in to paragraphs
*/
private void divideFileToChunks() {
try {
currentFileChunks = convertFileToParagraph(fileContent);
currentFileChunks = makeSmallChunks(currentFileChunks);
addChunksToTTS();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Divides file paragraphs into sentences of 200 characters
*
* @param currentFileChunks : list of paragraphs
* @return : list of divided file
*/
private String[] makeSmallChunks(String[] currentFileChunks) {
try {
ArrayList<String> smallChunks = new ArrayList<>();
for (int i = 0; i < currentFileChunks.length; i++) {
String chunk = currentFileChunks[i];
if (chunk != null && chunk.length() > 200) {
int length = chunk.length();
int count = length / 200;
int modulo = length % 200;
for (int j = 0; j < count; j++) {
smallChunks.add(chunk.substring(200 * j, (200 * j) + 199));
}
if (modulo > 0) {
smallChunks.add(chunk.substring(chunk.length() - 1 - modulo, chunk.length() - 1));
}
} else {
smallChunks.add(chunk);
}
}
return smallChunks.toArray(new String[smallChunks.size()]);
} catch (Exception e) {
e.printStackTrace();
return currentFileChunks;
}
}
/**
* Add all chunks to TTS(Text to Speech) Engine
*/
private void addChunksToTTS() {
try {
String[] chunks = getCurrentFileChunks();
if (chunks != null && chunks.length > 0) {
for (int i = currentChunk; i < chunks.length; i++) {
utterParam.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));
textToSpeech.speak(chunks[i], TextToSpeech.QUEUE_ADD, utterParam);
imgBtnT2SPlay.setImageResource(R.drawable.icon_pause_white);
edtT2SFileContents.setEnabled(false);
isPlaying = true;
}
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
} catch (Exception e) {
e.printStackTrace();
}
}
谢谢。