<?xml version="1.0" encoding="Shift_JIS"?>

<!--
●文法定義ファイルについて
　日本語を認識させるにはSjisでないとダメなので、本ファイルはSJISで記載してください。
　外国語は作者が話せないため、検証してません。


●音声認識の文法
　音声認識の開始キーワード＋コマンド名の組み合わせで命令できます。
　例えば、
　「あすら、属性変更」
　このように発音することで、As/Rに対して属性変更コマンドが発行できます。

　また定義XMLの順序を逆にすることにより
　「主語＋動詞」という構成にすることもできます。
　外部コマンドの起動はこちらを使っていますが、数が増えると誤認が多くなる傾向があります。



●xml構造

①.ルールの定義
　現状5つの組み込みルールと、1個の自動判定ルールが存在します。
※音声認識xmlの定義に従って階層を作ることもできますが、説明は割愛します。

<RULE NAME="As/R Command" TOPLEVEL="ACTIVE">
　　　　　　↑このルール名の文字列によって、文言解析の動作が分岐します

・「As/R Command」
　　COMMANDのVALSTRの値を数値変換し、コマンドIDとしてメインフレームに発行する（As/Rの内部機能の利用）

・「As/R Script」
　COMMANDのVALSTRの値をAs/R用のスクリプトファイル名として認識する

・「Execute Command」
　COMMANDのVALSTRの値をフルパス文字列としてコマンドを実行する

・「Task」
　COMMANDのVALSTRの値をプロセス名として認識します。
　操作コマンドは現在2種類用意されています。
　「CHANGE」タスクを切り替え、なるべく前面に表示させます。
　「CLOSE」タスクを閉じる。(対象ウィンドウハンドルにWM_COMMANDを投げる)

　タスク切り替えの
　「電卓」などのように起動コマンドタスク名が異なるもの、タスクマネージャなどのように権限昇格が必要なものは扱えません。

・「Special moves」
　必殺技用
　COMMANDのVALSTRの値を読み上げます。

・その他
　数値変換して0にならなければAs/R Command、0になったらExecute Commandと見なします。



②.音声認識のキーワード
　音声認識の発動のキーワードを指定します。
　複数の単語の場合は並べて記載することで使用できます。
　サンプルでは2音節のみ使用していますが、複数音節を使用して誤認を防ぐようにすることもできます。

　（4音節の例：「あすら、コマンド、全選択、実行」で4音節）

	<RULE NAME="test rule" TOPLEVEL="ACTIVE">
		<P>あすら</P>
		<P>コマンド</P>
		<L PROPNAME="COMMAND">
			<P VALSTR="57642">全選択</P>
		</L>
		<P>実行</P>
	</RULE>

　同じ識別語を使用した場合、先に検出した方を優先しますので、なるべく最初の音節でルールが特定できるようにすると誤検出しにくくなります。
　As/Rのように英字で読みにくいものは、平仮名か片仮名にしておくことをお薦めします。orz

※<L>の補足
<RULE NAME="As/R Command" TOPLEVEL="ACTIVE">
	<L>←★候補が複数あるので列挙する（"List"の略、候補が1個の場合はPタグをいきなり書いて良い）
		<P>あすら</P>←★この部分と
		<P>あさり</P>←★この部分がOR条件でヒットする
	</L>



③.コマンド定義
　リストのプロパティ名で識別します。
　<L PROPNAME="COMMAND">で括られた部分で、
　VALSTRの部分は、ルールの定義で触れられたように動作が変わります。
　音声認識の開始キーワードと同様に、同じ識別語を使用した場合、先に検出した方を優先します。

<L PROPNAME="COMMAND">
	<P VALSTR="42004">属性変更</P>←★この部分「ぞくせいへんこう」と発音すると反応する
	<P VALSTR="35207">削除</P>←★この部分「さくじょ」と発音すると反応する
	            ↑この例だと、コマンドＩＤ

　またルールが「Task」の場合、プロパティ名が「ACTION」で動作を複数定義することができます。
※現状は「CHANGE」「CLOSE」の2種類しか存在していません。



④.注意事項
　2個As/Rを起動して両方で音声認識をONにすると、両方が反応しておかしな動作になりますのでご注意ください。


 -->


