Raspberry Pi、IBM Bluemixでできることはたくさんあると分かってきました。以前の記事『これは遊べる!Raspberry PiとIBM Watsonで作るIoTに世界のWeb開発者が熱狂』では、Raspberry PiをIBM BluemixやIBM Waston、Node-REDに接続する方法を紹介しました。Raspberry Pi、Bluemix、Node-REDの接続がまだの人は、前回の記事から読み始めることをおすすめします。記事ではRaspberry Pi 3を使いましたが、Raspberry Pi 2でもちゃんと動くはずです。
この記事では前回取りあげたNode-REDにText-to-Speech(音声合成機能)を追加する方法を説明します。
音声合成機能をIBM Bluemixに接続
IBM Wastonの音声合成機能サービスに接続するには、Bluemixに「Text to Speech」サービスを追加する必要があります。Bluemix Serviceのページを開いて「Text to Speech」サービスを見つけてください(「Speech to Text」をクリックしないように注意してくださいね。まったくの別物です)。
クリックするとBluemixのText to Speechサービスページにアクセスします。
表示されたページには、IBM Bluemixに音声合成機能を追加するオプションが表示されます。使用するRaspberry Piがちゃんと選択されていることを確認し(前回の記事で「Dev」と紹介したもの)、アプリを無制限の状態にします。サービスに名前をつけ(ここでは「The Voice」)、認証情報にも名前をつけます(ここでは変更しませんでした)。使える唯一のプランが「Standard」だったので、これもそのままにしておきました。設定を選んだら「Create」をクリックします。
サービスの追加が完了すると、そのサービスのページに誘導されます。左側の「Service Credentials」メニューをクリックするとユーザー名とパスワードが表示されます。このユーザー名とパスワードは新しいIBM Waston音声合成サービスにアクセスするとき、Node-Redに入力するものです。ユーザー名とパスワードを書き留めておきます。
新しいIBM WastonサービスをNODE-REDに追加
Node-REDでIBM Waston音声合成サービスを使うには、ノードを新しくインストールする必要があります。Raspberry PiにSSHして(またはRaspberry Piからのターミナルを直接開く)入力します。
cd ~/.node-red
これでNode-REDアプリのフォルダーが開きますので、ここからnode-red-node-watsonという名前がつけられているNode-REDのノードを新しくインストールします。これで必要としているText to SpeechなどIBM Watsonサービスのすべてにアクセスできるようになります。インストールするにはNode-REDフォルダーのRaspberry Piで次のコマンドを実行します。
sudo npm install node-red-node-watson
ALSA Dev Libraryのインストール
IBM Wastonの音声合成機能はNode-REDアプリのテキストを読み上げて、音声ファイルに変換しますが、このようなファイルを再生できるようにRaspberry Piを操作する必要があります。Raspberry Piできちんと動作できるようにするには、次のコマンドを実行してdev ALSAライブラリーをインストールします。
sudo apt-get install libasound2-dev
Node-REDを再起動
Node-REDに変更を反映するには、Node-REDの再起動が必要です。次の2つのコマンドを実行して再起動をします。
node-red-stop
node-red-start
Node-REDの新しい流れ
音声読み上げ機能と再生機能の準備が整いました。Node-REDを設定し実行します。
node-red-node-watsonパッケージをインストールして再起動したあとNode-REDを開くと、左側の「IBM_Watson」の下に新しいノードが増えています。
「text to speech」が表示されるまでスクロールし、Node-REDシートにドラッグします。
text to speechノードがNode-REDシートにあることを確認したら、ダブルクリックして設定画面を開きます。
先に書き留めておいたIBM Waston音声合成サービスにアクセスする認証情報(ユーザー名とパスワード)を入力します。入力後、言語とRaspberry Pi用の声を選択します。ファイルのフォーマットを「WAV」にし、「OK」をクリックします。
ここから音声読み上げ機能が始まりますので、何を読み上げるのかを決めます。第1回で、Raspberry Piの温度をIBM Bluemixへ送信したように、今回はRaspberry Piの温度を読み上げます。
始めるには、新しいfunctionノードをNode-REDシートにドラッグします。
新しいfunctionノードをダブルクリックし、次のコードを入力します。
msg.payload = "My current CPU temperature is " +
msg.payload.replace("temp=","").replace("'C\n","") +
" degrees celsius";
return msg;
第1回で使った機能と同じように、この機能はメッセージを生成しますが、JSONの文字列ではなく人間にとって読みやすい文章を生成します。たとえば、「My current CPU temperature is X degrees celsius(現在のCPU温度は摂氏X度です)」などです。この文はmsg.payload変数の中に格納されており、IBM Watson Text to Speechノードの要求を満たしています。また、functionノードにラベルをつけます。今回は「Temperature Text(温度テキスト)」と名づけました。
getCPUTempノードのアウトプットを、Temperature Textノードのインプットに接続します。
Temperature Textノードのアウトプットをtext to speechノードのインプットし接続します。
次に、別のfunctionノードをNode-REDシートにドラッグします。そのノード内でmsg.speech変数をtext to speechノードが反応するmsg.payloadに加えるシンプルな機能の設定をします。
msg.payload = msg.speech;
return msg;
この新しいfunctionノードには好きな名前をつけて構いません。「Format Speech」とつけました。最後に「OK」をクリックします。
音声ファイルの保存、読み出し
生成され保存、再生準備完了になっているサウンド・バッファがありますので再生します。ファイルに保存するにはstorageヘディングの下にあるfileノードを使います。アウトプットがついていないfileノードをNode-REDシートにドラッグします。
ドラッグしたfileノードをダブルクリックし、次の設定をします。
- ファイル名を/home/pi/temp/speech.wavと設定(現在Node-REDを実行しているユーザー名は「pi」)
- アクションは「overwrite file(上書きファイル)」
- 「Add newline (\n) to each payload?(改行(\n)を各ペイロードに加えますか? )」はチェックしない
- 「Create directory if it doesn’t exist(ディレクトリが存在しない場合は作成する)」にチェックを入れ、必要な場合にNode-REDがディレクトリを作成できるようにする
- ノードに名前をつける(好きな名前で構いません。ここでは「Create WAV」)
- 「OK」をクリック
これでIBM Watsonが読み上げるたびにWAVファイルを生成してくれるシンプルな流れが完成しました。各ノードが以下のようにつながっているか確認します。
音声の再生
アプリを実行する前に、実行時の頻度を調整しておく必要があります。timestampノードをダブルクリックします。
頻度は常識的なものにしておきます。というのは、IBM Watsonの音声読み上げ機能は時間がかかるからです。また、IBMサービスは文字数が1か月あたり100万字を超えると課金されることにも注意が必要です。特に読み上げを何度も要求した結果、何も読まれなくなったら悲惨です。ここでは1分間隔が最適でした。
delayノードをNode-REDシートにドラッグします。これはIBM Watsonが音声合成する前にちょっと間を置くためですのノードです。音声ファイルが更新される際、Node-REDでノードを実行する方法はいくつかありますが、ときとしてバグが発生します。少し遅れがあるほうがきちんと動作します。
delayノードをダブルクリックして設定画面を開き、遅延を1秒に変更し、「OK」をクリックします。
Format Speechノードのアウトプットをdelayノードに次のように接続します。
新しいfileノードをNode-REDシートにドラッグします。先にCreate WAVノードと名前をつけたfileノードはアウトプットがありませんでしたが、新しいfileノードはインプットとアウトプットの両方がついているものを使います。このfileノードにはファイル読み上げ機能を設定します。
新しいfileノードをダブルクリックして、次のように設定します。
- ファイル名を/home/pi/temp/speech.wavと設定(前と同様)
- アウトプットが「a buffer(バッファ)」になっているか確認
- 「Read WAV」と名前をつける(好きな名前で構いません)
- 「OK」をクリック
delayノードをRead WAVノードとつなぎます。
advancedセクションの下にあるUnixコマンドが実行できる、最終ノードとなるexecノードをNode-REDシートにドラッグします。このノードで音声をRaspberry Piで再生します。
execノードをダブルクリックして設定を変更します。コマンドを次のように設定します。
aplay /home/pi/temp/speech.wav
これでRaspberry Piで音声が再生されます。ラジオボタンを選択する必要はなく、ただexecノードに名前をつけて(ここでは「Play Audio」)、「OK」をクリックします。
いよいよ実行
これで、動作に必要な準備はすべて揃いました。
Raspberry Piで変更する必要があるのは音声出力でしょう。次のコマンドを使って音声を3.5mmジャックに誘導します。
amixer cset numid=3 1
Raspberry Piの音声の設定変更についてはRaspberry Piオーディオコンフィギュレーションページでより詳しく紹介されています。
正常に音声の設定が終わってすべての準備が整ったら、Node-REDインターフェイスの右上にある「Deploy」ボタンをクリックします。計画通りであれば正常に動作し、Raspberry Piがしゃべりだします!
下の動画は私がTwitterに投稿した、Raspberry Piがスターバックスのカップを通じておしゃべりする様子です。
My @Raspberry_Pi continues to speak to me through a @StarbucksAu cup and it is wonderful. The joys of technology... pic.twitter.com/KIjgtPSnfe
— Patrick Catanzariti (@thatpatrickguy) May 24, 2016
(Boombox Portable Vibration Speakerという魔法のようなデバイスを使いました! )
最後に
IBM Watson音声合成機能はIBM BluemixやRaspberry Piを扱う開発者にとっては可能性の宝庫です。音声を他のIBM Watsonサービスなど、ほとんどどんなものにもつなげられます。ここまでついてきてくれた読者のみなさんのために、次回でもIBM Watsonが持つ可能性について引き続き探っていきます!
(原文:Teaching Your Raspberry Pi to Speak with IBM Watson)
[翻訳:加藤由佳]
[編集:Livit]