Start · Sprachen · JavaScript · Referenz · SpeechGrammarList.length

SpeechGrammarList.length

Eigenschaft

Schreibgeschützte Eigenschaft, die die Anzahl der <code>SpeechGrammar</code>-Objekte in einer <code>SpeechGrammarList</code> als Ganzzahl liefert.

seit JavaScript Web Speech API – eingeschränkte Unterstützung (Chr deprecated seit ja Kategorie: webapi

Signatur

SpeechGrammarList.length

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

Typ
number
Beschreibung
Nicht-negative Ganzzahl (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);
0 2

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}`);
}
Grammatik 0: Gewicht 1 Grammatik 1: Gewicht 0.8

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 ;'])
);
Erkennung gestartet mit 1 Grammatik(en).

// Wichtig · Fallstricke

  • Browser-Kompatibilität: SpeechGrammarList ist experimentell. Chrome und Edge stellen die Schnittstelle nur als webkitSpeechGrammarList bereit, 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 length gezählt, beeinflussen die Erkennung aber praktisch nicht. Ein Wert von length > 0 garantiert also nicht, dass die Ergebnisse eingeschränkt werden.
  • Schreibgeschützt: liste.length = 0 leert die Liste nicht. Um Grammatiken zu entfernen, legst du eine neue SpeechGrammarList an.
  • Kein echtes Array: Die Liste hat length und Index-Zugriff, aber keine Array-Methoden wie map(). Bei Bedarf wandelst du sie mit Array.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.