Amazon Web Services ブログ
AWS IoT Core と Amazon Polly を使って、IoT デバイスからのメッセージを音声コマンドに変換する
AWS IoT Core は、インフラを管理することなく、何十億もの IoT デバイスを接続し、何兆ものメッセージを AWS のサービスにルーティングできる、フルマネージドサービスです。AWS IoT Core の主要な機能の1つはルールエンジンです。
ルールエンジンを使用すると、IoT デバイスから AWS の他のサービスにデータを送信することができます。これにより、アラームや通知のトリガー、ログの収集、分析や機械学習モデルの実行など、IoT データに対して即座にアクションを起こすことができるようになります。この記事では、デバイスから入ってくる JSON メッセージを、Amazon Polly のテキスト読み上げ機械学習モデルを使用して音声に変換する方法を紹介します。Amazon Polly はディープラーニングにより自然な響きの音声を合成するため、テキストを音声に変換することができます。幅広い言語セットに対応した何十ものリアルな音声を備えているため、Amazon Polly を使用してテキスト読み上げアプリケーションを構築することができます。
シナリオ
この例では、スーパーマーケット内を移動して床を掃除する清掃ロボットを扱うことにします。ロボットは、ロボットの状態 [走行、待機、停止、充電]
が変わるたびに、MQTT トピック robot/<clientID>/data
にメッセージを送信します。メッセージには、ロボットの現在の状態とスーパーマーケット内の位置が含まれています。
こちらがロボットから送られてくる MQTT メッセージのサンプルです。
MQTT トピック: robot/cleaning_robot_1/data
{
"state": "stuck",
"location": "aisle 16"
}
この例ではスーパーマーケットは、ロボットが立ち往生したときに、ワイヤレスヘッドセットで従業員に通知することを計画しています。どのロボットが動かなくなったのか、またそのロボットがどこにいるのかがわかるようなオーディオクリップを流すことで、従業員が簡単にロボットのところへ向かい、問題を解決できるようになることが望まれます。
こちらは、従業員が聞くことになる音声の例です。
sample-audio-message.mp3 (「清掃ロボット 1 が 16 番通路で立ち往生しています。」)
ファイルをダウンロードし、PCで再生してください。
ソリューションの概要
このソリューションをスーパーマーケットに提供するためには、以下のものを構築する必要があります。
- ロボットが状態を変化させたときにメッセージを発行するロボットを表す IoT デバイス
- 音声メッセージを再生するスピーカーの IoT デバイス
- 以下のような IoT ルール:
- トピック
robot/+/data
のメッセージをリッスンする - ロボットが “stuck” 状態になったとき、JSON メッセージを目的の文字列に変換する
- 新しいメッセージを
speaker/message
に publish する
- トピック
前提条件
このチュートリアルでは、以下の前提条件を満たしている必要があります。
- AWS アカウント。AWS アカウントをお持ちでない場合は、指示に従ってアカウントを作成してください。
- 管理者権限を持つユーザーロール(ワークフローを本番稼動させる際には、このロールに関連するサービスアクセスをさらに制約することがあります)。
- 最近のモダンブラウザ (Firefox または Chrome の最新版)
- Python と Pip がインストールされていること
- このソリューションを構築するために専門的な知識は必要ありませんが、基本的な Linux と Python の知識があれば役立ちます。
チュートリアル
ステップ1: GitHub リポジトリのクローンと AWS IoT Device SDK のダウンロード
- ロボットとスピーカーをシミュレートするサンプルアプリケーションの GitHub レポジトリをクローンします。実際のロボットとスピーカーでこのワークフローを試したい場合は、robot1 と speaker1 フォルダをそれぞれのデバイスにコピーしてください。そうでない場合は、両方をそのままにしてコンピュータでローカルにシミュレートできます。
git clone https://github.com/aws-samples/iot-polly
- AWS IoT Device SDK for python をインストールします。
- ロボットとスピーカーを別々に動かしている場合は、すべてのデバイスに対してこのコマンドを実行する必要があります。
python3 -m pip install AWSIoTPythonSDK
ステップ2: デバイスへの権限設定
ロボット
- まず、任意のロボットに対して適切なパーミッションを設定します。ロボットは AWS IoT に接続し、
robot/<robotID>/data
というトピックに publish できる必要があります。これは、IoT ポリシーで実現できます。 - AWS IoT Core コンソールに移動します。ナビゲーションメニューで、セキュリティの下にあるポリシーを選択します。
- ポリシーを作成を選択します。
- ポリシー名に
policy_robot
と入力します。 - ポリシーステートメントは JSON を選択し、以下のポリシードキュメントを貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:<region>:<accountID>:client/${iot:Connection.Thing.ThingName}" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:<region>:<accountID>:topic/robot/${iot:Connection.Thing.ThingName}/data" } ] }
- 上記のポリシーの
<region>
と<accountID>
を置き換え、作成をクリックします。
スピーカー
- 次に、スピーカーデバイスに適切なアクセス許可を設定します。スピーカーは AWS IoT に接続し、トピック
speaker/message
にサブスクライブできる必要があります。また、スピーカーは、テキストを音声に変換するための Amazon Polly にアクセスする権限も必要です。IoT デバイスに他の AWS サービスへのアクセスを与えるには、デバイスにロールエイリアスを引き受ける権限を与える必要があります。 - ポリシーを作成を選択します。
- ポリシー名に
policy_speaker
と入力します。 - ポリシーステートメントは JSON を選択し、以下のポリシードキュメントを貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:AssumeRoleWithCertificate", "Resource": "arn:aws:iot:<region>:<accountID>:rolealias/speaker-role-alias" }, { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:<region>:<accountID>:client/${iot:Connection.Thing.ThingName}" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:<region>:<accountID>:topicfilter/speaker/message" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "arn:aws:iot:<region>:<accountID>:topic/speaker/message" } ] }
- 上記のポリシーの
<region>
と<accountID>
を置き換え、作成をクリックします。
ステップ3: Amazon Polly アクションに対するパーミッションの設定
スピーカーに Amazon Polly へのアクセス権限を与えるには、AWS Identity and Access Management (IAM) ロールを作成し、IoT ロールエイリアスを作成して IAM ロールを IoT モノにアタッチする必要があります。
- AWS IAM コンソールに移動します。ナビゲーションメニューでロールを選択します。
- ロールを作成を選択します。
- カスタム信頼ポリシーを選択します。
- 以下の JSON ポリシーを貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- 次へを選択します。
- 許可ポリシーで、
polly
を検索し、AmazonPollyReadOnlyAccess のチェックボックスを選択します。 - 次へを選択します。
- ロール名には、
speaker_role
と入力します。 - ロールを作成を選択します。
- AWS IoT Core コンソールに移動します。ナビゲーションメニューのセキュリティの下にあるロールエイリアスを選択します。
- ロールエイリアスを作成を選択します。
- ロールエイリアス名には、
speaker-role-alias
と入力します。 - ロールには、ドロップダウンから speaker_role を選択します。
- 資格情報の期間を 3600 秒 (1 時間) のままにして、作成を選択します。
ステップ4: AWS IoT Core にデバイスを接続する
AWS IoT Core でロボットやスピーカーデバイスの IoT モノを作成します。
- AWS IoT Core コンソールに移動します。ナビゲーションメニューで、管理の下にあるすべてのデバイス、さらにモノを選択します。
- モノを作成を選択します。
- 1つのモノを作成するを選択します。次へを選択します。
- まず、ロボットを作成します。ロボットに
cleaning_robot_1
というモノの名前をつけます。 - 残りの項目はそのままにし、次へを選びます。
- 新しい証明書を自動生成(推奨)を選択します。次へを選択します。
- policy_robot の横のチェックボックスを選択します。モノを作成を選択します。
- 4 つのファイルをすべてダウンロードします: デバイス証明書、パブリックキーファイル、プライベートキーファイル、RSA 2048 ビットキー: Amazon ルート CA 1 。
- 完了を選択します。
- 4 つのファイルを iot-polly リポジトリ内の robot1 というフォルダに移動します。
- 秘密鍵と証明書のファイル名を以下のように変更します。
- xxxx-private.pem.key から robot1-private.pem.key へ
- xxxx-certificate.pem.crt から robot1.certificate.pem.crt へ
- スピーカーデバイスについて、以下の変更を加えた上で、上記の手順を繰り返します。
- IoT モノの名前を
speaker_1
とします。 - IoT ポリシー:
policy_speaker
を選択します。 - プライベートキーと証明書のファイル名を次のように変更します。
- xxxx-private.pem.key から speaker1-private.pem.key へ
- xxxx-certificate.pem.crt から speaker1.certificate.pem.crt へ
- IoT モノの名前を
ステップ5: ロボットとスピーカーをテストする
- AWS IoT Core コンソールのナビゲーションメニューで、MQTT テストクライアントを選択します。
- トピックをサブスクライブするで、
robot/+/data
と入力します。 - ナビゲーションメニューで、設定を選択します。デバイスデータエンドポイントをコピーします。
- ターミナルで以下のコマンドを入力します。iot-polly リポジトリに移動します。
cd robot1
Windows の場合:
py -m venv env cd env/Scripts/ activate cd ../..
Mac/Ubuntu の場合
python3 -m venv env source env/bin/activate
<iot endpoint>
を先ほどコピーしたデバイスデータエンドポイントに置き換えてください。pip install -r requirements.txt aws iot describe-endpoint --endpoint-type iot:Data-ATS python3 robot.py --clientId cleaning_robot_1 --endpoint <iot endpoint> --key robot1-private.pem.key --cert robot1-certificate.pem.crt --rootCA AmazonRootCA1.pem
- MQTT テストクライアントに戻り、
robot/cleaning_robot_1/data
からメッセージが送られてくるのを確認します。{ "state": "stuck", "location": "aisle 17", "robotID": "cleaning robot 1" }
- 後ほど使いますので、robot1 はバックグラウンドで実行したままにしておきます。
- ターミナルの新しいタブで、iot-polly リポジトリに移動します。
cd speaker1
Windows の場合:
py -m venv env cd env/Scripts/ activate cd ../..
Mac/Ubuntu の場合:
python3 -m venv env source env/bin/activate
以下は両方で実行:
pip install -r requirements.txt
IoT エンドポイントとクレデンシャルプロバイダーの URL を取得します。
aws iot describe-endpoint --endpoint-type iot:Data-ATS aws iot describe-endpoint --endpoint-type iot:CredentialProvider --region <region>
- コンピュータの音声出力がオンになっていることを確認します。スピーカーデバイスを実行します: (エンドポイントとクレデンシャルプロバイダーを上記のコマンドの出力に置き換えてください) 。
python3 speaker-device.py --thingname speaker_1 --region <region> --endpoint <iot endpoint> --key speaker1-private.pem.key --cert speaker1-certificate.pem.crt --rootCA AmazonRootCA1.pem --credentials_url https://<credential-provider-endpoint>/role-aliases/speaker-role/alias/credentials
- MQTT テストクライアントに戻ります。
- トピックに公開するタブを選択します。
- トピック名は
speaker/message
とします。 - メッセージペイロードに以下を貼り付けます。
{ "message": "Hello from AWS IoT console" }
- 発行を選択
- speaker1 は、speaker-device.py ファイルの boto3 ライブラリを使用して、Amazon Polly API を呼び出し、メッセージで受け取ったテキストを MP3 オーディオファイルに変換します。その後、playsound ライブラリを使用して自動的に音声を再生します。
- “Hello from AWS IoT console” というメッセージが聞こえ、ターミナルに以下のメッセージが流れてくるのが確認できるはずです。
Received a new message:
b'{\n "message": "Hello from AWS IoT console"\n}'
from topic:
speaker/message
- speaker1 については、後ほど使いますので、起動したままにしておいてください。
ステップ6: IoT ルールの作成
- AWS IoT Core コンソールで、メッセージのルーティングの下のルールを選択します。
- ルールを作成を選択します。
- ルールのプロパティでは、ルールに名前:
robot_stuck
とルールの説明を付けます。次へを選択します。 - SQL のバージョンはそのままで、SQL ステートメントとして次を入力します。
SELECT concat(robotID, ' is stuck on ', location) as message FROM 'robot/+/data' WHERE state = "stuck"
- この SQL 文は、ワイルドカードトピック
robot/+/data
上で状態が stuck であるあらゆるメッセージを受け取り、そのデータを “<robotID>
is stuck on<location>
” という文章形式に連結しています。 - 次へを選択します。
- ルールアクションとして Republish to AWS IoT topic を選択し、トピック
speaker/message
を入力します。 - 新しいロールを作成を選択します。
- ロールに
Role_IoTVoice_rule
という名前を付けます。 - 作成を選択します。
- 次へを選択します。
- 作成を選択します。
- 新しいルールが正常に作成されたことが確認できるはずです。
ステップ7: IoT ルールのテスト
- ターミナルで robot1 と speaker1 が起動していること、音声出力がオンになっていることを確認します。
- JSON ファイル robot_payload.json (robot1 フォルダー内) をテキストエディタで開きます。
- JSON 中の location を編集し、保存します。
{ "state": "stuck", "location": "aisle 12" }
- robot1 がメッセージをパブリッシュしたことがわかります。
Published topic robot/cleaning_robot_1/data: {"state": "stuck", "location": "aisle 12", "robotID": "cleaning robot 1"}
- その後、トピックは自動的に IoT ルールにルーティングされ、speaker1 に戻るようにパブリッシュされます。
Received a new message:
b'{"message":"cleaning robot 1 is stuck on aisle 12"}'
from topic:
speaker/message
- speaker1 は、IoT ルールから受信したテキストを MP3 オーディオファイルに変換し、メッセージを自動再生します。”Cleaning robot 1 is stuck on aisle 12″ 。
- robot_payload.json ファイルを再度編集してみますが、今度は状態を running に変更します。ファイルを保存してください。
{ "state": "running", "location": "aisle 2" }
- robot1 がメッセージを受信していることがわかりますが、メッセージは speaker1 に転送されません。stuck していないので IoT ルールでフィルタリングされているためです。
おめでとうございます! IoT ルールを作成してメッセージを変換して別のデバイスにルーティングし、Amazon Polly で音声に変換することに成功しました。
まとめ
このブログでは、AWS IoT Core のルールエンジンと Amazon Polly を使って IoT メッセージを音声として聞く方法を学びましたが、学んだことは次のような様々なソリューションに応用することが可能です。
- スマートビークルは、「現在の航続距離は 30 マイル、次のガソリンスタンドは 5 マイル先です」という音声メッセージでドライバーに通知することができます。
- スマートフリーザー: 「冷凍庫の中の温度が高いです。10 分間で x 度から y 度になりました」
- 血糖値モニター: 「血糖値が高すぎます、210 mg/DL です」
IoT ルールエンジンの活用方法については、コース Deep Dive into AWS IoT Rules Engine をご覧ください。IoT データを使ってどのように行動し、業務を改善しているのか、ぜひ教えてください。