Signatur
Beschreibung
Die Eigenschaft src der Schnittstelle SpeechGrammar enthält die Grammatik, die eine Spracherkennung (SpeechRecognition) beim Auswerten des Gesprochenen berücksichtigen soll. Laut Spezifikation ist der Wert eine URL. Diese URL kann auf eine externe Grammatikdatei verweisen oder die Grammatik als data:-URL direkt enthalten. Üblich ist dafür das Format JSGF (JSpeech Grammar Format).
Meist setzt man src nicht selbst. Stattdessen fügt man Grammatiken über SpeechGrammarList.addFromString() oder SpeechGrammarList.addFromURI() einer Liste hinzu. Danach liest man die fertigen SpeechGrammar-Objekte über SpeechGrammarList.item() oder den Index-Zugriff aus. Mit src lässt sich dann prüfen, welche Grammatik ein Eintrag enthält, oder man tauscht sie nachträglich aus.
Man verwendet die Eigenschaft, wenn die Erkennung auf einen festen Wortschatz beschränkt oder dafür gewichtet werden soll, zum Beispiel für Sprachbefehle wie Farben, Ziffern oder Menüpunkte. In der Praxis werten aktuelle Browser Grammatiken aber kaum oder gar nicht aus. Deshalb sollte die Logik einer Anwendung nie davon abhängen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | string | Nur beim Setzen: eine URL zu einer Grammatikdatei oder eine data:-URL mit der Grammatik im JSGF-Format. Relative URLs werden relativ zur Dokument-URL aufgelöst. |
Rückgabewert
addFromString() hinzugefügt, liefert Chromium meist eine data:-URL mit dem kodierten Grammatik-Text.Beispiele
Grammatik hinzufügen und über src auslesen
const SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (!SpeechGrammarList) {
console.warn('SpeechGrammarList wird nicht unterstützt.');
} else {
const farben = ['rot', 'grün', 'blau', 'gelb'];
const grammatik = `#JSGF V1.0; grammar farben; public <farbe> = ${farben.join(' | ')} ;`;
const liste = new SpeechGrammarList();
liste.addFromString(grammatik, 1);
// Das erzeugte SpeechGrammar-Objekt auslesen
const eintrag = liste[0];
console.log(eintrag.src);
console.log(eintrag.weight);
}
Grammatik mit einer Spracherkennung verwenden
const Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (Recognition && GrammarList) {
const befehle = '#JSGF V1.0; grammar befehle; public <befehl> = start | stopp | weiter | zurück ;';
const liste = new GrammarList();
liste.addFromString(befehle, 1);
const erkennung = new Recognition();
erkennung.lang = 'de-DE';
erkennung.grammars = liste;
// Zur Kontrolle alle hinterlegten Grammatiken ausgeben
for (let i = 0; i < erkennung.grammars.length; i++) {
console.log(`Grammatik ${i}:`, erkennung.grammars.item(i).src);
}
erkennung.addEventListener('result', (event) => {
console.log('Erkannt:', event.results[0][0].transcript);
});
document.querySelector('#mikro')?.addEventListener('click', () => erkennung.start());
}
src nachträglich auf eine externe Grammatikdatei setzen
const GrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
if (GrammarList) {
const liste = new GrammarList();
liste.addFromString('#JSGF V1.0; grammar leer; public <x> = platzhalter ;', 1);
const grammar = liste.item(0);
// Relative URL wird relativ zum Dokument aufgelöst
grammar.src = '/grammatiken/ziffern.jsgf';
console.log(grammar.src);
}
// Wichtig · Fallstricke
- Experimentell und uneinheitlich unterstützt: Chromium-Browser stellen die Schnittstellen nur mit Präfix bereit (
webkitSpeechGrammar,webkitSpeechGrammarList). In Firefox ist die Web Speech API hinter einem Flag verborgen, und Safari unterstützt Grammatiken nur eingeschränkt. Die Unterstützung sollte man immer vorher prüfen. - Grammatiken werden oft ignoriert: Selbst wo die Eigenschaft vorhanden ist, beeinflusst die Grammatik das Ergebnis der Spracherkennung in aktuellen Implementierungen häufig nicht. Die Grammatikteile der Spezifikation gelten als veraltet und werden möglicherweise entfernt. Erkannte Texte sollte man deshalb immer selbst prüfen, zum Beispiel mit einem Abgleich gegen eine Liste erlaubter Wörter.
- Rückgabewert ist nicht der Originaltext: Nach
addFromString()liefertsrcin der Regel eine URL-kodiertedata:-URL. Den ursprünglichen JSGF-Text erhält man bei Bedarf mitdecodeURIComponent()zurück. - Externe Grammatikdateien unterliegen den üblichen Regeln für Zugriffe über Herkunftsgrenzen hinweg (CORS). Außerdem funktioniert die Spracherkennung nur in einem sicheren Kontext (HTTPS) und erst, nachdem der Nutzer den Mikrofonzugriff erlaubt hat.