메인 콘텐츠로 건너뛰기

규칙 문법(Rule Grammar)

규칙 문법(Rule Grammar) 파일을 이용한 음성 인식

AmiVoice API Private에서 사용 가능한 "音声入力_ルール" 엔진(-a-rule-input-private)은 사용자가 작성한 규칙 문법 파일을 사용하여 음성 인식을 수행할 수 있습니다. 예를 들어, IVR 시스템에서 고객 정보를 음성 인식할 때, 회원 번호 확인 등 일정한 규칙에 따라 제한된 단어만 사용되는 발화가 예상되는 상황에서 효과적입니다.

규칙 문법 파일 형식

"音声入力_ルール" 엔진에서는 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」이 됩니다.