Start · Sprachen · JavaScript · Referenz · SpeechRecognition.stop()

SpeechRecognition.stop()

Methode

Beendet die Audioaufnahme einer laufenden Spracherkennung und versucht, aus dem bisher Gehörten noch ein abschließendes <code>SpeechRecognitionResult</code> zu liefern.

seit JavaScript Chrome 25+ (mit Präfix webkit), Edge 79+, Safari 1 Kategorie: webapi

Signatur

SpeechRecognition.prototype.stop()

Beschreibung

Mit stop() beendet man eine Sitzung der Web Speech API, die zuvor mit start() begonnen wurde. Der Dienst hört ab diesem Moment nicht mehr auf das Mikrofon. Bereits aufgenommenes Audio wird aber noch ausgewertet: Das Ergebnis kommt meist als letztes result-Ereignis an, danach folgt end.

Genau darin liegt der Unterschied zu abort(). abort() bricht sofort ab und verwirft alles, was noch nicht erkannt wurde. stop() nimmt man, wenn das Gesagte noch zählen soll, zum Beispiel bei einem „Aufnahme beenden“-Button, bei Push-to-Talk (Taste loslassen) oder nach einer festen Zeit.

Die Methode arbeitet asynchron, gibt aber kein Promise zurück. Ob die Erkennung wirklich zu Ende ist, erfährt man erst über das Ereignis end (onend). Erst danach sollte man start() erneut aufrufen, sonst wirft der Browser einen InvalidStateError.

Beispiele

Diktat per Button starten und beenden

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SR();
recognition.lang = 'de-DE';
recognition.continuous = true;
recognition.interimResults = false;

const startBtn = document.querySelector('#start');
const stopBtn = document.querySelector('#stop');
const output = document.querySelector('#output');

recognition.addEventListener('result', (event) => {
  for (let i = event.resultIndex; i < event.results.length; i++) {
    if (event.results[i].isFinal) {
      output.textContent += event.results[i][0].transcript + ' ';
    }
  }
});

recognition.addEventListener('end', () => {
  startBtn.disabled = false;
  stopBtn.disabled = true;
  console.log('Erkennung beendet');
});

startBtn.addEventListener('click', () => {
  recognition.start();
  startBtn.disabled = true;
  stopBtn.disabled = false;
});

// stop(): Das bisher Gesagte wird noch ausgewertet
stopBtn.addEventListener('click', () => recognition.stop());
Erkennung beendet

Push-to-Talk: Aufnahme endet beim Loslassen der Leertaste

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SR();
recognition.lang = 'de-DE';
let listening = false;

recognition.onresult = (event) => {
  const text = event.results[0][0].transcript;
  console.log(`Befehl: ${text}`);
};
recognition.onend = () => { listening = false; };

document.addEventListener('keydown', (e) => {
  if (e.code === 'Space' && !listening && !e.repeat) {
    listening = true;
    recognition.start();
  }
});

document.addEventListener('keyup', (e) => {
  if (e.code === 'Space' && listening) {
    recognition.stop(); // letztes Ergebnis kommt noch per onresult
  }
});
Befehl: Licht einschalten

Zeitlimit mit Promise-Wrapper um stop()

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;

const listenFor = (ms) => new Promise((resolve, reject) => {
  const recognition = new SR();
  recognition.lang = 'de-DE';
  recognition.continuous = true;
  const parts = [];

  recognition.onresult = (e) => {
    for (let i = e.resultIndex; i < e.results.length; i++) {
      if (e.results[i].isFinal) parts.push(e.results[i][0].transcript);
    }
  };
  recognition.onerror = (e) => reject(new Error(e.error));
  recognition.onend = () => resolve(parts.join(' ').trim());

  recognition.start();
  setTimeout(() => recognition.stop(), ms);
});

const run = async () => {
  try {
    const text = await listenFor(5000);
    console.log('Erkannt:', text || '(nichts)');
  } catch (err) {
    console.error('Fehler:', err.message);
  }
};
run();
Erkannt: Hallo Welt

// Wichtig · Fallstricke

  • stop() oder abort()? stop() wertet das bereits aufgenommene Audio noch aus. abort() verwirft es. Nehmen Sie abort(), wenn der Nutzer ausdrücklich abbricht.
  • Asynchron: Nach stop() können noch result- oder nomatch-Ereignisse eintreffen. Das Ende der Sitzung meldet nur das Ereignis end. Rufen Sie start() nicht erneut auf, bevor end gefeuert hat, sonst droht ein InvalidStateError.
  • Rufen Sie stop() auf, ohne dass eine Erkennung läuft, passiert nichts. Es wird kein Fehler geworfen.
  • Kompatibilität: In Chrome und Edge gibt es die API nur mit Präfix als webkitSpeechRecognition. Firefox unterstützt sie standardmäßig nicht. In Chrome wird das Audio meist zur Erkennung an einen Server gesendet, eine Internetverbindung ist also nötig. Prüfen Sie immer vorher, ob die API vorhanden ist.
  • Datenschutz: Das Mikrofon erfordert eine Nutzerfreigabe und einen sicheren Kontext (HTTPS). Rufen Sie stop() konsequent auf, damit das Mikrofon nicht länger offen bleibt als nötig. Das Aufnahme-Symbol im Browser verschwindet erst nach end.