Friday, June 9, 2023
HomeIoTConvert Messages from IoT Units to Voice Instructions Utilizing AWS IoT Core...

Convert Messages from IoT Units to Voice Instructions Utilizing AWS IoT Core and Amazon Polly

AWS IoT Core is a totally managed service that permits you to join billions of IoT units and route trillions of messages to AWS companies with out managing infrastructure. One of many key options of AWS IoT Core is Guidelines Engine.

With Guidelines Engine, you’ll be able to ship knowledge out of your IoT units to different companies in AWS. This provides you the power to take fast actions in your IoT knowledge, corresponding to triggering alarms and notifications, accumulating logs, or working analytics and machine studying fashions. On this put up, we’ll present how one can take JSON messages coming in out of your gadget and convert them to audio utilizing the Amazon Polly textual content to speech machine studying mannequin. Amazon Polly makes use of deep studying applied sciences to synthesize natural-sounding human speech, so you’ll be able to convert articles to speech. With dozens of lifelike voices throughout a broad set of languages, you should utilize Amazon Polly to construct speech-activated functions.


For this instance, we will likely be working with cleansing robots which can be navigating via a grocery store to scrub the flooring. The robots ship messages on an MQTT subject, robotic/<clientID>/knowledge, every time the robots change states [running, waiting, stuck, charging]. The messages embrace the robotic’s present state in addition to its location within the grocery store.

Right here is pattern MQTT message coming in from a robotic:
Subject: robotic/cleaning_robot_1/knowledge

"state": "caught",
"location": "aisle 6"

In our instance, the grocery store intends to inform its workers via wi-fi headsets every time a robotic is caught. They need the announcement to play an audio clip figuring out which robotic is caught and the place it’s situated at, so the employees can simply navigate to the robotic and resolve the problem.

Right here is an instance of the audio the workers will hear:
sample-audio-message.mp3 (Clip enjoying: “Cleansing robotic 1 is caught on aisle 6.”)

Obtain the file and play in your laptop

Download Sample Audio

Determine 1 – Obtain Pattern Audio

Resolution overview

With a view to present the grocery store with this answer, you will have to construct the next:

  1. IoT gadget to symbolize the robotic that publishes messages when the robotic modifications state.
  2. IoT gadget to symbolize the speaker that performs audio messages.
  3. IoT Rule that:
    • Listens to messages on the subject robotic/+/knowledge.
    • Converts the JSON message to the specified String sentence when the robotic is in a “caught” state.
    • Publishes a brand new message to subject speaker/message.
Solution Diagram

Determine 2 – Resolution Diagram


For this stroll via, it’s best to have the next stipulations:

  • An AWS account. For those who don’t have an AWS Account, comply with the directions to create one.
  • A consumer function with administrator entry (service entry related to this function could be constrained additional when the workflow goes to manufacturing).
  • Latest trendy browser (newest model of Firefox or Chrome)
  • Python and Pip put in
  • No specialised information is required to construct this answer, however primary Linux and Python information will assist.


Step 1: Clone the GitHub repository and obtain the AWS IoT Gadget SDK

  1. Clone the GitHub repository for the pattern functions that simulate the robotic and speaker.
    If you wish to do that workflow on an actual robotic and speaker, copy the robot1 and speaker1 folders to their respective units. In any other case, you’ll be able to depart each to simulate regionally in your laptop.
    git clone
  2. Set up the AWS IoT Gadget SDK for python.
  3. In case you are working the robotic and speaker individually, you will have to run this command for all units.
    python3 -m pip set up AWSIoTPythonSDK

