Start · Sprachen · JavaScript · Referenz · SpeechRecognitionEvent

SpeechRecognitionEvent

Schnittstelle

Ereignisobjekt der Web Speech API für die Ereignisse <code>result</code> und <code>nomatch</code>. Es enthält vorläufige und endgültige Spracherkennungsergebnisse.

seit JavaScript Web Speech API – Chrome/Edge (mit Präfix webkit), Kategorie: webapi

Signatur

interface SpeechRecognitionEvent extends Event

Beschreibung

SpeechRecognitionEvent ist das Ereignisobjekt, das eine SpeechRecognition-Instanz bei den Ereignissen result und nomatch an die Handler übergibt. Es erbt von Event und liefert die erkannten Texte samt Konfidenzwerten.

Die wichtigsten Eigenschaften:

  • results (SpeechRecognitionResultList, nur lesbar): alle Ergebnisse der laufenden Sitzung. Jedes SpeechRecognitionResult enthält eine oder mehrere Alternativen (SpeechRecognitionAlternative mit transcript und confidence). Die Eigenschaft isFinal zeigt, ob das Ergebnis endgültig ist.
  • resultIndex (number, nur lesbar): Index des niedrigsten Ergebnisses in results, das sich bei diesem Ereignis geändert hat. Ab dieser Stelle muss man auswerten.
  • interpretation und emma: veraltet bzw. nie umgesetzt. In aktuellen Browsern liefern sie meist null oder existieren gar nicht.

Man braucht das Interface für Diktierfunktionen, Sprachbefehle und Live-Untertitel. Ist continuous = true und interimResults = true gesetzt, feuert result mehrfach. Dann trennt man mit resultIndex und isFinal die vorläufigen von den endgültigen Texten.

Der Konstruktor new SpeechRecognitionEvent(type, init) existiert. Im Alltag erzeugt aber der Browser die Instanzen. Selbst erzeugt man sie höchstens in Tests.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Nur beim Konstruktor: der Ereignisname, z. B. "result" oder "nomatch".
$eventInitDict Pflicht { resultIndex?: number, results: SpeechRecognitionResultList } Nur beim Konstruktor: Initialisierungsobjekt. results ist Pflicht. resultIndex ist standardmäßig 0. Dazu kommen die üblichen EventInit-Optionen.

Rückgabewert

Typ
SpeechRecognitionEvent
Beschreibung
Das Ereignisobjekt mit den Eigenschaften results und resultIndex sowie den geerbten Event-Eigenschaften.

Beispiele

Einfache Einmal-Erkennung mit Konfidenz

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SR();
recognition.lang = 'de-DE';
recognition.maxAlternatives = 1;

recognition.addEventListener('result', (event) => {
  const { transcript, confidence } = event.results[0][0];
  console.log(`Erkannt: "${transcript}" (${(confidence * 100).toFixed(0)} %)`);
});

recognition.addEventListener('nomatch', () => {
  console.log('Nichts Verständliches erkannt.');
});

document.querySelector('#mic').addEventListener('click', () => recognition.start());
Erkannt: "Hallo Welt" (92 %)

Diktat mit vorläufigen und endgültigen Ergebnissen

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

const output = document.querySelector('#text');
let finalText = '';

recognition.onresult = (event) => {
  let interim = '';
  // Nur die geänderten Ergebnisse ab resultIndex auswerten
  for (let i = event.resultIndex; i < event.results.length; i++) {
    const result = event.results[i];
    if (result.isFinal) {
      finalText += result[0].transcript + ' ';
    } else {
      interim += result[0].transcript;
    }
  }
  output.textContent = finalText + interim;
};

recognition.start();

Sprachbefehle über mehrere Alternativen erkennen

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SR();
recognition.lang = 'de-DE';
recognition.maxAlternatives = 5;

const commands = {
  hell: () => document.body.classList.remove('dark'),
  dunkel: () => document.body.classList.add('dark'),
};

recognition.onresult = (event) => {
  const alternatives = Array.from(event.results[event.resultIndex]);
  const hit = alternatives
    .map((alt) => alt.transcript.trim().toLowerCase())
    .find((text) => text in commands);

  if (hit) {
    commands[hit]();
    console.log(`Befehl ausgeführt: ${hit}`);
  } else {
    console.log('Unbekannter Befehl:', alternatives.map((a) => a.transcript));
  }
};

recognition.start();
Befehl ausgeführt: dunkel

// Wichtig · Fallstricke

  • Browser-Unterstützung: Chromium-Browser bieten das Interface nur mit Präfix an (webkitSpeechRecognition, webkitSpeechRecognitionEvent). In Firefox ist es standardmäßig deaktiviert. Vor der Nutzung sollte man die Verfügbarkeit prüfen.
  • Datenschutz: Chrome schickt die Audiodaten zur Erkennung an Server von Google. Wer mit sensiblen Inhalten arbeitet, muss die Nutzer darüber informieren. Außerdem sind ein sicherer Kontext (HTTPS) und eine Mikrofon-Berechtigung nötig.
  • resultIndex beachten: results enthält alle Ergebnisse der Sitzung. Wer jedes Mal ab Index 0 durchläuft, schreibt Texte doppelt.
  • confidence ist bei vorläufigen Ergebnissen oft 0 und je nach Browser unzuverlässig. Man sollte es nicht als harte Schwelle verwenden.
  • nomatch wird in Chrome selten ausgelöst. Häufiger kommt ein result mit niedriger Konfidenz oder ein error mit no-speech.
  • interpretation und emma sind veraltet. Man sollte sie nicht verwenden.