【问题标题】:Android - How can I save longer TTS wavefiles from synthesizeToFile?Android - 如何从 synthesizeToFile 保存更长的 TTS 波形文件?
【发布时间】:2015-01-17 03:32:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您设置的是OnUtteranceProgressListener 吗?没有它,有时 TTS 可能会行为不端。您也可能试图在文件完成写入之前打开它。
  • 令我惊讶的是,有 701 人查看了此主题,但没有人选择发表评论。很奇怪。

标签: android text-to-speech


【解决方案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();
         }

确定。重要的是,这似乎起到了作用。

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多