Signatur
Beschreibung
SpeechGrammar beschreibt eine einzelne Grammatik für die Spracherkennung mit SpeechRecognition. Die Grammatik wird meist im Format JSGF (JSpeech Grammar Format) angegeben und legt fest, welche Wörter oder Satzmuster der Erkennungsdienst erwarten soll, zum Beispiel Farbnamen, Befehle oder Zahlen.
Direkt erzeugt man Instanzen selten. Üblich ist es, Grammatiken über eine SpeechGrammarList hinzuzufügen, entweder mit addFromString() oder mit addFromURI(). Die Liste wird dann der Eigenschaft SpeechRecognition.grammars zugewiesen. Die einzelnen Einträge der Liste sind SpeechGrammar-Objekte. Sie lassen sich über den Index oder mit item() abrufen.
Das Interface hat zwei Eigenschaften:
src– die Grammatik als Zeichenkette oder als URI, je nachdem, wie sie hinzugefügt wurde.weight– eine Gewichtung von 0.0 bis 1.0 (Standard: 1.0). Sie bestimmt, wie stark diese Grammatik im Verhältnis zu anderen Grammatiken der Liste berücksichtigt wird.
In der Praxis sollte man Grammatiken als Hinweis an den Erkennungsdienst verstehen, nicht als feste Einschränkung. Die meisten aktuellen Umsetzungen, vor allem die serverbasierte Erkennung in Chrome, ignorieren sie weitgehend.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $src | string | Eigenschaft: Die Grammatik als JSGF-Zeichenkette oder als URI, unter der sie liegt. Lesen und Schreiben sind möglich. | |
| $weight | number | 1.0 | Eigenschaft: Gewichtung der Grammatik zwischen 0.0 und 1.0. Lesen und Schreiben sind möglich. |
Rückgabewert
new SpeechGrammar() (bzw. new webkitSpeechGrammar()) liefert ein leeres Grammatik-Objekt. Meist erhält man Instanzen aber aus einer SpeechGrammarList.Beispiele
Grammatik per SpeechGrammarList hinzufügen und auslesen
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const farben = ['rot', 'grün', 'blau', 'gelb'];
const jsgf = `#JSGF V1.0; grammar farben; public <farbe> = ${farben.join(' | ')};`;
const liste = new SpeechGrammarList();
liste.addFromString(jsgf, 1);
// Einzelnes SpeechGrammar-Objekt abrufen
const grammatik = liste[0]; // oder liste.item(0)
console.log(grammatik instanceof (window.SpeechGrammar || window.webkitSpeechGrammar));
console.log(grammatik.weight);
console.log(grammatik.src);
SpeechGrammar direkt erzeugen und in der Erkennung verwenden
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const SpeechGrammar = window.SpeechGrammar || window.webkitSpeechGrammar;
const SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (!SpeechRecognition || !SpeechGrammar) {
console.warn('Spracherkennung mit Grammatiken wird nicht unterstützt.');
} else {
const befehle = new SpeechGrammar();
befehle.src = '#JSGF V1.0; grammar befehle; public <befehl> = start | stopp | weiter | zurück;';
befehle.weight = 0.8;
const liste = new SpeechGrammarList();
liste.addFromString(befehle.src, befehle.weight);
const erkennung = new SpeechRecognition();
erkennung.grammars = liste;
erkennung.lang = 'de-DE';
erkennung.maxAlternatives = 1;
erkennung.addEventListener('result', (event) => {
const text = event.results[0][0].transcript.trim().toLowerCase();
console.log(`Befehl erkannt: ${text}`);
});
document.querySelector('#mikro')?.addEventListener('click', () => erkennung.start());
}
Gewichtung mehrerer Grammatiken anpassen
const SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const liste = new SpeechGrammarList();
liste.addFromString('#JSGF V1.0; grammar ja_nein; public <antwort> = ja | nein;', 1);
liste.addFromString('#JSGF V1.0; grammar zahlen; public <zahl> = eins | zwei | drei;', 0.5);
for (let i = 0; i < liste.length; i++) {
const g = liste.item(i);
console.log(`Grammatik ${i}: Gewicht ${g.weight}`);
}
// Wichtig · Fallstricke
- Browser-Unterstützung: In Chromium-Browsern gibt es das Interface nur mit Präfix als
webkitSpeechGrammar. Firefox unterstütztSpeechRecognitionstandardmäßig nicht. Safari unterstützt die Spracherkennung, Grammatiken aber nur eingeschränkt. Deshalb immer per Feature-Erkennung auf das Präfix zurückgreifen. - Kaum Wirkung: Chrome übergibt Grammatiken zwar an die Erkennung, berücksichtigt sie in der Praxis aber kaum. Das Ergebnis kann trotzdem beliebige Wörter enthalten. Erkannte Texte müssen deshalb immer selbst geprüft werden, etwa gegen eine Liste erlaubter Befehle.
- Veraltet: Die Spezifikation rückt von Grammatiken ab und setzt stattdessen auf kontextbezogene Phrasen (
SpeechRecognitionPhrase).SpeechGrammargilt als veraltet und sollte in neuem Code nicht mehr als verlässliches Werkzeug eingeplant werden. - Werte für
weightaußerhalb von 0.0 bis 1.0 können einen Fehler auslösen oder werden ignoriert. addFromURI()lädt Grammatiken aus einer externen Quelle. Dabei gelten die üblichen CORS- und CSP-Regeln.- Die Spracherkennung braucht die Erlaubnis für das Mikrofon und einen sicheren Kontext (HTTPS). In Chrome werden die Audiodaten außerdem an einen Server geschickt, was für den Datenschutz wichtig ist.