<GRAMMAR>
	<!-- As/R本体のメインフレームに投げる組み込みのコマンドID
	「あすら、すべて選択」のように発声します。 -->
	<RULE NAME="As/R Command" TOPLEVEL="ACTIVE">
		<L>
			<P>あすら</P>
			<P>あさり</P>
			<P>えーえすあーる</P>
			<P>あずあーる</P>
		</L>
		<L PROPNAME="COMMAND">
			<P VALSTR="42004">属性変更</P>
			<P VALSTR="35207">削除</P>
			<P VALSTR="42005">エディタ</P>
			<P VALSTR="35512">検索</P>
			<P VALSTR="35801">前のタブ</P>
			<P VALSTR="35800">次のタブ</P>
			<P VALSTR="57600">新しいタブ</P>
			<P VALSTR="42007">圧縮</P>
			<P VALSTR="42012">リネーム</P>
			<P VALSTR="40003">ビューア</P>
			<P VALSTR="57634">コピー</P>
			<P VALSTR="57637">貼り付け</P>
			<P VALSTR="57635">切り取り</P>
			<P VALSTR="35515">ヘルプ</P>
			<P VALSTR="42017">フォルダ作成</P>
			<P VALSTR="42023">フォルダ移動</P>
			<P VALSTR="33010">解凍</P>
			<P VALSTR="33301">更新</P>
			<P VALSTR="57640">アンドゥ</P>
			<!-- 言葉を間違えそうなものは複数登録しておく例 -->
			<P VALSTR="57642">すべて選択</P>
			<P VALSTR="57642">全選択</P>
		</L>
	</RULE>

	<!-- As/R用のスクリプトコマンドの実行、スクリプト名はフルパスで指定します。（組み込み置換マクロが使えます）
	IDを振らなくてもスクリプトが実行できる強力な機能ですが、恩恵を受ける人は限られるでしょう。
	「スクリプト実行、エディタ」のように発声します。 -->
	<RULE NAME="As/R Script" TOPLEVEL="ACTIVE">
		<P>スクリプト実行</P>
		<L PROPNAME="COMMAND">
			<P VALSTR="%Script_dir%\Editor.txt">エディタ</P>
			<P VALSTR="%Script_dir%\Viewer.txt">ビューア</P>
		</L>
	</RULE>

	<!-- 外部のexeなどを実行、いわゆるシェル実行
	「メモ帳、起動」のように発声します -->
	<RULE NAME="Execute Command" TOPLEVEL="ACTIVE">
		<L PROPNAME="COMMAND">
			<P VALSTR="notepad.exe">メモ帳</P>
			<P VALSTR="mspaint.exe">ペイント</P>
			<P VALSTR="calc.exe">電卓</P>
			<P VALSTR="Taskmgr.exe">タスクマネージャ</P>
			<P VALSTR="regedit.exe">レジストリエディタ</P>
			<P VALSTR="explorer.exe">エクスプローラー</P>

			<!-- 秀丸の標準インストール先、変更していたり所有していない場合は流用できません-->
			<P VALSTR="%ProgramFiles%\Hidemaru\Hidemaru.exe">秀丸</P>
			<!-- 64ビット版のChromeをインストールしている場合は%ProgramFiles%かもしれません-->
			<P VALSTR="%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe">Chrome</P>
			<P VALSTR="%ProgramFiles(x86)%\Microsoft\Edge\Application\msedge.exe">Edge</P>
			<P VALSTR="%ProgramFiles%\Mozilla Firefox\firefox.exe">FireFox</P>
			
			<!-- 作者のインストール先、ほぼ間違いなく流用できません-->
			<P VALSTR="D:\tool\Editor\Mery-x64\Mery\Mery.exe">Mery</P>
			<P VALSTR="D:\tool\FileTool\ffftp\FFFTP.exe">FFFTP</P>

			<!-- 作者がツールのショートカットをとりあえず放り込んでるディレクトリ、間違いなく流用できません-->
			<P VALSTR="%USERPROFILE%\Desktop\tool">ツールディレクトリ</P>

			<P VALSTR="https://www.google.com/?hl=ja">Google検索</P>
			<P VALSTR="https://translate.google.co.jp/?hl=ja">Google翻訳</P>
			<P VALSTR="https://www.deepl.com/ja/translator">DeepL翻訳</P><!-- でぃーぷえるほんやく-->
			
			<!-- MS OFficeがインストールされていない環境では動作しません-->
			<P VALSTR="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Excel.lnk">Excel</P>
			<P VALSTR="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Word.lnk">Word</P>
		</L>
		<L>
			<P>開く</P>
			<P>ひらけ</P>
			<P>起動</P>
		</L>
	</RULE>


	<!-- タスク切り替え
	Execute Commandと似ていますが、こちらはexe名のみの指定です。
	複数のウィンドウが見つかった場合、Zオーダー順で先に見つけた方を前面に表示します。
	また「電卓」のようにexe名が一致しないものや、「タスクマネージャ」などのように権限昇格が必要なものは操作できません。
	「メモ帳、切り替え」のように発声します。
	-->
	<RULE NAME="Task" TOPLEVEL="ACTIVE">
		<L PROPNAME="COMMAND">
			<P VALSTR="notepad.exe">メモ帳</P>
			<P VALSTR="mspaint.exe">ペイント</P>
			<P VALSTR="explorer.exe">エクスプローラー</P>
			<P VALSTR="Hidemaru.exe">秀丸</P>
			<P VALSTR="Mery.exe">Mery</P>
			<P VALSTR="FFFTP.exe">FFFTP</P>
			<P VALSTR="chrome.exe">Chrome</P>
			<P VALSTR="msedge.exe">Edge</P>
			<P VALSTR="firefox.exe">FireFox</P>
			<P VALSTR="EXCEL.EXE">Excel</P>
			<P VALSTR="WINWORD.EXE">Word</P>
		</L>
		<L PROPNAME="ACTION">
			<P VALSTR="CHANGE">切り替え</P>
			<P VALSTR="CHANGE">チェンジ</P>
			<P VALSTR="CHANGE">あるとたぶ</P>
			<P VALSTR="CLOSE">閉じる</P>
			<P VALSTR="CLOSE">クローズ</P>
		</L>
	</RULE>
	
	<!-- ネタ枠です
	「かーめー、深淵よりいでしもの」のような組み合わせで発声するのは自重ください。
	 -->
	<RULE NAME="Special moves" TOPLEVEL="ACTIVE">
		<L>
			<P>かーめー</P>
			<P>闇よりくらき</P>
			<P>黒より黒く</P>
		</L>
		<L PROPNAME="COMMAND">
			<P VALSTR="はぁぁぁぁー">はーめー</P>
			<P VALSTR="科学の光が落とす影">深淵よりいでしもの</P>
			<P VALSTR="イクスプロぉぉぉぉジョン">闇よりくらき漆黒に</P>
		</L>
	</RULE>
</GRAMMAR>
