메인 콘텐츠로 건너뛰기

규칙 문법 파일의 형식과 작성 방법

여기서는 "音声入力_ルール" 음성입력_규칙 엔진(-a-rule-input-private)에서 사용할 수 있는 규칙 문법 파일의 형식 및 작성 방법에 대해 설명합니다.

규칙 문법 파일 형식​

"音声入力_ルール" 음성입력_규칙 엔진에서는 JSpeech Grammar Format(JSGF)으로 작성된 문법 파일(JSGF 문법 파일) 또는 Speech Recognition Grammar Specification(SRGS)으로 작성된 문법 파일(SRGF 문법 파일)을 사용할 수 있습니다. 이러한 형식을 사용하여 음성 인식 엔진이 인식해야 할 구문(단어 집합)과 태그(구문이 인식되었을 때 부가 정보로 애플리케이션에 반환되는 문자열)를 제한적으로 기술할 수 있습니다. 신규 문법 파일을 작성하는 경우 JSGF 문법 파일을 권장합니다. 여기서는 두 가지 문법 파일의 사양에 대해 간단히 설명합니다. 각 문법 파일 사양의 자세한 내용은 다음 웹 페이지를 참조하십시오.

JSGF 규칙 문법 파일의 간이 사양​

JSGF 문법 파일은 다음 요소로 구성됩니다.

헤더 정보​

문자 인코딩 정보 및 국가·언어 정보를 기술합니다. "헤더 정보"의 형식은 다음과 같습니다.

#JSGF V1.0;
#JSGF V1.0 <문자 인코딩 정보>;
#JSGF V1.0 <문자 인코딩 정보> <국가·언어 정보>;

문자 인코딩 정보 및 국가·언어 정보는 생략할 수 있습니다.

예:

#JSGF V1.0;
#JSGF V1.0 MS932;
#JSGF V1.0 MS932 ja-JP;
#JSGF V1.0 UTF-8;

규칙 문법(Rule Grammar) 구문​

문법 이름을 기술합니다. "규칙 문법 구문" 형식은 다음과 같습니다.

grammar 【문법 이름】;

문법 이름에는 규칙 문법 파일 이름에서 경로 부분과 확장자 부분을 제외한 문자열을 지정하십시오.

예:

grammar Sample;

규칙 정의문​

실제로 음성 인식 엔진이 인식해야 할 구문과 태그의 정의를 기술합니다. 하나의 문법 파일 안에 여러 개의 규칙 정의문을 기술할 수 있습니다. 규칙에는 public 규칙과 private 규칙의 두 가지 종류가 있습니다. public 규칙은 그 자체로 음성 인식 엔진이 인식해야 할 구문이나 태그를 규정하는 것입니다. private 규칙은 다른 규칙에서 참조되는 것입니다. public 규칙의 "규칙 정의문" 형식은 다음과 같습니다.

public <【규칙 이름】> = 【규칙 정의】;

private 규칙의 "규칙 정의문" 형식은 다음과 같습니다.

<【규칙 이름】> = 【규칙 정의】;

규칙 정의에 대해서는 규칙 정의를 참조하십시오.

예:

public <sample1> = おはよう <sample2>;
<sample2> = AmiVoice\あみぼいす;

규칙 정의​

규칙 정의는 다음 요소로 구성됩니다.

단어​

음성 인식 엔진이 인식해야 할 단어를 기술합니다. 단어는 직렬 또는 병렬로 기술할 수 있습니다. 단어의 "표기"와 "읽기"는 \(백슬래시)로 구분합니다. 하나의 "표기"에 대해 여러 개의 "읽기"를 기술할 경우, 각 읽기를 /(슬래시)로 구분합니다. 형식은 다음과 같습니다.

기호설명
( )"집합화"를 나타냄
|"병렬"을 나타냄
\표기와 읽기의 구분을 나타냄
/읽기의 구분을 나타냄

직렬 예:

・・・ AmiVoice\あみぼいす/あみ 音声認識\おんせいにんしき エンジン ・・・

병렬 예:

・・・ ( AmiVoice\あみぼいす/あみ | 音声認識\おんせいにんしき | エンジン ) ・・・

단어 기술 방법에 대해서는 다음 사항도 확인하십시오.

  • 일본어의 "읽기"에 지정할 수 있는 문자열은 히라가나와 "ー"(장음 기호)와 "."(마침표)만 사용할 수 있습니다.
  • 일본어의 "읽기"를 기술할 때 "ー"(장음 기호)를 사용하여 기술하거나 사용하지 않고 기술해도 음성 인식 엔진 내부에서는 모두 동일한 "읽기"로 취급됩니다. 이 동일화 규칙에 따라 중복되는 단어 등록은 하지 않도록 주의하십시오.

예:

