# プログラマブル準AIモジュール "華和梨" Getting Started

2005/07/03
Phase 8.2.3

華和梨開発チーム :
NAKAUE.T (Meister), 偽Meister (夢乃), さとー, 酔狂, さくらのにえ

## Index

← back

> 0. はじめに
> 1. インストール
> 2. ファイルについて
> 3. kawarirc.kis
> 3.1. kawarirc.kisファイルの書き方
> 3.2. デバッグ用の動作モード指定
> 4. 辞書
> 4.1. 辞書ファイルの書き方
> 4.2. ダブルクォート
> 4.3. エントリ呼び出し
> 4.4. 履歴参照
> 4.5. システムエントリ
> 5. インラインスクリプト
> 6. 他に出来ること

## 0. はじめに

華和梨の全てを理解する必要はありません。

華和梨は、 「ゴーストを作成するための枠組みを作る人」と「ゴーストを作成する人」 が役割を分担できるようにするために、 意図的に多機能で柔軟なプラットフォームを提供しています。 ただゴーストをデスクトップに立たせるためだけなら、 華和梨の機能の一割を知っていれば十分です。

華和梨のことは何も知らないが、とにかくゴーストを作りたいという場合、 まずは、OpenKEEPS、 KLAFT、 FUDS などの「枠組み」を提供するミドルウェアを入手し、 その上でサンプルメッセージを書き換えるなどの作業から始めることをお薦めします。

## 1. インストール

ゴーストのディレクトリに、以下のファイルを置いて下さい。

shiori.dll | "華和梨"そのもの(必須)
kawarirc.kis | 初期設定ファイル(必須)
dict-*.txt | 辞書ファイル
ghost-*.txt | "華和梨"辞書形式のゴースト会話データファイル

## 2. ファイルについて

華和梨が読み込むゴースト設定ファイルは、 全て「華和梨辞書ファイル形式」です。 華和梨は「kawarirc.kis」ファイルをまず最初に読み込みますので、 通常は、ここから更に幾つかのオプション辞書ファイルを順次読み込んでいくことになります。

実際のゴースト記述に用いる辞書ファイルは、 他のファイルとの衝突を防ぐため、 単語データが主の辞書ファイルの名前を「dict-*.txt」、 会話データが主の辞書ファイルの名前を「ghost-*.txt」 とすることを"推奨" します。

## 3. kawarirc.kis

kawarirc.kisファイルは、華和梨が最初に読み込む辞書ファイルで、 必ず用意する必要があります。 文法的には他の辞書ファイルと全く変わりませんが、 慣れるまでは以下のように用いると良いでしょう。

### 3.1. kawarirc.kisファイルの書き方

まず、「=kis」だけが書かれた行と、 「=end」だけが書かれた行で、ファイル全体を囲ってください。

=kis
=end

次に、=kis〜=end で囲まれた中に、読み込みたい辞書ファイル名を、 「load ファイル名 ;」の形で指定します。 loadごとに";"(セミコロン) は省略できませんので、注意してください。 空行があっても構いません。 また、セミコロンさえあれば、同じ行に何回も記述しても構いません。

=kis
load dict-base.txt;
load ghost-kawari.txt;
load dict-standard.txt;
load dict-dms.txt;
=end

また、「#」で始まる行は、行全体がコメントになります。 コメントは華和梨の動作に全く影響を与えません。 辞書読み込み時に、華和梨はコメントを読み飛ばします。

#------------------------------------------------
# ゴースト「○○」設定ファイル
#------------------------------------------------
=kis
# 辞書基本フレームワーク
load dict-base.txt;
# 台本 (ゴースト依存)
load ghost-kawari.txt;
# 標準辞書
load dict-standard.txt;
load dict-dms.txt;
=end

### 3.2. デバッグ用の動作モード指定

ゴーストの開発中は、デバッグのために、 華和梨に動作中の情報を出力させることが頻繁に行われます。 =kis 〜 =endで囲まれた中で、 以下の記述によってデバッグ動作を変更できます。 より詳細な設定については、ユーザーズマニュアルを参照してください。

logfile ファイル名 ;

  shiori.dllと同じフォルダに、指定したファイル名のログファイルを作ります。

loglevel [ 動作情報 イベント種別 ... ] ;

  ログに記録すべき内容を指定します。 デフォルトでは、何も記録しません。 loglevel quiet;によって、 明示的に記録動作を禁止することができます。

  リリース(できたゴーストを実際にユーザに提供すること)の際には、 必ずloglevel, logfile指定を削除、もしくはコメントアウトしてください。

