Android - 如何从synthesizeToFile中保存更长的TTS波形文件?

时间:2014-10-03 22:56:02

标签: android text-to-speech

使用典型方法从TTS渲染wav文件,

         HashMap<String, String> myHashRender = new HashMap();
         myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, translatedtexttodisplay);
         tts.synthesizeToFile(translatedtexttodisplay, myHashRender, destFileName);

我通常会得到没有数据的44字节文件。我从单字TTS输出中获得可行的文件(以千字节为单位)。我做错了什么?

1 个答案:

答案 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();
         }

可以肯定。重要的是,这似乎已经成功了。