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ätenD/speak﹕ called: 1415654293442
D/speak﹕ started: 1415654299287, delay: 5845
D/speak﹕ done: 1415654299995, total: 6553, duration: 708
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. –