このページの本文へ

Raspberry Pi×Watsonで音リモコンを作ろう (2/3)

2016年04月21日 11時00分更新

文●横井一仁/日立製作所

  • この記事をはてなブックマークに追加
本文印刷

Node-REDで記述したシステム

Node-REDで記述したシステム全体の処理は、次のとおりです。

Node-REDで記述した処理

以下、処理の流れに沿って説明します(各ノードの設定はコラムを参照してください)。

Run

「Run」は定期的に処理を開始するノードで、injectノードを用いて定義しました。最初に、この「Run」が後続の処理を開始します。2回目以降は、前回処理を開始してから10秒後に同じ後続の処理を再実行します。

Record voice、Error

「Record voice」は、ffmpegを用いてマイク入力を録音するノードであり、execノードを用いて定義しました。「Record voice」は「Run」からの入力を契機とし、5秒間音声を録音します。

「Record voice」はエラーの情報を上から2つ目の端子、戻り値の情報を上から3つ目の端子に出力します。debugノードを用いて定義した「Error」へこれら2つの端子をつなぎ、「Record voice」がエラーを出力した際の内容をデバッグ画面に出力するようにしました。「Record voice」の録音処理が成功した場合は、1番上の端子に処理が渡り「Read voice file」が実行されます。

Read voice file

「Read voice file」は、音声ファイルのバイナリデータを読み込むノードで、fileノードを用いて定義しました。この「Read voice file」が読み込んだ音声ファイルのバイナリデータを後続の「Watson Speech to Text」に渡します。

Watson Speech to Text

「Watson Speech to Text」はBluemixのWatson Speech to Textサービスへバイナリデータをアップロードし、音声認識結果のテキストデータを取得します。その後「Watson Speech to Text」から出力される音声認識結果は、「Text」と「hot?」の2つのノードに引き継がれます。

Bluemix上のWatson Speech to Textサービスの環境変数に登録されているIDとパスワードを、プロパティ画面上で入力するとRaspberry Pi上でWatson Speech to Textを利用できるようになります。言語は、日本語も対応していますが、今回は処理を単純にするため英語を指定しました。インターネット上のBluemixで提供されているサービスなので、利用するにはRaspberry Piがインターネットにつながり、APIにアクセスできる必要があります。

Watson Speech to Textサービスの処理ノードのプロパティ画面

Text

「Text」は、ユーザーが音声認識の結果を確認するためデバッグ画面に出力するノードで、debugノードを用いて定義しました。

hot?、ON、OFF

「hot?」は文字列の条件判定をするノードで、switchノードを用いて定義しました。「hot?」はテキストが文字列“hot”を含む場合、上の端子に接続された「ON」を用いてGPIO端子の電流をONにする信号を「Relay」へ渡します。一方、テキストが文字列“hot”を含まない場合は、下の端子に接続された「OFF」を用いてGPIO端子の電流をOFFにする信号を「Relay」へ渡します。

「ON」、「OFF」はTemplateノードで定義し、「Relay」に送る信号としてそれぞれ値1と0を記述してあります。最後にrpi-gpioノードで定義した「Relay」は、「ON」「OFF」からの信号に従い、GPIO端子に電流を流し、扇風機のスイッチのON/OFFを操作します。

扇風機の電源ON/OFFの条件判定はSwitchノードを使いました。プロパティ画面にて、指定した文字列が含まれているかを判定するcontainsをプルダウンメニューから選択し、文字列として“hot”を入力しました。このSwitchノードにhotを含む文字列が渡されると、リレーをONにする処理に処理を引継ぎます。もし、Switchノードに“hot”を含まない文字列が渡されると、リレーをOFFにする処理に引継がれます。

条件分岐の処理ノードのプロパティ画面

Relay

「Relay」は、扇風機の電源ON/OFFするリレー制御をするために、rpi-gpioノードを使いました。このノードは、プロパティにて電流を流すGPIO端子を指定できます。今回は、GPIOの12番の端子に電流を流すように指定しました。

