2014-11-09 14 views
5

在運行最新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 

回答

1

你可能沒有使用相同的TTS引擎在兩個設備上。

更多的人聲探聽連接TTS引擎(您可能已經安裝在您的較新設備上)可以使用數百兆字節的數據文件來生成語音。這些系統中的大多數需要一定量的第一個話語的建立時間。基於formant的簡單系統可能只需要幾兆字節,因此加載速度要快得多。

一個有趣的實驗將是時間的「第二」話語。我預測這會比第一次在你的新手機上更快。另外,更自然的TTS系統通常在調用TTS和從話語開始發聲之間有較長的等待時間。特別是如果系統在整個句子中查看長句以便在開始話語之前制定最佳措辭。

另外,你確定你的新設備沒有使用一些基於雲的TTS服務嗎?還有其他重要的附加變量會影響延遲。

+0

感謝您的深刻解答。當然,新手機上的聲音具有較少的音頻假象。 TTS引擎即使在沒有互聯網連接的情況下也能正常工作,所以它排除了基於雲的服務。我將添加代碼以獲取話語進度的開始和結束時間,並查看可從中推演出的內容。 – 2014-11-10 12:44:47

相關問題