Signatur
Beschreibung
Die Eigenschaft isFinal eines SpeechRecognitionResult-Objekts zeigt an, ob die Spracherkennung für diesen Abschnitt fertig ist. Bei true ist das Ergebnis endgültig: Das Transkript wird sich nicht mehr ändern und kann dauerhaft übernommen werden, etwa in ein Textfeld oder zur Befehlsauswertung.
Wichtig ist die Eigenschaft vor allem mit SpeechRecognition.interimResults = true. Dann liefert der Browser während des Sprechens laufend Zwischenergebnisse (isFinal === false), die bei jedem result-Ereignis durch genauere Varianten ersetzt werden, bis schließlich ein endgültiges Ergebnis kommt. Ohne Zwischenergebnisse sind alle gelieferten Ergebnisse in der Regel endgültig.
Üblicherweise geht man im result-Handler ab event.resultIndex über event.results (eine SpeechRecognitionResultList), trennt anhand von isFinal in „bestätigten“ und „vorläufigen“ Text und stellt vorläufigen Text z. B. grau oder kursiv dar.
Rückgabewert
true, wenn das Ergebnis endgültig ist; false bei einem Zwischenergebnis, das sich noch ändern kann.Beispiele
Endgültige und vorläufige Ergebnisse trennen
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
recognition.lang = 'de-DE';
recognition.interimResults = true;
recognition.continuous = true;
let finalText = '';
recognition.addEventListener('result', (event) => {
let interimText = '';
for (let i = event.resultIndex; i < event.results.length; i++) {
const result = event.results[i];
if (result.isFinal) {
finalText += result[0].transcript;
} else {
interimText += result[0].transcript;
}
}
console.log('Endgültig:', finalText);
console.log('Vorläufig:', interimText);
});
recognition.start();
Live-Diktat mit hervorgehobenem Zwischentext
// HTML: <p id="final"></p><p id="interim" class="grau"></p>
const finalEl = document.querySelector('#final');
const interimEl = document.querySelector('#interim');
const Rec = window.SpeechRecognition || window.webkitSpeechRecognition;
const rec = new Rec();
rec.lang = 'de-DE';
rec.interimResults = true;
rec.onresult = (event) => {
const results = Array.from(event.results);
finalEl.textContent = results
.filter((r) => r.isFinal)
.map((r) => r[0].transcript)
.join(' ');
interimEl.textContent = results
.filter((r) => !r.isFinal)
.map((r) => r[0].transcript)
.join(' ');
};
document.querySelector('#start').addEventListener('click', () => rec.start());
Sprachbefehl erst bei endgültigem Ergebnis ausführen
const Rec = window.SpeechRecognition || window.webkitSpeechRecognition;
const rec = new Rec();
rec.lang = 'de-DE';
rec.interimResults = true;
const befehle = {
'licht an': () => console.log('💡 Licht eingeschaltet'),
'licht aus': () => console.log('🌑 Licht ausgeschaltet'),
};
rec.onresult = (event) => {
const result = event.results[event.results.length - 1];
if (!result.isFinal) return; // Zwischenergebnisse ignorieren
const text = result[0].transcript.trim().toLowerCase();
befehle[text]?.() ?? console.log(`Unbekannter Befehl: ${text}`);
};
rec.start();
// Wichtig · Fallstricke
- Schreibgeschützt: Zuweisungen an
isFinalwerden ignoriert (im Strict ModeTypeError). - Aktionen mit Nebenwirkungen (Befehle ausführen, Daten speichern) nur bei
isFinal === trueauslösen – Zwischenergebnisse ändern sich oft noch, etwa „wel“ → „Welt“. - Bei Zwischenergebnissen nie Text anhängen, sondern jedes Mal ersetzen, sonst entstehen Dopplungen. Für endgültigen Text ab
event.resultIndexiterieren, damit nichts doppelt übernommen wird. - Browserunterstützung: Chrome und Edge nur mit Präfix
webkitSpeechRecognition, oft mit serverseitiger Erkennung (Internetverbindung nötig, Datenschutz beachten). Safari ab 14.1; Firefox unterstützt die Spracherkennung standardmäßig nicht. Vorher auf Unterstützung prüfen. - Braucht einen sicheren Kontext (HTTPS) und die Freigabe für das Mikrofon.