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で再生してください。

Download Sample Audio

図1: サンプル音声のダウンロード

ソリューションの概要

このソリューションをスーパーマーケットに提供するためには、以下のものを構築する必要があります。

  1. ロボットが状態を変化させたときにメッセージを発行するロボットを表す IoT デバイス
  2. 音声メッセージを再生するスピーカーの IoT デバイス
  3. 以下のような IoT ルール:
    • トピック robot/+/data のメッセージをリッスンする
    • ロボットが “stuck” 状態になったとき、JSON メッセージを目的の文字列に変換する
    • 新しいメッセージを speaker/message に publish する
Solution Diagram

図2: ソリューションの全体図

前提条件

このチュートリアルでは、以下の前提条件を満たしている必要があります。

  • AWS アカウント。AWS アカウントをお持ちでない場合は、指示に従ってアカウントを作成してください。
  • 管理者権限を持つユーザーロール(ワークフローを本番稼動させる際には、このロールに関連するサービスアクセスをさらに制約することがあります)。
  • 最近のモダンブラウザ (Firefox または Chrome の最新版)
  • PythonPip がインストールされていること
  • このソリューションを構築するために専門的な知識は必要ありませんが、基本的な Linux と Python の知識があれば役立ちます。

チュートリアル

ステップ1: GitHub リポジトリのクローンと AWS IoT Device SDK のダウンロード

  1. ロボットとスピーカーをシミュレートするサンプルアプリケーションの GitHub レポジトリをクローンします。実際のロボットとスピーカーでこのワークフローを試したい場合は、robot1speaker1 フォルダをそれぞれのデバイスにコピーしてください。そうでない場合は、両方をそのままにしてコンピュータでローカルにシミュレートできます。
    git clone https://github.com/aws-samples/iot-polly
  2. AWS IoT Device SDK for python をインストールします。
  3. ロボットとスピーカーを別々に動かしている場合は、すべてのデバイスに対してこのコマンドを実行する必要があります。
    python3 -m pip install AWSIoTPythonSDK

ステップ2: デバイスへの権限設定

ロボット

  1. まず、任意のロボットに対して適切なパーミッションを設定します。ロボットは AWS IoT に接続し、robot/<robotID>/data というトピックに publish できる必要があります。これは、IoT ポリシーで実現できます。
  2. AWS IoT Core コンソールに移動します。ナビゲーションメニューで、セキュリティの下にあるポリシーを選択します。
  3. ポリシーを作成を選択します。
  4. ポリシー名policy_robot と入力します。
  5. ポリシーステートメント 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"
    }
    ]
    }
  6. 上記のポリシーの <region><accountID> を置き換え、作成をクリックします。

    IoT Policy Robot

    図3: ロボット用の IoT ポリシー

スピーカー

  1. 次に、スピーカーデバイスに適切なアクセス許可を設定します。スピーカーは AWS IoT に接続し、トピック speaker/message にサブスクライブできる必要があります。また、スピーカーは、テキストを音声に変換するための Amazon Polly にアクセスする権限も必要です。IoT デバイスに他の AWS サービスへのアクセスを与えるには、デバイスにロールエイリアスを引き受ける権限を与える必要があります。
  2. ポリシーを作成を選択します。
  3. ポリシー名policy_speaker と入力します。
  4. ポリシーステートメント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"
    }
    ]
    }
  5. 上記のポリシーの <region><accountID> を置き換え、作成をクリックします。

    Figure 4 - IoT Policy Speaker

    図4: スピーカー用の IoT ポリシー

ステップ3: Amazon Polly アクションに対するパーミッションの設定

