在運行最新Android版本的最新手機上,TextToSpeech引擎在首次調用時可能需要大約6秒的時間才能響應到較舊的電話。KitKat比Froyo在第一次調用時對TextToSpeech.speak()的反應要多6秒
我的測試代碼如下所示。 (編輯:適用於Android 4.0.3冰淇淋三明治的替代代碼,API 15及以上,末尾顯示)。
對於運行4.4.4 KitKat的1歲摩托羅拉Moto G,可能需要7秒鐘TextToSpeech引擎完成第一次調用speak()
單詞「Started」。這是我的代碼的輸出。
D/speak﹕ call: 1415501851978
D/speak﹕ done: 1415501859122, delay: 7144
在運行2.2 Froyo的一個3歲的三星SGH-T499Y,它需要不到一秒鐘到把話說完:
D/speak﹕ call: 1415502283050
D/speak﹕ done: 1415502283900, delay: 850
有沒有一種方法,去發現這個6-期間發生第二延遲?
有什麼方法可以讓更新(更快)的設備反應更快?
package com.example.speak
import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.os.Bundle;
import android.util.Log;
import java.util.HashMap;
import java.util.Locale;
public class MainActivity extends Activity implements TextToSpeech.OnInitListener,
TextToSpeech.OnUtteranceCompletedListener {
private final String TAG = "speak";
private Activity activity;
private TextToSpeech tts;
private long launchTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts = new TextToSpeech(getApplicationContext(), this);
}
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
tts.setOnUtteranceCompletedListener(this);
tts.setLanguage(Locale.UK);
ttsSay("Started");
}
}
private void ttsSay(String toSpeak) {
int mode = TextToSpeech.QUEUE_FLUSH;
HashMap hashMap = new HashMap<String, String>();
hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, TAG);
launchTime = System.currentTimeMillis();
Log.d(TAG, "call: " + launchTime);
tts.speak(toSpeak, mode, hashMap);
}
public void onUtteranceCompleted(String utteranceID) {
long millis = System.currentTimeMillis();
Log.d(TAG, "done: " + millis + ", delay: " + (millis - launchTime));
}
}
編輯:用冰淇淋三明治4.0.3,API 15,Android提供UtteranceProgressListener,其可用於時間兩者的開始和文本到語音重放結束啓動。以下與Froyo不兼容;
package com.example.announceappprogress;
import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.os.Bundle;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;
import java.util.HashMap;
import java.util.Locale;
public class MainActivity extends Activity implements TextToSpeech.OnInitListener {
private final String TAG = "speak";
private TextToSpeech tts;
private long launchTime;
private long startTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts = new TextToSpeech(getApplicationContext(), this);
tts.setOnUtteranceProgressListener(mProgressListener);
}
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
tts.setLanguage(Locale.UK);
ttsSay("Started");
}
}
private void ttsSay(String toSpeak) {
int mode = TextToSpeech.QUEUE_FLUSH;
HashMap hashMap = new HashMap<String, String>();
hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, TAG);
launchTime = System.currentTimeMillis();
Log.d(TAG, "called: " + launchTime);
tts.speak(toSpeak, mode, hashMap);
}
private final UtteranceProgressListener mProgressListener = new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
startTime = System.currentTimeMillis();
Log.d(TAG, "started: " + startTime + ", delay: " + (startTime - launchTime));
}
@Override
public void onError(String utteranceId) {} // Do nothing.
@Override
public void onDone(String utteranceId) {
long millis = System.currentTimeMillis();
Log.d(TAG, "done: " + millis + ", total: " + (millis - launchTime) + ", duration: " + (millis - startTime));
}
};
}
下面是輸出的一個樣本,這給上運行4.4.4奇巧摩托羅拉摩托G:
D/speak﹕ called: 1415654293442
D/speak﹕ started: 1415654299287, delay: 5845
D/speak﹕ done: 1415654299995, total: 6553, duration: 708
感謝您的深刻解答。當然,新手機上的聲音具有較少的音頻假象。 TTS引擎即使在沒有互聯網連接的情況下也能正常工作,所以它排除了基於雲的服務。我將添加代碼以獲取話語進度的開始和結束時間,並查看可從中推演出的內容。 – 2014-11-10 12:44:47