Tech Blog
  • HOME
  • Blog
  • 【AmiVoice API Private・SDK】簡単な「ルールグラマ」を作ってみた【基本編】

【AmiVoice API Private・SDK】簡単な「ルールグラマ」を作ってみた【基本編】

公開日:2023.12.20 最終更新日:2024.01.24

f:id:amivoice_techblog:20210209095049p:plain 大倉尭

皆さん、こんにちは!

AmiVoice API PrivateやSDKでは「ルールグラマ(グラマ認識)」を使ったエンジンが利用可能です。

ルールグラマとは、「事前に決めた文法(ルール)に従う表現だけを認識する」もので、どのような単語や文を認識できるようにするかというルールを自分で設定することができます。以前の記事で解説しましたので、詳しくは以下のリンクをご覧ください。

本記事は「ルールグラマ」シリーズの2本目として、ルールグラマの基本的な書き方を解説し、簡単なルールグラマが書けるようになることを目指します。

※なお、ルールグラマを使った音声認識には、AmiVoice API PrivateまたはAmiVoice SDKで「ルールグラマエンジン」を使用する必要があります。詳細はこちらをご確認のうえ、担当者までお問い合わせください。

前提:ルールグラマのフォーマットについて

AmiVoice API PrivateやSDKのルールグラマは、JSGF(JSpeech Grammar Format または Java Speech Grammar Format)に準拠した仕様を基本とし、一部に弊社ルールグラマ独自の仕様が含まれています。
以下の解説では、「弊社ルールグラマ独自の仕様」の部分はその旨を明記します。JSGFの仕様も必要な部分は解説しますが、詳細に関してはこちらをご覧ください(英語です)。

ルールグラマの中身はテキストファイルですので、一般的なテキストエディタ等で作成できます。拡張子を”.gram”として保存してください。

ルールグラマの簡単なサンプル

はじめに、「AmiVoice(読み:あみぼいす)」のみを認識する、簡単なサンプル(Sample.gram)を示します。このサンプルに基づいて、ルールグラマの書き方を解説していきます。

1行目:”#JSGF V1.0 UTF-8;”

JSGFのヘッダ情報です。以下の仕様となっています。

「#JSGF V1.0」は固定文字列です。上記のサンプルは、文字エンコーディングが「UTF-8」であることを示しています。文字エンコーディングは、特段の事情がない限り「UTF-8」とすることを推奨します。また、UTF-8を指定している場合には、ファイル自体もUTF-8(BOMなし)で保存することを忘れないようにしてください

「文字エンコーディング情報」は記述を省略することができますが、「うまく認識できない」などのトラブルにつながることもあるので、省略せずに記述してください。

2行目:”grammar Sample;”

グラマ名の定義です。以下の仕様となっています。

「グラマ名」に使用可能な文字種は、半角英数字と半角アンダースコア(”_”)です。半角ハイフンは使用できません。

基本的には、拡張子を除いたファイル名をグラマ名とすることを推奨します

ルールグラマエンジンは複数のgramファイルを読み込むことも可能で、その際にグラマ名が同一だと衝突が起こり、正しく認識が行われません。グラマ名とファイル名を一致させ、同じフォルダ内に複数のグラマファイルを保存することを推奨します。ただし、グラマ名に半角ハイフンは使用できないので、ファイル名に半角ハイフンがある場合は半角アンダースコアに置換するなどして対処してください。

3行目:”public <sample> = AmiVoice\あみぼいす;”

ルールを定義する文です。実際に音声認識エンジンに認識してほしいフレーズを定義します。以下の仕様となっています。

最初の”public”は「publicルール」であることを示します。publicでないルールについては次回以降の記事で解説する予定ですので、まずは「ルール名の前には”public”を付ける」と理解しておいてください。

「ルール名」は”<>”で囲う必要があります。サンプルでは、ファイル名・グラマ名は先頭が大文字の”Sample”、ルール名は小文字の”sample”と区別していますが、ルール名はファイル名・グラマ名とは無関係で、自由に命名して構いません。

「ルール定義」の部分を工夫することで、様々なルールグラマを作成することができます。詳細は次回以降の記事で解説しますので、ひとまず「音声認識したい単語を書く」と覚えておいてください。

「ルール定義」にはアルファベットや漢字なども記述することが可能ですが、その場合はひらがなまたはカタカナで読みを指定する必要があります。書き方は「AmiVoice\あみぼいす」のように、

と、「表記」と「読み」の間に半角バックスラッシュ(”\”)をつけます(フォント等によっては”¥”で表示される場合もあります)。”\”の前後にスペースを入れてはいけません。この「読み」の付与方法は弊社ルールグラマ独自の仕様です。ひらがなのみ・カタカナのみで構成される単語は、基本的に読みを登録する必要はありません

