heyheytower

日々のメモです。誰かのお役に立てれば幸いです。

声で家電を制御する:その5(音声認識のプレフィックス利用。リモコンリレー制御。ミク・メイコ音声利用)

目的

声で家電を制御する。ただし安価に。

経過(その4)

OpenRTM-aist インストールし、起動スクリプトを作製した。
また同コマンド群によりテストが楽に行えるようになった。
(起動・停止・状態確認・音声テキストのテスト入力など)

今回の概要

  1. 認識した音声を受け取るSEATに状態遷移モデルを定義し、音声認識にプレフィックス(呼びかけ)を導入した
  2. OpenJTalk の音声で、ミク・メイコさんを利用できるようにした
  3. エアコンのリモコンを、小型リレーで制御した

【2016/12/23 追記 : 提供ファイルをdropboxのpublicフォルダから、googleドライブへ移行】

SEAT で状態遷移モデルを定義する

この変更により、呼びかけ(例."コンピュータ"と言う)を用いてコマンド入力モードへ切り替わる仕様に変わりました。
※ワンステップ入って面倒かと思われるでしょうが、誤認識を簡単に潰す有効な方法でした。
 これもrti7743さんのアイディアです。*1

seatxml の書き方は腕上げロボット — Open Source RT-Components selected by AISTを参考にした。
自分は「生活で使わない単語+趣味」から "GLaDOS"(グラドス)*2と呼びかけることにしました。
これにより機械学習など用いてないのですが、実用レベルになったと思います。


Fig.1 模式図( Vim の visual モードとかの遷移を想像してもらえたらと。)
   丸の中がモードで、矢印は音声を発した時って感じで見てください。

OpenJTalk でミクさん、メイコさんの音声利用

音響モデルは自作できるようですが*3、自分の声で自作しても…とのことで、ミク*4・メイコ*5さんの声を利用できるようにしました。

f:id:maijou2501:20131002015435j:plain:medium
Pic.1 ミクさん

そもそも、OpenHRI の RTコンポーネントの OpenJTalk.rtc ではデフォルトでメイコさんの声に対応しているそうです。(ファイル追加は必要)*6

ディレクトリの何処に何を置くかはOpenHRIVoiceをソースからインストールする — Open Source RT-Components selected by AISTを参照しました。

次に、 MMDAgentのサイト に移動し “Sample Script”の”Binary Package”をダウンロードします。 MMDAgent_Example-1.3.zip(2012/10/05時点では、1.3が最新でした)を展開します。
# unzip MMDAgent_Example-1.3.zip
最後に、OpenJTalkRTCで設定されているPathに音声ファイル等を配置します。
# sudo mkdir -p /usr/lib/open_jtalk/dic
# sudo ln -s /var/lib/mecab/dic/open-jtalk/naist-jdic /usr/lib/open_jtalk/dic/utf-8
# sudo ln -s /usr/share/hts-voice /usr/lib/hts-voice
# sudo mkdir /usr/lib/mmdagent
# sudo ln -s /usr/local/share/MMDAgent_Example-1.3/Voice /usr/lib/mmdagent/voice
以上で、OpenJTalkのインストールは完了です。

各環境毎に、シンボリックリンク作ったりとか違うと思うので注意です。
うまく配置できて、OpenJTlalk.rtc を起動すると Eclipse の RT System editer 上から OpenJTalk0.rtc のプロパティを変更することでメイコさんの声が利用できると思います。

あと、適当にhts-voice自体のシンボリックリンクを変更することで
ミクさんの音響モデルも利用できました。

※ミクさんはサンプルを利用したので、うまく発音してくれませんでしたし、
 それに加えどうしても歌うように話す(?)ので、違和感が…。

☆テスト音声(音量注意)
 ミクさん(声:初音ミクです)

miku.mp3 - Google ドライブ

 メイコさん(声:時間になったよ)

meiko.mp3 - Google ドライブ

※メイコさんのパラメータはOpen JTalk で MMDAgent のメイちゃんに喋らせてみた - 凹みTipsOpen JTalk で音声合成して日本語テキスト読み上げ - ぽち*ぷ〜ちを参考にした。


エアコンのリモコン ON/OFF に小型リレーを利用

どうしてもリモコンの解析結果では、本体が信号を受け取ってくれなかったので、強硬手段です。
電気的に直接電源ボタンを叩いてやります。

まずばらします。

Pic.2 リモコンをばらした

アパート備え付けのリモコンなのでハンダ付けせず、絶縁テープを用い並列でスイッチできるように配線します。
※一応オリジナルの電源スイッチも生かしときたいですし

Pic.3 リモコンへの配線

そしてブレッドボードに仮組みして、小型リレー 941H-2C-5D(100円)を用いて、arduino から電源 ON/OFF できるようになりました。*7,*8


緑点灯:スイッチ未結線
青点灯:スイッチ結線

小型リレーは電磁石を用いたバネ構造になっているので、切り替え時に「カチッ」という音がするのが心地いいです。
※「ピッ」という音はエアコン起動音です。

この仕組みを用いれば原理的には 100V の機器の制御もできるので、赤外線リモコン以外も安価に制御できますね。

その他

  • 音声認識後、任意の linux コマンドを実行できるようにした(天気を読ませるなど)
  • bluetooth ヘッドセットの利用*9
  • 音響エコー除去*10
  • PS3赤外線リモコンについて

 linux で赤外線リモコンなどを操作する際にLIRC - Linux Infrared Remote Controlなど情報収集に利用するかと思うのですが情報に一部誤りがあるので注意です。

 http://lirc.sourceforge.net/remotes/sony/SCPH-10150
 UP :9EB92(20bit)→2AB5B(20)
 DOWN :5EB92(20bit)→6AB5B(20)
 RIGHT:3EB92(20bit)→AAB5B(20)
 LEFT :DEB92(20bit)→EAB5B(20)
 ※末尾が "B5B" の信号でないと受信機が受け取りませんでした。

  • 一般ユーザで shutdown を可能にする*11
  • shutdown は firefox などのセッションが保存されなかったため "gnome-session-save --shutdown-dialog" を利用した。( 更新 2013/02/06 )
  • シリアル通信のボーレート設定*12

 /etc/rc.local に下記の設定を追加した。
 stty -F /dev/ttyUSB0 9600 -parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke


感想

エアコンを制御できたので、とりあえず寒くなる今後が一安心です。
あと、小型リレーのテストでは配置を間違えダイオードが異常加熱したり、arduino に過剰電流が流れたり、とてもヒヤヒヤしました^^;
プログラムの試し書きのようなノリで、電子回路をいじると危ないなぁと思いました。



以上。