2014-11-09 2 views
5

Auf einem Telefon, auf dem kürzlich eine Android-Version ausgeführt wurde, kann die TextToSpeech-Engine beim ersten Aufruf etwa 6 Sekunden länger dauern zu einem älteren Telefon.KitKat braucht 6 Sekunden mehr als Froyo, um beim ersten Anruf auf TextToSpeech.speak() zu reagieren

Mein Testcode ist unten abgebildet. (EDITED: Alternativer Code für Android 4.0.3 Ice Cream Sandwich, API 15 und höher, am Ende gezeigt.)

Auf einem 1 Jahr alten Motorola Moto G mit 4.4.4 KitKat kann es über 7 Sekunden dauern die TextToSpeech-Engine zum Abschluss des ersten Aufrufs an speak() das Wort "Started". Hier ist die Ausgabe meines Codes.

D/speak﹕ call: 1415501851978 
D/speak﹕ done: 1415501859122, delay: 7144 

Auf einem 3 Jahre alten Samsung SGH-T499Y 2.2 Froyo laufen, nehmen Sie es weniger als eine Sekunde sprechen zu beenden:

D/speak﹕ call: 1415502283050 
D/speak﹕ done: 1415502283900, delay: 850 

Gibt es eine Möglichkeit, herauszufinden, was während dieser 6- geschieht zweite Verzögerung?
Gibt es eine Möglichkeit, das neuere (und vermutlich schnellere) Gerät schneller reagieren zu lassen?

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)); 
    } 
} 

EDIT: Beginnend mit Ice Cream Sandwich 4.0.3 API 15, Android bietet UtteranceProgressListener, die Zeit verwendet werden kann, sowohl den Beginn und das Ende der Text-to-Speech-Wiedergabe. Das Folgende ist nicht kompatibel mit 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)); 
     } 
    }; 
} 

Hier ist ein Beispiel für die Ausgabe, dass diese auf dem Motorola Moto G läuft 4.4.4 KitKat gibt:

auf beiden Geräten
D/speak﹕ called: 1415654293442 
D/speak﹕ started: 1415654299287, delay: 5845 
D/speak﹕ done: 1415654299995, total: 6553, duration: 708 

Antwort

1

Sie sind wahrscheinlich nicht mit der gleichen TTS-Engine.

Mehr menschlich klingende verkettete TTS-Engines (die Sie möglicherweise auf Ihrem neueren Gerät installiert haben) können Hunderte von Megabytes an Datendateien verwenden, um Sprache zu generieren. Die meisten dieser Systeme benötigen eine gewisse Rüstzeit für die erste Äußerung. Einfache (und mehr mechanisch klingende) formant-basierte Systeme benötigen möglicherweise nur ein paar Megabyte und können daher viel schneller geladen werden.

Ein interessantes Experiment wäre Zeit, die "zweite" Äußerung Zeit. Ich sage voraus, dass das schneller sein wird als das erste auf deinem neueren Handy. Auch haben natürlichere klingende TTS-Systeme im Allgemeinen eine längere Latenzzeit zwischen dem Aufrufen des TTS und dem Beginn des Tons aus der Äußerung. Insbesondere wenn ein langer Satz gegeben wird, da das System über den gesamten Satz schaut, um die beste Formulierung vor dem Beginn der Äußerung zu formulieren.

Sind Sie sicher, dass Ihr neues Gerät keinen cloudbasierten TTS-Dienst verwendet? Es gibt andere signifikante, zusätzliche Variablen, die sich auf die Latenz auswirken.

+0

Vielen Dank für Ihre aufschlussreiche Antwort. Sicherlich hat die Stimme auf dem neueren Telefon weniger Audioartefakte. Die TTS-Engine funktioniert auch ohne Internetverbindung, so dass ein Cloud-basierter Dienst ausgeschlossen ist. Ich werde Code hinzufügen, um die Start- und Endzeit des Äusserungsfortschritts zu erhalten und zu sehen, was daraus abgeleitet werden kann. –

Verwandte Themen