GPIOを制御する処理ノードのプロパティ画面

今回使用したNode-REDの処理ノードと設定

今回開発したシステムでは、次の表の処理ノードを使用して一連の処理を記述しました。各処理ノードの仕様は、Node-REDの開発画面右側のinfoタブ内に表示されますので、プロパティの設定方法や入出力データの受け渡し方法が分からない場合に参考にできます。例えばTemplateノードを選択した際は、infoタブ内に図の情報が表示されます。本infoタブ内には、前の処理ノードから引き継いだ変数を定型文に挿入する例が説明されています。

今回使用したNode-REDの処理ノード

※1:rpi-gpioノードは、Raspbian版Node-REDにのみ標準で存在する処理ノード
※2:Speech to Textノードは、Raspbian版Node-REDに標準で存在しない処理ノード(追加インストールが必要)

Templateノードを選択した時のinfoタブの情報

ハードウェアの設定

リレーを使ってGPIOの端子に電流を流すと、扇風機に電源が流れる回路をブレッドボード上で作成しました。ブレッドボードは、電子部品を差し込むだけで電子回路を組めるボードです。ブレッドボードは半田付け不要なので、回路の変更も容易です。

ブレッドボード上で作成した回路

電源入力用のUSB端子(下図の左側)と電源出力用のUSB端子(下図の右側)を用意し、電源の1番、5番の端子を使用します。1番の端子同士は直結し、5番の端子同士の間にはリレーのスイッチ部につなぎました。リレーのスイッチによってUSBの電源ON/OFFを制御します。

GPIOのGND端子と12番端子はリレーの電磁石部につなぎました。

緑色のジャンパーコード、左側の赤色と黒色のジャンパーコード、2つのLEDと抵抗は、開発中に通電を確認するために使用したもので、今回の回路では使用していません。

電源入力用のUSB端子(左側)と扇風機に接続する電源出力用のUSB端子(右側)回路

システムの動作検証

システムの開発が終了したら、動作検証をします。動画のとおり、USBマイクに向かって“It’s hot....”と話すとリレーのスイッチが入り、扇風機が動き出します(音声はスマートフォンで生成しました)。

▼動作検証動画

デバック画面には、音声認識結果の“It’s hot..”が出力されています。なお、今回の処理は10秒間隔で実行しているため、10秒後の次の処理で“hot”という単語が認識されないと、扇風機が止まります。

デバッグ画面の出力

まとめ

Raspberry Pi上で音声認識やGPIO端子を制御するには、コマンドを記述することが一般的です。そのため、開発にはLinuxのコマンド操作の知識が必要になります。一方、Node-REDを使うと、視覚的で分かりやすく、プログラミング技術がない人でも手軽に開発できます。処理の視覚的な表示は、展示デモなどで処理を説明する際にも便利です。

Node-REDは複雑な処理がカプセル化されているため、開発時間が少なくて済むという特徴もあります。処理ノードが用意されている状態であれば、処理ノードの仕様書を読みながら開発しても1時間程度で今回のような処理を記述できます。Node-REDを使った開発にぜひチャレンジしてみてください。

※ ※ ※

次回は、話題のロボット「Pepper」を使ったIoTアプリを作成する予定です。

著者:横井一仁(よこい・かずひと)

著者写真

株式会社日立製作所 研究開発グループ テクノロジイノベーション統括本部 情報通信イノベーションセンタ
2009年に日立製作所へ入社し、検索、自然言語処理、グラフデータベース、クラウドストレージの研究に従事。アイデアを素早く形にできるBluemixの開発手法を活用し、国内外の開発コンテストで受賞した実績を持つ。現在、Bluemixユーザー会の運営メンバの1人として活躍中。

この連載の記事

一覧へ

この記事の編集者は以下の記事をオススメしています