スピーカーに Amazon Polly へのアクセス権限を与えるには、AWS Identity and Access Management (IAM) ロールを作成し、IoT ロールエイリアスを作成して IAM ロールを IoT モノにアタッチする必要があります。

  1. AWS IAM コンソールに移動します。ナビゲーションメニューでロールを選択します。
  2. ロールを作成を選択します。
  3. カスタム信頼ポリシーを選択します。
  4. 以下の JSON ポリシーを貼り付けます。
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": {
    "Service": "credentials.iot.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
    }
    ]
    }
  5. 次へを選択します。
  6. 許可ポリシーで、polly を検索し、AmazonPollyReadOnlyAccess のチェックボックスを選択します。
  7. 次へを選択します。
  8. ロール名には、speaker_role と入力します。
  9. ロールを作成を選択します。
  10. AWS IoT Core コンソールに移動します。ナビゲーションメニューのセキュリティの下にあるロールエイリアスを選択します。
  11. ロールエイリアスを作成を選択します。
  12. ロールエイリアス名には、speaker-role-alias と入力します。
  13. ロールには、ドロップダウンから speaker_role を選択します。
  14. 資格情報の期間を 3600 秒 (1 時間) のままにして、作成を選択します。

ステップ4: AWS IoT Core にデバイスを接続する

AWS IoT Core でロボットやスピーカーデバイスの IoT モノを作成します。

  1. AWS IoT Core コンソールに移動します。ナビゲーションメニューで、管理の下にあるすべてのデバイス、さらにモノを選択します。
  2. モノを作成を選択します。
  3. 1つのモノを作成するを選択します。次へを選択します。
  4. まず、ロボットを作成します。ロボットに cleaning_robot_1 というモノの名前をつけます。
  5. 残りの項目はそのままにし、次へを選びます。

    Figure 5 - Creating IoT Thing on AWS IoT Core

    図5: AWS IoT Core で IoT モノを作成する

  6. 新しい証明書を自動生成(推奨)を選択します。次へを選択します。
  7. policy_robot の横のチェックボックスを選択します。モノを作成を選択します。

    図6: ポリシーのアタッチ

  8. 4 つのファイルをすべてダウンロードします: デバイス証明書、パブリックキーファイル、プライベートキーファイル、RSA 2048 ビットキー: Amazon ルート CA 1 。
  9. 完了を選択します。

    Figure 7 - Download Certificates

    図7: 証明書をダウンロード

  10. 4 つのファイルを iot-polly リポジトリ内の robot1 というフォルダに移動します。
  11. 秘密鍵と証明書のファイル名を以下のように変更します。
    • xxxx-private.pem.key から robot1-private.pem.key
    • xxxx-certificate.pem.crt から robot1.certificate.pem.crt
  12. スピーカーデバイスについて、以下の変更を加えた上で、上記の手順を繰り返します。
    • IoT モノの名前を speaker_1 とします。
    • IoT ポリシー: policy_speaker を選択します。
    • プライベートキーと証明書のファイル名を次のように変更します。
      1. xxxx-private.pem.key から speaker1-private.pem.key
      2. xxxx-certificate.pem.crt から speaker1.certificate.pem.crt

ステップ5: ロボットとスピーカーをテストする

  1. AWS IoT Core コンソールのナビゲーションメニューで、MQTT テストクライアントを選択します。
  2. トピックをサブスクライブするで、robot/+/data と入力します。
  3. ナビゲーションメニューで、設定を選択します。デバイスデータエンドポイントをコピーします。
  4. ターミナルで以下のコマンドを入力します。iot-polly リポジトリに移動します。
    cd robot1

    Windows の場合:

    py -m venv env
    cd env/Scripts/
    activate
    cd ../..

    Mac/Ubuntu の場合

    python3 -m venv env
    source env/bin/activate
  5. <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
  6. MQTT テストクライアントに戻り、robot/cleaning_robot_1/data からメッセージが送られてくるのを確認します。
    {
    "state": "stuck",
    "location": "aisle 17",
    "robotID": "cleaning robot 1"
    }
  7. 後ほど使いますので、robot1 はバックグラウンドで実行したままにしておきます。
  8. ターミナルの新しいタブで、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>
  9. コンピュータの音声出力がオンになっていることを確認します。スピーカーデバイスを実行します: (エンドポイントとクレデンシャルプロバイダーを上記のコマンドの出力に置き換えてください) 。
    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
  10. MQTT テストクライアントに戻ります。
  11. トピックに公開するタブを選択します。
  12. トピック名は speaker/message とします。
  13. メッセージペイロードに以下を貼り付けます。
    { "message": "Hello from AWS IoT console" }
  14. 発行を選択
  15. speaker1 は、speaker-device.py ファイルの boto3 ライブラリを使用して、Amazon Polly API を呼び出し、メッセージで受け取ったテキストを MP3 オーディオファイルに変換します。その後、playsound ライブラリを使用して自動的に音声を再生します。
  16. “Hello from AWS IoT console” というメッセージが聞こえ、ターミナルに以下のメッセージが流れてくるのが確認できるはずです。
    Received a new message:
    b'{\n "message": "Hello from AWS IoT console"\n}'
    from topic:
    speaker/message
  17. speaker1 については、後ほど使いますので、起動したままにしておいてください。

