Watson TJBotをつくりました【１】声でLEDの色をコントロール

PDF資料はこちらからどうぞ。
http://seahorse-inc.com/QIITA/TJBot-1/STTセットアップ全手順_20170718.pdf

# 1.   はじめに
<font color="blue"><strong>TJBot</strong></font>は声を文字、文字を声にしたり、話しかけられた意図(意味)を理解してお話したり、色々な情報から欲しい情報を探してくれるといった、「IBM WatsonコグニティブAPI」をこれからやってみようという人にはうってつけのキットです。

厚紙や3Dプリンターでホディを作り、小さく低価格のコンピュータ(Raspberry PI)で頭脳を組み込みます。手を振ったり、LEDの色を変えたり、話しかけると答えてくれます。
機能的にはシンプルですが、反応してくれるとワクワクして楽しく、ボディは簡単に組み立てられるようになっています。

TJBotはすでに、色々な「IBM WatsonコグニティブAPI」を組み合わせた「レシピ」があります。

本投稿は、できあがっている「レシピ」を参考に、実際に作ってみた手順となっています。
使用するパーツなどの関係で、そのままの「レシピ」ではうまくいかないところや分からない点がありましたが、試行錯誤の末、ちゃんと動作することができました。
さらに、おまけとして日本語対応しました。
![00.png](http://seahorse-inc.com/QIITA/TJBot-1/00.png)

尚、厚紙でTJBotのボディ作成は割愛させていただきますが、下記URLを参考に作ってみてください。
https://www.youtube.com/watch?v=UEnuF--LA-0
https://www.instructables.com/id/Build-TJ-Bot-Out-of-Cardboard/

厚紙、３Dプリンター用の図面は下記URLです。
https://ibmtjbot.github.io/#gettj

ちなみに私は、A2サイズ２mmの厚紙にpdf印刷出力の図面を貼り、デザインナイフでカットしました。
デザインナイフでカットすると、かなり時間と労力を要しますので、レーザーカットをお勧めします。
レーザーカッターを時間制で使えるサービスもあるようです。

厚紙とRaspberry Pi、マイク、スピーカー、LED、モーターでTJBotを組み立て、Watson Cognitive APIを使って、色々なレシピが生まれています。
本投稿は、各レシピを実際に作成し、日本語化を行ってみた際の手順内容となっています。

# ２.  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/


# ３.   今回作成するレシピ
Watson 「Speech to Text」とRaspberry Piを使って、マイクに話しかけた内容で、LEDの色を変えます。たとえば、LEDの色を緑色に変更するには、「光を緑にする」と言います。

使用させていただいたレシピのサイト情報：
https://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/cm_mc_uid=10504612478614984670523&cm_mc_sid_50200000=1500263609

# ４.  材料
価格は変わる可能性があります。
![01.png](http://seahorse-inc.com/QIITA/TJBot-1/01.png)
厚紙は、ミューズ　ＫＭＫケントボード　ＳＳ－Ａ２２ｍｍ厚を使いました。　



# ５.  H/Wセットアップ
Raspberry Pi用のOS Rasbianのインストールは割愛させていただきます。
http://qiita.com/Mitsu-Murakita/items/90907782b6aec9959328
の「3. Raspbian関連のインストール」などを参考にしえください。

## ５-１.   LED
スイッチサイエンス社 NeoPixel スルーホールLEDを使用しました。
![03.png](http://seahorse-inc.com/QIITA/TJBot-1/03.png)![04.png](http://seahorse-inc.com/QIITA/TJBot-1/04.png)
LEDは平らにカットされている方から
1.--- 使用しない
2.--- GND　	⇒　　6番ピン
3.--- +3.3V 	⇒　　1番ピン
4.--- Data in	⇒　12番ピン
になっています。
（注意！）RaspberryPiに接続する際は、２⇒４⇒３の順番に接続する
![05.png](http://seahorse-inc.com/QIITA/TJBot-1/05.png)

## ５-２.  USBマイク
BU-Bauty PC Mac用USBマイク 超小型 超ミニ 22mmx18mmx5mmを使用しました。
![06.png](http://seahorse-inc.com/QIITA/TJBot-1/06.png)

USBマイクを接続してから、lsusbコマンドでデバイスが認識されているか確認します。

```Command:
lsusb ⏎ 
```
![07.png](http://seahorse-inc.com/QIITA/TJBot-1/07.png)
この例では、“Bus 001 Device 004: ID 0d8c:0016 C-Media Electronics, Inc”で認識されています。

ハードウェアデバイスを調べます。

```Command:
$ arecord –l ⏎ 
```
![08.png](http://seahorse-inc.com/QIITA/TJBot-1/08.png)
カード番号１、デバイス０で認識されています。

マイクの感度を調整します。(-cに続く番号はcard番号です)

```Command:
$ amixer sset Mic 50 -c 1 ⏎ 
```
![09.png](http://seahorse-inc.com/QIITA/TJBot-1/09.png)
81％の値がマイク感度です。

録音してみます。

```Command:
$ arecord -D plughw:1,0 -d 10 -f cd test.wav ⏎ 
```
(plughw:1,0はarecoed –l のカード番号とデバイス番号です。生成する音声ファイルはtest.wav)
PCなどに転送して音を確認してください。


# ６.  Watson「Speech to Text」サービスの作成
Bluemixにログイン
https://console.bluemix.net/

![10.png](http://seahorse-inc.com/QIITA/TJBot-1/10.png)

![11.png](http://seahorse-inc.com/QIITA/TJBot-1/11.png)

![12.png](http://seahorse-inc.com/QIITA/TJBot-1/12.png)

カタログより<font color="blue">「Speech to Text」</font>を選択
![13.png](http://seahorse-inc.com/QIITA/TJBot-1/13.png)

<font color="blue">「作成」</font>をクリック
![14.png](http://seahorse-inc.com/QIITA/TJBot-1/14.png)

<font color="blue">「サービス資格情報」</font>をクリック
![15.png](http://seahorse-inc.com/QIITA/TJBot-1/15.png)

<font color="blue">「資格情報の表示」</font>をクリック
![16.png](http://seahorse-inc.com/QIITA/TJBot-1/16.png)

<font color="red">「username」「password」を後程使用しますので、メモ帳などにコピー保存してください。</font>
![17.png](http://seahorse-inc.com/QIITA/TJBot-1/17.png)
![18.png](http://seahorse-inc.com/QIITA/TJBot-1/18.png)


# ７.  Raspbianの最新化とNode.js、npm、サウンド関連のインストール
TeratermなどでSSH接続します。ID、パスワードの初期値は、
　　<font color="blue">ID: pi
　　Password: raspberry </font>です。
![19.png](http://seahorse-inc.com/QIITA/TJBot-1/19.png)

以下のコマンドを実行してください。

```Command:
$ 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 apt-get install alsa-base alsa-utils libasound2-dev ⏎ 
```

# ８.  コードのダウンロードとインストール
```Command:
$ git clone https://github.com/ibmtjbot/tjbot.git ⏎
$ cd tjbot/recipes/speech_to_text ⏎
$ npm install ⏎
```

インストールしたプログラムなど
![20.png](http://seahorse-inc.com/QIITA/TJBot-1/20.png)

# ９.  「Speech to Text」構成情報の設定
ディレクトリを　~/tjbot/recipes/speech_to_text に移動します。

```Command:
$ cd ~/tjbot/recipes/speech_to_text ⏎
```
インストールされたデフォルト構成ファイル<font color="blue">「config.defaule.js」</font>を<font color="blue">「config.js」</font>という名でコピーし、<font color="blue">「config.js」</font>を編集します。

```Command:
$ cp config.default.js config.js ⏎
```
<font color="green">“【４】Watson「Speech to Text」サービスの作成”</font>で取得した、「username」「password」を登録します。
ここではnanoエディターを使用しました。

```Command:
$ sudo nano config.js ⏎
```
![21.png](http://seahorse-inc.com/QIITA/TJBot-1/21.png)
<font color="blue">「password」「username」を登録し、Ctrl+x ⇒ y ⇒⏎</font>で保存します。

# １０.  LED 色指定の問題
LEDが指定した色で光るかを確認します。
確認用プログラムをインストールし、実行します。

```Command:
$ cd ~/tjbot/bootstrap/tests ⏎ 
$ npm install ⏎
$ sudo node test.led.js ⏎
```
![22.png](http://seahorse-inc.com/QIITA/TJBot-1/22.png)

おそらく<font color="red">意図したように光らなかった</font>と思います。
これは、LEDの色設定(Data in)のPWMモジュールがピン番号12（GPIO 18）を使用していますが、内臓のオーディオ出力も同じGPIO18を使用しているため、競合状態となる為です。
回避策として、内臓のオーディオジャック出力を止める方法があり、以下のコマンドでサウンドカーネルモジュールを無効します。
ただこの場合、オーディオ出力はHDMI、USB、またはBluetooth経由でスピーカーを接続する必要があります。

```Command:
$ cd ~/tjbot/bootstrap ⏎
$ sudo cp tjbot-blacklist-snd.conf /etc/modprobe.d/ ⏎
$ sudo update-initramfs -u ⏎
$ sudo reboot ⏎
```

raspberryが再起動したら、確認用プログラムを試して、意図した通り色が光ることを確認してください。

```Command:
$ cd ~/tjbot/bootstrap/tests ⏎ 
$ sudo node test.led.js ⏎
```

# １１.  プログラムの実行
```Command:
$ cd ~/tjbot/recipes/speech_to_text ⏎
$ sudo node stt.js ⏎ 
```
![23.png](http://seahorse-inc.com/QIITA/TJBot-1/23.png)
'turn the light red'
'change the light to green'
'turn the light off'
など話しかけてみてください。
LEDの色が変わります。

# １２.  日本語対応に変更
## １２－１.  変更点１：listenの言語を日本語に変更
~/tjbot/recipes/speech_to_text/node_modules/tjbot/lib/tjbotjs
tbot.jsの152行目
language: 'en-US' // see TJBot.prototype.languages.listen
⇒
language: '<font color="red">ja-JP</font>' // see TJBot.prototype.languages.listen

## １２－２.  変更点２：色情報を日本語に変更
~/tjbot/recipes/speech_to_text/node_modules/colornames/color.js
<font color="blue">color.js</font>を<font color="blue">color_org.js</font>にバックアップコピー

```Command:
$ cp colors.js colors_org.js ⏎
```
colors.jsの内容を下記内容に置き換える
<font color="red">module.exports = [
  {
    "value":"#000000",
    "name":"黒"
  },
  {
    "value":"#808080",
    "name":"灰"
  },
  {
    "value":"#C0C0C0",
    "name":"銀"
  },
  {
    "value":"#FFFFFF",
    "name":"白"
  },
  {
    "value":"#0000FF",
    "name":"青"
  },
  {
    "value":"#000080",
    "name":"ネイビー"
  },
  {
    "value":"#008080",
    "name":"青緑"
  },
  {
    "value":"#008000",
    "name":"緑"
  },
  {
    "value":"#00FF00",
    "name":"黄緑"
  },
  {
    "value":"#00FFFF",
    "name":"水"
  },
  {
    "value":"#FFFF00",
    "name":"黄"
  },
  {
    "value":"#FF0000",
    "name":"赤"
  },
  {
    "value":"#FF00FF",
    "name":"マゼンタ"
  },
  {
    "value":"#808000",
    "name":"オリーブ"
  },
  {
    "value":"#000000",
    "name":"黒色"
  },
  {
    "value":"#808080",
    "name":"灰色"
  },
  {
    "value":"#C0C0C0",
    "name":"銀色"
  },
  {
    "value":"#FFFFFF",
    "name":"白色"
  },
  {
    "value":"#0000FF",
    "name":"青色"
  },
  {
    "value":"#000080",
    "name":"ネイビー色"
  },
  {
    "value":"#008080",
    "name":"青緑色"
  },
  {
    "value":"#008000",
    "name":"緑色"
  },
  {
    "value":"#00FF00",
    "name":"黄緑色"
  },
  {
    "value":"#00FFFF",
    "name":"水色"
  },
  {
    "value":"#FFFF00",
    "name":"黄色"
  },
  {
    "value":"#FF0000",
    "name":"赤色"
  },
  {
    "value":"#FF00FF",
    "name":"マゼンタ色"
  },
  {
    "value":"#808000",
    "name":"オリーブ色"
  },
  {
    "value":"#800080",
    "name":"紫色"
  },
  {
    "value":"800000",
    "name":"茶色"
  },
  {
    "value":"#FFFFFF",
    "name":"オン"
  },
  {
    "value":"#000000",
    "name":"オフ"
  }
]</font>

## １２－３.  変更点３：stt.jsを日本語に変更
~/tjbot/recipes/speech_to_text/stt.js

### １２－３－１.  39行目あたり
console.log("I understand lots of colors.  You can tell me to shine my light a different color by saying 'turn the light red' or 'change the light to green' or 'turn the light off'.");
<font color="green">⇒</font>
<font color="red">console.log("私は、たくさんの色がわかります。「光を赤にする」、「光を緑に変える」、または「光をオフにする」、「光をオンにする」と言ってみて下さい。");</font>

### １２－３－２.  53～57行目あたり
var containsTurn = msg.indexOf("turn") >= 0;
var containsChange = msg.indexOf("change") >= 0;
var containsSet = msg.indexOf("set") >= 0;
var containsLight = msg.indexOf("the light") >= 0;
var containsDisco = msg.indexOf("disco") >= 0;
<font color="green">⇒</font>    
<font color="red">var containsTurn = msg.indexOf("つける") >=0;
var containsChange = msg.indexOf("変える") >=0;
var containsSet = msg.indexOf("する") >=0;
var containsLight = msg.indexOf("光") >=0;
var containsDisco = msg.indexOf("ディスコ") >=0;</font>

### １２－３－３.  64行目あたり
if (colors[word] != undefined || word == "on" || word == "off") {
<font color="green">⇒</font>
<font color="red">if (colors[word] != undefined || word == "オン" || word == "オフ") {</font>

### １２－３－４.  70,76,86行目あたり
コメントをはずし、function discoParty()関数を有効にする。

# １３.   日本語対応版プログラムの実行
```Command:
$ cd ~/tjbot/recipes/speech_to_text ⏎
$ sudo node stt.js ⏎
```

![24.png](http://seahorse-inc.com/QIITA/TJBot-1/24.png)

「光を赤にする」、「光を緑に変える」、または「光をオフにする」、「光をオンにする」と言ってみて下さい。

黒/灰/銀/白/青/ネイビー/青緑/緑/黄緑/水/黄/赤/マゼンタ/オリーブ
黒色/灰色/銀色/白色/青色/ネイビー色/青緑色/緑色/黄緑色/水色/黄色/赤色/マゼンタ色/オリーブ色/紫色/茶色
オン/オフ（オンは白色、オフは黒色です）
の色が指定できます。

# １４.   おわりに
　TJBotのボディは "Cardboard"と書かれててたので、素直に”紙段ボール”で作りましたが、 フニャフニャで細かい箇所は強度が足りなくてうまく作れませんでした。”プラ段ボール”に代えて2体目作成しても同じ状況です。
思い込みで訳を間違えていたようで、”厚紙”でやっと完成です。
　「ミューズ イラストレーションボードSS 2mm厚 A2」がいいです。世界堂で売ってます。通販なら楽天もありますが（https://item.rakuten.co.jp/reino-web/3110319-ssa2-10/　）10枚入りのため共同購入するか、TJBotを10体作るかです。
 また、デザインカッターを使いましたが、肩こりになる恐れがありますのでレーザーカットをお勧めします。時間制で貸してくれるところもあります。