使用典型方法从TTS渲染wav文件,
HashMap<String, String> myHashRender = new HashMap();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, translatedtexttodisplay);
tts.synthesizeToFile(translatedtexttodisplay, myHashRender, destFileName);
我通常会得到没有数据的44字节文件。我从单字TTS输出中获得可行的文件(以千字节为单位)。我做错了什么?
答案 0 :(得分:1)
对于那些关注此主题的人,答案是 在调用合成WAV之前的setOnUtteranceProgressListener;然后将所有实际复制文件放入侦听器的onDone()方法中。然后它不会过早地写出文件,严重截断它。
写出来很长很丑,但重要的部分在这里:
HashMap<String, String> myHashRender = new HashMap();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");
tts.setOnUtteranceProgressListener(new TtsUtteranceListener());
tts.synthesizeToFile(translatedtexttodisplay, myHashRender, destFileName);
然后,
public class TtsUtteranceListener extends UtteranceProgressListener {
@Override
public void onDone(String utteranceId) {
[stuff to save the file appropriately]
}
@Override
public void onStart(String utteranceId) {
Log.d("TtsUtteranceListener", "utterance Start: " + utteranceId);
}
@Override
public void onError(String utteranceId) {
Log.d("TtsUtteranceListener", "utterance Error: " + utteranceId);
}
}
另外,我使用了
// wait here for file to be created
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
showToast("Oops! Exception!");
e.printStackTrace();
}
可以肯定。重要的是,这似乎已经成功了。