「かー」=「かあ」 「きゃー」=「きゃあ」
「きー」=「きい」
「くー」=「くう」 「きゅー」=「きゅう」
「けー」=「けい」=「けえ」
「こー」=「こう」=「こお」 「きょー」=「きょう」=「きょお」등
  • 일본어의 "읽기" 에 "は" 또는 "へ"를 기술하는 경우, 이들은 항상 "h a"이나 "h e"로 취급됩니다. "w a"나 "e"로 취급되지 않습니다.
  • 일본어의 "읽기"를 기술할 때 "."(마침표)를 사용하면 위의 동일화 규칙을 강제로 적용하지 않는 기술이 가능합니다. 예:
「やまのうち」 → “やまのーち”
「やまの.うち」 → “やまのうち”
「りくうんきょく」 → “りくーんきょく”
「りく.うんきょく」→ “りくうんきょく” 등

규칙 이름​

같은 문법 파일 내의 다른 규칙을 참조하고 싶을 때 기술합니다. 규칙 이름도 직렬 또는 병렬로 기술할 수 있습니다. 형식은 다음과 같습니다.

<【규칙 이름】>

예:

・・・ こんにちは <name> さん・・・

특수 규칙 이름​

특수 규칙에 대한 참조를 기술할 수도 있습니다. 특수 규칙을 나타내는 규칙 이름은 다음과 같습니다.

규칙 이름설명
<NULL>아무것도 없음을 의미하는 특수 규칙
<VOID>어떤 발화에도 절대 일치하지 않음을 의미하는 특수 규칙
<GARBAGE>어떤 발화에도 일치함을 의미하는 특수 규칙

예:

・・・ こんにちは ( <NULL> {no-name} | アミ {AMI} ) ・・・
・・・ こんばんは <VOID> ・・・
<GARBAGE>+ ( おはよう | おやすみ ) <GARBAGE>+
팁

특수 규칙 <GARBAGE>는 AmiVoice가 JSGF에 대해 독자적으로 확장한 사양이며, 표준 JSGF 사양에는 포함되지 않습니다.

반복​

반복 횟수로 "1회", "0 또는 1회", "0회 이상의 반복", "1회 이상의 반복"의 4가지 종류의 기술이 가능합니다. 형식은 다음과 같습니다.

기호설명
[ ]"0 또는 1회"를 나타내는 기호
*"0회 이상의 반복"을 나타내는 후치 기호
+"1회 이상의 반복"을 나타내는 후치 기호

"1회" 예:

・・・ AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン ・・・

"0 또는 1회" 예:

・・・ [ AmiVoice\あみぼいす ] ・・・
・・・ [ AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン ] ・・・

"0회 이상의 반복" 예:

・・・ AmiVoice\あみぼいす * ・・・
・・・ ( AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン )* ・・・

"1회 이상의 반복" 예:

・・・ AmiVoice\あみぼいす + ・・・
・・・ ( AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン )+ ・・・

태그​

규칙 정의 내에 태그(구문이 음성 인식되었을 때 부가 정보로 애플리케이션에 반환되는 문자열)를 기술할 수 있습니다. 태그를 사용하면 음성 인식된 구문에서, 음성 인식된 구문을 구성하는 단어 집합과는 다른 정보를 추출할 수 있습니다. 같은 의미를 가진 다른 구문에 같은 태그를 설정함으로써 태그 문자열을 받는 애플리케이션 측에서 표현 방식이나 언어에 의존하지 않는 처리를 쉽게 구현할 수 있습니다. 형식은 다음과 같습니다.

{【태그】}

예:

・・・ AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン {AmiVoice} ・・・
・・・ ( 一つ\ひとつ | 一個\いっこ | 一本\いっぽん ) {1} ・・・

SRGS 문법 파일 간단 사양​

SRGS 문법 파일은 ABNF 형식의 SRGS 문법 파일과 XML 형식의 SRGS 문법 파일 두 가지 형식을 가지지만, 둘 다 표현 형식만 다를 뿐 표현 가능한 내용에는 차이가 없습니다. SRGS 문법 파일의 사양은 거의 JSGF 문법 파일의 사양을 포함하고 있어, JSGF 문법 파일과 SRGS 문법 파일 간의 변환은 비교적 쉽게 할 수 있습니다. JSGF 문법 파일과 SRGS 문법 파일 간의 주요 변환 규칙은 다음과 같습니다.

