前回はiRemoconを手軽に操作できるようにiRemoconオブジェクトを作成しました。今回は、そのiRemoconオブジェクトを利用して、音声認識でiRemoconを操作するテストプログラムを作りたいと思います。
ここで書くプログラムを利用するには以下のiRemoconが必要です。
![]() | Glamo スマートフォンを利用して家の中や外出先から様々なリモコン対応家電をコントロールできます。 |
さて、音声認識を利用するにはプログラムから利用できる音声認識エンジンが必要です。しかも、自分のような個人が使うには、フリーなものが望ましいということで、フリーで使える音声認識エンジンを探してみたところ、JuliusとSAPI 5.1の二つがありました。
Juliusは、公式サイトによると数万語の語彙を対象とした文章発声の認識を行う能力を持つ高性能音声認識ソフトウェア
ということですが、以下のブログ記事を読む限り、結構設定が面倒くさそうなので、自分のレベルには少し高度そうに感じました。
「Julius」の検索結果一覧 - 凹みTips
「Julius」の検索結果一覧 - お前の血は何色だ!! 4
なので、今回はJuliusの使用は見合わせ。SAPI 5.1を利用することに。
SAPI 5.1は、Speech Application Programming Interface(Speech API、SAPI)の略で、Windowsアプリケーションで音声認識や音声合成を使うためにマイクロソフトが開発したAPIのことです。
SAPI 5.1については、自分が以前から「リモコンを音声コマンド操作したい」と思っていたこともあり、過去に日本語音声認識サンプル(SAPI 5.1)などを作成して使い方を調べていたので、こちらならある程度使い方も分るかなと。
SAPI 5.1自体、2001年後半に出されたもので結構古いものっちゃー古いものなんですが、リモコン操作ぐらいの音声コマンド利用でしたら、これで十分な気もします。てか、リリースされてから10年以上、サンプルを作ってからも3、4年経っているので、「新しいフリーの日本語音声認識エンジンのとか、もう出ているのでは?」と調べてみたんですが、結局SAPI 5.1ぐらいしかないっぽいです。
ということで、音声認識エンジンが決定しところでSAPI 5.1を利用する準備です。
SAPI 5.1を利用する準備
SAPI 5.1のダウンロードからインストール方法、設定については以下で説明しています。
音声認識準備
こちらを参考にSAPI 5.1の初期設定をします。
次は、Delphiで利用する方法です。
EmbarcaderoからSAPI 5.1 sample programs & support packages for Delphiをダウンロードします。(※要ユーザー登録)
ダウンロードした物の中の「support packages」中の「SpeechLib_TLB.pas」と「SpeechLib_TLB.dcr」をDelphiのライブラリパスの通ったフォルダにコピーし、オブジェクト(TSpSharedRecoContext)をコード側で作成して使います。IDEにコンポーネントをインストールして使用しても、どちらでも構いません。
iRemocon音声認識操作サンプルの作成
とりあえず以前作成した日本語音声認識サンプル(SAPI 5.1)がそのまま使えそうなので、これのグラマーファイルとコードを少し変更して利用したいと思います。ダウンロードからサンプルファイルをダウンロードします。
グラマー(Grammer)ファイルの作成
サンプルファイルをダウンロードしたら、解凍してまず中のグラマー(文法)ファイルを変更したいと思います。中にある「SpeechGrammer.xml」をエディタか何かで開いて中を以下のように変更します。
<GRAMMAR LANGID="411">
<RULE NAME="iRemocon" TOPLEVEL="ACTIVE">
<L>
<P><RULEREF NAME="IREMOCON"/></P>
</L>
</RULE>
<RULE NAME="IREMOCON" >
<L PROPNAME="COMPUTER_NAME_CMD">
<P VAL="100">/コンピューター/こんぴゅーたー/コンピューター;</P>
<P VAL="200">/Caspar/きゃすぱー/キャスパー;</P>
<P VAL="200">/Caspar/かすぱー/カスパー;</P>
</L>
<L PROPNAME="REMOCON_CMD">
<P VAL="1">/エアコン点けて/えあこんつけて/エアコンツケテ;</P>
<P VAL="1">/暑い/あつい/アツイ;</P>
<P VAL="2">/エアコン消して/えあこんけして/エアコンケシテ;</P>
<P VAL="2">/寒い/さむい/サムイ;</P>
<P VAL="5">/電気点けて/でんきつけて/デンキツケテ;</P>
<P VAL="5">/明るくして/あかるくして/アカルクシテ;</P>
<P VAL="5">/暗い/くらい/クライ;</P>
<P VAL="6">/電気消して/でんきけして/デンキケシテ;</P>
<P VAL="6">/暗くして/くらくして/クラクシテ;</P>
</L>
</RULE>
</GRAMMAR>
今回利用するコマンドは誤認識防止のために、音声コマンドの前にコンピューター名を付けて
[コンピューター名] + [音声コマンド]
という形で使用したいと思います。
なので<L PROPNAME="COMPUTER_NAME_CMD"></L>タグの中にはコンピューター名、<L PROPNAME="REMOCON_CMD"></L>タグの中にはリモコン用の音声コマンドを書きました。
リモコン用の音声コマンドの書き方としては、
<P VAL="{リモコン番号}">/{音声コマンド}/{音声コマンドの読み方}/{音声コマンドの他の読み方};</P>といった具合に書きます。グラマーファイルの書き方について詳しくはVB.NETで音声認識(その1:音声認識ライブラリを作る)にて丁寧に解説されています。
日本語音声認識サンプルの修正
グラマーファイルの設定を変更したら日本語音声認識サンプル(SAPI 5.1)のコードも修正したいと思います。とはいっても、ほとんどそのまま使用できそうだったので、フォームを少しと、コードを数行変更するだけで、目的のものは作成できました。
で、作成したものが以下。
iRemocon音声認識テストプログラムのダウンロード
※iRemoconを持っていないと動作しません。
※このプログラムを使用してiRemoconに不具合が出ても保証はできません。IRM-01Lコマンド仕様書(PDF)に書かれた内容を守ってお使いください。
インターフェースは以下のような感じ。
iRemocon音声認識テスト全ソース
主に変更したところといえば、フォームにIPを入力するエディットボックスを付けたことと、プログラムを数行追加したくらいです。
コンストラクタでiRemoconオブジェクトを作成。IPの登録。
IRemocon := TIRemocon.Create(Self);
IRemocon.Host := HostEdit.Text;
デストラクタでiRemoconオブジェクトを破棄。
IRemocon.Free;
音声認識が成功したときのRecoContextRecognitionイベントでiRemoconの赤外線コマンドを送信するコードを書く。
//Grammerファイルに設定したリモコン番号を取得
RemoconNo := Props.Item(1).Value;
(中略)
//取得したリモコン番号を元にiRemoconから赤外線発信
IRemocon.TransmitInfrared(RemoconNo);
iRemoconオブジェクトの作成&昔の音声認識サンプルプログラムの再利用のおかげで主な変更はこれだけで、思ったより簡単に書けました。昔、音声認識サンプルプログラムを作った自分ナイス。
iRemocon音声認識テストプログラムを利用してみる
まずはProject1.exeを起動し、エディットボックスに使っているiRemoconのIPを入力します。ITの確認方法はIP確認方法を参照してください。
次にグラマーファイルに入力したコンピューター名に続けて、音声コマンドを発声してください。
「コンピューター、エアコン点けて」
コンピューター名に続き、音声コマンドが表示され、音声コマンドに関連づけられたリモコン番号1を元に、iRemoconの赤外線信号が発信されます。
「コンピューター、エアコン消して」
valueにエアコンを消すリモコン番号の2が表示され、iRemoconのリモコン番号2に登録された「エアコン停止」赤外線信号が発信されます。
「コンピューター、電気点けて」
「コンピューター、電気消して」
認識率は初期設定状態で85~90%とSAPIの説明にありましたが、実際にそれくらいの信頼度はあると思います。発声している途中で噛んだりしない限りかなりの確率で認識してくれます。
今回はコンピューター名に「コンピューター」を使用しましたが、グラマーファイルを書き変えれば、好きな呼び方に変更することも可能です。
以下は試しにコンピューター名「Caspar」としたときの設定例。
SpeechGrammer.xml
<P VAL="200">/Caspar/きゃすぱー/キャスパー;</P>
<P VAL="200">/Caspar/かすぱー/カスパー;</P>
また、グラマーファイル中の音声コマンドを追加していけば、好きなだけ命令を登録することができます。
<L PROPNAME="REMOCON_CMD">
<P VAL="1">/エアコン点けて/えあこんつけて/エアコンツケテ;</P>
<P VAL="1">/暑い/あつい/アツイ;</P>
<P VAL="2">/エアコン消して/えあこんけして/エアコンケシテ;</P>
<P VAL="2">/寒い/さむい/サムイ;</P>
<P VAL="5">/電気点けて/でんきつけて/デンキツケテ;</P>
<P VAL="5">/明るくして/あかるくして/アカルクシテ;</P>
<P VAL="5">/暗い/くらい/クライ;</P>
<P VAL="6">/電気消して/でんきけして/デンキケシテ;</P>
<P VAL="6">/暗くして/くらくして/クラクシテ;</P>
(これ以降追加していく)
</L>
さて、これまでに作ったもので、Delphiなどのプログラムを使用しなくてもリモコンを登録し、
音声コマンドを作成できるようになりました。次回は、プログラムの必要ない音声コマンド利用方法を書きたいと思います。その後、今まで作成したものを応用して、iRemoconを音声認識で利用するアプリケーションを作成出来ればと思います。
