Signatur
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());
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
}
});
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();
// Wichtig · Fallstricke
stop()oderabort()?stop()wertet das bereits aufgenommene Audio noch aus.abort()verwirft es. Nehmen Sieabort(), wenn der Nutzer ausdrücklich abbricht.- Asynchron: Nach
stop()können nochresult- odernomatch-Ereignisse eintreffen. Das Ende der Sitzung meldet nur das Ereignisend. Rufen Siestart()nicht erneut auf, bevorendgefeuert hat, sonst droht einInvalidStateError. - 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 nachend.