音声認識機能を作るときに参考にしたページ、参考になりそうなページ

自分用のリンクメモ。

Kinect

Kinect for Windowsで機器を作るヒント(4) ―― 日本語の音声認識をやってみる
http://www.kumikomi.net/archives/2012/06/ep08knc4.php

頭の方向取得
http://kinection.jp/post/75

Kinect (キネクト) の総合情報サイト
http://kinection.jp/

iRemocon

iRemocon開発者向け情報
http://i-remocon.com/development/

SRGS

SRGSは音声認識文法仕様 (Speech Recognition Grammar Specification)の略。
SRGSはSAPI 5.3からサポートされているが、DTMC (プッシュ音) と拡張バッカス記法 (ABNF) はサポートされていない。

OpenHRIマニュアル 音声認識文法の作成方法
http://openhri.net/doc/workingwithgrammar-ja.html
OpenHRIはW3C-SRGS形式をサポートしている。試してないけど文法作成用ツールもある。

Galatea Dialog Studio
http://galatea.sourceforge.jp/galatea-doc/main_ja.html
VoiceXML(音声対話)の日本語解説がある。VoiceXMLはSRGSが埋め込めるので参考になりそう。

Speech Recognition Grammar Specification Version 1.0
http://www.w3.org/TR/speech-grammar/

SAPI

.NET Framework 3.0 クラスライブラリ日本語ヘルプ
System.Speech.Recognition 名前空間
http://msdn.microsoft.com/ja-jp/library/ms554855%28v=vs.85%29

Kinectを使った音声認識で家電を操作してみた

以前、普通のマイクとjuliusを使って音声認識させようとしていたけど、テレビや食洗機の騒音があると全く認識できませんでした。juliusを使いこなしていないとか、PC用マイク一つでは限界もあるかと思い、今回はKinect音声認識をさせてみました。せっかくのKinectなのに、ジェスチャーは一切使ってません。

作成した内容

人間の声で「テレビつけて」と言うとテレビの電源がONになり、「次のチャンネル」と言うとチャンネルが切り替わるといった感じで家電を操作

結果

Kinectに内蔵されたマイク・アレイとノイズ抑制に期待して音声認識システムを作ってみましたが、予想以上に実用的な音声認識システムが作れました。マイク・アレイすごい。マイクロソフトすごい。

  • テレビの内容や音量にもよるけど、少々テレビの音が鳴っていても認識できる
  • 少しぐらいの騒音であれば、大きめの声で話せば認識される
  • 騒音が大きいとさすがに認識できない

f:id:sanofi:20120814191251p:plain

構成

f:id:sanofi:20120814191248p:plain
Kinectを使った音声認識なのでKinect for Windows SDK 1.5.1、Microsoft Speech Platform SDK Version 11、Kinect Speech Language Packs(日本語)を使用しています。
音声認識の方法は実用性を重視してルールベースです。ルールの内容はSRGS(Speech Recognition Grammar Specification Version 1.0)という形式の文法ファイルに記載。

文法ファイル(KinectSpeechGrammar.xml)の抜粋

<grammar version="1.0" xml:lang="ja-JP" root="rootRule" tag-format="semantics/1.0-literals" xmlns="http://www.w3.org/2001/06/grammar">
  <rule id="rootRule">
    <one-of>
      <item>
        <tag>TV_ON</tag>
        <one-of>
          <item> テレビ つけて </item>
        </one-of>
      </item>
      <item>
        <tag>TV_OFF</tag>
        <one-of>
          <item> テレビ けして </item>
        </one-of>
      </item>
      <item>
        <tag>TV_CH_UP</tag>
        <one-of>
          <item> つぎの チャンネル </item>
        </one-of>
      </item>
    </one-of>
  </rule>
</grammar>

課題

Kinectを常時使用できる環境が作れていない

KinectはPCに接続して使用する必要があるので、PCの確保が必要
消費電力が気になるので実用的な範囲か確認

改善されたものの、まだどうしても誤認識してしまうことがある

認識に使う単語が短いと誤認識しやすい
「オン」と「オフ」など似たような単語は間違って認識することがある

文法ファイルは適当に作成したので、もう少し勉強して内容を見直す必要がありそう

外出先から家電をコントロールできるようにしてみた

未来なお部屋(http://d.hatena.ne.jp/rti7743/20120104/1325668680)"に触発されて、自分も家電をコントロールできるソフトを作ってみた。
未来なお部屋では音声認識で家電を制御しているけれども、うまく作れなかったので、今回は仕方なく外出先から家電をコントロールできるようにしてみました。
こんなものを作らなくてもiRemoconには外出先から制御できる仕組みがあるんだけど、なんとなく自分で制御したかったので作成。
帰宅途中にエアコンの電源をONにできるのは、けっこう便利。

作成した内容

PCから家電を制御
外出先からPCでもスマホでも家電を制御

構成

f:id:sanofi:20120810191917p:plain

スマホ用画面

f:id:sanofi:20120810192109p:plain:w150f:id:sanofi:20120810192107p:plain:w150

仕組み

iRemoconはTCP/IP通信で制御できる赤外線学習リモコンなので、PCから制御。
自宅Webサーバーを用意して、こちらからもTCP/IP通信を使ってiRemoconを制御。
それ以外には、Webサーバーには本人しかアクセスできないようにBASIC認証を設定。

その他

これ以外にもjuliusを使った音声認識による家電制御も作ってみたものの、残念ながらノイズが多いとあまり実用的ではなかった。ノイズ対策を考えねば。
できるかぎりコンパクトに作りたかったので自宅Webサーバーは WEBrick を使用。30行程度のrubyスクリプトでWebサーバーが実現できるのは魅力的。

jEditで階層付きテキストのアウトラインを表示させてみた

前回、Emacs の outline-mode 形式に対応したjEdit用SideKickパーサーを作成。
Wz Editorアウトラインプロセッサでよく使われている階層付きテキストに対応するのも簡単そうだったので、階層付きテキスト用SideKickパーサーも作成してみました。
これで、とりえあずjEditで階層付きテキストが読めるようになります。

概要

階層付きテキスト形式で書かれた文章を解析して、 SideKick で表示するためのプラグイン。行の先頭が1~6個のドット(.)で始まった場合、その行を見出しと判断します。

例:
----------------------
. 見出し階層1
.. 見出し階層2
... 見出し階層3
.... 見出し階層4
..... 見出し階層5
...... 見出し階層6
----------------------

インストール方法

プラグインフォルダに DotOutline.jar を置く

Windows版 jEdit 5.xでは C:\Users\\AppData\Roaming\jEdit\jars
Windows版 jEdit 4.xでは C:\Users\\.jEdit\jars

アンインストール方法

プラグインフォルダに DotOutline.jar を削除

他に必要なプラグイン

SideKick plugin
ErrorList plugin

動作確認環境

jEdit 5.0pre1
ErrorList plugin 2.0
SideKick plugin 1.4

動作方法

・設定する
プラグイン > プラグインオプション でダイアログを表示
SideKick > Parsers を選択
textなど、任意のモードに dot outline に変更

・階層を表示させる
文章を入力して SideKickで表示
SideKickで表示させる方法は、プラグイン > DotOutlineSideKick > SideKick 等。

・階層構造で折り畳む
ユーティリティ > バッファオプション でダイアログ表示
フォールディングモード を sidekick にする