항목JSGF 문법 파일ABNF 형식의
SRGS 문법 파일
XML 형식의
SRGS 문법 파일
헤더 정보#JSGF V1.0 MS932 ja-JP;#ABNF 1.0 MS932;
language ja-JP;
<?xml version="1.0" encoding="MS932">
<grammar xmlns="..." version="1.0" xml:lang="ja-JP">
...
</grammar>
문법 선언문grammar a;(없음)
※ 파일 이름으로 문법 이름을 표현하기 때문에
(없음)
※ 파일 이름으로 문법 이름을 표현하기 때문에
Public 규칙 정의문public <a> = A;public $a = A;<rule id="a" scope="public">
A
</rule>
Private 규칙 정의문<b> = B;$b = B;<rule id="b">
B
</rule>
집합( A B C )( A B C )<item>A B C</item>
병렬( A | B | C )( A | B | C )<one-of>
<item>A<item>
<item>B</item>
<item>C</item>
</one-of>
규칙 이름< b >$ b<ruleref uri="#b">
특수 규칙 이름<NULL>
<VOID>
<GARBAGE>
$NULL
$VOID
$GARBAGE
<ruleref special="NULL">
<ruleref special="VOID">
<ruleref special="GARBAGE">
0회 또는 1회[ A ][ A ]
또는
A <0-1>
<item repeat="0-1">
A
</item>
0회 이상A *A <0-><item repeat="0-">
A
</item>
1회 이상A +A <1-><item repeat="1-">
A
</item>
태그{ T }{ T }<tag>T</tag>

예제​

예제1: 인사

Greeting.gram

#JSGF V1.0 UTF-8;
grammar Greeting;

public <greeting> = おはよう [ございます] | こんにちは | こんばんは | さようなら;

「おはよう」, 「おはようございます」, 「こんにちは」, 「こんばんは」, 「さようなら」를 인식할 수 있습니다.

예제2: 이름

Name.gram

#JSGF V1.0 UTF-8;
grammar Name;

public <name> = [私\わたし わ] <last> <first> [です];

<last> = 鈴木\すずき {suzuki} | 中村\なかむら {nakamura};
<first> = 太郎\たろー {taro} | 花子\はなこ {hanako};

「私は鈴木太郎です」 또는 「私は中村花子です」 등을 인식할 수 있습니다. 「私は」와 「です」는 생략할 수 있습니다. 「鈴木花子は私です」와 같이 어순이 다른 발화 및 「私は中村です」 등은 인식할 수 없습니다.

샘플3: 우편번호

ZipCode.gram

#JSGF V1.0 UTF-8;
grammar ZipCode;

public <zipcode> = <num> <num> <num> [の] <num> <num> <num> <num>;

<num> = 1\いち {1}
| 2\に/にー {2}
| 3\さん {3}
| 4\よん/し/しー {4}
| 5\ご {5}
| 6\ろく {6}
| 7\なな/しち {7}
| 8\はち {8}
| 9\きゅー/く/くー {9}
| 0\ぜろ/れー/まる {0};

「123 の4567」와 같은 발화를 인식할 수 있습니다. 「123 の4567」로 인식한 경우의 태그 문자열은 「1|2|3|4|5|6|7」이 되므로, 애플리케이션 측에서 태그 문자열에서 「|」를 제거하면 우편번호와 같은 숫자열을 얻을 수 있습니다。

샘플4: 연속 숫자 입력

Number.gram

#JSGF V1.0 UTF-8;
grammar Number;

public <number> = <num>+;

<num> = 1\いち {1}
| 2\に/にー {2}
| 3\さん {3}
| 4\よん/し/しー {4}
| 5\ご {5}
| 6\ろく {6}
| 7\なな/しち {7}
| 8\はち {8}
| 9\きゅー/く/くー {9}
| 0\ぜろ/れー/まる {0};

「いちにさん」, 「ごろくなな」 등을 인식할 수 있습니다.

샘플5: 드라이브스루

Burger.gram

#JSGF V1.0 UTF-8;
grammar Burger;

public <order> = (<item> [を] <count> [と])+ [[を] お願い\おねがい [します]];

public <item> = ( ハンバーガー {bur}
| ドリンク {dri}
| フライドポテト {fri}
| コカコーラ {col}
| アイスクリーム {ice}
);

<count> = ( 一つ\ひとつ {1} | 二つ\ふたつ {2} | 三つ\みっつ {3} | 四つ\よっつ {4} | 五つ\いつつ {5}
| 六つ\むっつ {6} | 七つ\ななつ {7} | 八つ\やっつ {8} | 九つ\ここのつ {9}
| 一個\いっこ {1} | 二個\にこ {2} | 三個\さんこ {3} | 四個\よんこ {4} | 五個\ごこ {5}
| 六個\ろっこ {6} | 七個\ななこ {7} | 八個\はっこ {8} | 九個\きゅーこ {9}
);

public <end> = (以上\いじょー | OK\おっけー) [です] {end};

「+」 기호는 1회 이상의 반복이므로, 다음과 같은 문장을 인식할 수 있습니다.

「ハンバーガー」
「ひとつ」
「ハンバーガー一個」
「ハンバーガー一個とアイスクリームを二つお願いします」
「ハンバーガー一個とアイスクリームを二つドリンク三つ」

애플리케이션 측에서 태그 문자열을 이용하면, 「一つ」로 인식한 경우나 「一個」로 인식한 경우에도 동일한 처리를 쉽게 할 수 있습니다. 예를 들어, 「ハンバーガー一個とアイスクリームを二つドリンク三つ」를 인식한 경우의 태그 문자열은 「bur|1|ice|2|dri|3」이 됩니다.