【问题标题】:UtteranceProgressListener not working for Android TTSUtteranceProgressListener 不适用于 Android TTS
【发布时间】:2014-03-17 10:25:17
【问题描述】:

我正在制作一个应用程序,每次触发广播接收器时都使用 tts 合成 wav 文件。我正在使用 AndroidStudio(最新版本)并使用 API 级别 19,最少 15。

我有一个带有广播监听器的服务。每次执行 BroadcastListener onReceive 方法时,我都使用

tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");

文件创建成功,但 UtteranceProgressListener 的 onDone() 方法从未被调用。

public void onCreate() {
    super.onCreate();

    //Get TTS capabilities
    //TODO: Use TextToSpeech.Engine.ACTION_CHECK_TTS_DATA to check if tts is available
    tts = new TextToSpeech(PresenterService.this,
            new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {

                    //If the TTS engine was started successfully

                    if (status != TextToSpeech.ERROR) {

                        tts.setLanguage(Locale.US);
                        tts.setPitch(PRESENTER_PITCH);
                        tts.setSpeechRate(PRESENTER_RATE);
                    }

                }
            });

    tts.setOnUtteranceProgressListener(new TtsUtteranceListener());



    IntentFilter filter = new IntentFilter();
    filter.addAction("xxxxxxxxxxxxxxxxxx");

    mReceiver = new TrackChangedReceiver(tts);
    registerReceiver(mReceiver, filter);

}

还有 TtsUtteranceListener 类:

public class TtsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onDone(String utteranceId) {
        Log.d("TtsUtteranceListener", "utterance Done: " + utteranceId);
    }

    @Override
    public void onStart(String utteranceId) {
        Log.d("TtsUtteranceListener", "utterance Start: " + utteranceId);
    }

    @Override
    public void onError(String utteranceId) {
        Log.d("TtsUtteranceListener", "utterance Error: " + utteranceId);
    }
}

监听器上的方法:

public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action != null) {
        if (action.equalsIgnoreCase("xxxxxxxxxxxxxxxxx")) {
            String playing = "test string";
            tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");
        }
    }
}

我正在使用 AndroidStudio,在调试模式下我可以看到 tts 对象的 mUtteranceProgressListener 有一些对象引用:

com.example.android.ttstest.TtsUtteranceListener@41eaf8d8

但是监听器的方法永远不会被调用。 Log.d() 调用永远不会起作用,并且永远不会触发任何断点。

我还尝试在调用时将 UtteranceProgressListener 声明为匿名类

tts.setOnUtteranceProgressListener(new UtteranceProgressListener(){...});

但同样的事情......

谁能指出我做错了什么?

【问题讨论】:

  • 我想我已经解决了。我尝试使用 tts.speak 并且回调有效。那是我以前的实现。我只需要在其中传递一个带有 KEY_PARAM_UTTERANCE_ID 参数的参数 HashMap。

标签: java android text-to-speech


【解决方案1】:

好的,我解决了。问题是我没有通过KEY_PARAM_UTTERANCE_ID

if (action.equalsIgnoreCase("xxxxxxxxxxxxxxxxx")) {
    HashMap<String, String> hashTts = new HashMap<String, String>();
    hashTts.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");

    String playing = "test string";
    tts.synthesizeToFile(playing, hashTts, storagePath + "/" + "tst.wav");
}

我将参数参数作为空值传递:

tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");

【讨论】:

    【解决方案2】:

    我有一个用于检测天气的有线解决方案 tts 讲完了。虽然没有优化但是效果很好。

    第 1 步:在您的代码中创建此类。 (在相同的代码中,而不是单独的文件)

    class Waiter extends AsyncTask<Void,Void,Void>{
            @Override
            protected Void doInBackground(Void... voids) {
                while (tts.isSpeaking()){
                    try{Thread.sleep(1000);}catch (Exception e){}
                }
                return null;
            }
            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                //TTS has finished speaking. WRITE YOUR CODE HERE
            }
        }
    

    第 2 步:调用 tts.speak(...) 时调用它

    tts.speak(...);
    new Waiter().execute();
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2014-09-25
      • 2012-03-07
      • 2015-04-15
      • 2014-06-11
      • 1970-01-01
      • 2012-01-27
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多