=kis
# エラー/動作情報と基本イベント情報を記録する。とりあえずはこれが良い。
loglevel error warning info baseevents;
# kawari.logファイルに記録する。
logfile kawari.log;
## 日付付きファイルに記録するサンプル。
# logfile kawari-$(date %Y%m%d%H%M%S).log;
=end

## 4. 辞書

ゴーストが喋る内容や、名詞や動詞などの単語の一つ一つを、 華和梨では「文」と呼んでいます(この「文」は、日本語の「文」とは限りません)。 華和梨は、この「文」を分類して集めた「辞書」を持っています。 辞書は、起動時に辞書ファイルから読み込みます。 実行中にスクリプトを使って辞書を書き換えることもできます。

通常、辞書ファイルはkawarirc.kisから、 先ほど説明したloadコマンドによって読み込まれます。

### 4.1. 辞書ファイルの書き方

基本的な辞書ファイル記述形式は、次の通りです。

エントリ名 : 文 , 文 , ... <改行>

カンマで区切って並べた「文」を、一つのエントリに分類しています。 エントリ名と文の羅列の間は、コロンで区切ります。 改行によって、エントリへの登録が終了します。 また、半角シャープ('#')から始まる行はコメントとして無視します。

# 例
ゴースト : 毒子, 裏子, 陽子, 54, 美耳, M, 涼璃, あると, 花ちゃん, 千郷, 双葉
ご挨拶 : ${ゴースト}さん、こんにちは

カンマやコロンの周りのスペースやタブは自動的に削除されます。

エントリ名をカンマで区切って並べ、文を複数エントリへ一度に登録することもできます。

エントリ名 , エントリ名 , ... : 文 , 文 , ... <改行>
# 例
ゴースト, デベロパ : 朱鷺乃
# こう書くのと同じ
ゴースト : 朱鷺乃
デベロパ : 朱鷺乃

エントリ名に使える文字は以下です。

漢字、 半角英数字(A〜Za〜z0〜9)、 クエスチョンマーク('?')、 ピリオド('.')、 アンダーバー('_')、 アットマーク('@')

ただし、アットマーク'@' は特別な目的に用いるので、 普段は使わないでください。

エントリ名の長さや、エントリの個数、辞書ファイルの長さに制限はありません。

「文」でそのまま使えない文字は以下です。

