Start · Sprachen · JavaScript · Referenz · SpeechSynthesis.speaking

SpeechSynthesis.speaking

Eigenschaft

Schreibgeschützter boolescher Wert: <code>true</code>, wenn gerade eine Äußerung gesprochen wird. Das gilt auch dann, wenn die Sprachausgabe pausiert ist.

seit JavaScript Baseline: alle modernen Browser (seit 2018) Kategorie: webapi

Signatur

SpeechSynthesis.speaking

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

Typ
boolean
Beschreibung
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);
Vorher: false Beim Start: true Nach dem Ende: false

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);
speaking: true paused: true

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

  • speaking heißt nicht „ist hörbar“: Die Eigenschaft ist auch bei pausierter Ausgabe true. Frag zusätzlich paused ab, um wirklich hörbare Ausgabe zu erkennen.
  • Zustand ändert sich asynchron: Direkt nach speak(), pause() oder cancel() kann der Wert noch veraltet sein. Verlass dich besser auf die Events start, end, pause und resume der Äußerung.
  • Browser verhalten sich unterschiedlich: In Chrome bricht die Ausgabe bei langen Texten teils nach etwa 15 Sekunden ab, und speaking kann danach falsch stehen bleiben. Safari und Firefox melden den Pausen-Zustand teils anders. Unter Android pausiert pause() 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 speaking false.
  • Verfügbarkeit prüfen: Vorher mit 'speechSynthesis' in window testen. In Node.js gibt es die API nicht.