Signatur
Beschreibung
Der Konstruktor SpeechGrammar() gehört zur Web Speech API. Er erzeugt ein einzelnes Grammatik-Objekt mit den Eigenschaften src (die Grammatik selbst bzw. deren URI) und weight (Gewichtung, Standard 1). Mit einer solchen Grammatik wollte man festlegen, welche Wörter oder Sätze die Spracherkennung bevorzugt erkennen soll, etwa Farbnamen oder Menübefehle.
In der Praxis erzeugt man einzelne Grammatiken meist nicht direkt über den Konstruktor, sondern fügt sie über SpeechGrammarList.addFromString() oder SpeechGrammarList.addFromURI() einer Liste hinzu. Diese Liste wird dann der Eigenschaft SpeechRecognition.grammars zugewiesen. Der Konstruktor ist nur dann nützlich, wenn man ein Grammatik-Objekt gezielt einzeln anlegen und seine Eigenschaften selbst setzen möchte.
Wichtig: Grammatiken werden von den Browsern kaum bis gar nicht ausgewertet. Chromium-basierte Browser stellen den Konstruktor nur mit Präfix als webkitSpeechGrammar bereit und ignorieren die Grammatik bei der Erkennung. Die aktuelle Spezifikation hat das Grammatik-Konzept inzwischen zugunsten kontextbezogener Hinweise (Phrases) aufgegeben. Für neuen Code sollte man sich daher nicht auf SpeechGrammar verlassen.
Beispiele
Grammatik-Objekt mit Feature-Erkennung anlegen
// Präfix-Variante in Chromium berücksichtigen
const GrammarCtor = window.SpeechGrammar || window.webkitSpeechGrammar;
if (GrammarCtor) {
const grammar = new GrammarCtor();
grammar.src = '#JSGF V1.0; grammar farben; public <farbe> = rot | grün | blau ;';
grammar.weight = 0.8;
console.log(grammar.weight);
} else {
console.log('SpeechGrammar wird nicht unterstützt');
}
Übliche Alternative: Grammatik über SpeechGrammarList hinzufügen
const Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (Recognition && GrammarList) {
const jsgf = '#JSGF V1.0; grammar befehle; public <befehl> = start | stopp | weiter ;';
const list = new GrammarList();
list.addFromString(jsgf, 1);
const recognition = new Recognition();
recognition.lang = 'de-DE';
recognition.grammars = list;
recognition.addEventListener('result', (event) => {
console.log('Erkannt:', event.results[0][0].transcript);
});
console.log('Grammatiken in der Liste:', list.length);
// recognition.start(); // erfordert Nutzeraktion und Mikrofonfreigabe
}
Grammatik aus einer Liste auslesen
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (GrammarList) {
const list = new GrammarList();
list.addFromString('#JSGF V1.0; grammar ja_nein; public <antwort> = ja | nein ;', 0.5);
// Jeder Eintrag ist ein SpeechGrammar-Objekt
const grammar = list.item(0);
console.log(grammar instanceof (window.SpeechGrammar || window.webkitSpeechGrammar));
console.log(grammar.weight);
}
// Wichtig · Fallstricke
- Veraltet und experimentell: Das Grammatik-Konzept wurde aus der aktuellen Web-Speech-Spezifikation entfernt. Für neuen Code nicht verwenden.
- Kompatibilität: Chromium-Browser (Chrome, Edge, Opera) bieten nur
webkitSpeechGrammaran; Firefox hatte die API lediglich hinter einem Flag; Safari unterstütztSpeechGrammarpraktisch nicht. Immer eine Feature-Erkennung verwenden. - Keine Wirkung auf die Erkennung: Auch wenn der Konstruktor vorhanden ist, werten die gängigen Erkennungsdienste die Grammatik nicht aus. Das Ergebnis wird also nicht auf die angegebenen Wörter beschränkt. Filtern Sie die Ergebnisse deshalb selbst im
result-Handler. - Einen Wert für
weightaußerhalb von 0 bis 1 kann der Browser zurückweisen oder ignorieren. - Die Spracherkennung selbst braucht einen sicheren Kontext (HTTPS) und die Mikrofonfreigabe. In Chrome wird der Ton außerdem an einen Server geschickt, was für den Datenschutz wichtig ist.