Signatur
Beschreibung
Die Eigenschaft elapsedTime eines SpeechSynthesisEvent gibt an, wie viel Zeit seit dem Start der Ausgabe von SpeechSynthesisUtterance.text vergangen war, als das Ereignis ausgelöst wurde. Laut Spezifikation ist der Wert eine Gleitkommazahl in Sekunden.
Der Wert ist in allen Ereignissen der Sprachausgabe verfügbar: start, end, pause, resume, boundary, mark und error (dort als SpeechSynthesisErrorEvent, das von SpeechSynthesisEvent erbt). Besonders nützlich ist er im boundary-Ereignis, um den zeitlichen Verlauf von Wort- und Satzgrenzen zu verfolgen, sowie im end-Ereignis, um die Gesamtdauer einer Ansage zu messen.
Typische Einsatzzwecke sind Fortschrittsanzeigen, Karaoke-artiges Hervorheben des gerade gesprochenen Wortes, Protokollierung und die Abschätzung der Sprechgeschwindigkeit verschiedener Stimmen. Da es sich um eine reine Leseeigenschaft handelt, hat sie keine Parameter; Zuweisungen werden ignoriert.
Rückgabewert
start-Ereignis in der Regel 0.Beispiele
Gesamtdauer einer Ansage messen (addEventListener)
const utterance = new SpeechSynthesisUtterance('Willkommen bei programmierung.net!');
utterance.lang = 'de-DE';
utterance.addEventListener('start', (event) => {
console.log(`Start nach ${event.elapsedTime} s`);
});
utterance.addEventListener('end', (event) => {
console.log(`Ausgabe beendet nach ${event.elapsedTime.toFixed(2)} s`);
});
speechSynthesis.speak(utterance);
Wortgrenzen mit Zeitstempel protokollieren (on-Property)
const text = 'Das ist ein kurzer Testsatz.';
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = 'de-DE';
utterance.onboundary = (event) => {
if (event.name !== 'word') return;
const wort = text.slice(event.charIndex).split(/\s/)[0];
console.log(`${event.elapsedTime.toFixed(2)} s: ${wort}`);
};
speechSynthesis.speak(utterance);
Pausieren und Fortsetzen mit Zeitangabe
const utterance = new SpeechSynthesisUtterance(
'Dies ist ein längerer Text, der zwischendurch pausiert wird.'
);
utterance.lang = 'de-DE';
const log = (event) =>
console.log(`${event.type} bei ${event.elapsedTime.toFixed(2)} s`);
utterance.addEventListener('pause', log);
utterance.addEventListener('resume', log);
utterance.addEventListener('end', (event) => {
log(event);
// Listener aufräumen
utterance.removeEventListener('pause', log);
utterance.removeEventListener('resume', log);
});
speechSynthesis.speak(utterance);
setTimeout(() => speechSynthesis.pause(), 1000);
setTimeout(() => speechSynthesis.resume(), 2500);
// Wichtig · Fallstricke
- Einheit nicht einheitlich: Die Spezifikation schreibt Sekunden vor, einige Browser-Versionen (vor allem ältere Chromium-Versionen) liefern jedoch Millisekunden. Wer exakte Zeiten braucht, sollte den Wert plausibilisieren oder zusätzlich
performance.now()beimstart-Ereignis messen. - Abhängig von der Sprach-Engine: Genauigkeit und Verfügbarkeit hängen von der verwendeten Stimme ab. Bei manchen Netzwerk-Stimmen (z. B. Google-Stimmen in Chrome) werden
boundary-Ereignisse gar nicht ausgelöst, oderelapsedTimeist0. - Ob die Zeit während einer Pause weiterläuft, ist nicht festgelegt und variiert zwischen Implementierungen.
- Die Eigenschaft ist schreibgeschützt; Zuweisungen haben keine Wirkung (im Strict Mode kein Fehler, da es ein Getter ohne Setter auf dem Prototyp ist – die Zuweisung wird einfach ignoriert bzw. wirft in Strict Mode einen
TypeError). - Die Web Speech API ist nur in Browsern verfügbar, nicht in Node.js. Vorher mit
'speechSynthesis' in windowprüfen.