Start · Sprachen · JavaScript · Referenz · SpeechRecognitionAlternative

SpeechRecognitionAlternative

Schnittstelle

Steht für eine einzelne Erkennungshypothese der Web Speech API: den erkannten Text (<code>transcript</code>) und wie sicher sich der Dienst dabei ist (<code>confidence</code>).

seit JavaScript Chrome 33+, Edge 79+, Safari 14.1+ (mit webkit-Prä Kategorie: webapi

Signatur

interface SpeechRecognitionAlternative

Beschreibung

Die Schnittstelle SpeechRecognitionAlternative gehört zur Web Speech API. Sie steht für eine mögliche Deutung dessen, was der Spracherkennungsdienst gehört hat. Das kann ein einzelnes Wort sein, aber auch ein ganzer Satz. Der Dienst liefert oft mehrere Deutungen, sortiert nach Wahrscheinlichkeit. Jede davon ist eine eigene SpeechRecognitionAlternative.

Man erzeugt solche Objekte nie selbst. Man bekommt sie über die Hierarchie im result-Ereignis von SpeechRecognition: event.results ist eine SpeechRecognitionResultList. Jedes Element darin ist ein SpeechRecognitionResult, und über dessen Index (result[0], result[1] …) oder result.item(i) kommt man an die einzelnen Alternativen.

Die Schnittstelle hat zwei schreibgeschützte Eigenschaften:

  • transcript (string): der erkannte Text.
  • confidence (number): eine Schätzung zwischen 0 und 1, wie sicher sich der Dienst ist.

Wie viele Alternativen es pro Ergebnis höchstens gibt, legt SpeechRecognition.maxAlternatives fest (Standard: 1). Mehrere Alternativen lohnen sich zum Beispiel bei Sprachbefehlen: Man vergleicht alle Hypothesen mit einer Liste erlaubter Befehle und nimmt die erste, die passt.

Rückgabewert

Typ
SpeechRecognitionAlternative
Beschreibung
Ein schreibgeschütztes Objekt mit den Eigenschaften transcript (string) und confidence (number, 0–1). Man erhält es über SpeechRecognitionResult[index] bzw. SpeechRecognitionResult.item(index).

Beispiele

Beste Alternative lesen (transcript und confidence)

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

recognition.addEventListener('result', (event) => {
  // Erstes Ergebnis, erste (wahrscheinlichste) Alternative
  const alternative = event.results[0][0];
  console.log(`Erkannt: "${alternative.transcript}"`);
  console.log(`Sicherheit: ${(alternative.confidence * 100).toFixed(1)} %`);
});

// Muss durch eine Nutzeraktion ausgelöst werden
document.querySelector('#mic').addEventListener('click', () => recognition.start());
Erkannt: "hallo welt" Sicherheit: 92.4 %

Mehrere Alternativen gegen eine Befehlsliste prüfen

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

const befehle = ['licht an', 'licht aus', 'musik stopp'];

recognition.onresult = (event) => {
  const result = event.results[0];
  // SpeechRecognitionResult ist nicht iterierbar wie ein Array -> Array.from
  const alternativen = Array.from({ length: result.length }, (_, i) => result.item(i));

  const treffer = alternativen.find((alt) =>
    befehle.includes(alt.transcript.trim().toLowerCase())
  );

  if (treffer) {
    console.log(`Befehl: ${treffer.transcript} (${treffer.confidence.toFixed(2)})`);
  } else {
    console.log('Kein bekannter Befehl:', alternativen.map((a) => a.transcript));
  }
};

document.querySelector('#cmd').addEventListener('click', () => recognition.start());
Befehl: licht an (0.87)

Fortlaufendes Diktat mit Zwischenergebnissen

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

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

recognition.onresult = (event) => {
  let zwischenText = '';
  for (let i = event.resultIndex; i < event.results.length; i++) {
    const { transcript } = event.results[i][0]; // SpeechRecognitionAlternative
    if (event.results[i].isFinal) {
      finalText += transcript + ' ';
    } else {
      zwischenText += transcript;
    }
  }
  ausgabe.textContent = finalText + zwischenText;
};

document.querySelector('#start').onclick = () => recognition.start();
document.querySelector('#stop').onclick = () => recognition.stop();

// Wichtig · Fallstricke

  • Browser-Unterstützung: Chromium-Browser und Safari kennen die API nur mit Präfix als webkitSpeechRecognition. Firefox unterstützt sie standardmäßig nicht. Prüfe deshalb immer vorher, ob sie vorhanden ist: 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window.
  • Serverbasierte Erkennung: In Chrome geht das Audio zur Auswertung an Google-Server. Ohne Netzwerk kommt ein error-Ereignis mit network. Denke an den Datenschutz: Nutzer sollten wissen, dass ihre Sprache übertragen wird.
  • confidence ist unzuverlässig: Je nach Browser und Dienst ist der Wert bei Zwischenergebnissen oder weiteren Alternativen oft 0. Verwende ihn nur als grobe Orientierung und nicht als feste Schwelle.
  • maxAlternatives ist nur eine Obergrenze: Der Dienst kann auch weniger Alternativen liefern. Prüfe also immer result.length.
  • Leerzeichen im Text: Bei fortlaufender Erkennung beginnt transcript ab dem zweiten Ergebnis häufig mit einem Leerzeichen. Vor Vergleichen deshalb trim() aufrufen.
  • Die Erkennung braucht einen sicheren Kontext (HTTPS) und die Freigabe des Mikrofons. start() sollte man durch eine Nutzeraktion auslösen.