Die Speech Recognition Grammar Specification (SRGS) ist ein W3C-Standard, der beschreibt, wie Spracherkennungs-Grammatiken (engl. speech recognition grammars) spezifiziert werden. Eine Spracherkennungs-Grammatik ist eine Reihe von Wortschemen, die dem Spracherkennungssystem mitteilen, was ein Mensch sagen würde. Zum Beispiel würde, wenn man ein automatisches Vermittlungssystem aufruft, das Spracherkennungssystem nach dem Namen der Person fragen, mit der man sprechen möchte. Danach wird ein Spracherkennungsprogramm aufgerufen, dem eine Spracherkennungs-Grammatik vorliegt. Diese Grammatik enthält die Namen aller Personen im Verzeichnis und die verschiedenen Satzmuster, mit denen Anrufer typischerweise anrufen.
SRGS spezifiziert zwei verschiedene, aber logisch gleichwertige Syntaxen, eine XML-basiert, die andere benutzt die angereicherte Backus-Naur-Form. In der Praxis wird allerdings die XML-Syntax öfter eingesetzt.
Würde das Spracherkennungsprogramm nur eine Zeichenkette der gesprochenen Wörter zurückgeben, würde die Sprachsoftware die sehr mühsame Arbeit übernehmen müssen, den Wörtern die semantische Bedeutung zu entnehmen. Aus diesem Grund können SRGS-Grammatiken mit tag-Elementen ausgestaltet werden, die, wenn sie ausgeführt werden, das semantische Ergebnis erzeugen. SRGS spezifiziert nicht den Inhalt dieser Tagelemente: dies wird in Zusammenarbeit mit dem W3C-Standard Semantic Interpretation for Speech Recognition (SISR) durchgeführt. SISR basiert auf ECMAScript und ECMAScript-Statements innerhalb der SRGS-Tags erzeugen ein ECMAScript-semantisches Ergebnisobjekt, das von der Voice-Application leicht verarbeitet werden kann.
Sowohl SRGS als auch SISR sind W3C-Empfehlungen, also auf der finalen Stufe auf dem Weg zum W3C-Standard. Der W3C VoiceXML-Standard, der definiert, wie Voice-Dialoge spezifiziert werden, basiert stark auf SRGS und SISR.
Beispiele
Hier ist ein Beispiel der Augmented BNF-Form von SRGS, wie sie in einer Sprachverzeichnis-Applikation vorkommen könnte:
#ABNF 1.0 ISO-8859-1;
// Standard-Grammatiksprache ist US-Englisch
language en-US;
// Single language attachment to tokens
// Note that "fr-CA" (Canadian French) is applied to only
// the word "oui" because of precedence rules
$yes = yes | oui!fr-CA;
// Single language attachment to an expansion
$people1 = (Michel Tremblay | André Roy)!fr-CA;
// Handling language-specific pronunciations of the same word
// A capable speech recognizer will listen for Mexican Spanish and
// US English pronunciations.
$people2 = Jose!en-US | Jose!es-MX;
/**
* Multi-lingual input possible
* @example may I speak to André Roy
* @example may I speak to Jose
*/
public $request = may I speak to ($people1 | $people2);
Hier ist dasselbe SRGS-Beispiel als XML-Formular:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN"
"http://www.w3.org/TR/speech-grammar/grammar.dtd">
<!-- the default grammar language is US English -->
<grammar xmlns="http://www.w3.org/2001/06/grammar"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/06/grammar
http://www.w3.org/TR/speech-grammar/grammar.xsd"
xml:lang="en-US" version="1.0">
<!--
single language attachment to tokens
"yes" inherits US English language
"oui" is Canadian French language
-->
<rule id="yes">
<one-of>
<item>yes</item>
<item xml:lang="fr-CA">oui</item>
</one-of>
</rule>
<!-- Single language attachment to an expansion -->
<rule id="people1">
<one-of xml:lang="fr-CA">
<item>Michel Tremblay</item>
<item>André Roy</item>
</one-of>
</rule>
<!--
Handling language-specific pronunciations of the same word
A capable speech recognizer will listen for Mexican Spanish
and US English pronunciations.
-->
<rule id="people2">
<one-of>
<item xml:lang="en-US">Jose</item>
<item xml:lang="es-MX">Jose</item>
</one-of>
</rule>
<!-- Multi-lingual input is possible -->
<rule id="request" scope="public">
<example> may I speak with André Roy </example>
<example> may I speak with Jose </example>
may I speak with
<one-of>
<item> <ruleref uri="#people1"/> </item>
<item> <ruleref uri="#people2"/> </item>
</one-of>
</rule>
</grammar>