Signatur
Beschreibung
Die Methode addFromString() der Schnittstelle SpeechGrammarList nimmt eine Grammatik, die als String vorliegt (z. B. in einer Variablen oder einem Template-Literal gespeichert), wandelt sie in ein SpeechGrammar-Objekt um und hängt sie an die Liste an. Die Grammatik wird üblicherweise im JSGF-Format (JSpeech Grammar Format) geschrieben.
Gedacht ist sie für die Web Speech API: Du übergibst die Liste über recognition.grammars an ein SpeechRecognition-Objekt. Damit sollte die Erkennung bestimmte Wörter oder Phrasen (etwa Befehle, Farbnamen oder Menüpunkte) bevorzugt erkennen. Im Gegensatz zu addFromURI() brauchst du dafür keine externe Datei, sondern hast die Grammatik direkt im Code.
Über den optionalen Parameter weight legst du die relative Gewichtung dieser Grammatik gegenüber anderen Grammatiken derselben Liste fest (Wertebereich 0.0 bis 1.0).
Wichtig: In der Praxis ignorieren aktuelle Browser-Implementierungen (Chrome, Edge, Safari) Grammatiken weitgehend. Der Aufruf verursacht keinen Fehler, beeinflusst das Erkennungsergebnis aber in der Regel nicht spürbar. Die Spezifikation hat Grammatiken inzwischen sogar als veraltet markiert.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Die Grammatik als String, typischerweise im JSGF-Format, z. B. #JSGF V1.0; grammar farben; public <farbe> = rot | grün | blau;. |
|
| $weight | number | 1.0 | Relative Gewichtung der Grammatik zwischen 0.0 und 1.0. Werte außerhalb dieses Bereichs können einen SyntaxError auslösen. |
Rückgabewert
undefined zurück. Die neue SpeechGrammar steht danach am Ende der Liste und ist über list.item(index) bzw. list[index] erreichbar.Beispiele
Farb-Grammatik für die Spracherkennung registrieren
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const farben = ['rot', 'grün', 'blau', 'gelb', 'schwarz'];
const grammatik = `#JSGF V1.0; grammar farben; public <farbe> = ${farben.join(' | ')};`;
const liste = new SpeechGrammarList();
liste.addFromString(grammatik, 1);
const recognition = new SpeechRecognition();
recognition.grammars = liste;
recognition.lang = 'de-DE';
recognition.interimResults = false;
recognition.addEventListener('result', (event) => {
const text = event.results[0][0].transcript;
document.body.style.backgroundColor = text.trim() === 'rot' ? 'red' : '';
console.log('Erkannt:', text);
});
document.querySelector('#start').addEventListener('click', () => recognition.start());
Mehrere Grammatiken mit unterschiedlicher Gewichtung
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const liste = new GrammarList();
liste.addFromString('#JSGF V1.0; grammar befehle; public <befehl> = start | stopp | weiter;', 1.0);
liste.addFromString('#JSGF V1.0; grammar zahlen; public <zahl> = eins | zwei | drei;', 0.5);
console.log(liste.length);
console.log(liste[1].weight);
Feature-Erkennung vor der Nutzung
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (GrammarList) {
const liste = new GrammarList();
liste.addFromString('#JSGF V1.0; grammar ja_nein; public <antwort> = ja | nein;');
console.log('Grammatik hinzugefügt:', liste.length);
} else {
console.warn('SpeechGrammarList wird nicht unterstützt.');
}
// Wichtig · Fallstricke
- Kaum Wirkung in der Praxis: Chrome, Edge und Safari akzeptieren Grammatiken, werten sie aber faktisch nicht aus. Verlasse dich nicht darauf, dass die Erkennung dadurch genauer wird – prüfe das Transkript lieber selbst gegen eine Liste erlaubter Werte.
- Veraltet: Die Web-Speech-Spezifikation hat
SpeechGrammarundSpeechGrammarListals veraltet markiert. In neuerem Code solltest du sie nicht voraussetzen. - Kompatibilität: In Chromium-Browsern ist die Schnittstelle nur mit Präfix als
webkitSpeechGrammarListverfügbar; Firefox unterstützt die Spracherkennung standardmäßig nicht. Immer eine Feature-Erkennung einbauen. - Die Spracherkennung in Chrome schickt Audiodaten an einen Server – beim Datenschutz beachten und nur in sicheren Kontexten (HTTPS) nutzen.
- Ein syntaktisch fehlerhafter JSGF-String löst in der Regel keinen Fehler aus; Tippfehler bemerkst du also nicht.