Start · Sprachen · JavaScript · Referenz · SpeechRecognition.grammars

SpeechRecognition.grammars

Eigenschaft

Liest oder setzt die <code>SpeechGrammarList</code> mit den Grammatiken, die eine <code>SpeechRecognition</code>-Instanz bei der Spracherkennung berücksichtigen soll.

seit JavaScript Web Speech API (Entwurf), Chrome/Edge 33+ und Safa Kategorie: webapi

Signatur

SpeechRecognition.grammars

Beschreibung

Die Eigenschaft grammars einer SpeechRecognition-Instanz enthält eine SpeechGrammarList. Diese Liste besteht aus SpeechGrammar-Objekten und beschreibt, welche Wörter oder Wortfolgen die Erkennung erwarten soll. Die Grammatiken werden meist im Format JSGF (JSpeech Grammar Format) angegeben, zum Beispiel für eine feste Menge an Befehlen oder Farbnamen.

Man verwendet grammars, wenn eine Anwendung nur einen kleinen, bekannten Wortschatz braucht, etwa bei Sprachbefehlen („start“, „stopp“, „weiter“) oder bei Auswahllisten. Dazu erzeugt man mit new SpeechGrammarList() eine Liste, fügt über addFromString() oder addFromURI() Grammatiken hinzu (optional gewichtet von 0 bis 1) und weist die Liste recognition.grammars zu, bevor start() aufgerufen wird.

Wichtig: Die Grammatik ist nur ein Hinweis an die Erkennungs-Engine. Aktuelle Browser, allen voran Chrome, verwenden eine serverseitige Erkennung und ignorieren die Grammatik in der Praxis weitgehend. Das Ergebnis kann also trotzdem Wörter enthalten, die nicht in der Grammatik stehen. Prüfe erkannte Texte deshalb immer selbst gegen die erlaubten Werte.

Parameter

Name Typ Default Beschreibung
$value SpeechGrammarList leere SpeechGrammarList Nur beim Setzen: die neue Liste von Grammatiken, die der Erkennung zugewiesen wird.

Rückgabewert

Typ
SpeechGrammarList
Beschreibung
Die aktuell zugewiesene Liste von SpeechGrammar-Objekten. Ohne eigene Zuweisung ist sie leer (length === 0).

Beispiele

Grammatik für Farbbefehle zuweisen

const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;

const farben = ['rot', 'grün', 'blau', 'gelb', 'schwarz'];
const jsgf = `#JSGF V1.0; grammar farben; public <farbe> = ${farben.join(' | ')} ;`;

const recognition = new SpeechRecognition();
const grammarList = new SpeechGrammarList();
grammarList.addFromString(jsgf, 1); // Gewicht 0..1

recognition.grammars = grammarList;
recognition.lang = 'de-DE';
recognition.maxAlternatives = 1;

console.log(recognition.grammars.length);
1

Zugewiesene Grammatiken auslesen

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const SGL = window.SpeechGrammarList || window.webkitSpeechGrammarList;

const recognition = new SR();
console.log('Vorher:', recognition.grammars.length);

const list = new SGL();
list.addFromString('#JSGF V1.0; grammar cmd; public <cmd> = start | stopp ;', 1);
list.addFromString('#JSGF V1.0; grammar ja; public <ja> = ja | nein ;', 0.5);
recognition.grammars = list;

for (let i = 0; i < recognition.grammars.length; i++) {
  const g = recognition.grammars.item(i);
  console.log(i, g.weight);
}
Vorher: 0 0 1 1 0.5

Sprachbefehle mit Prüfung und Funktionserkennung

const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const SGL = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const befehle = ['start', 'stopp', 'weiter'];

if (!SR) {
  console.warn('Spracherkennung wird nicht unterstützt.');
} else {
  const recognition = new SR();
  recognition.lang = 'de-DE';

  // Grammatik nur setzen, wenn der Browser sie kennt
  if (SGL) {
    const list = new SGL();
    list.addFromString(`#JSGF V1.0; grammar befehle; public <b> = ${befehle.join(' | ')} ;`, 1);
    recognition.grammars = list;
  }

  recognition.addEventListener('result', (event) => {
    const text = event.results[0][0].transcript.trim().toLowerCase();
    // Grammatik ist nur ein Hinweis – selbst prüfen
    if (befehle.includes(text)) {
      console.log(`Befehl erkannt: ${text}`);
    } else {
      console.log(`Unbekannte Eingabe: ${text}`);
    }
  });

  document.querySelector('#mic').addEventListener('click', () => recognition.start());
}
Befehl erkannt: start

// Wichtig · Fallstricke

  • Wird oft ignoriert: Chrome und Safari berücksichtigen die zugewiesene Grammatik in der Praxis kaum. Erkannte Texte immer selbst prüfen und nicht davon ausgehen, dass nur Wörter aus der Grammatik zurückkommen.
  • Präfixe: In Chrome, Edge und Safari heißen die Konstruktoren webkitSpeechRecognition und webkitSpeechGrammarList. Firefox unterstützt die Spracherkennung standardmäßig nicht. Safari stellt SpeechGrammarList je nach Version gar nicht bereit, daher braucht man eine Funktionserkennung.
  • Zeitpunkt: Die Grammatik vor start() zuweisen. Änderungen während einer laufenden Sitzung wirken sich meist erst beim nächsten Start aus.
  • Veraltet: SpeechGrammar und SpeechGrammarList gelten in neueren Fassungen der Spezifikation als veraltet. Für neuen Code sollte man sich nicht darauf verlassen.
  • Datenschutz: In Chrome wird das Audio zur Erkennung an einen Server gesendet. Außerdem ist eine sichere Verbindung (HTTPS) mit Mikrofon-Freigabe nötig.