JSGF

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску

Технология JSpeech Grammar Format (JSGF) — платформонезависимая текстовое представление грамматик для использования в компьютерном распознавании речи. JSGF перенимает стиль и соглашения языка Java в дополнение к использованию традиционной грамматической нотации. Описание в Wiki.

Грамматика — это формальные правила, которые описывают простые правила построения предложений. Лексемы, полученные на предыдущем шаге пытаются сопоставиться с грамматикой и если удачно, то выводится результат.

Пример 1

Рассмотрим простой пример JSGF-грамматики:

#JSGF V1.0;
grammar answer; 

public <answer> = (да|нет|выход|ноль|один|два|три|четыре|пять|шесть|семь|восемь|девять|десять);

Символ «|» означает «или», скобки используются в качестве группирующего оператора.

В данном примере, ответ может быть: «да» или «нет», или «выход», или «ноль», или «один», или «два», или «три», или «четыре», или «пять», или «шесть», или «семь», или «восемь», или «девять», или «десять». Если же мы произнесем «один два», то мы нарушим правило построения ответа.

Пример 2

#JSGF V1.0;

grammar robot;

<object> = (робот);
<action> =(вперёд|назад|налево|направо|стоп);
public <command> = <object> <action>;

Грамматика выражения «public <command> = <object> <action>» подразумевает, что сначала мы должны произнести «<<object>» (В нашем случает «робот»), а дальше действие «<action>» («вперед» или «назад», или «направо», или «стоп»). Если же мы скажем «вперед робот», то программа нас не поймет и ничего не выведет на экран, так как это противоречит правилу построения предложения. Чтобы команда «вперед робот» распознавалась, мы должны «<object>» и «<action>» поменять местами.

Пример 3

Более сложный пример JSGF-грамматики, на примере калькулятора:

#JSGF V1.0;

grammar calc;

<greeting> = (ок|окей)(компьютер|калькулятор);
<n1> = (ноль|один|два|три|четыре|пять|шесть|семь|восемь|девять);
<n2> = (десять|одинадцать|двенадцать|тринадцать|четырнадцать|пятнадцать|шестнадцать|семнадцать|восемнадцать|девятнадцать)|(двадцать|тридцать|сорок| 
пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)[<n1>];
<n3> = (сто|двести|триста|четыреста|пятьсот|шестьсот|девятьсот)[<n2>|<n1>];
<n4> = [<n1>|<n2>|<n3>](тысяча|тысяч|тысячи)[<n3>|<n2>|<n1>];
<number> = <n4>|<n3>|<n2>|<n1>;
<operation> = плюс | минус | умножить на | разделить на;
<expression> = <number> <operation> <number>;
public <query> = <greeting> <expression>;


Наша программа будет активироваться фразой «окей компьютер» или «окей калькулятор», за которой будет идти арифметическое выражение. Например:

«окей калькулятор два плюс два» или «окей компьютер две тысячи умножить на семь»


Правила построения запроса строятся из «приветствия» » (<greeting> = (ок|окей)(компьютер|калькулятор)) и «выражения» (<expression> = <number> <operation> <number>). Где «<number>» - первое число, «<operation>» - возможные операции, «<number>» - второе число.


JSGF-грамматика - это не сложно, более подробная информация представлена в JSpeech Grammar Format (W3C Note).