Signatur
Beschreibung
Die schreibgeschützte Eigenschaft speaking des Interfaces SpeechSynthesis (erreichbar über window.speechSynthesis) zeigt an, ob die Sprachausgabe gerade eine Äußerung (SpeechSynthesisUtterance) bearbeitet. Sie ist true, sobald eine Äußerung begonnen hat, und bleibt es, bis die Äußerung endet oder mit cancel() abgebrochen wird.
Wichtig: speaking ist auch dann true, wenn die Ausgabe mit pause() angehalten wurde. Ob wirklich gerade Ton zu hören ist, erkennst du erst in Kombination mit speechSynthesis.paused. Ob noch weitere Äußerungen in der Warteschlange stehen, zeigt dagegen speechSynthesis.pending.
Typische Einsatzfälle:
- Schaltflächen je nach Zustand umschalten (z. B. „Vorlesen“, „Pause“, „Fortsetzen“).
- Verhindern, dass sich neue Äußerungen ungewollt an die laufende anhängen.
- Den Zustand der Oberfläche beim Laden der Seite oder nach einem Tab-Wechsel angleichen.
Für reaktive Oberflächen sind die Events start, end, pause und resume der Äußerung meist besser geeignet als das wiederholte Abfragen von speaking.
Rückgabewert
true, wenn gerade eine Äußerung gesprochen wird, auch im pausierten Zustand. Sonst false.Beispiele
Zustand vor und nach dem Start prüfen
const synth = window.speechSynthesis;
console.log('Vorher:', synth.speaking);
const utterance = new SpeechSynthesisUtterance('Hallo und willkommen auf programmierung.net!');
utterance.lang = 'de-DE';
utterance.addEventListener('start', () => {
console.log('Beim Start:', synth.speaking);
});
utterance.addEventListener('end', () => {
console.log('Nach dem Ende:', synth.speaking);
});
synth.speak(utterance);
speaking bleibt beim Pausieren true
const synth = window.speechSynthesis;
const utterance = new SpeechSynthesisUtterance('Dies ist ein längerer Text, der gleich pausiert wird.');
utterance.lang = 'de-DE';
utterance.addEventListener('start', () => {
synth.pause();
// Kurz warten, bis der Browser den Zustand übernommen hat
setTimeout(() => {
console.log('speaking:', synth.speaking);
console.log('paused:', synth.paused);
synth.resume();
}, 200);
});
synth.speak(utterance);
Ein Knopf zum Vorlesen, Pausieren und Fortsetzen
// HTML: <button id="vorlesen">Vorlesen</button> <article id="text">…</article>
const synth = window.speechSynthesis;
const button = document.querySelector('#vorlesen');
const text = document.querySelector('#text').textContent;
const updateLabel = () => {
if (!synth.speaking) button.textContent = 'Vorlesen';
else if (synth.paused) button.textContent = 'Fortsetzen';
else button.textContent = 'Pause';
};
button.addEventListener('click', () => {
if (!synth.speaking) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = 'de-DE';
utterance.addEventListener('end', updateLabel);
synth.speak(utterance);
} else if (synth.paused) {
synth.resume();
} else {
synth.pause();
}
// Zustand ändert sich asynchron, darum etwas später aktualisieren
setTimeout(updateLabel, 100);
});
Laufende Ausgabe abbrechen, bevor neuer Text gesprochen wird
const sayNow = (message) => {
const synth = window.speechSynthesis;
if (synth.speaking || synth.pending) {
synth.cancel(); // laufende Äußerung und Warteschlange leeren
}
const utterance = new SpeechSynthesisUtterance(message);
utterance.lang = 'de-DE';
synth.speak(utterance);
};
sayNow('Neue Nachricht eingegangen.');
// Wichtig · Fallstricke
speakingheißt nicht „ist hörbar“: Die Eigenschaft ist auch bei pausierter Ausgabetrue. Frag zusätzlichpausedab, um wirklich hörbare Ausgabe zu erkennen.- Zustand ändert sich asynchron: Direkt nach
speak(),pause()odercancel()kann der Wert noch veraltet sein. Verlass dich besser auf die Eventsstart,end,pauseundresumeder Äußerung. - Browser verhalten sich unterschiedlich: In Chrome bricht die Ausgabe bei langen Texten teils nach etwa 15 Sekunden ab, und
speakingkann danach falsch stehen bleiben. Safari und Firefox melden den Pausen-Zustand teils anders. Unter Android pausiertpause()nicht zuverlässig. - Nutzeraktion nötig: Viele Browser (vor allem Safari/iOS) geben Sprache erst nach einer Nutzeraktion wie einem Klick aus. Ohne Klick bleibt
speakingfalse. - Verfügbarkeit prüfen: Vorher mit
'speechSynthesis' in windowtesten. In Node.js gibt es die API nicht.