Step 2: Arrange permissions for the units


  1. First, arrange the correct permissions for any robots. The robots want to have the ability to hook up with AWS IoT and publish to the subject robotic/<robotID>/knowledge. This may be achieved with an IoT coverage.
  2. Navigate to the AWS IoT Core console. Within the navigation menu, beneath Safety, select Insurance policies.
  3. Select Create coverage.
  4. For Coverage title enter policy_robot.
  5. For Coverage statements select JSON after which paste within the following coverage doc:
    "Model": "2012-10-17",
    "Assertion": [
    "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. Insert your <area> and <accountID> into the coverage after which select Create.
    IoT Policy Robot

    Determine 3 – IoT Coverage Robotic


  1. Subsequent, arrange the correct permissions for the speaker gadget. The speaker wants to have the ability to hook up with AWS IoT and subscribe to the subject speaker/message. The speaker additionally wants permissions to entry Amazon Polly for changing textual content to audio. To present an IoT gadget entry to different AWS companies, you will have to present the gadget permission to imagine a job alias.
  2. Select Create coverage.
  3. For Coverage title enter policy_speaker.
  4. For Coverage statements select JSON after which paste within the following coverage:
    "Model": "2012-10-17",
    "Assertion": [
    "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. Insert your <area> and <accountID> into the coverage after which select Create.
    Figure 4 - IoT Policy Speaker

    Determine 4 – IoT Coverage Speaker

Step 3: Arrange permissions for Amazon Polly actions

To present the speaker permissions to entry Amazon Polly you will have to create an AWS Id and Entry Administration(IAM) function after which create an IoT function alias to connect the IAM function to an IoT factor.

  1. Navigate to AWS IAM console. Within the navigation menu select Roles.
  2. Select Create Position.
  3. Choose Customized belief coverage.
  4. Paste the next JSON coverage:
    "Model": "2012-10-17",
    "Assertion": [
    "Effect": "Allow",
    "Principal": {
    "Service": ""
    "Action": "sts:AssumeRole"
  5. Select Subsequent.
  6. Beneath Permissions insurance policies, seek for polly and choose the checkbox for AmazonPollyReadOnlyAccess.
  7. Select Subsequent.
  8. For function title, enter speaker_role.
  9. Select Create function.
  10. Navigate to the AWS IoT Core console. Within the navigation menu, beneath Safety, select Position Aliases.
  11. Choose Create function alias.
  12. For function alias title, enter speaker-role-alias.
  13. For function, choose speaker_role from the dropdown.
  14. Go away the credentials period as 3600 seconds (1 hour) and select Create.

Step 4: Join the units to AWS IoT Core

Create IoT issues in AWS IoT Core to your robotic and speaker units.

  1. Navigate to the AWS IoT Core console. Within the navigation menu, beneath Handle, select All units, Issues.
  2. Select Create issues.
  3. Select Create single factor. Select Subsequent.
  4. First, create the robotic. Give the robotic a Factor title of cleaning_robot_1.
  5. Go away the remainder as is, and select Subsequent.
    Figure 5 - Creating IoT Thing on AWS IoT Core

    Determine 5 – Creating IoT Factor on AWS IoT Core

  6. Select Auto-generate a brand new certificates (really helpful). Select Subsequent.
  7. Choose the checkbox subsequent to the policy_robot. Select Create factor.

    Determine 6 – Connect Coverage

  8. Obtain all 4 recordsdata: Gadget certificates, Public Key file, Non-public key file, RSA 2048 bit key: Amazon Root CA 1.
  9. Select Completed.
    Figure 7 - Download Certificates

    Determine 7 – Obtain Certificates

  10. Transfer the 4 recordsdata to the folder within the iot-polly repository titled robot1.
  11. Rename the non-public key and certificates recordsdata as follows:
    • xxxx-private.pem.key to robot1-private.pem.key
    • xxxx-certificate.pem.crt to robot1.certificates.pem.crt
  12. Repeat the steps above for the speaker gadget with the next modifications:
    • Title the IoT factor: speaker_1.
    • Choose the IoT coverage: policy_speaker.
    • Rename the non-public key and certificates recordsdata as follows:
      1. xxxx-private.pem.key to speaker1-private.pem.key
      2. xxxx-certificate.pem.crt to speaker1.certificates.pem.crt

Step 5: Take a look at the robotic and speaker

  1. Within the AWS IoT Core console navigation menu, select MQTT check consumer.
  2. For Subscribe to a subject, enter robotic/+/knowledge.
  3. Within the navigation menu, select Settings. Copy the Gadget knowledge endpoint.
  4. Enter the next instructions in your terminal. Navigate to the iot-polly repository.
    cd robot1

    # on a PC:

    py -m venv env
    cd envScripts
    cd ../..

    # on a Mac/Ubuntu:

    python3 -m venv env
    supply env/bin/activate
  5. Change <iot endpoint> with the gadget knowledge endpoint you simply copied.
    pip set up -r necessities.txt
    aws iot describe-endpoint --endpoint-type iot:Knowledge-ATS
    python3 --clientId cleaning_robot_1 --endpoint <iot endpoint> --key robot1-private.pem.key --cert robot1-certificate.pem.crt --rootCA AmazonRootCA1.pem
  6. Navigate again to the MQTT check consumer to see a message come via from robotic/cleaning_robot_1/knowledge:
    "state": "caught",
    "location": "aisle 17",
    "robotID": "cleansing robotic 1"
  7. Preserve robot1 working within the background as you’ll come again to it later.
  8. In a brand new tab in your terminal, navigate to the iot-polly repository.
    cd speaker1

    # on a PC:

    py -m venv env
    cd envScripts
    cd ../..

    # on a Mac/Ubuntu:

    python3 -m venv env
    supply env/bin/activate

    # on each:

    pip set up -r necessities.txt

    Get your IoT endpoint and credential supplier url:

    aws iot describe-endpoint --endpoint-type iot:Knowledge-ATS
    aws iot describe-endpoint --endpoint-type iot:CredentialProvider --region <area>
  9. Make sure the audio in your laptop is on. Run the speaker gadget: (Ensure to exchange your endpoint and credential supplier with the outputs of the instructions above).
    python3 --thingname speaker_1 --region <area> --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. Navigate again to the MQTT check consumer.
  11. Select the tab Publish to a Subject.
  12. Subject title: speaker/message
  13. Message payload:
    { "message": "Hiya from AWS IoT console" }
  14. Select Publish
  15. speaker1 makes use of the boto3 library within the file to name the Amazon Polly API to transform the textual content obtained within the message to an MP3 audio file. It then mechanically performs the audio utilizing the playsound library.
  16. You must hear the message “Hiya from AWS IoT console” and see the next message come via in your terminal window:
    Obtained a brand new message:
    b'{n "message": "Hiya from AWS IoT console"n}'
    from subject:
  17. Preserve speaker1 working as you’ll come again to it later.

Step 6: Create the IoT rule

  1. Within the AWS IoT Core console, select Message routing, Guidelines.
  2. Select Create rule.
  3. For rule properties, give your rule a reputation: robot_stuck and outline. Select Subsequent.
    8 - Specify Rule Properties

    Determine 8 – Specify Rule Properties

  4. Go away the SQL_version as is, after which enter the comply with because the SQL_statement:
    SELECT concat(robotID, ' is caught on ', location) as message FROM 'robotic/+/knowledge' WHERE state = "caught"
    9 - SQL Statement

    Determine 9 – SQL Assertion

  5. This SQL assertion receives any messages on the wildcard subject ‘robotic/+/knowledge‘ the place the state is “caught” after which concatenates the info right into a sentence format of “<robotID> is caught on <location>”.
  6. Select Subsequent.
  7. For Rule actions, select Republish to AWS IoT subject, after which sort the subject speaker/message.

    Determine 10 – Rule Actions

  8. Select Create new function.
  9. Title the function, Role_IoTVoice_rule.
  10. Select Create.
  11. Select Subsequent.
  12. Selected Create.
  13. You must see a brand new rule efficiently created.
    Figure 11 - New IoT Rule Created

    Determine 11 – New IoT Rule Created

Step 7: Take a look at the IoT rule

  1. Guarantee robot1 and speaker1 are nonetheless working in your terminal and your audio is on.
  2. Open the JSON file robot_payload.json (discovered within the robot1 folder) in your required textual content editor.
  3. Edit the situation within the JSON and save.
    "state": "caught",
    "location": "aisle 12"
  4. You will note that robot1 printed a message:
    Printed subject robotic/cleaning_robot_1/knowledge: {"state": "caught", "location": "aisle 12", "robotID": "cleansing robotic 1"}
  5. The subject is then mechanically routed via your IoT rule and printed again to speaker1.
    Obtained a brand new message:
    b'{"message":"cleansing robotic 1 is caught on aisle 12"}'
    from subject:
  6. speaker1 converts the textual content obtained out of your IoT Rule to an MP3 audio file and mechanically performs the message. “Cleansing robotic 1 is caught on aisle 12”.
  7. Strive modifying the robot_payload.json file once more, however this time change the state to “working”. Save the file.
    "state": "working",
    "location": "aisle 2"
  8. You will note that robot1 receives the message, however the message is rarely forwarded to speaker1 as a result of it’s not caught so the rule filters it out.

Congratulations! You’ve got efficiently created an IoT rule that converts and routes messages to a different gadget for conversion to audio with Amazon Polly.


On this weblog, you realized how you should utilize AWS IoT Core’s Rule Engine and Amazon Polly to take heed to IoT messages, however what you realized could be utilized in a wide range of options, for instance:

  • Good Car can notify drivers with voice message “Present vary is 30 miles; subsequent fuel station is 5 miles method”.
  • Good Freezer: “Temperature contained in the freezer is excessive. It went from 0oF to 5oF in 10 minutes”
  • Blood Sugar Monitor: “Your blood sugar is simply too excessive, 210mg/DL”

To be taught extra about make the most of the IoT Guidelines Engine, take a look at our course, Deep Dive into AWS IoT Guidelines Engine. Tell us how you might be appearing in your IoT knowledge to enhance your small business operations.

Adilson Perinei

Adilson Perinei

Adilson Perinei is an AWS Guide, member of AWS IoT Technical Area Neighborhood. Adilson holds 7 AWS certifications, together with Resolution Architect Skilled, DevOps Engineer Skilled and Safety Specialty.

Erica Goldberger

Erica Goldberger

Erica Goldberger is a Options Architect specializing in Robotics at Amazon Internet Providers (AWS). Previous to being a Options Architect, Erica was a Technical Curriculum Developer constructing coaching programs for AWS on matters corresponding to containers and IoT. Erica has a Grasp’s in Robotics from the College of Pennsylvania.



Please enter your comment!
Please enter your name here

Most Popular

Recent Comments