また、1つの「表記」に複数の「読み」を対応させたい場合は、「読み」同士を半角スラッシュ(”/”)で区切ります。例えば、「日本\にっぽん/にほん」と書くと、「にっぽん」「にほん」のいずれかで発話すれば「日本」と音声認識されます。こちらも、”/”の前後にスペースを入れてはいけません。

なお、「読み」に使える文字はひらがな・カタカナ・”ー”(長音文字)・”.”(半角ピリオド)のみです。そして、「読み」は実際に発音する通りに書くことを推奨します。以下の例を見てください。

「東京」をひらがなで書くと「とうきょう」ですが、実際の発音は「とーきょー」のようになると思います。なお、AmiVoiceには「読みの自動変換機能」があり、先ほどの「とーきょー」と「とうきょう」は同じものとして扱われます。しかし、意図しない自動変換が行われる可能性もあるので、実際に発音する通りに書く方が無難です。

もう1点注意が必要なのは、ひらがなの「は」「へ」です。これらは「わ(w a)」「え(e)」と読むこともありますが、AmiVoiceでは常に「は(h a)」「へ(h e)」として扱います。すなわち、「わ」「え」と読ませたい場合は、ひらがなのみの単語であっても読みの登録が必要です。例えば、「こんにちは」という挨拶のみを認識するルールグラマは、

のように書く必要があります。読みの記述を忘れると、「こんにち(k o n n i ch i h a)」と発音した場合のみ認識され、「こんにち(k o n n i ch i w a)」と発音しても認識されない可能性があります。

AmiVoiceにおける単語の読みについての詳細は、以下の記事もご覧ください。

ルールグラマを用いた音声認識の設定方法

ルールグラマを作成したら、音声認識を試してみましょう。ここでは、同期HTTP音声認識APIを使用した場合の設定方法を説明します。
※冒頭にも記載しましたが、ルールグラマを使った音声認識には、AmiVoice API PrivateまたはAmiVoice SDKで「ルールグラマエンジン」を使用する必要があります。

同期HTTP音声認識APIでルールグラマを指定する場合、ルールグラマはWebサーバ等に配置してください。そして、リクエストパラメータのdパラメータにある「接続エンジン名」を指定する箇所に、「接続エンジン名とルールグラマURLを”|”で繋いだ文字列」を記述します。こちらも参照してください。

具体的には、上記リンクにある、

を、以下のように書き換えることになります。

例えば、エンジン名が「-a-rule-input」、ルールグラマのURLが「http://dummy.com/grammars/Sample.gram」の場合、以下のように指定します。

そして、Sample.gramが「AmiVoice(あみぼいす)」のみを認識するように正しく記述され、「AmiVoice(あみぼいす)」と発話した音声ファイルを入力すると、例えば以下のような出力を得られます(出力は整形しています)。

「AmiVoice」と正しく認識されていることがわかります。「読み」を指定した場合、”written”に表記(AmiVoice)が、”spoken”に読み(あみぼいす)が出力されます。「読み」を指定しないひらがな・カタカナの場合は、”written”・”spoken”ともにルール定義に書いた通りの表記が出力されます。認識結果の詳しい見方についてはこちらをご覧ください。

次に、同じSample.gramを使って「AmiVoice」以外の音声を認識させてみましょう。出力の一例は以下の通りです。

上記の認識結果は、同じSample.gramに、私が「こんにちは」と発話した音声ファイルを認識させたものです。このルールグラマは「AmiVoice」しか認識できないので、それ以外の発話では”tokens”には何も出力されません。

トラブルシューティング

上記のSample.gramに「AmiVoice」と発話した音声ファイルを入力しても認識結果が出力されない場合、ルールグラマの記述に誤りがある可能性があります。一部は記事の途中でも触れましたが、間違えやすいポイントを以下に挙げておきます。

  • ヘッダで指定した文字エンコーディングと、ファイル自体の文字エンコーディングが一致しているか
  • 行末に”;“(半角セミコロン)を忘れていないか
  • 読みを指定する\“や”/“の前後にスペースを入れていないか

おわりに

本記事では、ルールグラマの書き方の基本について説明しました。より実践的なルールグラマの書き方は次回以降の記事で解説する予定ですので、ご期待ください。

ルールグラマはAmiVoice API Private・SDKで提供されている機能ですが、より手軽にAmiVoice APIの音声認識を試してみたい開発者の方がいましたら、ぜひ https://acp.amivoice.com/ を試してみてください。毎月音声60分までは全エンジン無料で使えます。

ここまでお読みいただき、ありがとうございました!

この記事を書いた人

  • 大倉尭

    新卒でアドバンスト・メディアに入社。
    音声認識の精度向上のための研究開発に携わった経験から、このブログをはじめ、アドバンスト・メディアの技術力をアピールする仕事に挑戦中。
    趣味は旅行(主に鉄道)・読書(主に小説)・ボードゲームなど。

     
APIを無料で利用開始