クォート2種('"', ''')、 ドルマーク('$')、 丸括弧('(', ')')、
カンマ(',')、 セミコロン(';')
# 実際には、カンマとセミコロンは状況によって使えます

空白文字 (スペース「' '」、タブなど) もそのまま書くことができます が、前述のカンマやコロンの周囲のほか、 各行の行頭行末の空白も自動的に削除されるため、 そうした場所に空白を入れるためには、後述するクォート表記を使ってください。

長い文は、複数行に渡って記述することもできます。 文の中で、丸括弧「'(' 〜 ')'」 で囲われた部分では、自由に改行することが出来ます。 改行文字は空白文字の一種として扱われるので、 出力には現れません。 丸括弧の中では、文に、さらにカンマ「,」、 セミコロン「;」 が使えるようになります。 逆に、丸括弧の中にエントリに登録するために幾つもの文を並べるようなことは出来ません。

speech : 色は匂へと散りぬるを 若よ誰そ常ならん 有意の奥山 今日越えて 浅き夢見し 酔ゐもせす
speech : "One Ring to rule them all, One Ring to find them, One Ring to bring them all, and in the darkness bind them. In the Land of Mordor where the Shadows lie."
sentence : \t\0\s[0]メニューだよ\n\q0[RandomTalk][トーク]\q1[Communicate][コミュニケート]\q2[TalkPref][トーク設定]\q3[Cancel][キャンセル]
# 上記でも構わないが、下記のように書いた方が見やすい
speech : (
色は匂へと散りぬるを 若よ誰そ常ならん
有意の奥山 今日越えて 浅き夢見し 酔ゐもせす )
speech : (
"One Ring to rule them all, One Ring to find them,"
"One Ring to bring them all, and in the darkness bind them."
"In the Land of Mordor where the Shadows lie." )
# 丸括弧が文全体を囲う必要はない。
sentence : \t\0\s[0]メニューだよ\n(
\n
\q0[RandomTalk][トーク]
\q1[Communicate][コミュニケート]
\q2[TalkPref][トーク設定]
\q3[Cancel][キャンセル] )

### 4.2. クォート表記

シングルクォート「'」、あるいは ダブルクォート「"」 で囲まれた文字列は、常にそのまま出力されます。 後述のエントリ呼び出し等がクォート内にあっても置き換えを行いません。 「,」や「${}」 「$()」 といった華和梨で特別の意味を持つ文字列や空白を文中に書き込みたい場合には クォートを使ってください。

クォートで囲まれた文字列中では、 「\<クォートに使った文字>」、 「\\」の二つだけが特別扱いされ、 それぞれ、クォートに使った文字と、「\」 を出力します。 「\」の後に上記の2つの文字以外がある場合は、 \はそのまま出力されます。

ダブルクォート中ではシングルクォートを普通に使え、 シングルクォート中ではダブルクォートを普通に使えることに留意してください。

    sentence : Good morning, U.S.A.

上記の例では、「Good morning」と「U.S.A.」という二つの単語として登録されます。 「Good morning, U.S.A.」として登録したい場合には、以下のようにしてください。

    sentence : "Good morning, U.S.A."
        または
    sentence : Good morning", "U.S.A.

その他、クォート表記の例です。

    sentence : "I can't help fallin' love"
    sentence : "We scream \"Ice cream\" !"

### 4.3. エントリ呼び出し

「${エントリ名}」という記述を 「エントリ呼び出し」と呼びます。

文の中で「${エントリ名}」と記述すると、 そのエントリに登録されている文の中からランダムで一つを選び出し、置き換えます。 該当する文が見つからなかったときは、空文字列に置き換えます。 また、置き換えた文にもエントリ呼び出しが含まれている場合には、再度置き換えを行います。

これが華和梨ゴースト制作の核心となる動作です。

    npw : 鈴木一郎 , 山本太郎
    sentence : ${npw}さん

上記の例では、sentenceを呼び出すと、 「鈴木一郎さん」又は「山本太郎さん」になります。

「置き換え」は、辞書が華和梨に読み込まれる時点ではなく、 外部(本体)からの呼び出しを受けて、 エントリ中の単語を実際に選ぶ段階で初めて行われます。 そのため、同じエントリを何度も呼び出すと毎回違った結果が得られます。

### 4.4. 履歴参照

「${数字}」という特殊なエントリ呼び出しを 「履歴参照」と呼びます。 履歴参照は、同じ文脈で置き換えた単語を再度参照する時に使います。

    n : 石
    food : 梨
    sentence : ${n}のような${food}、${1}のような${0}。

上記の例では、${0}は${n}を置き換えた結果に、 ${1}は${food}を置き換えた結果になり、 sentenceは「石のような梨、梨のような石。」になります。

### 4.5. システムエントリ

華和梨が特別に用いるエントリは大幅に減少しました。

「System.Callback.*」形式のエントリは、 OnClose等、様々なイベントが発生した際に呼ばれます。 その際、本体からのリクエストの内容は、全て 「System.Request.*」形式のエントリに入っています。 また、「System.Response.*」 形式のエントリに情報を登録して動作終了することにより、 本体へ返すレスポンスを自由に構成できます。 普通に文章を生成して返すと、会話文(Sentenceヘッダ内容)として扱われます。

「System.Resource.リソース名」形式のエントリは、 SHIORI/3.0未対応の本体から、ネットワーク更新先URL、 おすすめメニュー等を要求された際に呼ばれます。 リソースの詳細は、「何か。」公式ページのSHIORI仕様書を参照して下さい。

本体からの通知情報
System.Request.* | SHIORI/2.0 リクエストヘッダ
本体への応答
System.Response.* | SHIORI/2.0 レスポンスヘッダ
System.Response.To | SHIORI/2.3b 話しかけたいゴースト名。"stop"で打ち切り。
System.Response | SHIORI/2.0 ステータスコード
SHIORI/3.0 イベント対応
System.Callback.OnGET | GETイベント
System.Callback.OnNOTIFY | NOTIFYイベント
SHIORI/2.x イベント対応
System.Callback.OnEvent | 外部イベント処理
System.Callback.OnGetSentence | 応答イベント
System.Callback.OnGetStatus | ステータス取得イベント
System.Callback.OnResource | SHIORI/2.5リソース取得イベント
SAORIイベント対応
System.Callback.OnSaoriExecute | SAORI実行イベント
共通イベント対応
System.Callback.OnUnload | 切り離しイベント(華和梨が発行)
System.Callback.OnRequest | その他全てのリクエスト
その他(リードオンリー)
System.DataPath | shiori.dllの存在するディレクトリ
System.SecurityLevel | セキュリティレベル

さて、このままでは、ゴーストを動作させることができません。 たとえば、System.Callback.OnEventに直接会話文を書いても、 きっと上手くいかないでしょう。 華和梨ゴーストを動作させるには、 どうしても後述のインラインスクリプト「KIS」を用いた記述が必要になります。 これが華和梨の長所であり、短所でもあるのです。 華和梨でゴーストを書くには、KISで書かれた、 いわゆるレイヤーソフト、ミドルウェアが必須です。 一通り華和梨の文法を理解したら、 Webを巡って華和梨のミドルウェアを探し、そのどれかを使うことを強く推奨します。 それらを使ってゴーストを作るのは、とても簡単で楽しい作業です。

とにかく最低限の記述でゴーストを動作させるためには、 kawarirc.kis、もしくは必ずロードされる辞書ファイルに以下の記述を行ってください。 ただし、文頭は=kis 〜 =end領域の外から始まっていることが条件です。

    # period 565以前 イベントハンドラ
    System.Callback.OnEvent: ${event.${System.Request.Event}}
    System.Callback.OnResource: ${resource.${System.Request.ID}}

    # period 568以降 (SHIORI/3.0) イベントハンドラ
    System.Callback.OnGET: $(
        if $(match_at ${System.Request.ID} On)
            ${event.${System.Request.ID}}
        else
            ${resource.${System.Request.ID}} )

    # 最低限のイベント処理記述
    event.OnFirstBoot: \0\s[0]\1\s[10]\e
    event.OnBoot: \0\s[0]\1\s[10]\e
    event.OnGhostChanged: \0\s[0]\1\s[10]\e
    event.OnShellChanged: \0\s[0]\1\s[10]\e
    event.OnWindowStateRestore: \0\s[0]\1\s[10]\e
    event.OnClose: \-

    # 一分ごとにsentenceを呼ぶ
    event.OnMinuteChange: ${sentence}

    # 一分ごとにsentenceが呼ばれる
    sentence : \0\s[0]はろー\e
    sentence : \1\s[10]とにかく動かさないとな。\0\s[0]うん。\e

## 5. インラインスクリプト

「華和梨インラインスクリプト(Kawari Inline Script)」を用いることにより、 イベント処理、辞書の内容の動的な変更、エントリ内容による条件分岐等を実現できます。 基本的なスクリプトの書式は、「$(コマンド名 引数1 引数2…)」の形式です。 (簡単に言えば「Bash(Bourne Again SHell)のサブセット」です。(ぜんぜん簡単ではないですね)) 言語仕様の詳細は、添付の「華和梨インラインスクリプト リファレンスマニュアル」 を参照して下さい。

"華和梨ゴースト"会話データファイル(ghost-kawari.txt)の中に、 インラインスクリプトの用例があります。 コミュニケートボックスから簡単に呼べるようになっていますので、 いろいろ遊んでみて、動作を確かめると良いでしょう。

## 6.他にできること

華和梨には沢山の機能がありますが、最初から全てを使う必要はありません。 最初はまず、レイヤーソフトとかミドルウェアなどと呼ばれる、 スクリプト集のようなものを探して使ってください。 ミドルウェアは華和梨のリンク集「かわりんくす」からも探せます。 その上でゴーストを書く分には、 この文書に書かれた内容の知識で十分事足りるはずです。 「ゴースト作りは簡単でなければいけない」というのが華和梨の目指す目標の一つです。

でも、例えば、 SAORIを使って得た情報や、本体から送られてくる情報を、 少し加工して表示したいときがあります。 あるいは、ゴーストがそうやって集めた情報や、 「今までの起動時間」「起動された回数」「あるイベントが起きた回数」 「知人のゴーストがコミュニケートで送ってきたセリフ」「最近喋った話題」 などをセーブしたくなったらどうでしょう。 さらに、そうして保存した情報に基づいて、 ゴーストの挙動を変えたくなったら？ いわゆる「二重人格」、つまり、 複数人のキャラクタを入れ替わりに登場させるにはどうすればいいでしょう？

一つには、そういう機能も備えたミドルウェアを探すことです。 しかし、望むものが見つからなければ、自分で作るしかありません。 その際には、華和梨の機能をフルに使うことになるでしょう。 ユーザーズマニュアルと、 KISリファレンスマニュアル を読んで、自分なりにその機能を実現してみてください。 もっと詳しいことに興味がわいたら KISプログラミングマニュアル を参照してください。華和梨の全てが載っています。 どうしても分からないことがあったら、 華和梨の公式掲示板 で聞いてみてください。誰かが答えてくれることでしょう。 華和梨のスクリプト言語、KISを使えば、かなりのことができるはずです。 「ゴーストは多様でなければならない」もまた、華和梨の目標なのです。