PDF資料はこちらからどうぞ。
http://seahorse-inc.com/QIITA/TJBot-4/Wavingセットアップ全手順_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 「Speech to Text」、「Text to Speech」とRaspberry Pi、USBマイク、Bluetoothスピーカー、LED、サーボモータを使って、Watsonと簡単な会話をします。
使用させていただいたレシピのサイト情報:
https://www.instructables.com/id/Build-a-Waving-Robot-Using-Watson-Services/
4. 材料
価格は変わる可能性があります。
厚紙は、ミューズ KMKケントボード SS-A22mm厚を使いました。
5. H/Wセットアップ
Raspberry Pi用のOS Rasbianのインストールは割愛させていただきます。
http://qiita.com/Mitsu-Murakita/items/90907782b6aec9959328
の「3. Raspbian関連のインストール」などを参考にしてください。
5-1. LED
スイッチサイエンス社 NeoPixel スルーホールLED
LEDは平らにカットされている方から
1.--- 使用しない
2.--- GND ⇒ 6番ピン
3.--- +3.3V ⇒ 1番ピン
4.--- Data in ⇒ 12番ピン
になっているが、
(注意!)RaspberryPiに接続する際は、2⇒4⇒3の順番に接続する
5-2. サーボモータ
マイクロサーボ SG92R
配線は:茶=GND、赤=電源[+]、橙=制御信号
1.--- GND ⇒14
2.--- +5V ⇒2
3.--- Data in ⇒26
になっている。
(注意!)RaspberryPiに接続する際は、1⇒3⇒2の順番に接続する
5-3. USBマイク
BU-Bauty PC Mac用USBマイク 超小型 超ミニ 22mmx18mmx5mmを使用しました。
コマンドで認識されているか確認します。
$ lsusb ⏎
“Bus 001 Device 004: ID 0d8c:0016 C-Media Electronics, Inc”で認識されています。
カード番号は1です。
マイクの感度を調整します。(-cに続く番号はcard番号です)
81%の値がマイク感度です。
録音してみます。
$ arecord -D plughw:1,0 -d 10 -f cd test.wav ⏎
(plughw:1,0はarecoed –l のカード番号とデバイス番号です。生成する音声ファイルはtest.wav)
PCなどに転送して音を確認してください。
5-4. Bluetoothスピーカー
Anker SoundCore mini コンパクト Bluetoothスピーカーを使用します。
・パッケージPulseAudioパッケージをインストール
$ sudo apt-get update ⏎
$ sudo apt-get dist-upgrade ⏎
$ sudo apt-get install bluetooth ⏎
$ sudo apt-get install pulseaudio-module-bluetooth ⏎
・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 bluetoothctls ⏎
[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 ⏎
「ピロリン」という音が鳴ると、接続完了です。
bluetoothctlから抜けます。
[bluetooth]# exit ⏎
・なかなか接続できない場合
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 ⏎
6. Watson「Speech to Text」、「Text to Speech」サービスの作成
Bluemixにログイン
https://console.bluemix.net/
「username」「password」を後程使用しますので、メモ帳などにコピー保存してください。
「username」「password」を後程使用しますので、メモ帳などにコピー保存してください。
7. Rasbianの最新化とNode.js、npm、のインストール
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 ⏎
8. コードのダウンロードとインストール
$ git clone https://github.com/victordibia/tjwave ⏎
$ cd ~/tjwave ⏎
$ npm install ⏎
$ sudo apt-get install alsa-base alsa-utils ⏎
$ sudo apt-get install libasound2-dev ⏎
$ sudo apt-get install pigpio ⏎
9. 「Speech to Text」、「Text to Speech」、構成情報の設定
ディレクトリを cd ~/tjwave に移動します。
$ cd ~/tjwave ⏎
インストールされたデフォルト構成ファイル「config.defaule.js」を「config.js」という名でコピーし、「config.js」を編集します。
$ cp config.default.js config.js ⏎
$ sudo nano config.js ⏎
■“6.Watson「Speech to Text」、「Text to Speech」サービスの作成”で取得した、「username」「password」を登録します。
ここではnanoエディターを使用しました。
各項目を登録し、Ctrl+x ⇒ y ⇒⏎で保存します。
10. USBマイクの設定
~/tjwave/wave.js
のwave.jsで、USBマイクの設定値を追加します。
まず、USBマイクはのカード番号、デバイス番号を調べます。
$ arekorod –l ⏎
この例では、カード番号1、デバイス番号0ですので、plughw:1,0を追加します。
wave.jsの56行あたり
var micInstance = mic({ 'rate': '44100', 'channels': '2', 'debug': false,,'exitOnSilence': 6 });
⇒
var micInstance = mic({ 'rate': '44100', 'channels': '2', 'debug': false, 'device': 'plughw:1,0','exitOnSilence': 6 });
11. プログラムの実行
$ cd ~/tjwave ⏎
$ sudo node wave.js ⏎
「raise arm」
「weave arm」
「wave arm」
「leave arm」
「「intorduce yourself」
「what your name」
「「can you dance」
と話しかけると、手を振ったり、自己紹介したり、ダンスをしてくれます。
発音が悪く、なかなか認識してくれませんが、Google翻訳の音声を使うとよく反応しました。
12. 日本語対応に変更
・wave.js 71行あたり
console.log("TJ is listening, you may speak now.");
⇒
console.log("TJは聞いてます。何か話しかけてください");
・wave.js 81行あたり
content_type: 'audio/l16; rate=44100; channels=2'
⇒
model: 'ja-JP_BroadbandModel', content_type: 'audio/l16; rate=44100; channels=2'
・wave.js 106~109行あたり
var containsWaveArm = (str.indexOf("raise") >= 0 || str.indexOf("weave") >= 0 || str.indexOf("wave") >= 0 || str.indexOf("leave") >= 0 ) && ( str.indexOf$
var introduceYourself = str.indexOf("introduce") >= 0 && str.indexOf("yourself") >= 0 ;
var whatisYourname = str.indexOf("what") >= 0 && str.indexOf("your") >= 0 && str.indexOf("name") >= 0 ;
var canYouDance = str.indexOf("can") >= 0 && str.indexOf("you") >= 0 && str.indexOf("dance") >= 0 ;
⇒
var containsWaveArm = (str.indexOf("あげる") >= 0 || str.indexOf("振る") >= 0 || str.indexOf("振る") >= 0 || str.indexOf("下ろす") >= 0 ) && ( str.indexOf("手") >= 0) ;
var introduceYourself = str.indexOf("自己") >= 0 && str.indexOf("紹介") >= 0 ;
var whatisYourname = str.indexOf("あなたの") >= 0 && str.indexOf("名前") >= 0 && str.indexOf("は") >= 0 ;
var canYouDance = str.indexOf("ダンス") >= 0 && str.indexOf("できます") >= 0 ;
・wave.js 113行あたり
speak("Ok, I will wave my arm. Just for you.");
⇒
speak("はい。手を振ります。");
・wave.js 116行あたり
speak(" Hi, my name is TJ. I'm an open source project designed to help you access Watson Services in a fun way. You can 3D print me or laser cut me, then use one of my recipes to bring me to life. I can't wait to see what we do together. ");
⇒
speak("こんにちは、私の名前はTJです。 あなたが楽しい方法でWatson Servicesを使うのを手助けするように設計されたオープンソースプロジェクトです。 あなたは3Dプリントをしたり、レーザーカットしたりして、レシピの1つを使って私を作ります。 一緒に何かやりましょう! ");
・wave.js 118行あたり
speak(" My name is TJ. You can call me TJ Bot");
⇒
speak("私の名前はTJです。 TJ Botと呼んでください。");
・wave.js 123行あたり
speak("sorry, I haven't been taught to understand that.")
⇒
speak("すみません。よくわからないです。")
・wave.js 195行あたり
voice: config.voice,
⇒
voice: 'ja-JP_EmiVoice',
・wave.js 238行あたり
speak("Sure. I am decoding a sound file that I will dance to. This may take a couple of seconds.") ;
⇒
speak("確かに。 私は踊るサウンドファイルをデコードしています。 これには数秒かかります。") ;
13. 日本語対応版プログラムの実行
$ cd ~/tjwave
$ sudo node wave.js ⏎
「手をあげる」
「手を振る」
「手を下す」
「自己紹介」
「あなたの名前は?
「ダンスできます?」
と話しかけると、手を振ったり、自己紹介したり、ダンスをしてくれます。