Signatur
Beschreibung
Die Eigenschaft length der Schnittstelle SpeechGrammarList gibt an, wie viele Grammatiken (SpeechGrammar-Objekte) aktuell in der Liste enthalten sind. Grammatiken kommen über addFromString() oder addFromURI() hinzu und beschreiben im JSGF-Format, welche Wörter oder Phrasen die Spracherkennung bevorzugt erkennen soll.
Brauchen kannst du length vor allem, um mit einer klassischen for-Schleife und item(index) bzw. Index-Zugriff (list[i]) über die Liste zu laufen. Außerdem lässt sich damit prüfen, ob schon Grammatiken hinterlegt sind, bevor die Liste einem SpeechRecognition-Objekt über dessen Eigenschaft grammars zugewiesen wird.
Die Eigenschaft ist schreibgeschützt: Wenn du ihr einen Wert zuweist, wird er ignoriert (im Strict Mode gibt es einen TypeError). Um die Liste zu verändern, gibt es nur die Methoden zum Hinzufügen. Eine Methode zum Entfernen sieht die Spezifikation nicht vor.
Rückgabewert
unsigned long) mit der Anzahl der enthaltenen SpeechGrammar-Objekte. Bei einer leeren Liste ist der Wert 0.Beispiele
Anzahl der Grammatiken nach dem Hinzufügen prüfen
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const farben = '#JSGF V1.0; grammar farben; public <farbe> = rot | grün | blau | gelb ;';
const befehle = '#JSGF V1.0; grammar befehle; public <befehl> = start | stopp | weiter ;';
const liste = new GrammarList();
console.log(liste.length); // leer
liste.addFromString(farben, 1);
liste.addFromString(befehle, 0.5);
console.log(liste.length);
Alle Grammatiken mit length und item() durchlaufen
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const liste = new GrammarList();
liste.addFromString('#JSGF V1.0; grammar ja; public <a> = ja | nein ;', 1);
liste.addFromString('#JSGF V1.0; grammar zahl; public <z> = eins | zwei | drei ;', 0.8);
for (let i = 0; i < liste.length; i++) {
const grammatik = liste.item(i); // alternativ: liste[i]
console.log(`Grammatik ${i}: Gewicht ${grammatik.weight}`);
}
Spracherkennung nur starten, wenn Grammatiken vorhanden sind
const Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
const starteErkennung = (grammatikStrings) => {
if (!Recognition || !GrammarList) {
console.warn('Web Speech API wird nicht unterstützt.');
return;
}
const liste = new GrammarList();
grammatikStrings.forEach((g) => liste.addFromString(g, 1));
if (liste.length === 0) {
console.warn('Keine Grammatik definiert – Erkennung ohne Einschränkung.');
}
const erkennung = new Recognition();
erkennung.lang = 'de-DE';
erkennung.grammars = liste;
erkennung.onresult = (e) => console.log('Erkannt:', e.results[0][0].transcript);
erkennung.start();
console.log(`Erkennung gestartet mit ${liste.length} Grammatik(en).`);
};
// Aufruf z. B. in einem Klick-Handler (Nutzergeste nötig)
document.querySelector('#mikro')?.addEventListener('click', () =>
starteErkennung(['#JSGF V1.0; grammar farben; public <f> = rot | blau ;'])
);
// Wichtig · Fallstricke
- Browser-Kompatibilität:
SpeechGrammarListist experimentell. Chrome und Edge stellen die Schnittstelle nur alswebkitSpeechGrammarListbereit, Firefox unterstützt sie standardmäßig nicht. Prüfe daher immer vorher, ob die Schnittstelle existiert. - Grammatiken wirken kaum: In Chromium werden Grammatiken zwar angenommen und über
lengthgezählt, beeinflussen die Erkennung aber praktisch nicht. Ein Wert vonlength > 0garantiert also nicht, dass die Ergebnisse eingeschränkt werden. - Schreibgeschützt:
liste.length = 0leert die Liste nicht. Um Grammatiken zu entfernen, legst du eine neueSpeechGrammarListan. - Kein echtes Array: Die Liste hat
lengthund Index-Zugriff, aber keine Array-Methoden wiemap(). Bei Bedarf wandelst du sie mitArray.from(liste)um. Das funktioniert nur, wenn die Implementierung die Liste iterierbar macht oder Index-Zugriff unterstützt. - Wegen der ungewissen Zukunft der Grammatik-Funktion in der Spezifikation solltest du produktiv nicht darauf angewiesen sein.