ステップ6: IoT ルールの作成

  1. AWS IoT Core コンソールで、メッセージのルーティングの下のルールを選択します。
  2. ルールを作成を選択します。
  3. ルールのプロパティでは、ルールに名前: robot_stuck とルールの説明を付けます。次へを選択します。

    8 - Specify Rule Properties

    図8: ルールのプロパティを指定

  4. SQL のバージョンはそのままで、SQL ステートメントとして次を入力します。
    SELECT concat(robotID, ' is stuck on ', location) as message FROM 'robot/+/data' WHERE state = "stuck"

    9 - SQL Statement

    図9: SQL ステートメント

  5. この SQL 文は、ワイルドカードトピック robot/+/data 上で状態が stuck であるあらゆるメッセージを受け取り、そのデータを “<robotID> is stuck on <location>” という文章形式に連結しています。
  6. 次へを選択します。
  7. ルールアクションとして Republish to AWS IoT topic を選択し、トピック speaker/message を入力します。

    図10: ルールアクション

  8. 新しいロールを作成を選択します。
  9. ロールに Role_IoTVoice_rule という名前を付けます。
  10. 作成を選択します。
  11. 次へを選択します。
  12. 作成を選択します。
  13. 新しいルールが正常に作成されたことが確認できるはずです。

    Figure 11 - New IoT Rule Created

    図11: 新しい IoT ルールが作成された

ステップ7: IoT ルールのテスト

  1. ターミナルで robot1 と speaker1 が起動していること、音声出力がオンになっていることを確認します。
  2. JSON ファイル robot_payload.json (robot1 フォルダー内) をテキストエディタで開きます。
  3. JSON 中の location を編集し、保存します。
    {
    "state": "stuck",
    "location": "aisle 12"
    }
  4. robot1 がメッセージをパブリッシュしたことがわかります。
    Published topic robot/cleaning_robot_1/data: {"state": "stuck", "location": "aisle 12", "robotID": "cleaning robot 1"}
  5. その後、トピックは自動的に IoT ルールにルーティングされ、speaker1 に戻るようにパブリッシュされます。
    Received a new message:
    b'{"message":"cleaning robot 1 is stuck on aisle 12"}'
    from topic:
    speaker/message
  6. speaker1 は、IoT ルールから受信したテキストを MP3 オーディオファイルに変換し、メッセージを自動再生します。”Cleaning robot 1 is stuck on aisle 12″ 。
  7. robot_payload.json ファイルを再度編集してみますが、今度は状態を running に変更します。ファイルを保存してください。
    {
    "state": "running",
    "location": "aisle 2"
    }
  8. 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 データを使ってどのように行動し、業務を改善しているのか、ぜひ教えてください。

Adilson Perinei

Adilson Perinei

Adilson Perinei は AWS のコンサルタントで、AWS IoT Technical Field Community のメンバーです。ソリューションアーキテクトプロフェッショナル、DevOpsエンジニアプロフェッショナル、セキュリティスペシャリストなど、7つのAWS認定を取得しています。

Erica Goldberger

Erica Goldberger

Erica Goldberger は、AWS でロボティクスを専門とするソリューションアーキテクトです。ソリューションアーキテクトになる前は、Technical Curriculum Developer として、コンテナや IoT などのテーマで AWS のトレーニングコースを構築していました。ペンシルベニア大学でロボット工学の修士号を取得しています。

この記事は Convert Messages from IoT Devices to Voice Commands Using AWS IoT Core and Amazon Polly の日本語訳です。エンタープライズ事業本部 ソリューションアーキテクトの中西 貴大が翻訳しました。