Signatur
Beschreibung
Die schreibgeschützte Eigenschaft resultIndex eines SpeechRecognitionEvent gibt an, ab welcher Position sich die SpeechRecognitionResultList in event.results geändert hat. Alle Einträge unterhalb dieses Index sind unverändert geblieben und wurden schon in früheren result-Events gemeldet.
Das ist vor allem bei kontinuierlicher Erkennung (recognition.continuous = true) und bei Zwischenergebnissen (recognition.interimResults = true) wichtig. Hier enthält event.results alle Ergebnisse der laufenden Sitzung. Wer bei jedem Event die ganze Liste von vorn durchgeht, verarbeitet dieselben Sätze mehrfach. Mit resultIndex als Startwert der Schleife verarbeitet man nur die neuen oder geänderten Einträge.
Typisch ist dieses Muster: Endgültige Ergebnisse (result.isFinal === true) hängt man fest an ein Transkript an. Vorläufige Ergebnisse zeigt man dagegen nur vorübergehend an, denn sie können im nächsten Event unter demselben Index durch eine bessere Erkennung ersetzt werden.
Rückgabewert
event.results, der sich mit diesem Event geändert hat.Beispiele
Nur neue Ergebnisse verarbeiten
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
recognition.lang = 'de-DE';
recognition.continuous = true;
recognition.addEventListener('result', (event) => {
// Erst ab resultIndex lesen, frühere Ergebnisse sind bekannt
for (let i = event.resultIndex; i < event.results.length; i++) {
console.log(`Ergebnis ${i}:`, event.results[i][0].transcript);
}
});
recognition.start();
Live-Transkript mit Zwischenergebnissen
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
recognition.lang = 'de-DE';
recognition.continuous = true;
recognition.interimResults = true;
const finalEl = document.querySelector('#final');
const interimEl = document.querySelector('#interim');
let finalText = '';
recognition.onresult = (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;
}
}
finalEl.textContent = finalText;
interimEl.textContent = interimText; // vorläufig, wird ersetzt
};
document.querySelector('#start').addEventListener('click', () => recognition.start());
resultIndex zur Fehlersuche protokollieren
const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
recognition.continuous = true;
recognition.interimResults = true;
recognition.onresult = ({ resultIndex, results }) => {
console.log(`geändert ab Index ${resultIndex}, Gesamtzahl ${results.length}`);
};
recognition.start();
// Wichtig · Fallstricke
- Häufiger Fehler: Die Schleife bei
0statt beievent.resultIndexzu beginnen. Beicontinuous = truelanden dann Sätze doppelt im Transkript. - Vorläufige Ergebnisse können sich am selben Index mehrmals ändern. Sie sollten deshalb nicht fest gespeichert werden, sondern erst, wenn
isFinalden Werttruehat. - Einige Android-Versionen von Chrome melden bei
continuous = trueungewöhnlicheresultIndex-Werte oder doppelte Ergebnisse. Auf Mobilgeräten sollte man die Erkennung gezielt testen. - Kompatibilität: In Chromium-Browsern ist der Konstruktor oft nur als
webkitSpeechRecognitionverfügbar. Firefox unterstützt die Erkennung standardmäßig nicht. Chrome schickt die Audiodaten zur Auswertung an einen Server, deshalb funktioniert die Erkennung dort nicht offline. Außerdem ist ein sicherer Kontext (HTTPS) nötig, und der Nutzer muss den Mikrofonzugriff erlauben.