「出発進行」の声でおもちゃの電車を動かそう!Nゲージを声でコントロール [Listnr開発者モード事例]

NakamuraToshinari NakamuraToshinari

こんにちは。Listnrのアプリケーションソフトを担当している中村です。
ListnrはWi-Fi経由のインターネット接続機能とマイクを搭載したデバイスです。
乳児の声を録音し、その音声を解析サーバーにアップロードして、泣き、笑いといった感情を判断するという機能をご提供しています。

実は、この感情を判断する機能は、Listnrの活用例としてご提供しているもので、ベースの機能であるインターネット接続マイク機能をハックすることができるようになっています。具体的には、音声のアップロード先を自由に変えて、録音した音声を活用することが可能となっています。
今回は、その一例として、おもちゃの電車、Nゲージを声でコントロールできるようにし、運転士になった気分を味わえるようにしてみたいと思います。

システム構成

s 2016-04-12 12.56.59

大まかな流れは以下のようになります。

  1. Raspberry PiでListnrからの音声アップロードを受け付けるサーバーを構築する
    • Raspberry Piで受け取った音声ファイルをIBM BluemixのSpeech to Textサービスに送り、認識結果のテキストを受け取る
  2. Raspberry PiでNゲージ線路の電圧を制御して電車の走行方向とスピードを操作できるようにする
  3. Listnrの音声アップロード先をRaspberry Piに設定する

1. Raspberry PiでListnrからの音声アップロードを受け付けるサーバーを構築する

Raspberry Piに Raspbian をインストールします。インストールは INSTALLING OPERATING SYSTEM IMAGES などを参考に行ってください。

