PDF資料はこちらからどうぞ。
http://seahorse-inc.com/QIITA/TJBot-5/VisualTJ全手順_20170724.pdf
1. はじめに
TJBotは声を文字、文字を声にしたり、話しかけられた意図(意味)を理解してお話したり、色々な情報から欲しい情報を探してくれるといった、「IBM WatsonコグニティブAPI」をこれからやってみようという人にはうってつけのキットです。
厚紙や3Dプリンターでホディを作り、小さく低価格のコンピュータ(Raspberry PI)で頭脳を組み込みます。手を振ったり、LEDの色を変えたり、話しかけると答えてくれます。
機能的にはシンプルですが、反応してくれるとワクワクして楽しく、ボディは簡単に組み立てられるようになっています。
TJBotはすでに、色々な「IBM WatsonコグニティブAPI」を組み合わせた「レシピ」があります。
本投稿は、できあがっている「レシピ」を参考に、実際に作ってみた手順となっています。
使用するパーツなどの関係で、そのままの「レシピ」ではうまくいかないところや分からない点がありましたが、試行錯誤の末、ちゃんと動作することができました。
さらに、おまけとして日本語対応しました。
尚、厚紙でTJBotのボディ作成は割愛させていただきますが、下記URLを参考に作ってみてください。
https://www.youtube.com/watch?v=UEnuF--LA-0
https://www.instructables.com/id/Build-TJ-Bot-Out-of-Cardboard/
厚紙、3Dプリンター用の図面は下記URLです。
https://ibmtjbot.github.io/#gettj
ちなみに私は、A2サイズ2mmの厚紙にpdf印刷出力の図面を貼り、デザインナイフでカットしました。
デザインナイフでカットすると、かなり時間と労力を要しますので、レーザーカットをお勧めします。
レーザーカッターを時間制で使えるサービスもあるようです。
厚紙とRaspberry Pi、マイク、スピーカー、LED、モーターでTJBotを組み立て、Watson Cognitive APIを使って、色々なレシピが生まれています。
本投稿は、各レシピを実際に作成し、日本語化を行ってみた際の手順内容となっています。
2. TJBotについて
TJBotは、IBM ResearchのMaryam Ashooriによって、認知対象の設計と実装におけるベストプラクティスを見つけるための実験として作成されました。
https://www.ibm.com/blogs/research/2016/11/calling-makers-meet-tj-bot/
TJBotは、楽しい方法でWatsonサービスを理解するために生まれた、オープンソースプロジェクトです。
https://ibmtjbot.github.io/
3. 今回作成するレシピ
Watson、「Text to Speech」「Visual Recognition」とRaspberry Pi、Bluetoothスピーカー、Node-Redを使って、撮った写真について話します。
使用させていただいたレシピのサイト情報:
https://github.com/samuelvogelmann/visualtj
4. 材料
価格は変わる可能性があります。
厚紙は、ミューズ KMKケントボード SS-A22mm厚を使いました。
5. H/Wセットアップ
Raspberry Pi用のOS Rasbianのインストールは割愛させていただきます。
http://qiita.com/Mitsu-Murakita/items/90907782b6aec9959328
の「3. Raspbian関連のインストール」などを参考にしてください。
5-1. Bluetoothスピーカー
Anker SoundCore mini コンパクト Bluetoothスピーカーを使用しました。
・BluetoothパッケージPulseAudioパッケージをインストール
・PulseAudioをsystemdに登録
nanoを使ってpulseaudio.serviceに書込みます。
$ sudo nano /etc/systemd/system/pulseaudio.service ⏎
・pulseaudio-bluetooth.confファイルを作成します。
nanoを使ってpulseaudio-bluetooth.confに書込みます。
$ sudo nano /etc/dbus-1/system.d/pulseaudio-bluetooth.conf ⏎
・system.paファイルを編集
$ sudo nano /etc/pulse/system.pa ⏎
・pulseaudioサービスを起動
$ sudo systemctl start pulseaudio.service ⏎
・pulseaudioサービスを自動起動するよう設定
$ sudo systemctl enable pulseaudio.service ⏎
・root、piユーザがPulseAudioで音を出せるようにします
$ sudo gpasswd -a root pulse-access ⏎
$ sudo gpasswd -a pi pulse-access ⏎
ここまででPulseAudo関連の設定が完了しましたので、次にbluetoothctlでBluetoothデバイスを接続します。
スピーカーの電源をオン。
$ sudo bluetoothctl ⏎
[bluetooth]# power on ⏎
デバイスをスキャンし、スピーカーを探します。
[bluetooth]# scan on ⏎
Blutoothスピーカーが見つかったら、スキャンを停止します。
[bluetooth]# scan off ⏎
[NEW] Device 00:E0:4C:58:6C:EC SoundCore mini
でBlutoothスピーカーのデバイス情報が入手できました。
[bluetooth]# trust 00:E0:4C:58:6C:EC ⏎
[bluetooth]# pair 00:E0:4C:58:6C:EC ⏎
[bluetooth]# connect 00:E0:4C:58:6C:EC ⏎
「ピロリン」という音が鳴ると、接続完了です。
[bluetooth]# exit ⏎
でbluetoothctlから抜けます。
・なかなか接続できない場合
https://raspberrypi.stackexchange.com/questions/44497/having-an-issue-with-bluetooth-manager-pairing-on-the-pi
Syslogを確認します。
$ cat /var/log/syslog ⏎
“bluetoothd[794]: a2dp-sink profile connect failed for 00:E0:4C:58:6C:EC: Protocol not available”というエラーの場合下記手順を試してください。
(1) PulseAudio Bluetooth ライブラリーがインストールされているか確認
$ sudo apt-get install pulseaudio-module-bluetooth ⏎
(2) Pulse Audio serverが稼働しているか確認
まず停止します。
$ sudo killall pulseaudio ⏎
起動します。
$ pulseaudio --start ⏎
(3)bluetoothctlでconnectします。
[bluetooth]# connect 00:E0:4C:58:6C:EC ⏎
それでもだめだったら、スピーカのモード切替を行う。
5-2. カメラ
サインスマート Raspberry Pi 用 カメラモジュール Camera Module for ラズベリーパイを使用しました。
カメラが使えるように、Raspberry Piを設定します。
$ sudo raspi-config ⏎
6. Watson「Text to Speech」、「Visual Recognition」サービスの作成
Bluemixにログイン
https://console.bluemix.net/
「username」「password」を後程使用しますので、メモ帳などにコピー保存してください。
(2)カタログより「Visual Recognition」を選択
「api_key」を後程使用しますので、メモ帳などにコピー保存してください。
7. Rasbianの最新化とNode.js、Node-Redのインストール
TeratermなどでSSH接続します。ID、パスワードの初期値は、
ID:pi
Password: raspberry です。
以下のコマンドを実行してください。
$ sudo apt-get update ⏎
$ sudo apt-get dist-upgrade ⏎
$ curl sL https://deb.nodesource.com/setup_6.x | sudo -E bash - ⏎
$ sudo apt-get install -y nodejs ⏎
$ sudo npm install -g node-red ⏎
一度Node-Redを起動してから停止します。
$ node-red ⏎
Ctl + c で停止します。
Watson Node-Redサービスをインストールします。
$ cd ~/.node-red ⏎
$ npm install node-red-node-watson ⏎
Node-Redを起動します。
$ node-red
$ node-red ⏎
ブラウザーを使って、 IPアドレス:1880 でアクセスします。
Watsonノードも登録されています。
8. コードのダウンロードとインストール
$ git clone https://github.com/samuelvogelmann/visualtj.git ⏎
$ cd ~/visualtj ⏎
「flow.json」がダウンロードしたNode-Redのコードです。
9. ダウンロードしたコードをNode-Redへインポート
インポートはクリップボードを使用します。
Winscpなどを使って、「flow.json」をクライアントPCへ転送します。
Wordpadで「flow.json」を開き、Ctl+a ⇒Ctl+c
> でクリップボードへコピーします。
Raspberry側でNode-Redが停止している場合、Node-Red起動しておきます。
$ node-red ⏎
クライアントPC側のブラウザでNode-Redにアクセス。
http://RaspberryPIのIPアドレス:1880
右上の
「ハンバーガーメニュー」⇒「読み込み」⇒「クリップボード」
10. 「Text to Speech」、「Visual Recognition」、構成情報の設定
(1)「Text to Speech」
「Text to Speech」ノード(緑色)をダブルクリック
「username」「password」を入力後、「完了」ボタンを押す。
(2)「Visual Recognition」
「Text to Speech」ノード(紫色)をダブルクリック
11. 写真イメージが表示されないときに、修正する箇所
Node-Redが実行されている、Raspberryのブラウザーでプログラムを実行するには問題ないですが、別のPCのブラウザーで実行すると撮影した写真イメージが表示されません。
これは、イメージの保存場所指定のURLがlocalhostになっているためです。
ここでは、RaspberryのIPアドレスを「192.169.1.20」としてプログラムを修正します。
「JavaScript」ノードの修正。
をダブルクリック
15行目の「localhost」を「192.168.1.20」に変更します。
var image = "<img src='http://localhost:1880/getimage?"+ new Date().getTime() + "' alt='Picture' width='480px'/>";
⇒
var image = "<img src='http://192.168.1.20:1880/getimage?"+ new Date().getTime() + "' alt='Picture' width='480px'/>";
「完了」ボタンを押す。
12. プログラムの実行
Node-Redが起動していない場合は、「$ node-red」 で起動しておきます。
PCのブラウザーからアクセス
http://192.168.1.20:1880/visualtj
ここでは、RasberryのIPアドレスを「192.168.1.20」としました。
「Take a Picture」ボタンをクリックして、写真を撮ります。
「Analyze it」ボタンをクリック、撮影した写真イメージが何かを分析します。
分析結果を表示と音声で答えます。
13. 日本語対応に変更
(1)「WebApp」ノード
・14行目
<p><b>Hi my name is TJBot! I'm an open source project designed to help you access IBM Watson Services.</b></p>
⇒
<p><b>ハーイ!TJBotです。私はIBM Watson Servicesへのアクセスを支援するように設計されたオープンソース・プロジェクトです。</b></p>
・19行目
<div id="divbutton"><button type="button" onclick='takepic("take picture");'>Take a Picture</button></div>
⇒
<div id="divbutton"><button type="button" onclick='takepic("take picture");'>写真を撮る</button></div>
・20行目
<div id="divbutton"><button type="button" onclick='analyze("analyze picture");'>Analyze it</button></div>
⇒
<div id="divbutton"><button type="button" onclick='analyze("analyze picture");'>写真を分析</button></div>
(2)「Picture status」ノード
・1行目
<p><b>I've taken this picture. Now you can analyze it!</b></p>
⇒
<p><b>写真を撮りました。分析できますよ!</b></p>
(3)「Visual Recognition」ノード
“Language”を「English」から「Japanese」へ変更
(4)「No result found」ノード
<p><b>I don't know what this is!</b></p>
⇒
<p><b>なんだか?わかりません!</b></p>
(5)「Convert class to payload」ノード
・1行目
msg.payload="This is a "+msg.class;
⇒
msg.payload="これは"+msg.class;
(6)「Text to Speech」ノード
“Language” を「US English」から「Japanese」へ変更
“Voice”を「Michaei」から「Emi」へ変更
14. 日本語対応版プログラムの実行
Node-Redが起動している状態で、PCのブラウザから
http://192.168.1.20:1880/visualtj
にアクセスします。