インストールができたら、Raspberry Pi上で作業します。キーボードとディスプレイをRaspberry Piに繋いで作業していただいてもよいですし、sshでRaspberry Piにログインして作業していただいても構いません。
Raspbianのデフォルトのユーザー名は pi で、パスワードは raspberry になっています。(参考: LINUX USERS

サンプルコードが以下にありますので、Raspberry Pi上にダウンロードします。
https://github.com/cerevo/listnr-server-sample-py

git clone https://github.com/cerevo/listnr-server-sample-py.git

ダウンロードできたら、speech_to_text_n_scale ディレクトリに移動します。

cd listnr-server-sample-py/speech_to_text_n_scale/

必要なライブラリをインストールします。

sudo pip install -r requirements.txt
sudo apt-get install flac

サーバーを起動します。

python server.py

以下の様なログが表示されれば起動されています。

Bottle v0.12.9 server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8080/
Hit Ctrl-C to quit.

一旦、Ctrl-C でサーバーを終了します。

IBM Bluemix Speech to Text サービスを利用できるようにする

ここで、音声ファイルのテキスト認識をするためのサービスを利用するため、IBM Bluemixのフリートライアルの申し込みを行います。
ちなみに、IBM Bluemixでは、テキスト認識だけでなく、音声合成や画像認識などいろいろ試せます。
Raspberry Piではなく、普段お使いのブラウザで申し込み作業を行ってください。

以下を開き、上部右側にある「登録」ボタンを押して、アカウント登録します。
Speech to Textの機能は無料トライアル終了後も1,000分/月まで無料で利用可能です(2016/04/11現在)。ただし、無料トライアル終了後に継続して利用するにはクレジットカードの登録が必要です。

https://console.ng.bluemix.net/

登録後、再度上記ページを開き、上部右側にある「ログイン」ボタンからログインします。
ログイン後にダッシュボードから、「サービスまたはAPIの使用」を押し、次の画面で「Speech To Text」を選択します。
右側の「サービスの追加」フォームで、以下のように入力して、「作成」ボタンを押します。

  • スペース: dev
  • アプリ: アンバインドのまま
  • サービス名: Speech To Text
  • 資格情報名: Credentials-1
  • 選択済みプラン: 標準

作成が完了したら、左側メニューから「サービス資格情報」を選択します。すると、passwordやusernameが表示されるはずです。
このpasswordやusernameをRaspberry Piでダウンロードしたサンプルプログラムの設定ファイルに書き込みます。
設定ファイルは、 listnr-server-sample-py/speech_to_text_n_scale/config.ini です。

vi config.ini
# ibm_bluemix_speech_to_text セクションのusername, passwordの部分に書き込んでください。

[ibm_bluemix_speech_to_text]
username=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
password=xxxxxxxxxxxx

サーバーを起動して、テストしてみます。まずはサーバーを起動します。

python server.py

別のターミナルを開き、サンプルプログラムのディレクトリ以下にあるサンプル音声のディレクトリに移動し、音声ファイルをアップロードしてみます。

cd listnr-server-sample-py
cd audio_sample
curl -H "Transfer-Encoding: chunked" -X POST http://localhost:8080/wave -F "file=@sample.r16;type=application/octet-stream"
# OK と表示されれば送信完了です。

サーバーを起動したターミナルを再度開き以下の用に表示されれば、テキスト認識成功です。

127.0.0.1 - - [08/Apr/2016 11:05:23] "POST /wave HTTP/1.1" 200 2
IBM Speech Recognition thinks you said こんにちは

2. Raspberry PiでNゲージ線路の電圧を制御して電車の走行方向とスピードを操作できるようにする

Raspberry PiとI2Cで接続できるモータードライバ DRV8830 を使って、ブレットボードなどで以下の様な回路を作ります。

s 2016-04-11 12.58.55

こうすることで、Raspberry Pi –(I2C)–> DRV8830 –> D.C フィーダー N –> Nゲージの線路 –> 電車 という風に接続され、Raspberry PiでNゲージ線路の電圧を制御して電車の走行方向とスピードを操作できるようになります。

Raspberry PiでI2Cを使えるようにします。

  • /boot/config.txt の dtparam=i2c_arm=on の行のコメントアウトを外します
  • /etc/modules に i2c-dev の行があるか確認します
  • reboot します
  • 再起動後、lsmod を実行して、i2c_bcm2708 と i2c_dev の行があることを確認します
    lsmod

    Module Size Used by
    cfg80211 407532 0
    rfkill 16036 1 cfg80211
    i2c_bcm2708 4920 0
    snd_bcm2835 19802 3
    snd_pcm 73474 1 snd_bcm2835
    snd_timer 18848 1 snd_pcm
    bcm2835_gpiomem 2860 0
    bcm2835_rng 1763 0
    snd 50779 9 snd_bcm2835,snd_timer,snd_pcm
    uio_pdrv_genirq 2944 0
    uio 7753 1 uio_pdrv_genirq
    i2c_dev 5671 0
    fuse 80630 3
    ipv6 340825 36

  • 必要なライブラリをインストールします
    sudo apt-get install python-smbus

Raspberry PiからI2CでDRV8830に指示を送るプログラムは i2c_motor_driver.py というファイルに書いてあります。上記の回路をテストするには、以下を実行してください。電車が動き始め、加速・減速し、その後逆方向に進むといった動作をすれば成功です。

python i2c_motor_driver.py

3. Listnrの音声アップロード先をRaspberry Piに設定する

Listnrの音声アップロード先は、専用アプリ(Android版, iOS版)から変更可能です。開発者向け情報ページの「Listnrの音声アップロード先サーバーを変更する」セクションを参考に変更を行います。
音声アップロード先URLは、 http://{Raspberry PiのIPアドレス}:8080/wave に設定します。
Raspberry PiのIPアドレスは ifconfig コマンドなどで確認してください。

運転士になってみる

以上の準備ができたら、Raspberry Pi上のサーバーを起動して、Listnrに声を聞かせて見ましょう。

python server.py

サンプルプログラムでは以下の様なコマンドを用意しています。変更するには、server.py を編集してください。
声を聞かせるときの注意として、Listnrは大きな音を検出したら録音を開始するため、コマンドをいきなり発声すると最初の部分を取りこぼしてしまいます。最初にListnrのマイクに息を吹きかけて風切り音を入力してからコマンドを言うと拾いやすくなります。

動作 コマンド
出発 出発進行, スタート, 発車, 出発
停車 止まれ, ストップ, 停車
折り返し バック, リバース, リターン, 折り返し
加速 加速, アップ, アクセル
減速 減速, ダウン, ブレーキ

ちなみに、社内で試したときは、音声認識の対象言語を英語にして、rightで出発、lightで停車という風に設定したところ、英語の発音練習大会に発展し大変盛り上がりました。rightが得意な人、lightが得意な人、両方きっちり発音できるネイティブの人という格付けまでされていました。コマンドの設定次第でいろいろと遊べるかもしれません。

まとめ

Listnrを使えば、Wi-Fi経由で音声を録音できるようになりますのでアイディア次第で様々な応用が可能だと思います。例えば、Raspberry Piではなく、インターネット上のレンタルサーバーに音声をアップロードして、認識した音声を元にSNSへ投稿するなどの応用例も実現可能かと思います。何かおもしろい応用例を思いつかれた場合や、実装された場合はぜひ教えてください。